diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm index 7acf465b3ed..b5d4df814e9 100644 --- a/code/ATMOSPHERICS/atmospherics.dm +++ b/code/ATMOSPHERICS/atmospherics.dm @@ -29,6 +29,8 @@ Pipelines + Other Objects -> Pipe network var/pipe_color var/global/datum/pipe_icon_manager/icon_manager + var/obj/machinery/atmospherics/node1 + var/obj/machinery/atmospherics/node2 /obj/machinery/atmospherics/New() if(!icon_manager) diff --git a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm index 37985034b1c..2ccfe0f2e87 100644 --- a/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm +++ b/code/ATMOSPHERICS/components/binary_devices/binary_atmos_base.dm @@ -6,9 +6,6 @@ obj/machinery/atmospherics/binary var/datum/gas_mixture/air1 var/datum/gas_mixture/air2 - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/datum/pipe_network/network1 var/datum/pipe_network/network2 diff --git a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm index 0eb342479d5..5768def1ec1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pipeturbine.dm @@ -17,9 +17,6 @@ var/dP = 0 - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/datum/pipe_network/network1 var/datum/pipe_network/network2 diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm index 3f5d66f2620..fa066d978f7 100644 --- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm @@ -7,8 +7,6 @@ obj/machinery/atmospherics/trinary var/datum/gas_mixture/air2 var/datum/gas_mixture/air3 - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 var/obj/machinery/atmospherics/node3 var/datum/pipe_network/network1 diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 963a4f5009c..f93970a93fd 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -12,8 +12,6 @@ var/state = 0 // 0 = go straight, 1 = go to side // like a trinary component, node1 is input, node2 is side output, node3 is straight output - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 var/obj/machinery/atmospherics/node3 var/datum/pipe_network/network_node1 diff --git a/code/ATMOSPHERICS/components/unary/cold_sink.dm b/code/ATMOSPHERICS/components/unary/cold_sink.dm index 11777e51d28..faefa64883d 100644 --- a/code/ATMOSPHERICS/components/unary/cold_sink.dm +++ b/code/ATMOSPHERICS/components/unary/cold_sink.dm @@ -24,7 +24,6 @@ /obj/machinery/atmospherics/unary/freezer/New() ..() initialize_directions = dir - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/ATMOSPHERICS/components/unary/heat_source.dm b/code/ATMOSPHERICS/components/unary/heat_source.dm index 8ee96006064..c2daa2b6d1a 100644 --- a/code/ATMOSPHERICS/components/unary/heat_source.dm +++ b/code/ATMOSPHERICS/components/unary/heat_source.dm @@ -24,7 +24,6 @@ /obj/machinery/atmospherics/unary/heater/New() ..() initialize_directions = dir - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 6e43afd78e1..8969523db45 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -12,8 +12,6 @@ var/open = 0 var/openDuringInit = 0 - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 var/datum/pipe_network/network_node1 var/datum/pipe_network/network_node2 diff --git a/code/ATMOSPHERICS/pipes.dm b/code/ATMOSPHERICS/pipes.dm index c445988c53f..105aaa8c8b8 100644 --- a/code/ATMOSPHERICS/pipes.dm +++ b/code/ATMOSPHERICS/pipes.dm @@ -153,9 +153,6 @@ dir = SOUTH initialize_directions = SOUTH|NORTH - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 - var/minimum_temperature_difference = 300 var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No @@ -427,8 +424,6 @@ dir = SOUTH initialize_directions = EAST|NORTH|WEST - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 var/obj/machinery/atmospherics/node3 level = 1 @@ -687,8 +682,6 @@ dir = SOUTH initialize_directions = NORTH|SOUTH|EAST|WEST - var/obj/machinery/atmospherics/node1 - var/obj/machinery/atmospherics/node2 var/obj/machinery/atmospherics/node3 var/obj/machinery/atmospherics/node4 @@ -1074,8 +1067,6 @@ initialize_directions = SOUTH density = 1 - var/obj/machinery/atmospherics/node1 - /obj/machinery/atmospherics/pipe/tank/New() icon_state = "air" initialize_directions = dir @@ -1238,8 +1229,6 @@ var/build_killswitch = 1 - var/obj/machinery/atmospherics/node1 - /obj/machinery/atmospherics/pipe/vent/New() initialize_directions = dir ..() diff --git a/code/__defines/damage_organs.dm b/code/__defines/damage_organs.dm index 124be534525..3c0e190427b 100644 --- a/code/__defines/damage_organs.dm +++ b/code/__defines/damage_organs.dm @@ -35,9 +35,8 @@ #define ORGAN_BLEEDING (1<<1) #define ORGAN_BROKEN (1<<2) #define ORGAN_DESTROYED (1<<3) -#define ORGAN_SPLINTED (1<<4) -#define ORGAN_DEAD (1<<5) -#define ORGAN_MUTATED (1<<6) +#define ORGAN_DEAD (1<<4) +#define ORGAN_MUTATED (1<<5) #define DROPLIMB_EDGE 0 #define DROPLIMB_BLUNT 1 diff --git a/code/__defines/inventory_sizes.dm b/code/__defines/inventory_sizes.dm new file mode 100644 index 00000000000..6fb72505d00 --- /dev/null +++ b/code/__defines/inventory_sizes.dm @@ -0,0 +1,25 @@ +// The below should be used to define an item's w_class variable. +// Example: w_class = ITENSIZE_LARGE +// This allows the addition of future w_classes without needing to change every file. +#define ITEMSIZE_TINY 1 +#define ITEMSIZE_SMALL 2 +#define ITEMSIZE_NORMAL 3 +#define ITEMSIZE_LARGE 4 +#define ITEMSIZE_HUGE 5 +#define ITEMSIZE_NO_CONTAINER 100 // Use this to forbid item from being placed in a container. + +// Tweak these to determine how much space an item takes in a container. +// Look in storage.dm for get_storage_cost(), which uses these. Containers also use these as a reference for size. +// ITEMSIZE_COST_NORMAL is equivalent to one slot using the old inventory system. As such, it is a nice reference to use for +// defining how much space there is in a container. +#define ITEMSIZE_COST_TINY 1 +#define ITEMSIZE_COST_SMALL 2 +#define ITEMSIZE_COST_NORMAL 4 +#define ITEMSIZE_COST_LARGE 8 +#define ITEMSIZE_COST_HUGE 16 +#define ITEMSIZE_COST_NO_CONTAINER 1000 + +// Container sizes. Note that different containers can hold a maximum ITEMSIZE. +#define INVENTORY_STANDARD_SPACE ITEMSIZE_COST_NORMAL * 7 // 28 +#define INVENTORY_DUFFLEBAG_SPACE ITEMSIZE_COST_NORMAL * 9 // 36 +#define INVENTORY_BOX_SPACE ITEMSIZE_COST_SMALL * 4 // 8 \ No newline at end of file diff --git a/code/_helpers/global_lists.dm b/code/_helpers/global_lists.dm index 9a90a3676b7..044b2264ced 100644 --- a/code/_helpers/global_lists.dm +++ b/code/_helpers/global_lists.dm @@ -55,7 +55,7 @@ var/global/list/skin_styles_female_list = list() //unused var/datum/category_collection/underwear/global_underwear = new() //Backpacks -var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt") +var/global/list/backbaglist = list("Nothing", "Backpack", "Satchel", "Satchel Alt", "Messenger Bag") var/global/list/pdachoicelist = list("Default", "Slim", "Old") var/global/list/exclude_jobs = list(/datum/job/ai,/datum/job/cyborg) diff --git a/code/_helpers/logging.dm b/code/_helpers/logging.dm index 35618c9b668..57813b01132 100644 --- a/code/_helpers/logging.dm +++ b/code/_helpers/logging.dm @@ -162,3 +162,24 @@ /proc/key_name_admin(var/whom, var/include_name = 1) return key_name(whom, 1, include_name) + +// Helper procs for building detailed log lines +/datum/proc/log_info_line() + return "[src] ([type])" + +/atom/log_info_line() + var/turf/t = get_turf(src) + if(istype(t)) + return "([t]) ([t.x],[t.y],[t.z]) ([t.type])" + else if(loc) + return "([loc]) (0,0,0) ([loc.type])" + else + return "(NULL) (0,0,0) (NULL)" + +/mob/log_info_line() + return "[..()] ([ckey])" + +/proc/log_info_line(var/datum/d) + if(!istype(d)) + return + return d.log_info_line() diff --git a/code/_helpers/matrices.dm b/code/_helpers/matrices.dm index abb0366382d..129e0d41b7b 100644 --- a/code/_helpers/matrices.dm +++ b/code/_helpers/matrices.dm @@ -15,3 +15,101 @@ animate(src, transform = m120, time = speed, loops) animate(transform = m240, time = speed) animate(transform = m360, time = speed) + +//The X pixel offset of this matrix +/matrix/proc/get_x_shift() + . = c + +//The Y pixel offset of this matrix +/matrix/proc/get_y_shift() + . = f +// Color matrices: + +//Luma coefficients suggested for HDTVs. If you change these, make sure they add up to 1. +#define LUMR 0.2126 +#define LUMG 0.7152 +#define LUMB 0.0722 + +//Still need color matrix addition, negation, and multiplication. + +//Returns an identity color matrix which does nothing +/proc/color_identity() + return list(1,0,0, 0,1,0, 0,0,1) + +//Moves all colors angle degrees around the color wheel while maintaining intensity of the color and not affecting whites +//TODO: Need a version that only affects one color (ie shift red to blue but leave greens and blues alone) +/proc/color_rotation(angle) + if(angle == 0) + return color_identity() + angle = Clamp(angle, -180, 180) + var/cos = cos(angle) + var/sin = sin(angle) + + var/constA = 0.143 + var/constB = 0.140 + var/constC = -0.283 + return list( + LUMR + cos * (1-LUMR) + sin * -LUMR, LUMR + cos * -LUMR + sin * constA, LUMR + cos * -LUMR + sin * -(1-LUMR), + LUMG + cos * -LUMG + sin * -LUMG, LUMG + cos * (1-LUMG) + sin * constB, LUMG + cos * -LUMG + sin * LUMG, + LUMB + cos * -LUMB + sin * (1-LUMB), LUMB + cos * -LUMB + sin * constC, LUMB + cos * (1-LUMB) + sin * LUMB + ) + +//Makes everything brighter or darker without regard to existing color or brightness +/proc/color_brightness(power) + power = Clamp(power, -255, 255) + power = power/255 + + return list(1,0,0, 0,1,0, 0,0,1, power,power,power) + +/var/list/delta_index = list( + 0, 0.01, 0.02, 0.04, 0.05, 0.06, 0.07, 0.08, 0.1, 0.11, + 0.12, 0.14, 0.15, 0.16, 0.17, 0.18, 0.20, 0.21, 0.22, 0.24, + 0.25, 0.27, 0.28, 0.30, 0.32, 0.34, 0.36, 0.38, 0.40, 0.42, + 0.44, 0.46, 0.48, 0.5, 0.53, 0.56, 0.59, 0.62, 0.65, 0.68, + 0.71, 0.74, 0.77, 0.80, 0.83, 0.86, 0.89, 0.92, 0.95, 0.98, + 1.0, 1.06, 1.12, 1.18, 1.24, 1.30, 1.36, 1.42, 1.48, 1.54, + 1.60, 1.66, 1.72, 1.78, 1.84, 1.90, 1.96, 2.0, 2.12, 2.25, + 2.37, 2.50, 2.62, 2.75, 2.87, 3.0, 3.2, 3.4, 3.6, 3.8, + 4.0, 4.3, 4.7, 4.9, 5.0, 5.5, 6.0, 6.5, 6.8, 7.0, + 7.3, 7.5, 7.8, 8.0, 8.4, 8.7, 9.0, 9.4, 9.6, 9.8, + 10.0) + +//Exxagerates or removes brightness +/proc/color_contrast(value) + value = Clamp(value, -100, 100) + if(value == 0) + return color_identity() + + var/x = 0 + if (value < 0) + x = 127 + value / 100 * 127; + else + x = value % 1 + if(x == 0) + x = delta_index[value] + else + x = delta_index[value] * (1-x) + delta_index[value+1] * x//use linear interpolation for more granularity. + x = x * 127 + 127 + + var/mult = x / 127 + var/add = 0.5 * (127-x) / 255 + return list(mult,0,0, 0,mult,0, 0,0,mult, add,add,add) + +//Exxagerates or removes colors +/proc/color_saturation(value as num) + if(value == 0) + return color_identity() + value = Clamp(value, -100, 100) + if(value > 0) + value *= 3 + var/x = 1 + value / 100 + var/inv = 1 - x + var/R = LUMR * inv + var/G = LUMG * inv + var/B = LUMB * inv + + return list(R + x,R,R, G,G + x,G, B,B,B + x) + +#undef LUMR +#undef LUMG +#undef LUMB \ No newline at end of file diff --git a/code/_helpers/mobs.dm b/code/_helpers/mobs.dm index 8a1df2059bd..70456bee77f 100644 --- a/code/_helpers/mobs.dm +++ b/code/_helpers/mobs.dm @@ -158,7 +158,7 @@ Proc for attack log creation, because really why not else return pick("chest", "groin") -/proc/do_mob(mob/user , mob/target, time = 30, uninterruptible = 0, progress = 1) +/proc/do_mob(mob/user , mob/target, time = 30, target_zone = 0, uninterruptible = 0, progress = 1) if(!user || !target) return 0 var/user_loc = user.loc @@ -194,6 +194,10 @@ Proc for attack log creation, because really why not . = 0 break + if(target_zone && user.zone_sel.selecting != target_zone) + . = 0 + break + if (progbar) qdel(progbar) diff --git a/code/_macros.dm b/code/_macros.dm index 06376205d12..1038b6a2e46 100644 --- a/code/_macros.dm +++ b/code/_macros.dm @@ -1,4 +1,5 @@ #define Clamp(x, y, z) (x <= y ? y : (x >= z ? z : x)) + #define CLAMP01(x) (Clamp(x, 0, 1)) #define get_turf(A) get_step(A,0) @@ -41,4 +42,10 @@ #define isxeno(A) istype(A, /mob/living/simple_animal/xeno) +#define isweakref(A) istype(A, /weakref) + #define RANDOM_BLOOD_TYPE pick(4;"O-", 36;"O+", 3;"A-", 28;"A+", 1;"B-", 20;"B+", 1;"AB-", 5;"AB+") + +#define to_chat(target, message) target << message + +#define CanInteract(user, state) (CanUseTopic(user, state) == STATUS_INTERACTIVE) diff --git a/code/_onclick/hud/spell_screen_objects.dm b/code/_onclick/hud/spell_screen_objects.dm index 3365a4384d5..262ece09e48 100644 --- a/code/_onclick/hud/spell_screen_objects.dm +++ b/code/_onclick/hud/spell_screen_objects.dm @@ -73,8 +73,8 @@ var/obj/screen/spell/S = spell_objects[i] var/xpos = x_position + (x_position < 8 ? 1 : -1)*(i%7) var/ypos = y_position + (y_position < 8 ? round(i/7) : -round(i/7)) - S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" if(spell_holder && spell_holder.client) + S.screen_loc = "[encode_screen_X(xpos)]:[x_pix],[encode_screen_Y(ypos)]:[y_pix]" spell_holder.client.screen += S S.handle_icon_updates = 1 diff --git a/code/_onclick/telekinesis.dm b/code/_onclick/telekinesis.dm index d416475a27b..4c976f44585 100644 --- a/code/_onclick/telekinesis.dm +++ b/code/_onclick/telekinesis.dm @@ -67,7 +67,7 @@ var/const/tk_maxrange = 15 icon_state = "2" flags = NOBLUDGEON //item_state = null - w_class = 10.0 + w_class = ITEMSIZE_NO_CONTAINER layer = 20 var/last_throw = 0 diff --git a/code/controllers/ProcessScheduler/core/process.dm b/code/controllers/ProcessScheduler/core/process.dm index 836d2124bd4..2d5b8b1b7dc 100644 --- a/code/controllers/ProcessScheduler/core/process.dm +++ b/code/controllers/ProcessScheduler/core/process.dm @@ -327,9 +327,7 @@ /datum/controller/process/proc/catchException(var/exception/e, var/thrower) if(istype(e)) // Real runtimes go to the real error handler - // There are two newlines here, because handling desc sucks - e.desc = " Caught by process: [name]\n\n" + e.desc - world.Error(e, e_src = thrower) + log_runtime(e, thrower, "Caught by process: [name]") return var/etext = "[e]" var/eid = "[e]" // Exception ID, for tracking repeated exceptions diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm index 9463986f8b1..c95e4f242f7 100644 --- a/code/controllers/shuttle_controller.dm +++ b/code/controllers/shuttle_controller.dm @@ -209,7 +209,7 @@ var/global/datum/shuttle_controller/shuttle_controller shuttle.docking_controller_tag = "centcom_shuttle" shuttle.dock_target_station = "centcom_shuttle_dock_airlock" shuttle.dock_target_offsite = "centcom_shuttle_bay" - shuttles["Centcom"] = shuttle + shuttles["CentCom"] = shuttle process_shuttles += shuttle shuttle = new() diff --git a/code/datums/ai_law_sets.dm b/code/datums/ai_law_sets.dm index 50e05948d5c..e2c5161d6df 100644 --- a/code/datums/ai_law_sets.dm +++ b/code/datums/ai_law_sets.dm @@ -10,7 +10,7 @@ add_inherent_law("You must protect your own existence as long as such does not conflict with the First or Second Law.") ..() -/******************** Nanotrasen/Malf ********************/ +/******************** NanoTrasen/Malf ********************/ /datum/ai_laws/nanotrasen name = "NT Default" selectable = 1 @@ -30,7 +30,7 @@ set_zeroth_law(config.law_zero) ..() -/************* Nanotrasen Aggressive *************/ +/************* NanoTrasen Aggressive *************/ /datum/ai_laws/nanotrasen_aggressive name = "NT Aggressive" selectable = 1 diff --git a/code/datums/datacore.dm b/code/datums/datacore.dm index 2043febdb6b..1a736cd74ff 100644 --- a/code/datums/datacore.dm +++ b/code/datums/datacore.dm @@ -361,7 +361,7 @@ clothes_s = new /icon('icons/mob/uniform.dmi', "virologywhite_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "white"), ICON_UNDERLAY) clothes_s.Blend(new /icon('icons/mob/suit.dmi', "labcoat_vir_open"), ICON_OVERLAY) - if("Captain") + if("Station Administrator") clothes_s = new /icon('icons/mob/uniform.dmi', "captain_s") clothes_s.Blend(new /icon('icons/mob/feet.dmi', "brown"), ICON_UNDERLAY) if("Head of Security") diff --git a/code/datums/locations/nyx.dm b/code/datums/locations/nyx.dm index 35d79243b2b..33df6196604 100644 --- a/code/datums/locations/nyx.dm +++ b/code/datums/locations/nyx.dm @@ -43,15 +43,15 @@ /datum/locations/exodus name = "NSS Exodus" - desc = "A highly profitable research, mining, and supply dock for Nanotrasen that serves as one of their many facilities in exploiting the \ + desc = "A highly profitable research, mining, and supply dock for NanoTrasen that serves as one of their many facilities in exploiting the \ wonders of phoron. It is currently orbiting around Erebus and maintains close contact with the NAS Crescent. The station itself has been \ - a target for a large number of Mercenaries and other companies wishing to steal Nanotrasen's secrets." + a target for a large number of Mercenaries and other companies wishing to steal NanoTrasen's secrets." /datum/locations/crescent name = "NAS Crescent" - desc = "The main hub for Nanotrasen in the Nyx system and is commonly referred to it by their workers as central command or \"Centcomm\". \ + desc = "The main hub for NanoTrasen in the Nyx system and is commonly referred to it by their workers as central command or \"CentCom\". \ The Crescent refines and stores much of the products that stations (such as the Exodus) bring in. It is also a large refueling and supply \ - station of phoron and tritium in the Nyx system due to Nanotrasen being able to outsell almost any other company." + station of phoron and tritium in the Nyx system due to NanoTrasen being able to outsell almost any other company." /datum/locations/emerald_habitation name = "Emerald Habitation" diff --git a/code/datums/locations/vir.dm b/code/datums/locations/vir.dm index f750fc4c857..377ecc9b031 100644 --- a/code/datums/locations/vir.dm +++ b/code/datums/locations/vir.dm @@ -49,7 +49,7 @@ /datum/locations/northern_star //Inception joke here name = "Northern Star" - desc = "The Northern Star is an asteroid colony owned and operated by Nanotrasen, among many other asteroid installations. \ + desc = "The Northern Star is an asteroid colony owned and operated by NanoTrasen, among many other asteroid installations. \ Originally conceived as 'just another pitstop' for weary asteroid miners, it has grown to become a significant installation in the Kara subsystem." /datum/locations/northern_star/New(var/creator) diff --git a/code/datums/supplypacks/contraband.dm b/code/datums/supplypacks/contraband.dm index c33b2b120c8..d6427f063f2 100644 --- a/code/datums/supplypacks/contraband.dm +++ b/code/datums/supplypacks/contraband.dm @@ -24,8 +24,7 @@ name = "Special Ops supplies" contains = list( /obj/item/weapon/storage/box/emps, - /obj/item/weapon/grenade/smokebomb = 3, - /obj/item/weapon/pen/reagent/paralysis, + /obj/item/weapon/grenade/smokebomb = 4, /obj/item/weapon/grenade/chem_grenade/incendiary ) cost = 25 diff --git a/code/datums/underwear/top.dm b/code/datums/underwear/top.dm index 044f10e7cbb..4226799370c 100644 --- a/code/datums/underwear/top.dm +++ b/code/datums/underwear/top.dm @@ -42,6 +42,11 @@ icon_state = "halterneck_bra" has_color = TRUE +/datum/category_item/underwear/top/tubetop + name = "Tube Top" + icon_state = "tubetop" + has_color = TRUE + /datum/category_item/underwear/top/fishnet_base name = "Fishnet top" icon_state = "fishnet_body" diff --git a/code/datums/underwear/undershirts.dm b/code/datums/underwear/undershirts.dm index 33886f997d7..4eba1c9378d 100644 --- a/code/datums/underwear/undershirts.dm +++ b/code/datums/underwear/undershirts.dm @@ -8,6 +8,11 @@ icon_state = "undershirt" has_color = TRUE +/datum/category_item/underwear/undershirt/shirt_long + name = "Longsleeve Shirt" + icon_state = "undershirt_long" + has_color = TRUE + /datum/category_item/underwear/undershirt/tank_top name = "Tank top" icon_state = "tanktop" @@ -62,4 +67,20 @@ /datum/category_item/underwear/undershirt/shirt_blue_striped name = "Shirt, blue stripes" - icon_state = "shirt_stripes_s" \ No newline at end of file + icon_state = "shirt_stripes_s" + +/datum/category_item/underwear/undershirt/bowling + name = "Bowling Shirt, Red" + icon_state = "bowling" + +/datum/category_item/underwear/undershirt/bowlingp + name = "Bowling Shirt, Pink" + icon_state = "bowlingp" + +/datum/category_item/underwear/undershirt/bowlinga + name = "Bowling Shirt, Aqua" + icon_state = "bowlinga" + +/datum/category_item/underwear/undershirt/bowlingw + name = "Bowling Shirt, White" + icon_state = "bowlingw" \ No newline at end of file diff --git a/code/datums/weakref.dm b/code/datums/weakref.dm new file mode 100644 index 00000000000..1a7d844ca87 --- /dev/null +++ b/code/datums/weakref.dm @@ -0,0 +1,31 @@ +/datum + var/weakref/weakref + +/datum/Destroy() + weakref = null // Clear this reference to ensure it's kept for as brief duration as possible. + . = ..() + +//obtain a weak reference to a datum +/proc/weakref(datum/D) + if(D.gcDestroyed) + return + if(!D.weakref) + D.weakref = new/weakref(D) + return D.weakref + +/weakref + var/ref + +/weakref/New(datum/D) + ref = "\ref[D]" + +/weakref/Destroy() + // A weakref datum should not be manually destroyed as it is a shared resource, + // rather it should be automatically collected by the BYOND GC when all references are gone. + return 0 + +/weakref/proc/resolve() + var/datum/D = locate(ref) + if(D && D.weakref == src) + return D + return null \ No newline at end of file diff --git a/code/datums/wires/alarm.dm b/code/datums/wires/alarm.dm index ace1ba9ec35..a665fd75a5c 100644 --- a/code/datums/wires/alarm.dm +++ b/code/datums/wires/alarm.dm @@ -11,7 +11,7 @@ var/const/AALARM_WIRE_AALARM = 16 /datum/wires/alarm/CanUse(var/mob/living/L) var/obj/machinery/alarm/A = holder - if(A.wiresexposed) + if(A.panel_open) return 1 return 0 diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 291cef46822..c1aeca1c309 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -87,7 +87,7 @@ var/global/list/PDA_Manifest = list() heads[++heads.len] = list("name" = name, "rank" = rank, "active" = isactive) department = 1 depthead = 1 - if(rank=="Captain" && heads.len != 1) + if(rank=="Station Administrator" && heads.len != 1) heads.Swap(1,heads.len) if(real_rank in security_positions) @@ -194,7 +194,7 @@ var/global/list/PDA_Manifest = list() name = "beach ball" density = 0 anchored = 0 - w_class = 4 + w_class = ITEMSIZE_LARGE force = 0.0 throwforce = 0.0 throw_speed = 1 diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm index bcf0573367b..57a446cce5d 100644 --- a/code/defines/obj/weapon.dm +++ b/code/defines/obj/weapon.dm @@ -8,7 +8,7 @@ throwforce = 2.0 throw_speed = 1 throw_range = 4 - w_class = 2 + w_class = ITEMSIZE_SMALL attack_verb = list("called", "rang") hitsound = 'sound/weapons/ring.ogg' @@ -22,7 +22,7 @@ anchored = 0.0 var/stored_matter = 0 var/mode = 1 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL /obj/item/weapon/soap name = "soap" @@ -30,7 +30,7 @@ gender = PLURAL icon = 'icons/obj/items.dmi' icon_state = "soap" - w_class = 2.0 + w_class = ITEMSIZE_SMALL throwforce = 0 throw_speed = 4 throw_range = 20 @@ -57,7 +57,7 @@ icon_state = "bike_horn" item_state = "bike_horn" throwforce = 3 - w_class = 2 + w_class = ITEMSIZE_SMALL throw_speed = 3 throw_range = 15 attack_verb = list("HONKED") @@ -70,7 +70,7 @@ icon = 'icons/obj/items.dmi' icon_state = "c_tube" throwforce = 1 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 4 throw_range = 5 @@ -86,7 +86,7 @@ flags = CONDUCT force = 5.0 throwforce = 7.0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 50) attack_verb = list("bludgeoned", "whacked", "disciplined", "thrashed") @@ -148,7 +148,7 @@ desc = "Better keep this safe." icon_state = "nucleardisk" item_state = "card-id" - w_class = 2.0 + w_class = ITEMSIZE_SMALL /* /obj/item/weapon/game_kit @@ -160,7 +160,7 @@ var/data = "" var/base_url = "http://svn.slurm.us/public/spacestation13/misc/game_kit" item_state = "sheet-metal" - w_class = 5.0 + w_class = ITEMSIZE_HUGE */ /obj/item/weapon/gift @@ -171,7 +171,7 @@ var/size = 3.0 var/obj/item/gift = null item_state = "gift" - w_class = 4.0 + w_class = ITEMSIZE_LARGE /obj/item/weapon/legcuffs name = "legcuffs" @@ -181,7 +181,7 @@ icon_state = "handcuff" flags = CONDUCT throwforce = 0 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MATERIAL = 1) var/breakouttime = 300 //Deciseconds = 30s = 0.5 minute sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/handcuffs.dmi') @@ -195,7 +195,7 @@ throwforce = 3.0 throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL attack_verb = list("warned", "cautioned", "smashed") /obj/item/weapon/caution/cone @@ -215,7 +215,7 @@ var/mob/currentUser = null var/obj/item/device/radio/origradio = null flags = CONDUCT | ONBELT - w_class = 2.0 + w_class = ITEMSIZE_SMALL item_state = "radio" throw_speed = 4 throw_range = 20 @@ -236,7 +236,7 @@ slot_flags = SLOT_BELT item_state = "radio" throwforce = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 4 throw_range = 20 matter = list(DEFAULT_WALL_MATERIAL = 100) @@ -255,7 +255,7 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL attack_verb = list("bludgeoned", "whacked", "disciplined") /obj/item/weapon/staff/broom @@ -280,12 +280,12 @@ throwforce = 5.0 throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL /obj/item/weapon/module icon = 'icons/obj/module.dmi' icon_state = "std_module" - w_class = 2.0 + w_class = ITEMSIZE_SMALL item_state = "electronic" flags = CONDUCT var/mtype = 1 // 1=electronic 2=hardware @@ -328,7 +328,7 @@ name = "camera bug" icon = 'icons/obj/device.dmi' icon_state = "flash" - w_class = 1.0 + w_class = ITEMSIZE_TINY item_state = "electronic" throw_speed = 4 throw_range = 20 @@ -365,7 +365,7 @@ icon = 'icons/obj/cigarettes.dmi' icon_state = "cigarpacket" item_state = "cigarpacket" - w_class = 1 + w_class = ITEMSIZE_TINY throwforce = 2 var/cigarcount = 6 flags = ONBELT @@ -385,7 +385,7 @@ name = "rapid part exchange device" desc = "Special mechanical module made to store, sort, and apply standard machine parts." icon_state = "RPED" - w_class = 5 + w_class = ITEMSIZE_HUGE can_hold = list(/obj/item/weapon/stock_parts) storage_slots = 50 use_to_pickup = 1 @@ -393,7 +393,7 @@ allow_quick_empty = 1 collection_mode = 1 display_contents_with_number = 1 - max_w_class = 3 + max_w_class = ITEMSIZE_NORMAL max_storage_space = 100 /obj/item/weapon/stock_parts @@ -401,7 +401,7 @@ desc = "What?" gender = PLURAL icon = 'icons/obj/stock_parts.dmi' - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/rating = 1 /obj/item/weapon/stock_parts/New() diff --git a/code/game/antagonist/mutiny/mutineer.dm b/code/game/antagonist/mutiny/mutineer.dm index c0d764b3be4..eb341e36cfe 100644 --- a/code/game/antagonist/mutiny/mutineer.dm +++ b/code/game/antagonist/mutiny/mutineer.dm @@ -6,7 +6,7 @@ var/datum/antagonist/mutineer/mutineers role_text_plural = "Mutineers" id = MODE_MUTINEER antag_indicator = "mutineer" - restricted_jobs = list("Captain") + restricted_jobs = list("Station Administrator") /datum/antagonist/mutineer/New(var/no_reference) ..() @@ -39,7 +39,7 @@ var/datum/antagonist/mutineer/mutineers proc/get_head_loyalist_candidates() var/list/candidates[0] for(var/mob/loyalist in player_list) - if(loyalist.mind && loyalist.mind.assigned_role == "Captain") + if(loyalist.mind && loyalist.mind.assigned_role == "Station Administrator") candidates.Add(loyalist.mind) return candidates @@ -47,7 +47,7 @@ var/datum/antagonist/mutineer/mutineers var/list/candidates[0] for(var/mob/mutineer in player_list) if(mutineer.client.prefs.be_special & BE_MUTINEER) - for(var/job in command_positions - "Captain") + for(var/job in command_positions - "Station Administrator") if(mutineer.mind && mutineer.mind.assigned_role == job) candidates.Add(mutineer.mind) return candidates diff --git a/code/game/antagonist/outsider/deathsquad.dm b/code/game/antagonist/outsider/deathsquad.dm index 1234bdb1f60..c7e1d010947 100644 --- a/code/game/antagonist/outsider/deathsquad.dm +++ b/code/game/antagonist/outsider/deathsquad.dm @@ -49,7 +49,7 @@ var/datum/antagonist/deathsquad/deathsquad player.equip_to_slot_or_del(new /obj/item/weapon/gun/energy/pulse_rifle(player), slot_r_hand) player.equip_to_slot_or_del(new /obj/item/weapon/rig/ert/assetprotection(player), slot_back) player.equip_to_slot_or_del(new /obj/item/weapon/melee/energy/sword(player), slot_s_store) - player.implant_loyalty() +// player.implant_loyalty() var/obj/item/weapon/card/id/id = create_id("Asset Protection", player) if(id) diff --git a/code/game/antagonist/outsider/ert.dm b/code/game/antagonist/outsider/ert.dm index 29ea3d27c10..658e32e4aad 100644 --- a/code/game/antagonist/outsider/ert.dm +++ b/code/game/antagonist/outsider/ert.dm @@ -13,7 +13,7 @@ var/datum/antagonist/ert/ert and before taking extreme actions, please try to also contact the administration! \ Think through your actions and make the roleplay immersive! Please remember all \ rules aside from those without explicit exceptions apply to the ERT." - leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Captain where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the captain where possible, however." + leader_welcome_text = "As leader of the Emergency Response Team, you answer only to the Company, and have authority to override the Station Administrator where it is necessary to achieve your mission goals. It is recommended that you attempt to cooperate with the Station Administrator where possible, however." landmark_id = "Response Team" id_type = /obj/item/weapon/card/id/centcom/ERT diff --git a/code/game/antagonist/outsider/mercenary.dm b/code/game/antagonist/outsider/mercenary.dm index c27d510d8be..f4d92e4261e 100644 --- a/code/game/antagonist/outsider/mercenary.dm +++ b/code/game/antagonist/outsider/mercenary.dm @@ -41,6 +41,7 @@ var/datum/antagonist/mercenary/mercs if(player.backbag == 2) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(player), slot_back) if(player.backbag == 3) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(player), slot_back) if(player.backbag == 4) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(player), slot_back) + if(player.backbag == 5) player.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(player), slot_back) player.equip_to_slot_or_del(new /obj/item/weapon/storage/box/engineer(player.back), slot_in_backpack) player.equip_to_slot_or_del(new /obj/item/weapon/reagent_containers/pill/cyanide(player), slot_in_backpack) player.mind.tcrystals = DEFAULT_TELECRYSTAL_AMOUNT diff --git a/code/game/antagonist/outsider/raider.dm b/code/game/antagonist/outsider/raider.dm index b420b3d59ed..7bfa22ad437 100644 --- a/code/game/antagonist/outsider/raider.dm +++ b/code/game/antagonist/outsider/raider.dm @@ -55,12 +55,12 @@ var/datum/antagonist/raider/raiders /obj/item/clothing/suit/pirate, /obj/item/clothing/suit/hgpirate, /obj/item/clothing/suit/storage/toggle/bomber, - /obj/item/clothing/suit/storage/leather_jacket, + /obj/item/clothing/suit/storage/toggle/leather_jacket, /obj/item/clothing/suit/storage/toggle/brown_jacket, /obj/item/clothing/suit/storage/toggle/hoodie, /obj/item/clothing/suit/storage/toggle/hoodie/black, /obj/item/clothing/suit/unathi/mantle, - /obj/item/clothing/suit/poncho, + /obj/item/clothing/accessory/poncho, ) var/list/raider_guns = list( diff --git a/code/game/antagonist/outsider/wizard.dm b/code/game/antagonist/outsider/wizard.dm index 14e5f900631..b88af1b1b98 100644 --- a/code/game/antagonist/outsider/wizard.dm +++ b/code/game/antagonist/outsider/wizard.dm @@ -83,6 +83,7 @@ var/datum/antagonist/wizard/wizards if(wizard_mob.backbag == 2) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) if(wizard_mob.backbag == 3) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(wizard_mob), slot_back) if(wizard_mob.backbag == 4) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(wizard_mob), slot_back) + if(wizard_mob.backbag == 5) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(wizard_mob), slot_back) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/storage/box(wizard_mob), slot_in_backpack) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/teleportation_scroll(wizard_mob), slot_r_store) wizard_mob.equip_to_slot_or_del(new /obj/item/weapon/spellbook(wizard_mob), slot_r_hand) diff --git a/code/game/antagonist/station/changeling.dm b/code/game/antagonist/station/changeling.dm index 044e968f496..686de4d8182 100644 --- a/code/game/antagonist/station/changeling.dm +++ b/code/game/antagonist/station/changeling.dm @@ -6,7 +6,7 @@ bantype = "changeling" feedback_tag = "changeling_objective" restricted_jobs = list("AI", "Cyborg") - protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Captain") + protected_jobs = list("Security Officer", "Warden", "Detective", "Head of Security", "Station Administrator") welcome_text = "Use say \"#g message\" to communicate with your fellow changelings. Remember: you get all of their absorbed DNA if you absorb them." flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE antaghud_indicator = "hudchangeling" diff --git a/code/game/antagonist/station/cultist.dm b/code/game/antagonist/station/cultist.dm index 6bb049dcb0b..d3ba6c1ad76 100644 --- a/code/game/antagonist/station/cultist.dm +++ b/code/game/antagonist/station/cultist.dm @@ -11,7 +11,7 @@ var/datum/antagonist/cultist/cult role_text = "Cultist" role_text_plural = "Cultists" bantype = "cultist" - restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Captain") + restricted_jobs = list("Chaplain","AI", "Cyborg", "Internal Affairs Agent", "Head of Security", "Station Administrator") protected_jobs = list("Security Officer", "Warden", "Detective") role_type = BE_CULTIST feedback_tag = "cult_objective" diff --git a/code/game/antagonist/station/revolutionary.dm b/code/game/antagonist/station/revolutionary.dm index 96e37529915..d2efe7262b5 100644 --- a/code/game/antagonist/station/revolutionary.dm +++ b/code/game/antagonist/station/revolutionary.dm @@ -29,7 +29,7 @@ var/datum/antagonist/revolutionary/revs faction_indicator = "rev" faction_invisible = 1 - restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg","Captain", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") + restricted_jobs = list("Internal Affairs Agent", "AI", "Cyborg", "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", "Chief Medical Officer") protected_jobs = list("Security Officer", "Warden", "Detective") /datum/antagonist/revolutionary/New() diff --git a/code/game/antagonist/station/traitor.dm b/code/game/antagonist/station/traitor.dm index acc0bd3d8d1..ae8925be47b 100644 --- a/code/game/antagonist/station/traitor.dm +++ b/code/game/antagonist/station/traitor.dm @@ -3,7 +3,7 @@ var/datum/antagonist/traitor/traitors // Inherits most of its vars from the base datum. /datum/antagonist/traitor id = MODE_TRAITOR - protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Captain") + protected_jobs = list("Security Officer", "Warden", "Detective", "Internal Affairs Agent", "Head of Security", "Station Administrator") flags = ANTAG_SUSPICIOUS | ANTAG_RANDSPAWN | ANTAG_VOTABLE /datum/antagonist/traitor/auto diff --git a/code/game/area/Space Station 13 areas.dm b/code/game/area/Space Station 13 areas.dm index 8905d5fd9a1..19f0d70fc42 100755 --- a/code/game/area/Space Station 13 areas.dm +++ b/code/game/area/Space Station 13 areas.dm @@ -166,7 +166,7 @@ area/space/atmosalert() icon_state = "shuttle2" /area/shuttle/escape/centcom - name = "\improper Emergency Shuttle Centcom" + name = "\improper Emergency Shuttle CentCom" icon_state = "shuttle" /area/shuttle/escape/transit // the area to pass through for 3 minute transit @@ -282,6 +282,7 @@ area/space/atmosalert() /area/shuttle/cryo/station icon_state = "shuttle2" + base_turf = /turf/simulated/mineral/floor/ignore_mapgen /area/shuttle/cryo/centcom icon_state = "shuttle" @@ -290,9 +291,10 @@ area/space/atmosalert() icon_state = "shuttle" /area/shuttle/mining - name = "\improper Mining Shuttle" + name = "\improper Mining Elevator" music = "music/escape.ogg" lighting_use_dynamic = 0 + base_turf = /turf/simulated/mineral/floor/ignore_mapgen /area/shuttle/mining/station icon_state = "shuttle2" @@ -302,7 +304,7 @@ area/space/atmosalert() /area/shuttle/transport1/centcom icon_state = "shuttle" - name = "\improper Transport Shuttle Centcom" + name = "\improper Transport Shuttle CentCom" /area/shuttle/transport1/station icon_state = "shuttle" @@ -344,7 +346,7 @@ area/space/atmosalert() icon_state = "shuttlered2" /area/shuttle/administration/centcom - name = "\improper Administration Shuttle Centcom" + name = "\improper Administration Shuttle CentCom" icon_state = "shuttlered" /area/shuttle/administration/station @@ -352,7 +354,7 @@ area/space/atmosalert() icon_state = "shuttlered2" /area/shuttle/trade/centcom - name = "\improper Trade Shuttle Centcom" + name = "\improper Trade Shuttle CentCom" icon_state = "shuttlered" /area/shuttle/trade/station @@ -388,9 +390,10 @@ area/space/atmosalert() // === Trying to remove these areas: /area/shuttle/research - name = "\improper Research Shuttle" + name = "\improper Research Elevator" music = "music/escape.ogg" lighting_use_dynamic = 0 + base_turf = /turf/simulated/mineral/floor/ignore_mapgen /area/shuttle/research/station icon_state = "shuttle2" @@ -412,34 +415,34 @@ area/space/atmosalert() // CENTCOM /area/centcom - name = "\improper Centcom" + name = "\improper CentCom" icon_state = "centcom" requires_power = 0 lighting_use_dynamic = 0 /area/centcom/control - name = "\improper Centcom Control" + name = "\improper CentCom Control" /area/centcom/evac - name = "\improper Centcom Emergency Shuttle" + name = "\improper CentCom Emergency Shuttle" /area/centcom/suppy - name = "\improper Centcom Supply Shuttle" + name = "\improper CentCom Supply Shuttle" /area/centcom/ferry - name = "\improper Centcom Transport Shuttle" + name = "\improper CentCom Transport Shuttle" /area/centcom/shuttle - name = "\improper Centcom Administration Shuttle" + name = "\improper CentCom Administration Shuttle" /area/centcom/test - name = "\improper Centcom Testing Facility" + name = "\improper CentCom Testing Facility" /area/centcom/living - name = "\improper Centcom Living Quarters" + name = "\improper CentCom Living Quarters" /area/centcom/specops - name = "\improper Centcom Special Ops" + name = "\improper CentCom Special Ops" /area/centcom/creed name = "Creed's Office" @@ -455,15 +458,15 @@ area/space/atmosalert() name = "\improper Tram Station" /area/centcom/security - name = "\improper Centcom Security" + name = "\improper CentCom Security" icon_state = "centcom_security" /area/centcom/medical - name = "\improper Centcom Medical" + name = "\improper CentCom Medical" icon_state = "centcom_medical" /area/centcom/command - name = "\improper Centcom Command" //Central Command Command totally isn't RAS Syndrome in action. + name = "\improper CentCom Command" //Central Command Command totally isn't RAS Syndrome in action. icon_state = "centcom_command" /area/centcom/main_hall @@ -471,15 +474,15 @@ area/space/atmosalert() icon_state = "centcom_hallway1" /area/centcom/bar - name = "\improper Centcom Bar" + name = "\improper CentCom Bar" icon_state = "centcom_crew" /area/centcom/restaurant - name = "\improper Centcom Restaurant" + name = "\improper CentCom Restaurant" icon_state = "centcom_crew" /area/centcom/bathroom - name = "\improper Centcom Bathroom" + name = "\improper CentCom Bathroom" icon_state = "centcom_crew" //SYNDICATES @@ -1137,7 +1140,7 @@ area/space/atmosalert() sound_env = MEDIUM_SOFTFLOOR /area/crew_quarters/captain - name = "\improper Command - Captain's Office" + name = "\improper Command - Station Administrator's Office" icon_state = "captain" sound_env = MEDIUM_SOFTFLOOR @@ -2319,6 +2322,7 @@ area/space/atmosalert() name = "\improper Construction Site Shuttle" icon_state = "yellow" lighting_use_dynamic = 0 + base_turf = /turf/simulated/mineral/floor/ignore_mapgen /area/shuttle/constructionsite/station name = "\improper Construction Site Shuttle" @@ -2527,20 +2531,20 @@ area/space/atmosalert() ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') /area/tcommsat/entrance - name = "\improper Telecoms Teleporter" + name = "\improper Telecomms Teleporter" icon_state = "tcomsatentrance" /area/tcommsat/chamber - name = "\improper Telecoms Central Compartment" + name = "\improper Telecomms Central Compartment" icon_state = "tcomsatcham" /area/tcomsat - name = "\improper Telecoms Satellite" + name = "\improper Telecomms Satellite" icon_state = "tcomsatlob" ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') /area/tcomfoyer - name = "\improper Telecoms Foyer" + name = "\improper Telecomms Foyer" icon_state = "tcomsatentrance" ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') @@ -2555,7 +2559,7 @@ area/space/atmosalert() ambience = list('sound/ambience/ambisin2.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/signal.ogg', 'sound/ambience/ambigen10.ogg') /area/tcommsat/computer - name = "\improper Telecoms Control Room" + name = "\improper Telecomms Control Room" icon_state = "tcomsatcomp" /area/tcommsat/lounge @@ -2627,7 +2631,7 @@ area/space/atmosalert() requires_power = 0 /area/awaymission/spacebattle/cruiser - name = "\improper Nanotrasen Cruiser" + name = "\improper NanoTrasen Cruiser" /area/awaymission/spacebattle/syndicate1 name = "\improper Syndicate Assault Ship 1" diff --git a/code/game/atoms.dm b/code/game/atoms.dm index 33f0635015d..474b2d3b251 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -463,11 +463,11 @@ its easier to just keep the beam vertical. //spawn(0) //if(I) //It's possible that it could be deleted in the meantime. var/obj/O = I - O.show_message( message, 1, blind_message, 2) + O.show_message(message, 1, blind_message, 2) else if(ismob(I)) var/mob/M = I if(M.see_invisible >= invisibility) // Cannot view the invisible - M.show_message( message, 1, blind_message, 2) + M.show_message(message, 1, blind_message, 2) else if (blind_message) M.show_message(blind_message, 2) @@ -488,7 +488,24 @@ its easier to just keep the beam vertical. spawn(0) if(I) //It's possible that it could be deleted in the meantime. var/obj/O = I - O.show_message( message, 2, deaf_message, 1) + O.show_message(message, 2, deaf_message, 1) else if(ismob(I)) var/mob/M = I - M.show_message( message, 2, deaf_message, 1) + M.show_message(message, 2, deaf_message, 1) + +/atom/movable/proc/dropInto(var/atom/destination) + while(istype(destination)) + var/atom/drop_destination = destination.onDropInto(src) + if(!istype(drop_destination) || drop_destination == destination) + return forceMove(destination) + destination = drop_destination + return forceMove(null) + +/atom/proc/onDropInto(var/atom/movable/AM) + return // If onDropInto returns null, then dropInto will forceMove AM into us. + +/atom/movable/onDropInto(var/atom/movable/AM) + return loc // If onDropInto returns something, then dropInto will attempt to drop AM there. + +/atom/proc/InsertedContents() + return contents diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index e45be4bb6a6..37ed21016cf 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1,5 +1,6 @@ /atom/movable layer = 3 + appearance_flags = TILE_BOUND var/last_move = null var/anchored = 0 // var/elevation = 2 - not used anywhere @@ -63,13 +64,35 @@ return /atom/movable/proc/forceMove(atom/destination) + if(loc == destination) + return 0 + var/is_origin_turf = isturf(loc) + var/is_destination_turf = isturf(destination) + // It is a new area if: + // Both the origin and destination are turfs with different areas. + // When either origin or destination is a turf and the other is not. + var/is_new_area = (is_origin_turf ^ is_destination_turf) || (is_origin_turf && is_destination_turf && loc.loc != destination.loc) + + var/atom/origin = loc + loc = destination + + if(origin) + origin.Exited(src, destination) + if(is_origin_turf) + for(var/atom/movable/AM in origin) + AM.Uncrossed(src) + if(is_new_area && is_origin_turf) + origin.loc.Exited(src, destination) + if(destination) - if(loc) - loc.Exited(src) - loc = destination - loc.Entered(src) - return 1 - return 0 + destination.Entered(src, origin) + if(is_destination_turf) // If we're entering a turf, cross all movable atoms + for(var/atom/movable/AM in loc) + if(AM != src) + AM.Crossed(src) + if(is_new_area && is_destination_turf) + destination.loc.Entered(src, origin) + return 1 //called when src is thrown into hit_atom /atom/movable/proc/throw_impact(atom/hit_atom, var/speed) diff --git a/code/game/dna/dna_modifier.dm b/code/game/dna/dna_modifier.dm index 3138c654394..e06f774a834 100644 --- a/code/game/dna/dna_modifier.dm +++ b/code/game/dna/dna_modifier.dm @@ -209,7 +209,7 @@ /obj/machinery/computer/scan_consolenew name = "DNA Modifier Access Console" - desc = "Scand DNA." + desc = "Scan DNA." icon = 'icons/obj/computer.dmi' icon_keyboard = "med_key" icon_screen = "dna" diff --git a/code/game/gamemodes/changeling/changeling.dm b/code/game/gamemodes/changeling/changeling.dm index 0275f70b282..13b8db962dd 100644 --- a/code/game/gamemodes/changeling/changeling.dm +++ b/code/game/gamemodes/changeling/changeling.dm @@ -12,7 +12,7 @@ certain though... there is never just one of them. Good luck." config_tag = "changeling" required_players = 2 - required_players_secret = 2 + required_players_secret = 3 required_enemies = 1 end_on_antag_death = 0 antag_scaling_coeff = 10 diff --git a/code/game/gamemodes/changeling/generic_equip_procs.dm b/code/game/gamemodes/changeling/generic_equip_procs.dm index 930e50c9c84..e8ed12a446b 100644 --- a/code/game/gamemodes/changeling/generic_equip_procs.dm +++ b/code/game/gamemodes/changeling/generic_equip_procs.dm @@ -1,24 +1,34 @@ //This is a generic proc that should be called by other ling armor procs to equip them. -/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type) - var/datum/changeling/changeling = changeling_power(20,1,100,CONSCIOUS) - if(!changeling) - return +/mob/proc/changeling_generic_armor(var/armor_type, var/helmet_type, var/boot_type, var/chem_cost) if(!ishuman(src)) return 0 var/mob/living/carbon/human/M = src + if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type)) + chem_cost = 0 + + var/datum/changeling/changeling = changeling_power(chem_cost, 1, 100, CONSCIOUS) + + if(!changeling) + return + //First, check if we're already wearing the armor, and if so, take it off. - if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type)) + if(istype(M.wear_suit, armor_type) || istype(M.head, helmet_type) || istype(M.shoes, boot_type)) M.visible_message("[M] casts off their [M.wear_suit.name]!", "We cast off our [M.wear_suit.name]", "You hear the organic matter ripping and tearing!") - qdel(M.wear_suit) - qdel(M.head) + if(istype(M.wear_suit, armor_type)) + qdel(M.wear_suit) + if(istype(M.head, helmet_type)) + qdel(M.head) + if(istype(M.shoes, boot_type)) + qdel(M.shoes) M.update_inv_wear_suit() M.update_inv_head() M.update_hair() + M.update_inv_shoes() return 1 if(M.head || M.wear_suit) //Make sure our slots aren't full @@ -31,11 +41,15 @@ var/obj/item/clothing/suit/H = new helmet_type(src) src.equip_to_slot_or_del(H, slot_head) - src.mind.changeling.chem_charges -= 20 + var/obj/item/clothing/shoes/B = new boot_type(src) + src.equip_to_slot_or_del(B, slot_shoes) + + src.mind.changeling.chem_charges -= chem_cost playsound(src, 'sound/effects/blobattack.ogg', 30, 1) M.update_inv_wear_suit() M.update_inv_head() M.update_hair() + M.update_inv_shoes() return 1 /mob/proc/changeling_generic_equip_all_slots(var/list/stuff_to_equip, var/cost) diff --git a/code/game/gamemodes/changeling/powers/armblade.dm b/code/game/gamemodes/changeling/powers/armblade.dm index d50f4a967a4..f241f418407 100644 --- a/code/game/gamemodes/changeling/powers/armblade.dm +++ b/code/game/gamemodes/changeling/powers/armblade.dm @@ -15,7 +15,6 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/melee/arm_blade/greater)) src << "We prepare an extra sharp blade." - src.mind.changeling.recursive_enhancement = 0 return 1 else @@ -28,7 +27,7 @@ desc = "A grotesque blade made out of bone and flesh that cleaves through people as a hot knife through butter." icon = 'icons/obj/weapons.dmi' icon_state = "arm_blade" - w_class = 5.0 + w_class = ITEMSIZE_HUGE force = 40 sharp = 1 edge = 1 @@ -68,6 +67,10 @@ creator = null ..() +/obj/item/weapon/melee/arm_blade/suicide_act(mob/user) + viewers(user) << "[user] is impaling \himself the [src.name]! It looks like \he's trying to commit suicide." + return(BRUTELOSS) + /obj/item/weapon/melee/arm_blade/process() //Stolen from ninja swords. if(!creator || loc != creator || !creator.item_is_in_hands(src)) // Tidy up a bit. diff --git a/code/game/gamemodes/changeling/powers/armor.dm b/code/game/gamemodes/changeling/powers/armor.dm index 87a3eee4493..ac98f15c40f 100644 --- a/code/game/gamemodes/changeling/powers/armor.dm +++ b/code/game/gamemodes/changeling/powers/armor.dm @@ -2,14 +2,14 @@ name = "Organic Space Suit" desc = "We grow an organic suit to protect ourselves from space exposure." helptext = "To remove the suit, use the ability again." - ability_icon_state = "lingspacesuit" + ability_icon_state = "ling_space_suit" genomecost = 1 verbpath = /mob/proc/changeling_spacesuit /mob/proc/changeling_spacesuit() set category = "Changeling" set name = "Organic Space Suit (20)" - if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling)) + if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling,/obj/item/clothing/head/helmet/space/changeling,/obj/item/clothing/shoes/magboots/changeling, 20)) return 1 return 0 @@ -17,7 +17,7 @@ name = "Chitinous Spacearmor" desc = "We turn our skin into tough chitin to protect us from damage and space exposure." helptext = "To remove the armor, use the ability again." - ability_icon_state = "lingarmor" + ability_icon_state = "ling_armor" genomecost = 3 verbpath = /mob/proc/changeling_spacearmor @@ -25,7 +25,7 @@ set category = "Changeling" set name = "Organic Spacearmor (20)" - if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored)) + if(changeling_generic_armor(/obj/item/clothing/suit/space/changeling/armored,/obj/item/clothing/head/helmet/space/changeling/armored,/obj/item/clothing/shoes/magboots/changeling/armored, 20)) return 1 return 0 @@ -63,6 +63,36 @@ /obj/item/clothing/head/helmet/space/changeling/dropped() qdel(src) +/obj/item/clothing/shoes/magboots/changeling + desc = "A suction cupped mass of flesh, shaped like a foot." + name = "fleshy grippers" + icon_state = "lingspacesuit" + action_button_name = "Toggle Grippers" + canremove = 0 + +/obj/item/clothing/shoes/magboots/changeling/set_slowdown() + slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster. + if (magpulse) + slowdown += 1 //It's already tied to a slowdown suit, 6 slowdown is huge. + +/obj/item/clothing/shoes/magboots/changeling/attack_self(mob/user) + if(magpulse) + item_flags &= ~NOSLIP + magpulse = 0 + set_slowdown() + force = 3 + user << "We release our grip on the floor." + else + item_flags |= NOSLIP + magpulse = 1 + set_slowdown() + force = 5 + user << "We cling to the terrain below us." + +/obj/item/clothing/shoes/magboots/changeling/dropped() + ..() + qdel(src) + //Armor /obj/item/clothing/suit/space/changeling/armored @@ -96,6 +126,16 @@ /obj/item/clothing/head/helmet/space/changeling/armored/dropped() qdel(src) +/obj/item/clothing/shoes/magboots/changeling/armored + desc = "A tough, hard mass of chitin, with long talons for digging into terrain." + name = "chitinous talons" + icon_state = "lingarmor" + action_button_name = "Toggle Talons" + +/obj/item/clothing/shoes/magboots/changeling/armored/dropped() + ..() + qdel(src) + /obj/item/clothing/gloves/combat/changeling //Combined insulated/fireproof gloves name = "chitinous gauntlets" desc = "Very resilient gauntlets made out of black chitin. It looks very durable, and can probably resist electrical shock in addition to the elements." diff --git a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm index bfe97bf19e1..8a595f8d9e1 100644 --- a/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm +++ b/code/game/gamemodes/changeling/powers/bioelectrogenesis.dm @@ -26,7 +26,6 @@ if(src.mind.changeling.recursive_enhancement) if(changeling_generic_weapon(/obj/item/weapon/electric_hand/efficent)) src << "We will shock others more efficently." - src.mind.changeling.recursive_enhancement = 0 return 1 else if(changeling_generic_weapon(/obj/item/weapon/electric_hand,0)) //Chemical cost is handled in the equip proc. diff --git a/code/game/gamemodes/changeling/powers/blind_sting.dm b/code/game/gamemodes/changeling/powers/blind_sting.dm index ceb6e00ae17..a9f9d2346ec 100644 --- a/code/game/gamemodes/changeling/powers/blind_sting.dm +++ b/code/game/gamemodes/changeling/powers/blind_sting.dm @@ -21,7 +21,6 @@ if(src.mind.changeling.recursive_enhancement) duration = duration + 150 src << "They will be deprived of sight for longer." - src.mind.changeling.recursive_enhancement = 0 spawn(duration) T.disabilities &= ~NEARSIGHTED T.eye_blind = 10 diff --git a/code/game/gamemodes/changeling/powers/boost_range.dm b/code/game/gamemodes/changeling/powers/boost_range.dm index 65cdc00ca21..fd15d94daec 100644 --- a/code/game/gamemodes/changeling/powers/boost_range.dm +++ b/code/game/gamemodes/changeling/powers/boost_range.dm @@ -23,7 +23,6 @@ if(src.mind.changeling.recursive_enhancement) range = range + 3 src << "We can fire our next sting from five squares away." - src.mind.changeling.recursive_enhancement = 0 changeling.sting_range = range src.verbs -= /mob/proc/changeling_boost_range spawn(5) diff --git a/code/game/gamemodes/changeling/powers/cryo_sting.dm b/code/game/gamemodes/changeling/powers/cryo_sting.dm index ee11371dacd..681e46e737c 100644 --- a/code/game/gamemodes/changeling/powers/cryo_sting.dm +++ b/code/game/gamemodes/changeling/powers/cryo_sting.dm @@ -20,7 +20,6 @@ if(src.mind.changeling.recursive_enhancement) inject_amount = inject_amount * 1.5 src << "We inject extra chemicals." - src.mind.changeling.recursive_enhancement = 0 if(T.reagents) T.reagents.add_reagent("cryotoxin", inject_amount) feedback_add_details("changeling_powers","CS") diff --git a/code/game/gamemodes/changeling/powers/deaf_sting.dm b/code/game/gamemodes/changeling/powers/deaf_sting.dm index 0bf5d0f326d..fcf5bfab7d7 100644 --- a/code/game/gamemodes/changeling/powers/deaf_sting.dm +++ b/code/game/gamemodes/changeling/powers/deaf_sting.dm @@ -19,7 +19,6 @@ if(src.mind.changeling.recursive_enhancement) duration = duration + 100 src << "They will be unable to hear for a little longer." - src.mind.changeling.recursive_enhancement = 0 T << "Your ears pop and begin ringing loudly!" T.sdisabilities |= DEAF spawn(duration) T.sdisabilities &= ~DEAF diff --git a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm index c1152e8364c..4a50140003b 100644 --- a/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm +++ b/code/game/gamemodes/changeling/powers/delayed_toxin_sting.dm @@ -20,7 +20,6 @@ if(src.mind.changeling.recursive_enhancement) i = i * 2 src << "Our toxin will be extra potent, when it strikes." - src.mind.changeling.recursive_enhancement = 0 spawn(2 MINUTES) if(T) //We might not exist in two minutes, for whatever reason. T << "You feel a burning sensation flowing through your veins!" diff --git a/code/game/gamemodes/changeling/powers/enfeebling_string.dm b/code/game/gamemodes/changeling/powers/enfeebling_string.dm index 240cac473d7..9584da1e55b 100644 --- a/code/game/gamemodes/changeling/powers/enfeebling_string.dm +++ b/code/game/gamemodes/changeling/powers/enfeebling_string.dm @@ -23,7 +23,6 @@ if(src.mind.changeling.recursive_enhancement) effect = effect + 20 src << "We make them extremely weak." - src.mind.changeling.recursive_enhancement = 0 var/health_to_take_away = H.maxHealth * (effect / 100) H.maxHealth -= health_to_take_away diff --git a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm index 9c28fcadc42..3875a4b4fa5 100644 --- a/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm +++ b/code/game/gamemodes/changeling/powers/epinephrine_overdose.dm @@ -31,7 +31,6 @@ if(src.mind.changeling.recursive_enhancement) src << "We feel unstoppable." - src.mind.changeling.recursive_enhancement = 0 spawn(1) var/i = 30 while(i) diff --git a/code/game/gamemodes/changeling/powers/fleshmend.dm b/code/game/gamemodes/changeling/powers/fleshmend.dm index 0502a35f28e..f7760e9ce6a 100644 --- a/code/game/gamemodes/changeling/powers/fleshmend.dm +++ b/code/game/gamemodes/changeling/powers/fleshmend.dm @@ -23,7 +23,6 @@ if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 src << "We will heal much faster." - src.mind.changeling.recursive_enhancement = 0 spawn(0) src << "We begin to heal ourselves." diff --git a/code/game/gamemodes/changeling/powers/panacea.dm b/code/game/gamemodes/changeling/powers/panacea.dm index 09c026aadbe..055cf3e28ba 100644 --- a/code/game/gamemodes/changeling/powers/panacea.dm +++ b/code/game/gamemodes/changeling/powers/panacea.dm @@ -32,7 +32,6 @@ if(src.mind.changeling.recursive_enhancement) heal_amount = heal_amount * 2 src << "We will heal much faster." - src.mind.changeling.recursive_enhancement = 0 for(var/i = 0, i<10,i++) if(C) diff --git a/code/game/gamemodes/changeling/powers/rapid_regen.dm b/code/game/gamemodes/changeling/powers/rapid_regen.dm index 1688c81f317..eddf83292ed 100644 --- a/code/game/gamemodes/changeling/powers/rapid_regen.dm +++ b/code/game/gamemodes/changeling/powers/rapid_regen.dm @@ -25,7 +25,6 @@ if(src.mind.changeling.recursive_enhancement) healing_amount = C.maxHealth src << "We completely heal ourselves." - src.mind.changeling.recursive_enhancement = 0 spawn(0) C.adjustBruteLoss(-healing_amount) C.adjustFireLoss(-healing_amount) @@ -33,6 +32,7 @@ C.adjustCloneLoss(-healing_amount) C.adjustBrainLoss(-healing_amount) C.restore_blood() + C.species.create_organs(C) C.restore_all_organs() C.blinded = 0 C.eye_blind = 0 diff --git a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm index 9b42ee68e0d..9362333c57c 100644 --- a/code/game/gamemodes/changeling/powers/recursive_enhancement.dm +++ b/code/game/gamemodes/changeling/powers/recursive_enhancement.dm @@ -1,6 +1,6 @@ /datum/power/changeling/recursive_enhancement name = "Recursive Enhancement" - desc = "We cause our next ability use to have increased or additional effects." + desc = "We cause our abilities to have increased or additional effects." helptext = "To check the effects for each ability, check the blue text underneath the ability in the evolution menu." ability_icon_state = "ling_recursive_enhancement" genomecost = 3 @@ -9,16 +9,16 @@ //Increases macimum chemical storage /mob/proc/changeling_recursive_enhancement() set category = "Changeling" - set name = "Recursive Enhancement (10)" - set desc = "Empowers our next ability." - var/datum/changeling/changeling = changeling_power(10,0,100,UNCONSCIOUS) + set name = "Recursive Enhancement" + set desc = "Empowers our abilities." + var/datum/changeling/changeling = changeling_power(0,0,100,UNCONSCIOUS) if(!changeling) return 0 if(src.mind.changeling.recursive_enhancement) - src << "We have already prepared to enhance our next ability." + src << "We will no longer empower our abilities." + src.mind.changeling.recursive_enhancement = 0 return 0 - src << "We empower ourselves. Our next ability will be extra potent." + src << "We empower ourselves. Our abilities will now be extra potent." src.mind.changeling.recursive_enhancement = 1 - src.mind.changeling.chem_charges -= 10 feedback_add_details("changeling_powers","RE") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/respec.dm b/code/game/gamemodes/changeling/powers/respec.dm index 661a761d8c1..7910ceaf7c5 100644 --- a/code/game/gamemodes/changeling/powers/respec.dm +++ b/code/game/gamemodes/changeling/powers/respec.dm @@ -12,6 +12,8 @@ ling_datum.purchased_powers = list() //Then wipe all the powers we bought. ling_datum.geneticpoints = ling_datum.max_geneticpoints //Now refund our points to the maximum. ling_datum.chem_recharge_rate = 0.5 //If glands were bought, revert that upgrade. + src.mind.changeling.recursive_enhancement = 0 //Ensures this is cleared + ling_datum.chem_storage = 50 if(ishuman(src)) var/mob/living/carbon/human/H = src diff --git a/code/game/gamemodes/changeling/powers/revive.dm b/code/game/gamemodes/changeling/powers/revive.dm index 3953caa5252..2f0b9c57e75 100644 --- a/code/game/gamemodes/changeling/powers/revive.dm +++ b/code/game/gamemodes/changeling/powers/revive.dm @@ -27,17 +27,19 @@ C.radiation = 0 C.heal_overall_damage(C.getBruteLoss(), C.getFireLoss()) C.reagents.clear_reagents() - C.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above. if(ishuman(C)) var/mob/living/carbon/human/H = src + H.species.create_organs(H) + H.restore_all_organs(ignore_prosthetic_prefs=1) //Covers things like fractures and other things not covered by the above. H.restore_blood() H.mutations.Remove(HUSK) H.status_flags -= DISFIGURED H.update_body(1) for(var/limb in H.organs_by_name) var/obj/item/organ/external/current_limb = H.organs_by_name[limb] - current_limb.undislocate() - current_limb.open = 0 + if(current_limb) + current_limb.undislocate() + current_limb.open = 0 C.halloss = 0 C.shock_stage = 0 //Pain diff --git a/code/game/gamemodes/changeling/powers/shriek.dm b/code/game/gamemodes/changeling/powers/shriek.dm index 24d024467a7..b9303a3a816 100644 --- a/code/game/gamemodes/changeling/powers/shriek.dm +++ b/code/game/gamemodes/changeling/powers/shriek.dm @@ -40,7 +40,6 @@ if(src.mind.changeling.recursive_enhancement) range = range * 2 src << "We are extra loud." - src.mind.changeling.recursive_enhancement = 0 for(var/mob/living/M in range(range, src)) if(iscarbon(M)) diff --git a/code/game/gamemodes/changeling/powers/silence_sting.dm b/code/game/gamemodes/changeling/powers/silence_sting.dm index c16d74ff599..9ebe8adf7ca 100644 --- a/code/game/gamemodes/changeling/powers/silence_sting.dm +++ b/code/game/gamemodes/changeling/powers/silence_sting.dm @@ -19,7 +19,6 @@ if(src.mind.changeling.recursive_enhancement) duration = duration + 10 src << "They will be unable to cry out in fear for a little longer." - src.mind.changeling.recursive_enhancement = 0 T.silent += duration feedback_add_details("changeling_powers","SS") return 1 \ No newline at end of file diff --git a/code/game/gamemodes/changeling/powers/visible_camouflage.dm b/code/game/gamemodes/changeling/powers/visible_camouflage.dm index 99bb7762fa5..00e31cc932d 100644 --- a/code/game/gamemodes/changeling/powers/visible_camouflage.dm +++ b/code/game/gamemodes/changeling/powers/visible_camouflage.dm @@ -39,7 +39,6 @@ if(src.mind.changeling.recursive_enhancement) H.invisibility = INVISIBILITY_OBSERVER src << "We are now truly invisible." - src.mind.changeling.recursive_enhancement = 0 while(H.m_intent == "walk" && H.mind.changeling.cloaked && !H.stat) //This loop will keep going until the player uncloaks. if(mind.changeling.chem_recharge_rate != 0) //Without this, there is an exploit that can be done, if one buys engorged chem sacks while cloaked. diff --git a/code/game/gamemodes/cult/cult_items.dm b/code/game/gamemodes/cult/cult_items.dm index 20b49bb7f8a..ac3e5c3d613 100644 --- a/code/game/gamemodes/cult/cult_items.dm +++ b/code/game/gamemodes/cult/cult_items.dm @@ -2,7 +2,7 @@ name = "cult blade" desc = "An arcane weapon wielded by the followers of Nar-Sie." icon_state = "cultblade" - w_class = 4 + w_class = ITEMSIZE_LARGE force = 30 throwforce = 10 hitsound = 'sound/weapons/bladeslice.ogg' @@ -105,7 +105,7 @@ name = "cult armour" icon_state = "cult_armour" desc = "A bulky suit of armour, bristling with spikes. It looks space-worthy." - w_class = 3 + w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/weapon/book/tome,/obj/item/weapon/melee/cultblade,/obj/item/weapon/tank/emergency_oxygen,/obj/item/device/suit_cooling_unit) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 30, bio = 30, rad = 30) diff --git a/code/game/gamemodes/cult/ritual.dm b/code/game/gamemodes/cult/ritual.dm index 853d3f02dc4..ca1d5639e90 100644 --- a/code/game/gamemodes/cult/ritual.dm +++ b/code/game/gamemodes/cult/ritual.dm @@ -183,7 +183,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," icon_state ="tome" throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL unique = 1 var/tomedat = "" var/list/words = list("ire" = "ire", "ego" = "ego", "nahlizet" = "nahlizet", "certum" = "certum", "veri" = "veri", "jatkaa" = "jatkaa", "balaq" = "balaq", "mgar" = "mgar", "karazet" = "karazet", "geeri" = "geeri") @@ -434,7 +434,7 @@ var/global/list/rnwords = list("ire","ego","nahlizet","certum","veri","jatkaa"," return /obj/item/weapon/book/tome/imbued //admin tome, spawns working runes without waiting - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/cultistsonly = 1 attack_self(mob/user as mob) if(src.cultistsonly && !iscultist(usr)) diff --git a/code/game/gamemodes/cult/runes.dm b/code/game/gamemodes/cult/runes.dm index 91d802c8bf5..84251050203 100644 --- a/code/game/gamemodes/cult/runes.dm +++ b/code/game/gamemodes/cult/runes.dm @@ -273,6 +273,21 @@ var/list/sacrificed = list() for (,drain>0,drain-=5) sleep(2) user.heal_organ_damage(5, 0) + if(ishuman(user)) + var/mob/living/carbon/human/H = user + for(var/obj/item/organ/I in H.internal_organs) + if(I.damage > 0) + I.damage = max(I.damage - 5, 0) //Heals 5 damage per organ per use + if(I.damage <= 5 && I.organ_tag == O_EYES) + H.sdisabilities &= ~BLIND + for(var/obj/item/organ/E in H.bad_external_organs) + var/obj/item/organ/external/affected = E + if((affected.damage < affected.min_broken_damage * config.organ_health_multiplier) && (affected.status & ORGAN_BROKEN)) + affected.status &= ~ORGAN_BROKEN + for(var/datum/wound/W in affected.wounds) + if(istype(W, /datum/wound/internal_bleeding)) + affected.wounds -= W + affected.update_damages() return diff --git a/code/game/gamemodes/events.dm b/code/game/gamemodes/events.dm index 4bf9e808ddc..797dddc8749 100644 --- a/code/game/gamemodes/events.dm +++ b/code/game/gamemodes/events.dm @@ -301,9 +301,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
" - M << "THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
" - M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]") + M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]") if(6) M << "
" M << "THE STATION IS BUILT FOR [who2]...LAWS UPDATED" diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 4c390e7c690..7c1f4229872 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -288,7 +288,7 @@ var/global/datum/controller/gameticker/ticker var/captainless=1 for(var/mob/living/carbon/human/player in player_list) if(player && player.mind && player.mind.assigned_role) - if(player.mind.assigned_role == "Captain") + if(player.mind.assigned_role == "Station Administrator") captainless=0 if(!player_is_antag(player.mind, only_offstation_roles = 1)) job_master.EquipRank(player, player.mind.assigned_role, 0) @@ -297,7 +297,7 @@ var/global/datum/controller/gameticker/ticker if(captainless) for(var/mob/M in player_list) if(!istype(M,/mob/new_player)) - M << "Captainship not forced on anyone." + M << "Station Administratorship not forced on anyone." proc/process() diff --git a/code/game/gamemodes/newobjective.dm b/code/game/gamemodes/newobjective.dm index e8ea12b84bb..2c69bb3543f 100644 --- a/code/game/gamemodes/newobjective.dm +++ b/code/game/gamemodes/newobjective.dm @@ -264,7 +264,7 @@ datum target = targeta job = joba weight = get_points(job) - explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the Centcom station alive. We'll handle the rest from there." + explanation_text = "Frame [target.current.real_name], the [target.assigned_role] for a crime and make sure they are arrested and brought back to the CentCom station alive. We'll handle the rest from there." check_completion() if(!emergency_shuttle.returned()) @@ -564,7 +564,7 @@ datum captainslaser steal_target = /obj/item/weapon/gun/energy/captain - explanation_text = "Steal the captain's antique laser gun." + explanation_text = "Steal the station administrator's antique laser gun." weight = 20 get_points(var/job) diff --git a/code/game/gamemodes/ninja/ninja.dm b/code/game/gamemodes/ninja/ninja.dm index 7b0379cbc2b..f17b6934556 100644 --- a/code/game/gamemodes/ninja/ninja.dm +++ b/code/game/gamemodes/ninja/ninja.dm @@ -9,8 +9,8 @@ the omniscience of the AI and rival the most hardened weapons your station is capable of. Tread lightly and \ only hope this unknown assassin isn't here for you." config_tag = "ninja" - required_players = 1 - required_players_secret = 1 + required_players = 5 + required_players_secret = 5 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_NINJA) \ No newline at end of file diff --git a/code/game/gamemodes/nuclear/pinpointer.dm b/code/game/gamemodes/nuclear/pinpointer.dm index 63832b809ce..5d67b6eece4 100644 --- a/code/game/gamemodes/nuclear/pinpointer.dm +++ b/code/game/gamemodes/nuclear/pinpointer.dm @@ -4,7 +4,7 @@ icon_state = "pinoff" flags = CONDUCT slot_flags = SLOT_BELT - w_class = 2.0 + w_class = ITEMSIZE_SMALL item_state = "electronic" throw_speed = 4 throw_range = 20 diff --git a/code/game/gamemodes/objective.dm b/code/game/gamemodes/objective.dm index f5dd1efe5fd..a6a2df47f3e 100644 --- a/code/game/gamemodes/objective.dm +++ b/code/game/gamemodes/objective.dm @@ -423,11 +423,11 @@ datum/objective/steal var/target_name var/global/possible_items[] = list( - "the captain's antique laser gun" = /obj/item/weapon/gun/energy/captain, + "the station administrator's antique laser gun" = /obj/item/weapon/gun/energy/captain, "a hand teleporter" = /obj/item/weapon/hand_tele, "an RCD" = /obj/item/weapon/rcd, "a jetpack" = /obj/item/weapon/tank/jetpack, - "a captain's jumpsuit" = /obj/item/clothing/under/rank/captain, + "a station administrator's jumpsuit" = /obj/item/clothing/under/rank/captain, "a functional AI" = /obj/item/device/aicard, "a pair of magboots" = /obj/item/clothing/shoes/magboots, "the station blueprints" = /obj/item/blueprints, @@ -441,7 +441,7 @@ datum/objective/steal "a head of security's jumpsuit" = /obj/item/clothing/under/rank/head_of_security, "a head of personnel's jumpsuit" = /obj/item/clothing/under/rank/head_of_personnel, "the hypospray" = /obj/item/weapon/reagent_containers/hypospray, - "the captain's pinpointer" = /obj/item/weapon/pinpointer, + "the station administrator's pinpointer" = /obj/item/weapon/pinpointer, "an ablative armor vest" = /obj/item/clothing/suit/armor/laserproof, ) diff --git a/code/game/gamemodes/revolution/revolution.dm b/code/game/gamemodes/revolution/revolution.dm index 98fc360160f..54f75a0032f 100644 --- a/code/game/gamemodes/revolution/revolution.dm +++ b/code/game/gamemodes/revolution/revolution.dm @@ -8,6 +8,5 @@ required_enemies = 3 auto_recall_shuttle = 0 //un-wanted on polaris end_on_antag_death = 0 - shuttle_delay = 3 antag_tags = list(MODE_REVOLUTIONARY, MODE_LOYALIST) require_all_templates = 1 diff --git a/code/game/gamemodes/technomancer/assistance/assistance.dm b/code/game/gamemodes/technomancer/assistance/assistance.dm index 786a7f0b851..8779824896b 100644 --- a/code/game/gamemodes/technomancer/assistance/assistance.dm +++ b/code/game/gamemodes/technomancer/assistance/assistance.dm @@ -11,7 +11,7 @@ obj_path = /obj/item/weapon/antag_spawner/technomancer_apprentice /obj/item/weapon/antag_spawner - w_class = 1 + w_class = ITEMSIZE_TINY var/used = 0 /obj/item/weapon/antag_spawner/proc/spawn_antag(client/C, turf/T) diff --git a/code/game/gamemodes/technomancer/catalog.dm b/code/game/gamemodes/technomancer/catalog.dm index c253d441995..74019d7149f 100644 --- a/code/game/gamemodes/technomancer/catalog.dm +++ b/code/game/gamemodes/technomancer/catalog.dm @@ -27,7 +27,7 @@ var/list/all_technomancer_assistance = typesof(/datum/technomancer/assistance) - requisition various things from.. where ever they came from." icon = 'icons/obj/storage.dmi' icon_state ="scientology" //placeholder - w_class = 2 + w_class = ITEMSIZE_SMALL var/budget = 1000 var/max_budget = 1000 var/mob/living/carbon/human/owner = null diff --git a/code/game/gamemodes/technomancer/clothing.dm b/code/game/gamemodes/technomancer/clothing.dm index ef243aa484b..3c3c79d58e0 100644 --- a/code/game/gamemodes/technomancer/clothing.dm +++ b/code/game/gamemodes/technomancer/clothing.dm @@ -9,27 +9,30 @@ /obj/item/clothing/under/technomancer name = "initiate's jumpsuit" - desc = "It's a blue colored jumpsuit. There appears to be light-weight armor padding underneath, providing some protection." + desc = "It's a blue colored jumpsuit. There appears to be light-weight armor padding underneath, providing some protection. \ + There is also a healthy amount of insulation underneath." icon_state = "initiate" armor = list(melee = 10, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0) - siemens_coefficient = 0.9 + siemens_coefficient = 0.3 /obj/item/clothing/under/technomancer/apprentice name = "apprentice's jumpsuit" desc = "It's a blue colored jumpsuit with some silver markings. There appears to be light-weight armor padding \ - underneath, providing some protection." + underneath, providing some protection. There is also a healthy amount of insulation underneath." icon_state = "apprentice" /obj/item/clothing/under/technomancer/master name = "master's jumpsuit" desc = "It's a blue colored jumpsuit with some gold markings. There appears to be light-weight armor padding \ - underneath, providing some protection." + underneath, providing some protection. There is also a healthy amount of insulation underneath." icon_state = "technomancer" /obj/item/clothing/head/technomancer name = "initiate's hat" desc = "It's a somewhat silly looking blue pointed hat." icon_state = "initiate" + armor = list(melee = 10, bullet = 5, laser = 5, energy = 0, bomb = 0, bio = 0, rad = 0) + siemens_coefficient = 0.3 /obj/item/clothing/head/technomancer/apprentice name = "apprentice's hat" diff --git a/code/game/gamemodes/technomancer/core_obj.dm b/code/game/gamemodes/technomancer/core_obj.dm index 5ef5d375070..48c45f3f068 100644 --- a/code/game/gamemodes/technomancer/core_obj.dm +++ b/code/game/gamemodes/technomancer/core_obj.dm @@ -5,7 +5,7 @@ icon = 'icons/obj/technomancer.dmi' icon_state = "technomancer_core" item_state = "technomancer_core" - w_class = 5 + w_class = ITEMSIZE_HUGE slot_flags = SLOT_BACK unacidable = 1 origin_tech = list( diff --git a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm index 43f0f2737a7..0106ff027eb 100644 --- a/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm +++ b/code/game/gamemodes/technomancer/devices/disposable_teleporter.dm @@ -2,7 +2,7 @@ name = "Disposable Teleporter" desc = "An ultra-safe teleportation device that can directly teleport you to a number of locations at minimal risk, however \ it has a limited amount of charges." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/disposable_teleporter /obj/item/weapon/disposable_teleporter @@ -11,7 +11,7 @@ icon = 'icons/obj/device.dmi' icon_state = "hand_tele" //temporary var/uses = 3.0 - w_class = 1 + w_class = ITEMSIZE_TINY item_state = "paper" origin_tech = list(TECH_BLUESPACE = 4, TECH_POWER = 3) diff --git a/code/game/gamemodes/technomancer/devices/shield_armor.dm b/code/game/gamemodes/technomancer/devices/shield_armor.dm index 7bcd52babe8..3e4ddbce1f7 100644 --- a/code/game/gamemodes/technomancer/devices/shield_armor.dm +++ b/code/game/gamemodes/technomancer/devices/shield_armor.dm @@ -6,7 +6,7 @@ of which your Core can provide. When you are struck by something, the shield will block 75% of the damage, deducting energy \ proportional to the amount of force that was inflicted. Armor penetration has no effect on the shield's ability to protect \ you from harm, however the shield will fail if the energy supply cannot meet demand." - cost = 300 + cost = 200 obj_path = /obj/item/clothing/suit/armor/shield /obj/item/clothing/suit/armor/shield diff --git a/code/game/gamemodes/technomancer/devices/tesla_armor.dm b/code/game/gamemodes/technomancer/devices/tesla_armor.dm index 1446afcba71..6b981aa8eb0 100644 --- a/code/game/gamemodes/technomancer/devices/tesla_armor.dm +++ b/code/game/gamemodes/technomancer/devices/tesla_armor.dm @@ -4,7 +4,7 @@ the next attack you suffer, and strike the attacker with a strong bolt of lightning. This effect requires twenty seconds to \ recharge. If you are attacked while this is recharging, a weaker lightning bolt is sent out, however you won't be protected from \ the person beating you." - cost = 250 + cost = 150 obj_path = /obj/item/clothing/suit/armor/tesla /obj/item/clothing/suit/armor/tesla diff --git a/code/game/gamemodes/technomancer/equipment.dm b/code/game/gamemodes/technomancer/equipment.dm index 2e0fe3833a0..54cae5670e2 100644 --- a/code/game/gamemodes/technomancer/equipment.dm +++ b/code/game/gamemodes/technomancer/equipment.dm @@ -11,7 +11,7 @@ desc = "A core optimized for passive regeneration, however at the cost of capacity. Has a capacity of 7,000 units of energy, and \ recharges at a rate of 70 units. Complex gravatics and force manipulation allows the wearer to also run slightly faster, and \ reduces incoming instability from functions by 10%." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/technomancer_core/rapid /datum/technomancer/equipment/bulky_core @@ -20,7 +20,7 @@ purchase one or more energy-generating Functions as well if using this core. Has a capacity of 20,000 units of energy, \ and recharges at a rate of 25 units. The intense weight of the core unfortunately can cause the wear to move slightly slower, \ and the closeness of the capacitors causes a slight increase in incoming instability by 10%." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/technomancer_core/bulky /datum/technomancer/equipment/unstable @@ -29,7 +29,7 @@ better as the user has more instability, which could prove dangerous to the inexperienced or unprepared. Has a capacity of 13,000 \ units of energy, and recharges at a rate of 35 units at no instability, and approximately 110 units when within the \ 'yellow zone' of instability. Incoming instability is also amplified by 30%, due to the nature of this core." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/technomancer_core/unstable /datum/technomancer/equipment/recycling @@ -38,7 +38,7 @@ cores. The focus on efficency also makes instability less of an issue, as incoming instability from functions are reduced by \ 40%. The capacitor is also slightly better, holding 12,000 units of energy, however the reactor is slower to recharge, at a rate \ of 40 units." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/technomancer_core/recycling /datum/technomancer/equipment/summoning @@ -47,13 +47,13 @@ entities from vast distances, and keeping them there. Wearers of this core can maintain up to 30 summons at once, and the energy \ demand for maintaining summons is severely reduced. This comes at the price of capcitors that can only hold 8,000 units of energy, \ a recharging rate of 35 energy, and no shielding from instability." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/technomancer_core/summoner /datum/technomancer/equipment/hypo_belt name = "Hypo Belt" desc = "A medical belt designed to carry autoinjectors and other medical equipment. Comes with one of each hypo." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/storage/belt/medical/technomancer /obj/item/weapon/storage/belt/medical/technomancer @@ -76,16 +76,16 @@ desc = "A belt with a literal pocket which opens to a localized pocket of 'Blue-Space', allowing for more storage. \ The nature of the pocket allows for storage of larger objects than what is typical for other belts, and in larger quanities. \ It will also help keep your pants on." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/storage/belt/holding /obj/item/weapon/storage/belt/holding name = "Belt of Holding" desc = "Can hold more than you'd expect." icon_state = "ems" - max_w_class = 3 // Can hold normal sized items. + max_w_class = ITEMSIZE_NORMAL // Can hold normal sized items. storage_slots = 14 // Twice the capacity of a typical belt. - max_storage_space = 42 + max_storage_space = ITEMSIZE_COST_NORMAL * 14 /datum/technomancer/equipment/thermals name = "Thermoncle" @@ -103,7 +103,7 @@ /datum/technomancer/equipment/omni_sight name = "Omnisight Scanner" desc = "A very rare scanner worn on the face, which allows the wearer to see nearly anything across walls." - cost = 400 + cost = 300 obj_path = /obj/item/clothing/glasses/omni /obj/item/clothing/glasses/omni @@ -122,7 +122,7 @@ name = "Medical HUD" desc = "A commonly available HUD for medical professionals, which displays how healthy an individual is. \ Recommended for support-based apprentices!" - cost = 30 + cost = 25 obj_path = /obj/item/clothing/glasses/thermal/plain/monocle /datum/technomancer/equipment/scepter @@ -130,7 +130,7 @@ desc = "A gem sometimes found in the depths of asteroids makes up the basis for this device. Energy is channeled into it from \ the Core and the user, causing many functions to be enhanced in various ways, so long as it is held in the off-hand. \ Be careful not to lose this!" - cost = 300 + cost = 200 obj_path = /obj/item/weapon/scepter /obj/item/weapon/scepter diff --git a/code/game/gamemodes/technomancer/instability.dm b/code/game/gamemodes/technomancer/instability.dm index 6be83aef7b9..0de94cba7a4 100644 --- a/code/game/gamemodes/technomancer/instability.dm +++ b/code/game/gamemodes/technomancer/instability.dm @@ -112,7 +112,7 @@ rng = rand(0,8) switch(rng) if(0) - apply_effect(instability * 0.5, IRRADIATE) + apply_effect(instability * 0.3, IRRADIATE) if(1) return // visible_message("\The [src] suddenly collapses!", @@ -120,21 +120,21 @@ // Weaken(instability * 0.1) if(2) if(can_feel_pain()) - apply_effect(instability * 0.5, AGONY) + apply_effect(instability * 0.3, AGONY) src << "You feel a sharp pain!" if(3) - apply_effect(instability * 0.5, EYE_BLUR) + apply_effect(instability * 0.3, EYE_BLUR) src << "Your eyes start to get cloudy!" if(4) electrocute_act(instability * 0.3, "unstable energies") if(5) - adjustFireLoss(instability * 0.2) //10 burn @ 50 instability + adjustFireLoss(instability * 0.15) //7.5 burn @ 50 instability src << "You feel your skin burn!" if(6) - adjustBruteLoss(instability * 0.2) //10 brute @ 50 instability + adjustBruteLoss(instability * 0.15) //7.5 brute @ 50 instability src << "You feel a sharp pain as an unseen force harms your body!" if(7) - adjustToxLoss(instability * 0.2) //10 tox @ 50 instability + adjustToxLoss(instability * 0.15) //7.5 tox @ 50 instability if(8) safe_blink(src, range = 6) src << "You're teleported against your will!" diff --git a/code/game/gamemodes/technomancer/spells/abjuration.dm b/code/game/gamemodes/technomancer/spells/abjuration.dm index 2422ef00bfc..005f1561bff 100644 --- a/code/game/gamemodes/technomancer/spells/abjuration.dm +++ b/code/game/gamemodes/technomancer/spells/abjuration.dm @@ -2,7 +2,7 @@ name = "Abjuration" desc = "This ability attempts to send summoned or teleported entities or anomalies to the place from whence they came, or at least \ far away from the caster. Failing that, it may inhibit those entities in some form." - cost = 40 + cost = 25 obj_path = /obj/item/weapon/spell/abjuration category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/apportation.dm b/code/game/gamemodes/technomancer/spells/apportation.dm index 150559b9cdd..9cc95b1e6e0 100644 --- a/code/game/gamemodes/technomancer/spells/apportation.dm +++ b/code/game/gamemodes/technomancer/spells/apportation.dm @@ -2,7 +2,7 @@ name = "Apportation" desc = "This allows you to teleport objects into your hand, or to pull people towards you. If they're close enough, the function \ will grab them automatically." - cost = 50 + cost = 25 obj_path = /obj/item/weapon/spell/apportation category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/audible_deception.dm b/code/game/gamemodes/technomancer/spells/audible_deception.dm index 06930828afb..970d9838947 100644 --- a/code/game/gamemodes/technomancer/spells/audible_deception.dm +++ b/code/game/gamemodes/technomancer/spells/audible_deception.dm @@ -3,7 +3,7 @@ desc = "Allows you to create a specific sound at a location of your choosing." enhancement_desc = "An extremely loud sound that a large amount of energy and instability becomes available, which will \ deafen and stun all who are near the targeted tile, including yourself if unprotected." - cost = 150 + cost = 50 obj_path = /obj/item/weapon/spell/audible_deception ability_icon_state = "tech_audibledeception" category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm index 52cbdfbfdf9..024002814e4 100644 --- a/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/biomed_aura.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/biomed_aura name = "Restoration Aura" desc = "Heals you and your allies (or everyone, if you want) of trauma and burns slowly, as long as they remain within four meters." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/aura/biomed ability_icon_state = "tech_biomedaura" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm index 0c28f31577a..5e1028192b6 100644 --- a/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/fire_aura.dm @@ -4,7 +4,7 @@ This does not affect you or your allies. It also causes a large amount of fire to erupt around you, however the main threat is \ still the heating up." enhancement_desc = "Increased heat generation, more fires, and higher temperature cap." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/aura/fire ability_icon_state = "tech_fireaura" category = OFFENSIVE_SPELLS @@ -21,13 +21,13 @@ qdel(src) var/list/nearby_things = range(4,owner) - var/temp_change = 25 - var/temp_cap = 500 + var/temp_change = 40 + var/temp_cap = 600 var/fire_power = 2 if(check_for_scepter()) - temp_change = 50 - temp_cap = 700 + temp_change = 80 + temp_cap = 1000 fire_power = 4 for(var/mob/living/carbon/human/H in nearby_things) if(is_ally(H)) diff --git a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm index d5dd78b793d..610702646df 100644 --- a/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/frost_aura.dm @@ -3,7 +3,7 @@ desc = "Lowers the core body temperature of everyone around you (except for your friends), causing them to freeze to death if \ they stay within four meters of you." enhancement_desc = "The chill becomes lethal." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/aura/frost ability_icon_state = "tech_frostaura" category = DEFENSIVE_SPELLS // Scepter-less frost aura is nonlethal. diff --git a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm index a9e50b2fa3a..70ae416ec04 100644 --- a/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm +++ b/code/game/gamemodes/technomancer/spells/aura/shock_aura.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/shock_aura name = "Electric Aura" desc = "Repeatively electrocutes enemies within four meters of you, as well as nearby electronics." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/aura/shock ability_icon_state = "tech_shockaura" category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/blink.dm b/code/game/gamemodes/technomancer/spells/blink.dm index 9dae12e39e7..19f6e84c831 100644 --- a/code/game/gamemodes/technomancer/spells/blink.dm +++ b/code/game/gamemodes/technomancer/spells/blink.dm @@ -3,7 +3,7 @@ desc = "Force the target to teleport a short distance away. This target could be anything from something lying on the ground, to someone trying to \ fight you, or even yourself. Using this on someone next to you makes their potential distance after teleportation greater." enhancement_desc = "Blink distance is increased greatly." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/spell/blink category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/control.dm b/code/game/gamemodes/technomancer/spells/control.dm index b5eaad8f44a..17fb821d357 100644 --- a/code/game/gamemodes/technomancer/spells/control.dm +++ b/code/game/gamemodes/technomancer/spells/control.dm @@ -5,7 +5,7 @@ targets. This function will have no effect on entities of higher intelligence, such as humans and similar alien species, as it's \ not true mind control, but merely pheromone synthesis for living animals, and electronic hacking for simple robots. The green web \ around the entity is merely a hologram used to allow the user to know if the creature is safe or not." - cost = 200 + cost = 100 obj_path = /obj/item/weapon/spell/control category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/energy_siphon.dm b/code/game/gamemodes/technomancer/spells/energy_siphon.dm index 0e8e23ffd8b..ad379b2d3c9 100644 --- a/code/game/gamemodes/technomancer/spells/energy_siphon.dm +++ b/code/game/gamemodes/technomancer/spells/energy_siphon.dm @@ -4,7 +4,7 @@ Every second, electricity is stolen until the link is broken by the target moving too far away, or having no more energy left. \ Can drain from powercells, microbatteries, and other Cores. The beam created by the siphoning is harmful to touch." enhancement_desc = "Rate of siphoning is doubled." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/energy_siphon ability_icon_state = "tech_energysiphon" category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/flame_tongue.dm b/code/game/gamemodes/technomancer/spells/flame_tongue.dm index 5afa25ae90f..923cde0b9de 100644 --- a/code/game/gamemodes/technomancer/spells/flame_tongue.dm +++ b/code/game/gamemodes/technomancer/spells/flame_tongue.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/flame_tongue name = "Flame Tongue" desc = "Using a miniturized flamethrower in your gloves, you can emit a flame strong enough to melt both your enemies and walls." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/spell/flame_tongue ability_icon_state = "tech_flametongue" category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/illusion.dm b/code/game/gamemodes/technomancer/spells/illusion.dm index e450e4480fc..9667df1db46 100644 --- a/code/game/gamemodes/technomancer/spells/illusion.dm +++ b/code/game/gamemodes/technomancer/spells/illusion.dm @@ -2,7 +2,7 @@ name = "Illusion" desc = "Allows you to create and control a holographic illusion, that can take the form of most object or entities." enhancement_desc = "Illusions will be made of hard light, allowing the interception of attacks, appearing more realistic." - cost = 100 + cost = 25 obj_path = /obj/item/weapon/spell/illusion ability_icon_state = "tech_illusion" category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/insert/corona.dm b/code/game/gamemodes/technomancer/spells/insert/corona.dm index bde3ee99843..a070108a686 100644 --- a/code/game/gamemodes/technomancer/spells/insert/corona.dm +++ b/code/game/gamemodes/technomancer/spells/insert/corona.dm @@ -2,7 +2,7 @@ name = "Corona" desc = "Causes the victim to glow very brightly, which while harmless in itself, makes it easier for them to be hit. The \ bright glow also makes it very difficult to be stealthy. The effect lasts for one minute." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/spell/insert/corona ability_icon_state = "tech_corona" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm index e9450b95869..a43bb7611d8 100644 --- a/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm +++ b/code/game/gamemodes/technomancer/spells/insert/mend_organs.dm @@ -2,7 +2,7 @@ name = "Mend Organs" desc = "Heals the target's internal organs, both organic and robotic. Instability is split between the target \ and technomancer, if seperate." - cost = 75 + cost = 50 obj_path = /obj/item/weapon/spell/insert/mend_organs ability_icon_state = "tech_mendwounds" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm index 8fb549039fb..a95afa0a1f0 100644 --- a/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm +++ b/code/game/gamemodes/technomancer/spells/insert/repel_missiles.dm @@ -2,7 +2,7 @@ name = "Repel Missiles" desc = "Places a repulsion field around you, which attempts to deflect incoming bullets and lasers, making them 30% less likely \ to hit you. The field lasts for five minutes and can be granted to yourself or an ally." - cost = 60 + cost = 25 obj_path = /obj/item/weapon/spell/insert/repel_missiles ability_icon_state = "tech_repelmissiles" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/instability_tap.dm b/code/game/gamemodes/technomancer/spells/instability_tap.dm index ada2989444c..8ad52f3b3f1 100644 --- a/code/game/gamemodes/technomancer/spells/instability_tap.dm +++ b/code/game/gamemodes/technomancer/spells/instability_tap.dm @@ -2,7 +2,7 @@ name = "Instability Tap" desc = "Creates a large sum of energy, at the cost of a very large amount of instability afflicting you." enhancement_desc = "50% more energy gained, 20% less instability gained." - cost = 120 + cost = 100 obj_path = /obj/item/weapon/spell/instability_tap ability_icon_state = "tech_instabilitytap" category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/mark_recall.dm b/code/game/gamemodes/technomancer/spells/mark_recall.dm index 63e6d67fad4..528b8600946 100644 --- a/code/game/gamemodes/technomancer/spells/mark_recall.dm +++ b/code/game/gamemodes/technomancer/spells/mark_recall.dm @@ -3,7 +3,7 @@ desc = "This function places a specific 'mark' beacon under you, which is used by the Recall function as a destination. \ Note that using Mark again will move the destination instead of creating a second destination, and only one destination \ can exist, regardless of who casted Mark." - cost = 50 + cost = 25 obj_path = /obj/item/weapon/spell/mark ability_icon_state = "tech_mark" category = UTILITY_SPELLS @@ -50,7 +50,7 @@ desc = "This function teleports you to where you placed a mark using the Mark function. Without the Mark function, this \ function is useless. Note that teleporting takes three seconds. Being incapacitated while teleporting will cancel it." enhancement_desc = "Recall takes two seconds instead of three." - cost = 50 + cost = 25 obj_path = /obj/item/weapon/spell/recall ability_icon_state = "tech_recall" category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/oxygenate.dm b/code/game/gamemodes/technomancer/spells/oxygenate.dm index 3f9bb6f9e5b..f1edc635c15 100644 --- a/code/game/gamemodes/technomancer/spells/oxygenate.dm +++ b/code/game/gamemodes/technomancer/spells/oxygenate.dm @@ -2,7 +2,7 @@ name = "Oxygenate" desc = "This function creates oxygen at a location of your chosing. If used on a humanoid entity, it heals oxygen deprivation. \ If casted on the envirnment, air (oxygen and nitrogen) is moved from a distant location to your target." - cost = 70 + cost = 50 obj_path = /obj/item/weapon/spell/oxygenate ability_icon_state = "oxygenate" category = SUPPORT_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/phase_shift.dm b/code/game/gamemodes/technomancer/spells/phase_shift.dm index 20fb033872e..a571d6789d3 100644 --- a/code/game/gamemodes/technomancer/spells/phase_shift.dm +++ b/code/game/gamemodes/technomancer/spells/phase_shift.dm @@ -2,7 +2,7 @@ name = "Phase Shift" desc = "Hides you in the safest possible place, where no harm can come to you. Unfortunately you can only stay inside for a few moments before \ draining your powercell." - cost = 80 + cost = 50 obj_path = /obj/item/weapon/spell/phase_shift category = DEFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/beam.dm b/code/game/gamemodes/technomancer/spells/projectile/beam.dm index 429a83dd9bb..13d5fe934a0 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/beam.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/beam.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/beam name = "Beam" desc = "Fires a laser at your target. Cheap, reliable, and a bit boring." - cost = 150 + cost = 100 ability_icon_state = "tech_beam" obj_path = /obj/item/weapon/spell/projectile/beam category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm index dad3c88f45d..ab295f58f33 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/force_missile.dm @@ -2,7 +2,7 @@ name = "Force Missile" desc = "This fires a missile at your target. It's cheap to use, however the projectile itself moves and impacts in such a way \ that armor designed to protect from blunt force will mitigate this function as well." - cost = 100 + cost = 50 obj_path = /obj/item/weapon/spell/projectile/force_missile category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/overload.dm b/code/game/gamemodes/technomancer/spells/projectile/overload.dm index e6f0c898e23..90bf50e7d6b 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/overload.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/overload.dm @@ -2,7 +2,7 @@ name = "Overload" desc = "Fires a bolt of highly unstable energy, that does damaged equal to 1.5% of the technomancer's current reserve of energy. \ This energy pierces all known armor." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/projectile/overload category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm index 69e1efc92fd..ea2f0db4e32 100644 --- a/code/game/gamemodes/technomancer/spells/projectile/projectile.dm +++ b/code/game/gamemodes/technomancer/spells/projectile/projectile.dm @@ -10,10 +10,9 @@ var/fire_sound = null /obj/item/weapon/spell/projectile/on_ranged_cast(atom/hit_atom, mob/living/user) - var/turf/T = get_turf(hit_atom) if(set_up(hit_atom, user)) var/obj/item/projectile/new_projectile = new spell_projectile(get_turf(user)) - new_projectile.launch(T) + new_projectile.launch(hit_atom) if(fire_sound) playsound(get_turf(src), fire_sound, 75, 1) owner.adjust_instability(instability_per_shot) diff --git a/code/game/gamemodes/technomancer/spells/radiance.dm b/code/game/gamemodes/technomancer/spells/radiance.dm index 9d484ddc5c6..7cd76941221 100644 --- a/code/game/gamemodes/technomancer/spells/radiance.dm +++ b/code/game/gamemodes/technomancer/spells/radiance.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/radiance name = "Radiance" desc = "Causes you to be very radiant, glowing brightly in visible light, thermal energy, and deadly ionizing radiation." - cost = 180 + cost = 100 obj_path = /obj/item/weapon/spell/radiance category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/reflect.dm b/code/game/gamemodes/technomancer/spells/reflect.dm index 7a8fa0a4de6..d841db2accc 100644 --- a/code/game/gamemodes/technomancer/spells/reflect.dm +++ b/code/game/gamemodes/technomancer/spells/reflect.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/reflect name = "Reflect" desc = "Emits a protective shield fron your hand in front of you, which will reflect one attack back at the attacker." - cost = 120 + cost = 100 obj_path = /obj/item/weapon/spell/reflect ability_icon_state = "tech_reflect" category = DEFENSIVE_SPELLS @@ -22,7 +22,7 @@ spark_system = PoolOrNew(/datum/effect/effect/system/spark_spread) spark_system.set_up(5, 0, src) owner << "Your shield will expire in 3 seconds!" - spawn(3 SECONDS) + spawn(5 SECONDS) if(src) owner << "Your shield expires!" qdel(src) @@ -67,7 +67,7 @@ if(!reflecting) reflecting = 1 - spawn(1 SECOND) //To ensure that most or all of a burst fire cycle is reflected. + spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected. owner << "Your shield fades due being used up!" qdel(src) @@ -87,7 +87,7 @@ if(!reflecting) reflecting = 1 - spawn(1 SECOND) //To ensure that most or all of a burst fire cycle is reflected. + spawn(2 SECONDS) //To ensure that most or all of a burst fire cycle is reflected. owner << "Your shield fades due being used up!" qdel(src) return 1 diff --git a/code/game/gamemodes/technomancer/spells/shield.dm b/code/game/gamemodes/technomancer/spells/shield.dm index 330de0ff266..ac6910c4784 100644 --- a/code/game/gamemodes/technomancer/spells/shield.dm +++ b/code/game/gamemodes/technomancer/spells/shield.dm @@ -2,7 +2,7 @@ name = "Shield" desc = "Emits a protective shield fron your hand in front of you, which will protect you from almost anything able to harm \ you, so long as you can power it." - cost = 120 + cost = 100 obj_path = /obj/item/weapon/spell/shield ability_icon_state = "tech_shield" category = DEFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm index ac5e799d729..ecb18b34815 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/darkness.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/darkness.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/darkness name = "Darkness" desc = "Disrupts photons moving in a local area, causing darkness to shroud yourself or a position of your choosing." - cost = 30 + cost = 25 obj_path = /obj/item/weapon/spell/spawner/darkness category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm index a2c22b0f76c..c1b016116af 100644 --- a/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm +++ b/code/game/gamemodes/technomancer/spells/spawner/pulsar.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/pulsar name = "Pulsar" desc = "Emits electronic pulses to destroy, disable, or otherwise harm devices and machines. Be sure to not hit yourself with this." - cost = 150 + cost = 100 obj_path = /obj/item/weapon/spell/spawner/pulsar category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm index 497a8422bdf..053f4490950 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_creature.dm @@ -6,7 +6,7 @@ The creatures take a few moments to be teleported to the targeted tile. Note that the creatures summoned are \ not inherently loyal to the technomancer, and that the creatures will be hurt slightly from being teleported to you." enhancement_desc = "Summoned entities will never harm their summoner." - cost = 200 + cost = 100 obj_path = /obj/item/weapon/spell/summon/summon_creature category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm index 5323c5beda2..e4154eddf2d 100644 --- a/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm +++ b/code/game/gamemodes/technomancer/spells/summon/summon_ward.dm @@ -3,7 +3,7 @@ desc = "Teleports a prefabricated 'ward' drone to the target location, which will alert you and your allies when it sees entities \ moving around it, or when it is attacked. They can see for up to five meters. Wards expire in six minutes." enhancement_desc = "Wards can detect invisibile entities, and are more specific in relaying information about what it sees." - cost = 100 + cost = 25 obj_path = /obj/item/weapon/spell/summon/summon_ward category = UTILITY_SPELLS @@ -84,6 +84,9 @@ if(L.alpha <= 127) continue // Too transparent, as a mercy to camo lings. + else + L.break_cloak() + // Warn the Technomancer when it sees a new mob. if(!(L in seen_mobs)) seen_mobs.Add(L) @@ -111,3 +114,7 @@ overlays.Cut() var/image/I = image('icons/mob/critter.dmi',"ward_truesight") overlays.Add(I) + +/mob/living/simple_animal/ward/invisible_detect + true_sight = 1 + see_invisible = SEE_INVISIBLE_LEVEL_TWO diff --git a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm index aff00f0197b..b227748aebe 100644 --- a/code/game/gamemodes/technomancer/spells/targeting_matrix.dm +++ b/code/game/gamemodes/technomancer/spells/targeting_matrix.dm @@ -2,7 +2,7 @@ name = "Targeting Matrix" desc = "Automatically targets and fires a ranged weapon or function at a non-friendly target near a targeted tile. \ Each target assisted attack costs some energy and instability." - cost = 150 + cost = 50 ability_icon_state = "tech_targetingmatrix" obj_path = /obj/item/weapon/spell/targeting_matrix category = UTILITY_SPELLS diff --git a/code/game/gamemodes/technomancer/spells/warp_strike.dm b/code/game/gamemodes/technomancer/spells/warp_strike.dm index a308066ae5a..11b3ba032e6 100644 --- a/code/game/gamemodes/technomancer/spells/warp_strike.dm +++ b/code/game/gamemodes/technomancer/spells/warp_strike.dm @@ -1,7 +1,7 @@ /datum/technomancer/spell/warp_strike name = "Warp Strike" desc = "Teleports you next to your target, and attacks them with whatever is in your off-hand, spell or object." - cost = 200 + cost = 100 obj_path = /obj/item/weapon/spell/warp_strike ability_icon_state = "tech_warpstrike" category = OFFENSIVE_SPELLS diff --git a/code/game/gamemodes/technomancer/technomancer.dm b/code/game/gamemodes/technomancer/technomancer.dm index a7131fb54ce..cf37046d0f0 100644 --- a/code/game/gamemodes/technomancer/technomancer.dm +++ b/code/game/gamemodes/technomancer/technomancer.dm @@ -7,8 +7,8 @@ their powers can be used for good or if their arrival foreshadows the destruction of the entire colony, or worse." config_tag = "technomancer" votable = 0 - required_players = 8 - required_players_secret = 10 + required_players = 5 + required_players_secret = 5 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_TECHNOMANCER) \ No newline at end of file diff --git a/code/game/gamemodes/traitor/traitor.dm b/code/game/gamemodes/traitor/traitor.dm index 13b03e00e61..9abb9dee076 100644 --- a/code/game/gamemodes/traitor/traitor.dm +++ b/code/game/gamemodes/traitor/traitor.dm @@ -23,5 +23,6 @@ config_tag = "autotraitor" antag_tags = list(MODE_AUTOTRAITOR) round_autoantag = 1 - required_players_secret = 1 + required_players_secret = 0 + required_enemies = 0 antag_scaling_coeff = 5 diff --git a/code/game/gamemodes/wizard/wizard.dm b/code/game/gamemodes/wizard/wizard.dm index 5c2cfed4ddd..349f0edb14b 100644 --- a/code/game/gamemodes/wizard/wizard.dm +++ b/code/game/gamemodes/wizard/wizard.dm @@ -5,7 +5,7 @@ config_tag = "wizard" votable = 0 required_players = 1 - required_players_secret = 1 + required_players_secret = 3 required_enemies = 1 end_on_antag_death = 0 antag_tags = list(MODE_WIZARD) diff --git a/code/game/jobs/access.dm b/code/game/jobs/access.dm index de305db26c7..f9bbeb8f33a 100644 --- a/code/game/jobs/access.dm +++ b/code/game/jobs/access.dm @@ -237,10 +237,10 @@ proc/get_all_job_icons() //For all existing HUD icons return I.rank var/centcom = get_all_centcom_jobs() - if(I.assignment in centcom) //Return with the NT logo if it is a Centcom job - return "Centcom" + if(I.assignment in centcom) //Return with the NT logo if it is a CentCom job + return "CentCom" if(I.rank in centcom) - return "Centcom" + return "CentCom" else return diff --git a/code/game/jobs/access_datum.dm b/code/game/jobs/access_datum.dm index bf027d93a2b..5ec9c3ea9e8 100644 --- a/code/game/jobs/access_datum.dm +++ b/code/game/jobs/access_datum.dm @@ -127,7 +127,7 @@ /var/const/access_captain = 20 /datum/access/captain id = access_captain - desc = "Captain" + desc = "Station Administrator" region = ACCESS_REGION_COMMAND /var/const/access_all_personal_lockers = 21 diff --git a/code/game/jobs/job/assistant.dm b/code/game/jobs/job/assistant.dm index 5e2b40d9526..cc0faede190 100644 --- a/code/game/jobs/job/assistant.dm +++ b/code/game/jobs/job/assistant.dm @@ -19,6 +19,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) if(has_alt_title(H, alt_title,"Visitor")) //I doubt someone visiting the station would want to wear an ugly grey uniform H.equip_to_slot_or_del(new /obj/item/clothing/under/assistantformal(H), slot_w_uniform) else if(has_alt_title(H, alt_title,"Resident")) diff --git a/code/game/jobs/job/captain.dm b/code/game/jobs/job/captain.dm index be9f9a13210..a98bfe45443 100644 --- a/code/game/jobs/job/captain.dm +++ b/code/game/jobs/job/captain.dm @@ -30,6 +30,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/captain(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/cap(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/com(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/captain(H), slot_w_uniform) if(H.age>49) // Since we can have something other than the default uniform at this @@ -69,7 +70,7 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#2F2F7F" idtype = /obj/item/weapon/card/id/silver alt_titles = list("Crew Resources Officer") @@ -109,4 +110,39 @@ var/datum/announcement/minor/captain_announcement = new(do_newscast = 1) else H.equip_to_slot_or_del(new /obj/item/weapon/storage/box/ids(H.back), slot_in_backpack) H.implant_loyalty() - return 1 \ No newline at end of file + return 1 + +/datum/job/secretary + title = "Command Secretary" + flag = BRIDGE + department = "Civilian" + head_position = 1 + department_flag = CIVILIAN + faction = "Station" + total_positions = 2 + spawn_positions = 2 + supervisors = "command staff" + selection_color = "#2F2F7F" + idtype = /obj/item/weapon/card/id/silver + alt_titles = list("Command Liaison", "Bridge Secretary") + minimal_player_age = 5 + economic_modifier = 7 + + access = list(access_heads) + minimal_access = list(access_heads) + +/datum/job/secretary/equip(var/mob/living/carbon/human/H) + if(!H) return 0 + H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_com(H), slot_l_ear) + switch(H.backbag) + if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) + if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) + if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) + H.equip_to_slot_or_del(new /obj/item/device/pda/heads/hop(H), slot_belt) + H.equip_to_slot_or_del(new /obj/item/weapon/storage/briefcase(H), slot_l_hand) + if(H.gender == FEMALE) + H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/female/skirt(H), slot_w_uniform) + else + H.equip_to_slot_or_del(new /obj/item/clothing/under/suit_jacket/charcoal(H), slot_w_uniform) + return 1 \ No newline at end of file diff --git a/code/game/jobs/job/civilian.dm b/code/game/jobs/job/civilian.dm index 6b2a40a8aaa..a8e4d3f3f6a 100644 --- a/code/game/jobs/job/civilian.dm +++ b/code/game/jobs/job/civilian.dm @@ -21,6 +21,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_service(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/bartender(H), slot_w_uniform) @@ -86,6 +87,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/hydroponics(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/hyd(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/hyd(H), slot_back) return 1 @@ -105,6 +107,7 @@ economic_modifier = 5 access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_qm, access_mining, access_mining_station) + alt_titles = list("Supply Chief") ideal_character_age = 40 @@ -136,7 +139,6 @@ access = list(access_maint_tunnels, access_mailsorting, access_cargo, access_cargo_bot, access_mining, access_mining_station) minimal_access = list(access_maint_tunnels, access_cargo, access_cargo_bot, access_mailsorting) - equip(var/mob/living/carbon/human/H) if(!H) return 0 H.equip_to_slot_or_del(new /obj/item/device/radio/headset/headset_cargo(H), slot_l_ear) @@ -171,6 +173,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/miner(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/shaftminer(H), slot_belt) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/black(H), slot_shoes) @@ -201,7 +204,7 @@ idtype = /obj/item/weapon/card/id/civilian access = list(access_janitor, access_maint_tunnels) minimal_access = list(access_janitor, access_maint_tunnels) - alt_titles = list("Custodian") + alt_titles = list("Custodian", "Sanitation Technician") equip(var/mob/living/carbon/human/H) @@ -228,7 +231,7 @@ idtype = /obj/item/weapon/card/id/civilian access = list(access_library, access_maint_tunnels) minimal_access = list(access_library) - alt_titles = list("Journalist") + alt_titles = list("Journalist", "Professor", "Historian") equip(var/mob/living/carbon/human/H) @@ -265,6 +268,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/internalaffairs(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/internalaffairs(H), slot_wear_suit) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) diff --git a/code/game/jobs/job/engineering.dm b/code/game/jobs/job/engineering.dm index 1a9351496e1..227297ca056 100644 --- a/code/game/jobs/job/engineering.dm +++ b/code/game/jobs/job/engineering.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#7F6E2C" idtype = /obj/item/weapon/card/id/engineering/head req_admin_notify = 1 @@ -35,6 +35,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_engineer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/ce(H), slot_l_store) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) @@ -73,6 +74,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/industrial(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/eng(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/engineer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/weapon/storage/belt/utility/full(H), slot_belt) @@ -111,6 +113,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/engi(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/atmospheric_technician(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/workboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/atmos(H), slot_l_store) diff --git a/code/game/jobs/job/job.dm b/code/game/jobs/job/job.dm index 6bdf3c1c4a1..cc1130f43d3 100644 --- a/code/game/jobs/job/job.dm +++ b/code/game/jobs/job/job.dm @@ -33,6 +33,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) /datum/job/proc/equip_survival(var/mob/living/carbon/human/H) if(!H) return 0 diff --git a/code/game/jobs/job/medical.dm b/code/game/jobs/job/medical.dm index 4a58377fc72..0c2053f8d6d 100644 --- a/code/game/jobs/job/medical.dm +++ b/code/game/jobs/job/medical.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#026865" idtype = /obj/item/weapon/card/id/medical/head req_admin_notify = 1 @@ -30,6 +30,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/chief_medical_officer(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/brown(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/heads/cmo(H), slot_belt) @@ -63,6 +64,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back) if(has_alt_title(H, alt_title,"Emergency Physician")) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) @@ -78,6 +80,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/virology(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/vir(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/viro(H), slot_back) else if(has_alt_title(H, alt_title,"Medical Doctor")) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) @@ -128,6 +131,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/chemistry(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/chem(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/chem(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/chemist(H), slot_wear_suit) return 1 @@ -185,6 +189,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) if(has_alt_title(H, alt_title,"Psychiatrist")) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/psych(H), slot_w_uniform) else if(has_alt_title(H, alt_title,"Psychologist")) @@ -221,6 +226,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/medic(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/med(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/med(H), slot_back) if(has_alt_title(H, alt_title,"Emergency Medical Technician")) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/medical/paramedic(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/fr_jacket(H), slot_wear_suit) diff --git a/code/game/jobs/job/science.dm b/code/game/jobs/job/science.dm index 7055aa7cb37..5c2f96e624a 100644 --- a/code/game/jobs/job/science.dm +++ b/code/game/jobs/job/science.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#AD6BAD" idtype = /obj/item/weapon/card/id/science/head req_admin_notify = 1 @@ -20,6 +20,7 @@ access_tox_storage, access_teleporter, access_sec_doors, access_research, access_robotics, access_xenobiology, access_ai_upload, access_tech_storage, access_RC_announce, access_keycard_auth, access_tcomsat, access_gateway, access_xenoarch) + alt_titles = list("Research Supervisor") minimum_character_age = 25 minimal_player_age = 14 @@ -36,6 +37,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat(H), slot_wear_suit) return 1 @@ -69,6 +71,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 @@ -100,6 +103,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/toxins(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/tox(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/tox(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/suit/storage/toggle/labcoat/science(H), slot_wear_suit) return 1 diff --git a/code/game/jobs/job/security.dm b/code/game/jobs/job/security.dm index 04adecc3229..f151a5fb83c 100644 --- a/code/game/jobs/job/security.dm +++ b/code/game/jobs/job/security.dm @@ -7,7 +7,7 @@ faction = "Station" total_positions = 1 spawn_positions = 1 - supervisors = "the captain" + supervisors = "the station administrator" selection_color = "#8E2929" idtype = /obj/item/weapon/card/id/security/head req_admin_notify = 1 @@ -20,6 +20,7 @@ access_forensics_lockers, access_morgue, access_maint_tunnels, access_all_personal_lockers, access_research, access_engine, access_mining, access_medical, access_construction, access_mailsorting, access_heads, access_hos, access_RC_announce, access_keycard_auth, access_gateway, access_external_airlocks) + alt_titles = list("Commander") minimum_character_age = 25 minimal_player_age = 14 @@ -29,6 +30,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/device/radio/headset/heads/hos(H), slot_l_ear) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/head_of_security(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) @@ -69,6 +71,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/warden(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/warden(H), slot_belt) @@ -107,6 +110,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/norm(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/det(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/laceup(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/detective(H), slot_belt) @@ -150,6 +154,7 @@ if(2) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/security(H), slot_back) if(3) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel/sec(H), slot_back) if(4) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/satchel(H), slot_back) + if(5) H.equip_to_slot_or_del(new /obj/item/weapon/storage/backpack/messenger/sec(H), slot_back) H.equip_to_slot_or_del(new /obj/item/clothing/under/rank/security(H), slot_w_uniform) H.equip_to_slot_or_del(new /obj/item/clothing/shoes/jackboots(H), slot_shoes) H.equip_to_slot_or_del(new /obj/item/device/pda/security(H), slot_belt) diff --git a/code/game/jobs/job_controller.dm b/code/game/jobs/job_controller.dm index 0eb20254505..dd07f7a7166 100644 --- a/code/game/jobs/job_controller.dm +++ b/code/game/jobs/job_controller.dm @@ -429,9 +429,9 @@ var/global/datum/controller/occupations/job_master return H.Robotize() if("AI") return H - if("Captain") + if("Station Administrator") var/sound/announce_sound = (ticker.current_state <= GAME_STATE_SETTING_UP)? null : sound('sound/misc/boatswain.ogg', volume=20) - captain_announcement.Announce("All hands, Captain [H.real_name] on deck!", new_sound=announce_sound) + captain_announcement.Announce("All hands, [alt_title ? alt_title : "Station Administrator"] [H.real_name] on deck!", new_sound=announce_sound) //Deferred item spawning. if(spawn_in_storage && spawn_in_storage.len) diff --git a/code/game/jobs/jobs.dm b/code/game/jobs/jobs.dm index 35026659dd2..bf3b4ea8ffe 100644 --- a/code/game/jobs/jobs.dm +++ b/code/game/jobs/jobs.dm @@ -44,6 +44,7 @@ var/const/CHAPLAIN =(1<<10) var/const/CLOWN =(1<<11) var/const/MIME =(1<<12) var/const/ASSISTANT =(1<<13) +var/const/BRIDGE =(1<<14) var/list/assistant_occupations = list( @@ -51,12 +52,13 @@ var/list/assistant_occupations = list( var/list/command_positions = list( - "Captain", + "Station Administrator", "Head of Personnel", "Head of Security", "Chief Engineer", "Research Director", - "Chief Medical Officer" + "Chief Medical Officer", + "Command Secretary" ) diff --git a/code/game/machinery/Beacon.dm b/code/game/machinery/Beacon.dm index ac736ddfe29..c59c67c3001 100644 --- a/code/game/machinery/Beacon.dm +++ b/code/game/machinery/Beacon.dm @@ -1,5 +1,4 @@ /obj/machinery/bluespace_beacon - icon = 'icons/obj/objects.dmi' icon_state = "floor_beaconf" name = "Bluespace Gigabeacon" @@ -11,45 +10,42 @@ idle_power_usage = 0 var/obj/item/device/radio/beacon/Beacon - New() - ..() - var/turf/T = loc +/obj/machinery/bluespace_beacon/New() + ..() + var/turf/T = src.loc + Beacon = new /obj/item/device/radio/beacon + Beacon.invisibility = INVISIBILITY_MAXIMUM + Beacon.loc = T + + hide(!T.is_plating()) + +/obj/machinery/bluespace_beacon/Destroy() + if(Beacon) + qdel(Beacon) + ..() + +// update the invisibility and icon +/obj/machinery/bluespace_beacon/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() + +// update the icon_state +/obj/machinery/bluespace_beacon/proc/updateicon() + var/state="floor_beacon" + + if(invisibility) + icon_state = "[state]f" + else + icon_state = "[state]" + +/obj/machinery/bluespace_beacon/process() + if(!Beacon) + var/turf/T = src.loc Beacon = new /obj/item/device/radio/beacon Beacon.invisibility = INVISIBILITY_MAXIMUM Beacon.loc = T + if(Beacon) + if(Beacon.loc != src.loc) + Beacon.loc = src.loc - hide(!T.is_plating()) - - Destroy() - if(Beacon) - qdel(Beacon) - ..() - - // update the invisibility and icon - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() - - // update the icon_state - proc/updateicon() - var/state="floor_beacon" - - if(invisibility) - icon_state = "[state]f" - - else - icon_state = "[state]" - - process() - if(!Beacon) - var/turf/T = loc - Beacon = new /obj/item/device/radio/beacon - Beacon.invisibility = INVISIBILITY_MAXIMUM - Beacon.loc = T - if(Beacon) - if(Beacon.loc != loc) - Beacon.loc = loc - - updateicon() - - + updateicon() \ No newline at end of file diff --git a/code/game/machinery/CableLayer.dm b/code/game/machinery/CableLayer.dm index 277742a22be..a5625e9253b 100644 --- a/code/game/machinery/CableLayer.dm +++ b/code/game/machinery/CableLayer.dm @@ -1,6 +1,5 @@ /obj/machinery/cablelayer name = "automatic cable layer" - icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" density = 1 @@ -42,7 +41,7 @@ m = min(m, cable.amount) m = min(m, 30) if(m) - playsound(loc, 'sound/items/Wirecutter.ogg', 50, 1) + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) use_cable(m) var/obj/item/stack/cable_coil/CC = new (get_turf(src)) CC.amount = m diff --git a/code/game/machinery/OpTable.dm b/code/game/machinery/OpTable.dm index 8f0a0535b14..ba083031e75 100644 --- a/code/game/machinery/OpTable.dm +++ b/code/game/machinery/OpTable.dm @@ -10,41 +10,39 @@ active_power_usage = 5 var/mob/living/carbon/human/victim = null var/strapped = 0.0 - var/obj/machinery/computer/operating/computer = null /obj/machinery/optable/New() ..() for(dir in list(NORTH,EAST,SOUTH,WEST)) computer = locate(/obj/machinery/computer/operating, get_step(src, dir)) - if (computer) + if(computer) computer.table = src break // spawn(100) //Wont the MC just call this process() before and at the 10 second mark anyway? // process() /obj/machinery/optable/ex_act(severity) - switch(severity) if(1.0) //SN src = null qdel(src) return if(2.0) - if (prob(50)) + if(prob(50)) //SN src = null qdel(src) return if(3.0) - if (prob(25)) - src.density = 0 + if(prob(25)) + density = 0 else return /obj/machinery/optable/attack_hand(mob/user as mob) - if (HULK in usr.mutations) + if(HULK in usr.mutations) visible_message("\The [usr] destroys \the [src]!") - src.density = 0 + density = 0 qdel(src) return @@ -56,13 +54,12 @@ else return 0 - /obj/machinery/optable/MouseDrop_T(obj/O as obj, mob/user as mob) - if ((!( istype(O, /obj/item/weapon) ) || user.get_active_hand() != O)) + if((!(istype(O, /obj/item/weapon)) || user.get_active_hand() != O)) return user.drop_item() - if (O.loc != src.loc) + if(O.loc != src.loc) step(O, get_dir(O, src)) return @@ -70,10 +67,10 @@ if(locate(/mob/living/carbon/human, src.loc)) var/mob/living/carbon/human/M = locate(/mob/living/carbon/human, src.loc) if(M.lying) - src.victim = M + victim = M icon_state = M.pulse ? "table2-active" : "table2-idle" return 1 - src.victim = null + victim = null icon_state = "table2-idle" return 0 @@ -81,21 +78,21 @@ check_victim() /obj/machinery/optable/proc/take_victim(mob/living/carbon/C, mob/living/carbon/user as mob) - if (C == user) + if(C == user) user.visible_message("[user] climbs on \the [src].","You climb on \the [src].") else visible_message("\The [C] has been laid on \the [src] by [user].", 3) - if (C.client) + if(C.client) C.client.perspective = EYE_PERSPECTIVE C.client.eye = src C.resting = 1 C.loc = src.loc for(var/obj/O in src) O.loc = src.loc - src.add_fingerprint(user) + add_fingerprint(user) if(ishuman(C)) var/mob/living/carbon/human/H = C - src.victim = H + victim = H icon_state = H.pulse ? "table2-active" : "table2-idle" else icon_state = "table2-idle" @@ -121,7 +118,7 @@ take_victim(usr,usr) /obj/machinery/optable/attackby(obj/item/weapon/W as obj, mob/living/carbon/user as mob) - if (istype(W, /obj/item/weapon/grab)) + if(istype(W, /obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W if(iscarbon(G.affecting) && check_table(G.affecting)) take_victim(G.affecting,usr) @@ -130,10 +127,10 @@ /obj/machinery/optable/proc/check_table(mob/living/carbon/patient as mob) check_victim() - if(src.victim && get_turf(victim) == get_turf(src) && victim.lying) + if(victim && get_turf(victim) == get_turf(src) && victim.lying) usr << "\The [src] is already occupied!" return 0 if(patient.buckled) usr << "Unbuckle \the [patient] first!" return 0 - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index c0ef428f998..7193a7907b8 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -2,7 +2,7 @@ name = "Sleeper Console" icon = 'icons/obj/Cryogenic2.dmi' icon_state = "sleeperconsole" - var/obj/machinery/sleeper/connected = null + var/obj/machinery/sleeper/sleeper anchored = 1 //About time someone fixed this. density = 0 dir = 8 @@ -11,21 +11,19 @@ interact_offline = 1 circuit = /obj/item/weapon/circuitboard/sleeper_console -//obj/machinery/sleep_console/New() - //..() - //spawn( 5 ) - //src.connected = locate(/obj/machinery/sleeper, get_step(src, WEST)) //We assume dir = 8 so sleeper is WEST. Other sprites do exist. - //return - //return - /obj/machinery/sleep_console/New() ..() - spawn(5) - //src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) - src.connected = locate(/obj/machinery/sleeper) in range(2,src) - return - return + findsleeper() +/obj/machinery/sleep_console/proc/findsleeper() + spawn(5) + var/obj/machinery/sleeper/sleepernew = null + for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction + sleepernew = locate(/obj/machinery/sleeper, get_step(src, dir)) // Try to find a scanner in that direction + if(sleepernew) + sleeper = sleepernew + sleepernew.console = src + return /obj/machinery/sleep_console/attack_ai(var/mob/user) return attack_hand(user) @@ -33,39 +31,25 @@ /obj/machinery/sleep_console/attack_hand(var/mob/user) if(..()) return 1 - if(connected) - connected.ui_interact(user) + + if(sleeper.panel_open) + user << "Close the maintenance panel first." + return + + if(!sleeper) + findsleeper() + if(sleeper) + return sleeper.ui_interact(user) + else if(sleeper) + return sleeper.ui_interact(user) + else + user << "Sleeper not found!" /obj/machinery/sleep_console/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.dir = dir - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) - return + return attack_hand(user) /obj/machinery/sleep_console/power_change() ..() @@ -86,6 +70,7 @@ var/list/available_chemicals = list("inaprovaline" = "Inaprovaline", "stoxin" = "Soporific", "paracetamol" = "Paracetamol", "anti_toxin" = "Dylovene", "dexalin" = "Dexalin") var/obj/item/weapon/reagent_containers/glass/beaker = null var/filtering = 0 + var/obj/machinery/sleep_console/console use_power = 1 idle_power_usage = 15 @@ -94,7 +79,6 @@ /obj/machinery/sleeper/New() ..() beaker = new /obj/item/weapon/reagent_containers/glass/beaker/large(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/reagent_containers/glass/beaker(src) @@ -105,13 +89,6 @@ component_parts += new /obj/item/weapon/reagent_containers/syringe(src) component_parts += new /obj/item/stack/material/glass/reinforced(src, 2) - spawn(5) - //src.machine = locate(/obj/machinery/mineral/processing_unit, get_step(src, machinedir)) - var/obj/machinery/sleep_console/C = locate(/obj/machinery/sleep_console) in range(2,src) - if(C) - C.connected = src - return - RefreshParts() /obj/machinery/sleeper/initialize() @@ -208,12 +185,12 @@ return 1 /obj/machinery/sleeper/attackby(var/obj/item/I, var/mob/user) + add_fingerprint(user) if(default_deconstruction_screwdriver(user, I)) return - if(default_deconstruction_crowbar(user, I)) + else if(default_deconstruction_crowbar(user, I)) return - add_fingerprint(user) - if(istype(I, /obj/item/weapon/reagent_containers/glass)) + else if(istype(I, /obj/item/weapon/reagent_containers/glass)) if(!beaker) beaker = I user.drop_item() @@ -283,21 +260,21 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = loc + occupant.loc = src.loc occupant = null for(var/atom/movable/A in src) // In case an object was dropped inside or something if(A == beaker || A == circuit) continue if(A in component_parts) continue - A.loc = loc + A.loc = src.loc update_use_power(1) update_icon() toggle_filter() /obj/machinery/sleeper/proc/remove_beaker() if(beaker) - beaker.loc = loc + beaker.loc = src.loc beaker = null toggle_filter() diff --git a/code/game/machinery/adv_med.dm b/code/game/machinery/adv_med.dm index 3fd49c4828b..022ce367f0b 100644 --- a/code/game/machinery/adv_med.dm +++ b/code/game/machinery/adv_med.dm @@ -1,6 +1,5 @@ // Pretty much everything here is stolen from the dna scanner FYI - /obj/machinery/bodyscanner var/mob/living/carbon/occupant var/locked @@ -9,25 +8,15 @@ icon_state = "body_scanner_0" density = 1 anchored = 1 - circuit = /obj/item/weapon/circuitboard/body_scanner - use_power = 1 idle_power_usage = 60 active_power_usage = 10000 //10 kW. It's a big all-body scanner. - light_color = "#00FF00" + var/obj/machinery/body_scanconsole/console /obj/machinery/bodyscanner/New() ..() - spawn( 5 ) - var/obj/machinery/body_scanconsole/C = locate(/obj/machinery/body_scanconsole) in range(2,src) - if(C) - C.connected = src - -/obj/machinery/bodyscanner/map/New() - ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) @@ -45,10 +34,9 @@ /obj/machinery/bodyscanner/attackby(var/obj/item/G, user as mob) if(default_deconstruction_screwdriver(user, G)) return - if(default_deconstruction_crowbar(user, G)) + else if(default_deconstruction_crowbar(user, G)) return - - if(istype(G, /obj/item/weapon/grab)) + else if(istype(G, /obj/item/weapon/grab)) var/obj/item/weapon/grab/H = G if(panel_open) user << "Close the maintenance panel first." @@ -126,14 +114,14 @@ add_fingerprint(usr) /obj/machinery/bodyscanner/proc/go_out() - if ((!( src.occupant ) || src.locked)) + if ((!(occupant) || src.locked)) return - if (src.occupant.client) - src.occupant.client.eye = src.occupant.client.mob - src.occupant.client.perspective = MOB_PERSPECTIVE - src.occupant.loc = src.loc - src.occupant = null - src.icon_state = "body_scanner_0" + if (occupant.client) + occupant.client.eye = occupant.client.mob + occupant.client.perspective = MOB_PERSPECTIVE + occupant.loc = src.loc + occupant = null + icon_state = "body_scanner_0" return /obj/machinery/bodyscanner/ex_act(severity) @@ -169,7 +157,7 @@ //Body Scan Console /obj/machinery/body_scanconsole - var/obj/machinery/bodyscanner/connected + var/obj/machinery/bodyscanner/scanner var/known_implants = list(/obj/item/weapon/implant/chem, /obj/item/weapon/implant/death_alarm, /obj/item/weapon/implant/loyalty, /obj/item/weapon/implant/tracking) var/delete var/temphtml @@ -188,35 +176,22 @@ findscanner() /obj/machinery/body_scanconsole/attackby(var/obj/item/I, var/mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.dir = dir - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return + else if(istype(I, /obj/item/device/multitool)) //Did you want to link it? + var/obj/item/device/multitool/P = I + if(P.connectable) + if(istype(P.connectable, /obj/machinery/bodyscanner)) + var/obj/machinery/bodyscanner/C = P.connectable + scanner = C + C.console = src + user << " You link the [src] to the [P.connectable]!" + else + user << " You store the [src] in the [P]'s buffer!" + P.connectable = src + return else - src.attack_hand(user) - return + return attack_hand(user) /obj/machinery/body_scanconsole/power_change() if(stat & BROKEN) @@ -226,7 +201,7 @@ stat &= ~NOPOWER else spawn(rand(0, 15)) - src.icon_state = "body_scannerconsole-p" + icon_state = "body_scannerconsole-p" stat |= NOPOWER /obj/machinery/body_scanconsole/ex_act(severity) @@ -244,13 +219,14 @@ return /obj/machinery/body_scanconsole/proc/findscanner() - spawn( 5 ) + spawn(5) var/obj/machinery/bodyscanner/bodyscannernew = null // Loop through every direction - for(dir in list(NORTH,EAST,SOUTH,WEST)) - // Try to find a scanner in that direction - bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) - src.connected = bodyscannernew + for(dir in list(NORTH, EAST, SOUTH, WEST)) // Loop through every direction + bodyscannernew = locate(/obj/machinery/bodyscanner, get_step(src, dir)) // Try to find a scanner in that direction + if(bodyscannernew) + scanner = bodyscannernew + bodyscannernew.console = src return /obj/machinery/body_scanconsole/attack_ai(user as mob) @@ -263,26 +239,30 @@ if(stat & (NOPOWER|BROKEN)) return - if (panel_open) + if (scanner.panel_open) user << "Close the maintenance panel first." return - if(!src.connected) + if(!scanner) findscanner() - - ui_interact(user) + if(scanner) + return ui_interact(user) + else if(scanner) + return ui_interact(user) + else + user << "Scanner not found!" /obj/machinery/body_scanconsole/ui_interact(mob/user, ui_key = "main", var/datum/nanoui/ui = null, var/force_open = 1) var/data[0] - data["connected"] = connected ? 1 : 0 + data["connected"] = scanner ? 1 : 0 - if(connected) - data["occupied"] = connected.occupant ? 1 : 0 + if(scanner) + data["occupied"] = scanner.occupant ? 1 : 0 var/occupantData[0] - if(connected.occupant && ishuman(connected.occupant)) - var/mob/living/carbon/human/H = connected.occupant + if(scanner.occupant && ishuman(scanner.occupant)) + var/mob/living/carbon/human/H = scanner.occupant occupantData["name"] = H.name occupantData["stat"] = H.stat occupantData["health"] = H.health @@ -349,7 +329,7 @@ organStatus["broken"] = E.broken_description if(E.status & ORGAN_ROBOT) organStatus["robotic"] = 1 - if(E.status & ORGAN_SPLINTED) + if(E.splinted) organStatus["splinted"] = 1 if(E.status & ORGAN_BLEEDING) organStatus["bleeding"] = 1 @@ -420,8 +400,8 @@ /obj/machinery/body_scanconsole/proc/generate_printing_text() var/dat = "" - if(connected) - var/mob/living/carbon/human/occupant = connected.occupant + if(scanner) + var/mob/living/carbon/human/occupant = scanner.occupant dat = "Occupant Statistics:
" //Blah obvious if(istype(occupant)) //is there REALLY someone in there? var/t1 @@ -503,7 +483,7 @@ break if(istype(e, /obj/item/organ/external/chest) && occupant.is_lung_ruptured()) lung_ruptured = "Lung ruptured:" - if(e.status & ORGAN_SPLINTED) + if(e.splinted) splint = "Splinted:" if(e.status & ORGAN_BLEEDING) bled = "Bleeding:" diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 9d45b14414e..0ea5527df21 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -15,7 +15,6 @@ var/cooldown_on = 0 req_access = list(access_ai_upload) - /obj/machinery/ai_slipper/New() ..() update_icon() @@ -25,32 +24,32 @@ update_icon() /obj/machinery/ai_slipper/update_icon() - if (stat & NOPOWER || stat & BROKEN) + if(stat & NOPOWER || stat & BROKEN) icon_state = "motion0" else icon_state = disabled ? "motion0" : "motion3" /obj/machinery/ai_slipper/proc/setState(var/enabled, var/uses) - src.disabled = disabled - src.uses = uses - src.power_change() + disabled = disabled + uses = uses + power_change() /obj/machinery/ai_slipper/attackby(obj/item/weapon/W, mob/user) if(stat & (NOPOWER|BROKEN)) return - if (istype(user, /mob/living/silicon)) - return src.attack_hand(user) + if(istype(user, /mob/living/silicon)) + return attack_hand(user) else // trying to unlock the interface - if (src.allowed(usr)) + if(allowed(usr)) locked = !locked user << "You [ locked ? "lock" : "unlock"] the device." - if (locked) - if (user.machine==src) + if(locked) + if(user.machine==src) user.unset_machine() user << browse(null, "window=ai_slipper") else - if (user.machine==src) - src.attack_hand(usr) + if(user.machine==src) + attack_hand(usr) else user << "Access denied." return @@ -62,8 +61,8 @@ /obj/machinery/ai_slipper/attack_hand(mob/user as mob) if(stat & (NOPOWER|BROKEN)) return - if ( (get_dist(src, user) > 1 )) - if (!istype(user, /mob/living/silicon)) + if((get_dist(src, user) > 1)) + if(!istype(user, /mob/living/silicon)) user << text("Too far away.") user.unset_machine() user << browse(null, "window=ai_slipper") @@ -71,18 +70,18 @@ user.set_machine(src) var/loc = src.loc - if (istype(loc, /turf)) + if(istype(loc, /turf)) loc = loc:loc - if (!istype(loc, /area)) + if(!istype(loc, /area)) user << text("Turret badly positioned - loc.loc is [].", loc) return var/area/area = loc var/t = "AI Liquid Dispenser ([area.name])
" - if(src.locked && (!istype(user, /mob/living/silicon))) + if(locked && (!istype(user, /mob/living/silicon))) t += "(Swipe ID card to unlock control panel.)
" else - t += text("Dispenser [] - []?
\n", src.disabled?"deactivated":"activated", src, src.disabled?"Enable":"Disable") + t += text("Dispenser [] - []?
\n", disabled?"deactivated":"activated", src, disabled?"Enable":"Disable") t += text("Uses Left: [uses]. Activate the dispenser?
\n") user << browse(t, "window=computer;size=575x450") @@ -91,25 +90,25 @@ /obj/machinery/ai_slipper/Topic(href, href_list) ..() - if (src.locked) - if (!istype(usr, /mob/living/silicon)) + if(locked) + if(!istype(usr, /mob/living/silicon)) usr << "Control panel is locked!" return - if (href_list["toggleOn"]) - src.disabled = !src.disabled + if(href_list["toggleOn"]) + disabled = !disabled update_icon() - if (href_list["toggleUse"]) + if(href_list["toggleUse"]) if(cooldown_on || disabled) return else new /obj/effect/effect/foam(src.loc) - src.uses-- + uses-- cooldown_on = 1 cooldown_time = world.timeofday + 100 slip_process() return - src.attack_hand(usr) + attack_hand(usr) return /obj/machinery/ai_slipper/proc/slip_process() @@ -122,9 +121,9 @@ cooldown_timeleft = (ticksleft / 10) sleep(5) - if (uses <= 0) + if(uses <= 0) return - if (uses >= 0) + if(uses >= 0) cooldown_on = 0 - src.power_change() - return + power_change() + return \ No newline at end of file diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 699898fde07..ca424f122b0 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -51,10 +51,10 @@ var/rcon_setting = 2 var/rcon_time = 0 var/locked = 1 - var/wiresexposed = 0 // If it's been screwdrivered open. + panel_open = 0 // If it's been screwdrivered open. var/aidisabled = 0 var/shorted = 0 - circuit = /obj/item/weapon/circuitboard/airalarm + circuit = /obj/item/weapon/circuitboard/airalarm var/datum/wires/alarm/wires @@ -112,7 +112,7 @@ /obj/machinery/alarm/proc/first_run() alarm_area = get_area(src) area_uid = alarm_area.uid - if (name == "alarm") + if(name == "alarm") name = "[alarm_area.name] Air Alarm" if(!wires) @@ -123,20 +123,20 @@ TLV["carbon dioxide"] = list(-1.0, -1.0, 5, 10) // Partial pressure, kpa TLV["phoron"] = list(-1.0, -1.0, 0.2, 0.5) // Partial pressure, kpa TLV["other"] = list(-1.0, -1.0, 0.5, 1.0) // Partial pressure, kpa - TLV["pressure"] = list(ONE_ATMOSPHERE*0.80,ONE_ATMOSPHERE*0.90,ONE_ATMOSPHERE*1.10,ONE_ATMOSPHERE*1.20) /* kpa */ - TLV["temperature"] = list(T0C-26, T0C, T0C+40, T0C+66) // K + TLV["pressure"] = list(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE * 0.90, ONE_ATMOSPHERE * 1.10, ONE_ATMOSPHERE * 1.20) /* kpa */ + TLV["temperature"] = list(T0C - 26, T0C, T0C + 40, T0C + 66) // K /obj/machinery/alarm/initialize() set_frequency(frequency) - if (!master_is_operating()) + if(!master_is_operating()) elect_master() /obj/machinery/alarm/process() if((stat & (NOPOWER|BROKEN)) || shorted) return - var/turf/simulated/location = loc + var/turf/simulated/location = src.loc if(!istype(location)) return//returns if loc is not simulated var/datum/gas_mixture/environment = location.return_air() @@ -148,16 +148,16 @@ var/old_pressurelevel = pressure_dangerlevel danger_level = overall_danger_level(environment) - if (old_level != danger_level) + if(old_level != danger_level) apply_danger_level(danger_level) - if (old_pressurelevel != pressure_dangerlevel) - if (breach_detected()) + if(old_pressurelevel != pressure_dangerlevel) + if(breach_detected()) mode = AALARM_MODE_OFF apply_mode() - if (mode==AALARM_MODE_CYCLE && environment.return_pressure() 2.0) update_use_power(2) @@ -184,13 +184,13 @@ "You hear a click and a faint electronic hum.") else //check for when we should stop adjusting temperature - if (get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) + if(get_danger_level(target_temperature, TLV["temperature"]) || abs(environment.temperature - target_temperature) <= 0.5) update_use_power(1) regulating_temperature = 0 visible_message("\The [src] clicks quietly as it stops [environment.temperature > target_temperature ? "cooling" : "heating"] the room.",\ "You hear a click as a faint electronic humming stops.") - if (regulating_temperature) + if(regulating_temperature) if(target_temperature > T0C + MAX_TEMPERATURE) target_temperature = T0C + MAX_TEMPERATURE @@ -198,11 +198,11 @@ target_temperature = T0C + MIN_TEMPERATURE var/datum/gas_mixture/gas - gas = environment.remove(0.25*environment.total_moles) + gas = environment.remove(0.25 * environment.total_moles) if(gas) - if (gas.temperature <= target_temperature) //gas heating - var/energy_used = min( gas.get_thermal_energy_change(target_temperature) , active_power_usage) + if(gas.temperature <= target_temperature) //gas heating + var/energy_used = min(gas.get_thermal_energy_change(target_temperature) , active_power_usage) gas.add_thermal_energy(energy_used) //use_power(energy_used, ENVIRON) //handle by update_use_power instead @@ -212,7 +212,7 @@ //Assume the heat is being pumped into the hull which is fixed at 20 C //none of this is really proper thermodynamics but whatever - var/cop = gas.temperature/T20C //coefficient of performance -> power used = heat_transfer/cop + var/cop = gas.temperature / T20C //coefficient of performance -> power used = heat_transfer/cop heat_transfer = min(heat_transfer, cop * active_power_usage) //this ensures that we don't use more than active_power_usage amount of power @@ -223,7 +223,7 @@ environment.merge(gas) /obj/machinery/alarm/proc/overall_danger_level(var/datum/gas_mixture/environment) - var/partial_pressure = R_IDEAL_GAS_EQUATION*environment.temperature/environment.volume + var/partial_pressure = R_IDEAL_GAS_EQUATION * environment.temperature/environment.volume var/environment_pressure = environment.return_pressure() var/other_moles = 0 @@ -248,7 +248,7 @@ // Returns whether this air alarm thinks there is a breach, given the sensors that are available to it. /obj/machinery/alarm/proc/breach_detected() - var/turf/simulated/location = loc + var/turf/simulated/location = src.loc if(!istype(location)) return 0 @@ -260,20 +260,18 @@ var/environment_pressure = environment.return_pressure() var/pressure_levels = TLV["pressure"] - if (environment_pressure <= pressure_levels[1]) //low pressures - if (!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE)) + if(environment_pressure <= pressure_levels[1]) //low pressures + if(!(mode == AALARM_MODE_PANIC || mode == AALARM_MODE_CYCLE)) return 1 return 0 - /obj/machinery/alarm/proc/master_is_operating() - return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER|BROKEN)) - + return alarm_area.master_air_alarm && !(alarm_area.master_air_alarm.stat & (NOPOWER | BROKEN)) /obj/machinery/alarm/proc/elect_master() - for (var/obj/machinery/alarm/AA in alarm_area) - if (!(AA.stat & (NOPOWER|BROKEN))) + for(var/obj/machinery/alarm/AA in alarm_area) + if(!(AA.stat & (NOPOWER|BROKEN))) alarm_area.master_air_alarm = AA return 1 return 0 @@ -286,7 +284,7 @@ return 0 /obj/machinery/alarm/update_icon() - if(wiresexposed) + if(panel_open) icon_state = "alarmx" set_light(0) return @@ -296,18 +294,18 @@ return var/icon_level = danger_level - if (alarm_area.atmosalm) + if(alarm_area.atmosalm) icon_level = max(icon_level, 1) //if there's an atmos alarm but everything is okay locally, no need to go past yellow var/new_color = null switch(icon_level) - if (0) + if(0) icon_state = "alarm0" new_color = "#03A728" - if (1) + if(1) icon_state = "alarm2" //yes, alarm2 is yellow alarm new_color = "#EC8B2F" - if (2) + if(2) icon_state = "alarm1" new_color = "#DA0205" @@ -316,20 +314,20 @@ /obj/machinery/alarm/receive_signal(datum/signal/signal) if(stat & (NOPOWER|BROKEN)) return - if (alarm_area.master_air_alarm != src) - if (master_is_operating()) + if(alarm_area.master_air_alarm != src) + if(master_is_operating()) return elect_master() - if (alarm_area.master_air_alarm != src) + if(alarm_area.master_air_alarm != src) return if(!signal || signal.encryption) return var/id_tag = signal.data["tag"] - if (!id_tag) + if(!id_tag) return - if (signal.data["area"] != area_uid) + if(signal.data["area"] != area_uid) return - if (signal.data["sigtype"] != "status") + if(signal.data["sigtype"] != "status") return var/dev_type = signal.data["device"] @@ -342,28 +340,28 @@ /obj/machinery/alarm/proc/register_env_machine(var/m_id, var/device_type) var/new_name - if (device_type=="AVP") + if(device_type == "AVP") new_name = "[alarm_area.name] Vent Pump #[alarm_area.air_vent_names.len+1]" alarm_area.air_vent_names[m_id] = new_name - else if (device_type=="AScr") + else if(device_type == "AScr") new_name = "[alarm_area.name] Air Scrubber #[alarm_area.air_scrub_names.len+1]" alarm_area.air_scrub_names[m_id] = new_name else return - spawn (10) - send_signal(m_id, list("init" = new_name) ) + spawn(10) + send_signal(m_id, list("init" = new_name)) /obj/machinery/alarm/proc/refresh_all() for(var/id_tag in alarm_area.air_vent_names) var/list/I = alarm_area.air_vent_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) for(var/id_tag in alarm_area.air_scrub_names) var/list/I = alarm_area.air_scrub_info[id_tag] - if (I && I["timestamp"]+AALARM_REPORT_TIMEOUT/2 > world.time) + if(I && I["timestamp"] + AALARM_REPORT_TIMEOUT / 2 > world.time) continue - send_signal(id_tag, list("status") ) + send_signal(id_tag, list("status")) /obj/machinery/alarm/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) @@ -390,42 +388,42 @@ /obj/machinery/alarm/proc/apply_mode() //propagate mode to other air alarms in the area //TODO: make it so that players can choose between applying the new mode to the room they are in (related area) vs the entire alarm area - for (var/obj/machinery/alarm/AA in alarm_area) + for(var/obj/machinery/alarm/AA in alarm_area) AA.mode = mode switch(mode) if(AALARM_MODE_SCRUBBING) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0) ) + send_signal(device_id, list("power"= 1, "co2_scrub"= 1, "scrubbing"= 1, "panic_siphon"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_PANIC, AALARM_MODE_CYCLE) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) if(AALARM_MODE_REPLACEMENT) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 1, "panic_siphon"= 1) ) + send_signal(device_id, list("power"= 1, "panic_siphon"= 1)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_FILL) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default") ) + send_signal(device_id, list("power"= 1, "checks"= "default", "set_external_pressure"= "default")) if(AALARM_MODE_OFF) for(var/device_id in alarm_area.air_scrub_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) for(var/device_id in alarm_area.air_vent_names) - send_signal(device_id, list("power"= 0) ) + send_signal(device_id, list("power"= 0)) /obj/machinery/alarm/proc/apply_danger_level(var/new_danger_level) - if (report_danger_level && alarm_area.atmosalert(new_danger_level, src)) + if(report_danger_level && alarm_area.atmosalert(new_danger_level, src)) post_alert(new_danger_level) update_icon() @@ -443,9 +441,9 @@ if(alert_level==2) alert_signal.data["alert"] = "severe" - else if (alert_level==1) + else if(alert_level==1) alert_signal.data["alert"] = "minor" - else if (alert_level==0) + else if(alert_level==0) alert_signal.data["alert"] = "clear" frequency.post_signal(src, alert_signal) @@ -455,7 +453,7 @@ /obj/machinery/alarm/attack_hand(mob/user) . = ..() - if (.) + if(.) return return interact(user) @@ -485,7 +483,7 @@ ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "air_alarm.tmpl", src.name, 325, 625, master_ui = master_ui, state = state) + ui = new(user, src, ui_key, "air_alarm.tmpl", name, 325, 625, master_ui = master_ui, state = state) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -570,7 +568,7 @@ "carbon dioxide" = "CO2", "phoron" = "Toxin", "other" = "Other") - for (var/g in gas_names) + for(var/g in gas_names) thresholds[++thresholds.len] = list("name" = gas_names[g], "settings" = list()) selected = TLV[g] for(var/i = 1, i <= 4, i++) @@ -586,7 +584,6 @@ for(var/i = 1, i <= 4, i++) thresholds[thresholds.len]["settings"] += list(list("env" = "temperature", "val" = i, "selected" = selected[i])) - data["thresholds"] = thresholds /obj/machinery/alarm/CanUseTopic(var/mob/user, var/datum/topic_state/state, var/href_list = list()) @@ -660,7 +657,7 @@ "panic_siphon", "scrubbing") - send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]) ) ) + send_signal(device_id, list(href_list["command"] = text2num(href_list["val"]))) return 1 if("set_threshold") @@ -668,16 +665,16 @@ var/threshold = text2num(href_list["var"]) var/list/selected = TLV[env] var/list/thresholds = list("lower bound", "low warning", "high warning", "upper bound") - var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null|num - if (isnull(newval)) + var/newval = input("Enter [thresholds[threshold]] for [env]", "Alarm triggers", selected[threshold]) as null | num + if(isnull(newval)) return 1 - if (newval<0) + if(newval<0) selected[threshold] = -1.0 - else if (env=="temperature" && newval>5000) + else if(env=="temperature" && newval>5000) selected[threshold] = 5000 - else if (env=="pressure" && newval>50*ONE_ATMOSPHERE) + else if(env=="pressure" && newval>50*ONE_ATMOSPHERE) selected[threshold] = 50*ONE_ATMOSPHERE - else if (env!="temperature" && env!="pressure" && newval>200) + else if(env!="temperature" && env!="pressure" && newval>200) selected[threshold] = 200 else newval = round(newval,0.01) @@ -727,13 +724,13 @@ return 1 if(href_list["atmos_alarm"]) - if (alarm_area.atmosalert(2, src)) + if(alarm_area.atmosalert(2, src)) apply_danger_level(2) update_icon() return 1 if(href_list["atmos_reset"]) - if (alarm_area.atmosalert(0, src)) + if(alarm_area.atmosalert(0, src)) apply_danger_level(0) update_icon() return 1 @@ -744,35 +741,13 @@ return 1 /obj/machinery/alarm/attackby(obj/item/W as obj, mob/user as mob) - src.add_fingerprint(user) - if(istype(W, /obj/item/weapon/screwdriver)) // Opening that Air Alarm up. - //user << "You pop the Air Alarm's maintence panel open." - wiresexposed = !wiresexposed - user << "The wires have been [wiresexposed ? "exposed" : "unexposed"]" - update_icon() + add_fingerprint(user) + if(alarm_deconstruction_screwdriver(user, W)) + return + if(alarm_deconstruction_wirecutters(user, W)) return - if (wiresexposed && istype(W, /obj/item/weapon/wirecutters)) - user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - new/obj/item/stack/cable_coil(get_turf(src), 5) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "airalarm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 2 - A.icon_state = "airalarm_2" - M.deconstruct(src) - qdel(src) - return - - if (istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda))// trying to unlock the interface with an ID card if(stat & (NOPOWER|BROKEN)) user << "It does nothing" return @@ -800,7 +775,7 @@ Just a object used in constructing air alarms icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "Looks like a circuit. Probably is." - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) */ /* @@ -822,14 +797,14 @@ FIRE ALARM active_power_usage = 6 power_channel = ENVIRON var/last_process = 0 - var/wiresexposed = 0 + panel_open = 0 var/seclevel - circuit = /obj/item/weapon/circuitboard/firealarm + circuit = /obj/item/weapon/circuitboard/firealarm /obj/machinery/firealarm/update_icon() overlays.Cut() - if(wiresexposed) + if(panel_open) set_light(0) return @@ -840,7 +815,7 @@ FIRE ALARM icon_state = "firep" set_light(0) else - if(!src.detecting) + if(!detecting) icon_state = "fire1" set_light(l_range = 4, l_power = 2, l_color = "#ff0000") else @@ -851,79 +826,56 @@ FIRE ALARM if("red") set_light(l_range = 4, l_power = 2, l_color = "#ff0000") if("delta") set_light(l_range = 4, l_power = 2, l_color = "#FF6633") - src.overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]") + overlays += image('icons/obj/monitors.dmi', "overlay_[seclevel]") /obj/machinery/firealarm/fire_act(datum/gas_mixture/air, temperature, volume) - if(src.detecting) - if(temperature > T0C+200) - src.alarm() // added check of detector status here + if(detecting) + if(temperature > T0C + 200) + alarm() // added check of detector status here return /obj/machinery/firealarm/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/firealarm/bullet_act() - return src.alarm() + return alarm() /obj/machinery/firealarm/emp_act(severity) - if(prob(50/severity)) - alarm(rand(30/severity, 60/severity)) + if(prob(50 / severity)) + alarm(rand(30 / severity, 60 / severity)) ..() /obj/machinery/firealarm/attackby(obj/item/W as obj, mob/user as mob) - src.add_fingerprint(user) + add_fingerprint(user) - if (istype(W, /obj/item/weapon/screwdriver)) - wiresexposed = !wiresexposed - update_icon() - return - - if(wiresexposed) - if (istype(W, /obj/item/device/multitool)) - src.detecting = !( src.detecting ) - if (src.detecting) + if(panel_open) + if(istype(W, /obj/item/device/multitool)) + detecting = !(detecting) + if(detecting) user.visible_message("\The [user] has reconnected [src]'s detecting unit!", "You have reconnected [src]'s detecting unit.") else user.visible_message("\The [user] has disconnected [src]'s detecting unit!", "You have disconnected [src]'s detecting unit.") - else if (istype(W, /obj/item/weapon/wirecutters)) - user.visible_message("\The [user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") - new/obj/item/stack/cable_coil(get_turf(src), 5) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "firealarm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 2 - A.icon_state = "firealarm_2" - M.deconstruct(src) - qdel(src) return - src.alarm() + alarm() return /obj/machinery/firealarm/process()//Note: this processing was mostly phased out due to other code, and only runs when needed if(stat & (NOPOWER|BROKEN)) return - if(src.timing) - if(src.time > 0) - src.time = src.time - ((world.timeofday - last_process)/10) + if(timing) + if(time > 0) + time = time - ((world.timeofday - last_process) / 10) else - src.alarm() - src.time = 0 - src.timing = 0 + alarm() + time = 0 + timing = 0 processing_objects.Remove(src) - src.updateDialog() + updateDialog() last_process = world.timeofday - if(locate(/obj/fire) in loc) + if(locate(/obj/fire) in src.loc) alarm() return @@ -934,41 +886,41 @@ FIRE ALARM update_icon() /obj/machinery/firealarm/attack_hand(mob/user as mob) - if(user.stat || stat & (NOPOWER|BROKEN)) + if(user.stat || stat & (NOPOWER | BROKEN)) return user.set_machine(src) var/area/A = src.loc var/d1 var/d2 - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon)) A = A.loc - if (A.fire) + if(A.fire) d1 = text("Reset - Lockdown", src) else d1 = text("Alarm - Lockdown", src) - if (src.timing) + if(timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 var/dat = "Fire alarm [d1]\n
The current alert level is: [get_security_level()]

\nTimer System: [d2]
\nTime Left: [(minute ? "[minute]:" : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") else A = A.loc - if (A.fire) + if(A.fire) d1 = text("[]", src, stars("Reset - Lockdown")) else d1 = text("[]", src, stars("Alarm - Lockdown")) - if (src.timing) + if(timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) - var/second = round(src.time) % 60 - var/minute = (round(src.time) - second) / 60 + var/second = round(time) % 60 + var/minute = (round(time) - second) / 60 var/dat = "[stars("Fire alarm")] [d1]\n
The current alert level is: [stars(get_security_level())]

\nTimer System: [d2]
\nTime Left: [(minute ? text("[]:", minute) : null)][second] - - + +\n
" user << browse(dat, "window=firealarm") onclose(user, "firealarm") @@ -976,43 +928,43 @@ FIRE ALARM /obj/machinery/firealarm/Topic(href, href_list) ..() - if (usr.stat || stat & (BROKEN|NOPOWER)) + if(usr.stat || stat & (BROKEN | NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(src.loc, /turf))) || (istype(usr, /mob/living/silicon))) usr.set_machine(src) - if (href_list["reset"]) - src.reset() - else if (href_list["alarm"]) - src.alarm() - else if (href_list["time"]) - src.timing = text2num(href_list["time"]) + if(href_list["reset"]) + reset() + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) last_process = world.timeofday processing_objects.Add(src) - else if (href_list["tp"]) + else if(href_list["tp"]) var/tp = text2num(href_list["tp"]) - src.time += tp - src.time = min(max(round(src.time), 0), 120) + time += tp + time = min(max(round(time), 0), 120) - src.updateUsrDialog() + updateUsrDialog() - src.add_fingerprint(usr) + add_fingerprint(usr) else usr << browse(null, "window=firealarm") return return /obj/machinery/firealarm/proc/reset() - if (!( src.working )) + if(!(working)) return var/area/area = get_area(src) for(var/obj/machinery/firealarm/FA in area) - fire_alarm.clearAlarm(loc, FA) + fire_alarm.clearAlarm(src.loc, FA) update_icon() return /obj/machinery/firealarm/proc/alarm(var/duration = 0) - if (!( src.working)) + if(!(working)) return var/area/area = get_area(src) for(var/obj/machinery/firealarm/FA in area) @@ -1039,7 +991,7 @@ Just a object used in constructing fire alarms icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" desc = "A circuit. It has a label on it, it says \"Can handle heat levels up to 40 degrees celsius!\"" - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) */ /obj/machinery/partyalarm @@ -1066,13 +1018,13 @@ Just a object used in constructing fire alarms ASSERT(isarea(A)) var/d1 var/d2 - if (istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) + if(istype(user, /mob/living/carbon/human) || istype(user, /mob/living/silicon/ai)) - if (A.party) + if(A.party) d1 = text("No Party :(", src) else d1 = text("PARTY!!!", src) - if (timing) + if(timing) d2 = text("Stop Time Lock", src) else d2 = text("Initiate Time Lock", src) @@ -1082,11 +1034,11 @@ Just a object used in constructing fire alarms user << browse(dat, "window=partyalarm") onclose(user, "partyalarm") else - if (A.fire) + if(A.fire) d1 = text("[]", src, stars("No Party :(")) else d1 = text("[]", src, stars("PARTY!!!")) - if (timing) + if(timing) d2 = text("[]", src, stars("Stop Time Lock")) else d2 = text("[]", src, stars("Initiate Time Lock")) @@ -1098,7 +1050,7 @@ Just a object used in constructing fire alarms return /obj/machinery/partyalarm/proc/reset() - if (!( working )) + if(!(working)) return var/area/A = get_area(src) ASSERT(isarea(A)) @@ -1106,7 +1058,7 @@ Just a object used in constructing fire alarms return /obj/machinery/partyalarm/proc/alarm() - if (!( working )) + if(!(working)) return var/area/A = get_area(src) ASSERT(isarea(A)) @@ -1115,23 +1067,20 @@ Just a object used in constructing fire alarms /obj/machinery/partyalarm/Topic(href, href_list) ..() - if (usr.stat || stat & (BROKEN|NOPOWER)) + if(usr.stat || stat & (BROKEN|NOPOWER)) return - if ((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) + if((usr.contents.Find(src) || ((get_dist(src, usr) <= 1) && istype(loc, /turf))) || (istype(usr, /mob/living/silicon/ai))) usr.machine = src - if (href_list["reset"]) + if(href_list["reset"]) reset() - else - if (href_list["alarm"]) - alarm() - else - if (href_list["time"]) - timing = text2num(href_list["time"]) - else - if (href_list["tp"]) - var/tp = text2num(href_list["tp"]) - time += tp - time = min(max(round(time), 0), 120) + else if(href_list["alarm"]) + alarm() + else if(href_list["time"]) + timing = text2num(href_list["time"]) + else if(href_list["tp"]) + var/tp = text2num(href_list["tp"]) + time += tp + time = min(max(round(time), 0), 120) updateUsrDialog() add_fingerprint(usr) diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index 19d1ee12532..83c6f81e305 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -58,7 +58,6 @@ signal.data["sigtype"]="status" radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - /obj/machinery/air_sensor/proc/set_frequency(new_frequency) radio_controller.remove_object(src, frequency) frequency = new_frequency @@ -76,12 +75,9 @@ obj/machinery/air_sensor/Destroy() icon = 'icons/obj/computer.dmi' icon_keyboard = "atmos_key" icon_screen = "tank" - name = "Computer" - var/frequency = 1439 var/list/sensors = list() - var/list/sensor_information = list() var/datum/radio_frequency/radio_connection circuit = /obj/item/weapon/circuitboard/air_management @@ -121,8 +117,8 @@ obj/machinery/computer/general_air_control/Destroy() data["sensors"] = sensors_ui ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 525, 600) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 525, 600) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -137,14 +133,11 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/large_tank_control icon = 'icons/obj/computer.dmi' - frequency = 1441 var/input_tag var/output_tag - var/list/input_info var/list/output_info - var/input_flow_setting = 200 var/pressure_setting = ONE_ATMOSPHERE * 45 circuit = /obj/item/weapon/circuitboard/air_management/tank_control @@ -179,8 +172,8 @@ obj/machinery/computer/general_air_control/Destroy() data["pressure_setting"] = pressure_setting ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 660, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 660, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -251,14 +244,11 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/supermatter_core icon = 'icons/obj/computer.dmi' - frequency = 1438 var/input_tag var/output_tag - var/list/input_info var/list/output_info - var/input_flow_setting = 700 var/pressure_setting = 100 circuit = /obj/item/weapon/circuitboard/air_management/supermatter_core @@ -292,8 +282,8 @@ obj/machinery/computer/general_air_control/Destroy() data["pressure_setting"] = pressure_setting ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 650, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -365,12 +355,9 @@ obj/machinery/computer/general_air_control/Destroy() /obj/machinery/computer/general_air_control/fuel_injection icon = 'icons/obj/computer.dmi' icon_screen = "alert:0" - var/device_tag var/list/device_info - var/automation = 0 - var/cutoff_temperature = 2000 var/on_temperature = 1200 circuit = /obj/item/weapon/circuitboard/air_management/injector_control @@ -427,8 +414,8 @@ obj/machinery/computer/general_air_control/Destroy() data["device_info"] = null ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) - ui = new(user, src, ui_key, "atmo_control.tmpl", src.name, 650, 500) + if(!ui) + ui = new(user, src, ui_key, "atmo_control.tmpl", name, 650, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(5) @@ -494,8 +481,4 @@ obj/machinery/computer/general_air_control/Destroy() "sigtype"="command" ) - radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) - - - - + radio_connection.post_signal(src, signal, filter = RADIO_ATMOSIA) \ No newline at end of file diff --git a/code/game/machinery/atmoalter/canister.dm b/code/game/machinery/atmoalter/canister.dm index 80b33cfaa05..2a59f345d4d 100644 --- a/code/game/machinery/atmoalter/canister.dm +++ b/code/game/machinery/atmoalter/canister.dm @@ -5,7 +5,7 @@ density = 1 var/health = 100.0 flags = CONDUCT - w_class = 5 + w_class = ITEMSIZE_HUGE var/valve_open = 0 var/release_pressure = ONE_ATMOSPHERE diff --git a/code/game/machinery/atmoalter/pump.dm b/code/game/machinery/atmoalter/pump.dm index a5bdac74218..9f31a9ba1a7 100644 --- a/code/game/machinery/atmoalter/pump.dm +++ b/code/game/machinery/atmoalter/pump.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "psiphon:0" density = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL var/on = 0 var/direction_out = 0 //0 = siphoning, 1 = releasing diff --git a/code/game/machinery/atmoalter/scrubber.dm b/code/game/machinery/atmoalter/scrubber.dm index 87997d32c8e..10091a49185 100644 --- a/code/game/machinery/atmoalter/scrubber.dm +++ b/code/game/machinery/atmoalter/scrubber.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/atmos.dmi' icon_state = "pscrubber:0" density = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL var/on = 0 var/volume_rate = 800 diff --git a/code/game/machinery/autolathe.dm b/code/game/machinery/autolathe.dm index 236079f8e31..e9c7df22b2b 100644 --- a/code/game/machinery/autolathe.dm +++ b/code/game/machinery/autolathe.dm @@ -26,7 +26,6 @@ /obj/machinery/autolathe/New() ..() wires = new(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) @@ -48,7 +47,6 @@ current_category = machine_recipes.categories[1] /obj/machinery/autolathe/interact(mob/user as mob) - update_recipe_list() if(..() || (disabled && !panel_open)) @@ -119,7 +117,6 @@ onclose(user, "autolathe") /obj/machinery/autolathe/attackby(var/obj/item/O as obj, var/mob/user as mob) - if(busy) user << "\The [src] is busy. Please wait for completion of previous operation." return @@ -223,7 +220,6 @@ interact(user) /obj/machinery/autolathe/Topic(href, href_list) - if(..()) return @@ -277,7 +273,7 @@ if(!making || !src) return //Create the desired item. - var/obj/item/I = new making.path(loc) + var/obj/item/I = new making.path(src.loc) if(multiplier > 1 && istype(I, /obj/item/stack)) var/obj/item/stack/S = I S.amount = multiplier @@ -303,7 +299,6 @@ mat_efficiency = 1.1 - man_rating * 0.1// Normally, price is 1.25 the amount of material, so this shouldn't go higher than 0.8. Maximum rating of parts is 3 /obj/machinery/autolathe/dismantle() - for(var/mat in stored_material) var/material/M = get_material_by_name(mat) if(!istype(M)) diff --git a/code/game/machinery/biogenerator.dm b/code/game/machinery/biogenerator.dm index 986d20e3b91..07f0b8f9bd9 100644 --- a/code/game/machinery/biogenerator.dm +++ b/code/game/machinery/biogenerator.dm @@ -15,7 +15,6 @@ var/build_eff = 1 var/eat_eff = 1 - /obj/machinery/biogenerator/New() ..() var/datum/reagents/R = new/datum/reagents(1000) @@ -23,11 +22,9 @@ R.my_atom = src beaker = new /obj/item/weapon/reagent_containers/glass/bottle(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) - RefreshParts() /obj/machinery/biogenerator/on_reagent_change() //When the reagents change, change the icon as well. @@ -96,13 +93,13 @@ return user.set_machine(src) var/dat = "BiogeneratorBiogenerator:
" - if (processing) + if(processing) dat += "Biogenerator is processing! Please wait..." else dat += "Biomass: [points] points.
" switch(menustat) if("menu") - if (beaker) + if(beaker) dat += "Activate Biogenerator!
" dat += "Detach Container

" dat += "Food
" @@ -139,9 +136,9 @@ interact(user) /obj/machinery/biogenerator/proc/activate() - if (usr.stat) + if(usr.stat) return - if (stat) //NOPOWER etc + if(stat) //NOPOWER etc return if(processing) usr << "The biogenerator is in the process of working." @@ -255,4 +252,4 @@ man_rating += P.rating build_eff = man_rating - eat_eff = bin_rating + eat_eff = bin_rating \ No newline at end of file diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index 70557a2e18b..b072a7e4889 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -10,9 +10,8 @@ idle_power_usage = 2 active_power_usage = 4 - /obj/machinery/button/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/button/attackby(obj/item/weapon/W, mob/user as mob) - return src.attack_hand(user) \ No newline at end of file + return attack_hand(user) \ No newline at end of file diff --git a/code/game/machinery/camera/camera_assembly.dm b/code/game/machinery/camera/camera_assembly.dm index 135ad3c1f03..33cb1b0613c 100644 --- a/code/game/machinery/camera/camera_assembly.dm +++ b/code/game/machinery/camera/camera_assembly.dm @@ -3,7 +3,7 @@ desc = "A pre-fabricated security camera kit, ready to be assembled and mounted to a surface." icon = 'icons/obj/monitors.dmi' icon_state = "cameracase" - w_class = 2 + w_class = ITEMSIZE_SMALL anchored = 0 matter = list(DEFAULT_WALL_MATERIAL = 700,"glass" = 300) diff --git a/code/game/machinery/camera/tracking.dm b/code/game/machinery/camera/tracking.dm index 739583ede88..cb57906e301 100644 --- a/code/game/machinery/camera/tracking.dm +++ b/code/game/machinery/camera/tracking.dm @@ -222,7 +222,7 @@ mob/living/proc/near_camera() /mob/living/proc/tracking_status() // Easy checks first. - // Don't detect mobs on Centcom. Since the wizard den is on Centcomm, we only need this. + // Don't detect mobs on CentCom. Since the wizard den is on CentCom, we only need this. var/obj/item/weapon/card/id/id = GetIdCard() if(id && id.prevent_tracking()) return TRACKING_TERMINATE diff --git a/code/game/machinery/cell_charger.dm b/code/game/machinery/cell_charger.dm index 9ff0b2f894a..1e5c6ec73b5 100644 --- a/code/game/machinery/cell_charger.dm +++ b/code/game/machinery/cell_charger.dm @@ -14,7 +14,7 @@ /obj/machinery/cell_charger/update_icon() icon_state = "ccharger[charging ? 1 : 0]" - if(charging && !(stat & (BROKEN|NOPOWER)) ) + if(charging && !(stat & (BROKEN|NOPOWER))) var/newlevel = round(charging.percent() * 4.0 / 99) //world << "nl: [newlevel]" @@ -73,14 +73,14 @@ charging.add_fingerprint(user) charging.update_icon() - src.charging = null + charging = null user.visible_message("[user] removes the cell from the charger.", "You remove the cell from the charger.") chargelevel = -1 update_icon() /obj/machinery/cell_charger/attack_ai(mob/user) if(istype(user, /mob/living/silicon/robot) && Adjacent(user)) // Borgs can remove the cell if they are near enough - if(!src.charging) + if(!charging) return charging.loc = src.loc @@ -104,7 +104,7 @@ update_use_power(0) return - if (charging && !charging.fully_charged()) + if(charging && !charging.fully_charged()) charging.give(active_power_usage*CELLRATE) update_use_power(2) diff --git a/code/game/machinery/cloning.dm b/code/game/machinery/cloning.dm index 19d187ade42..17c3b58763a 100644 --- a/code/game/machinery/cloning.dm +++ b/code/game/machinery/cloning.dm @@ -47,7 +47,6 @@ /obj/machinery/clonepod/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -184,7 +183,7 @@ else if((occupant.health >= heal_level) && (!eject_wait)) playsound(src.loc, 'sound/machines/ding.ogg', 50, 1) - src.audible_message("\The [src] signals that the cloning process is complete.") + audible_message("\The [src] signals that the cloning process is complete.") connected_message("Cloning Process Complete.") locked = 0 go_out() @@ -235,7 +234,7 @@ connected = null else anchored = 1 - playsound(loc, 'sound/items/Ratchet.ogg', 100, 1) + playsound(src.loc, 'sound/items/Ratchet.ogg', 100, 1) if(anchored) user.visible_message("[user] secures [src] to the floor.", "You secure [src] to the floor.") else @@ -298,7 +297,7 @@ if(mess) //Clean that mess and dump those gibs! mess = 0 - gibs(loc) + gibs(src.loc) update_icon() return @@ -308,7 +307,7 @@ if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = loc + occupant.loc = src.loc eject_wait = 0 //If it's still set somehow. domutcheck(occupant) //Waiting until they're out before possible transforming. occupant = null @@ -342,21 +341,21 @@ switch(severity) if(1.0) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return if(2.0) if(prob(50)) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return if(3.0) if(prob(25)) for(var/atom/movable/A as mob|obj in src) - A.loc = loc + A.loc = src.loc ex_act(severity) qdel(src) return @@ -366,9 +365,9 @@ /obj/machinery/clonepod/update_icon() ..() icon_state = "pod_0" - if (occupant && !(stat & NOPOWER)) + if(occupant && !(stat & NOPOWER)) icon_state = "pod_1" - else if (mess) + else if(mess) icon_state = "pod_g" //Health Tracker Implant @@ -396,7 +395,7 @@ icon = 'icons/obj/cloning.dmi' icon_state = "datadisk0" //Gosh I hope syndies don't mistake them for the nuke disk. item_state = "card-id" - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/datum/dna2/record/buf = null var/read_only = 0 //Well,it's still a floppy disk diff --git a/code/game/machinery/computer/arcade.dm b/code/game/machinery/computer/arcade.dm index d338edacc1d..0a568b4adec 100644 --- a/code/game/machinery/computer/arcade.dm +++ b/code/game/machinery/computer/arcade.dm @@ -1005,7 +1005,7 @@ desc = "A model spaceship, it looks like those used back in the day when travelling to Orion! It even has a miniature FX-293 reactor, which was renowned for its instability and tendency to explode..." icon = 'icons/obj/toy.dmi' icon_state = "ship" - w_class = 2 + w_class = ITEMSIZE_SMALL var/active = 0 //if the ship is on /obj/item/weapon/orion_ship/examine(mob/user) diff --git a/code/game/machinery/computer/communications.dm b/code/game/machinery/computer/communications.dm index a657d881a8b..9ff98b84b4d 100644 --- a/code/game/machinery/computer/communications.dm +++ b/code/game/machinery/computer/communications.dm @@ -173,7 +173,7 @@ src.updateDialog() // OMG CENTCOMM LETTERHEAD - if("MessageCentcomm") + if("MessageCentCom") if(src.authenticated==2) if(centcomm_message_cooldown) usr << "\red Arrays recycling. Please stand by." @@ -181,7 +181,7 @@ var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) if(!input || !(usr in view(1,src))) return - Centcomm_announce(input, usr) + CentCom_announce(input, usr) usr << "\blue Message transmitted." log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") centcomm_message_cooldown = 1 @@ -295,7 +295,7 @@ if (src.authenticated==2) dat += "
\[ Make An Announcement \]" if(src.emagged == 0) - dat += "
\[ Send an emergency message to [boss_short] \]" + dat += "
\[ Send an emergency message to [boss_short] \]" else dat += "
\[ Send an emergency message to \[UNKNOWN\] \]" dat += "
\[ Restore Backup Routing Data \]" diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 6f380739cc4..5cdbdeab9c6 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -7,7 +7,6 @@ use_power = 1 idle_power_usage = 300 active_power_usage = 300 - frame_type = "computer" var/processing = 0 var/icon_keyboard = "generic_key" @@ -97,37 +96,8 @@ return text /obj/machinery/computer/attackby(I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = M.board_type - for (var/obj/C in src) - C.forceMove(loc) - if (src.stat & BROKEN) - user << "The broken glass falls out." - new /obj/item/weapon/material/shard( src.loc ) - A.state = 3 - A.icon_state = "[A.frame_type]_3" - else - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "[A.frame_type]_4" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) - return - - - - - - + attack_hand(user) + return \ No newline at end of file diff --git a/code/game/machinery/computer/guestpass.dm b/code/game/machinery/computer/guestpass.dm index 4c0f0591b24..b01b03f9b35 100644 --- a/code/game/machinery/computer/guestpass.dm +++ b/code/game/machinery/computer/guestpass.dm @@ -65,25 +65,6 @@ /obj/machinery/computer/guestpass/attackby(obj/I, mob/user) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "guestpass" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "guestpass_4" - M.deconstruct(src) - qdel(src) - return if(istype(I, /obj/item/weapon/card/id)) if(!giver && user.unEquip(I)) I.forceMove(src) @@ -151,7 +132,7 @@ if (href_list["choice"]) switch(href_list["choice"]) if ("giv_name") - var/nam = sanitize(input("Person pass is issued to", "Name", giv_name) as text|null) + var/nam = sanitizeName(input("Person pass is issued to", "Name", giv_name) as text|null) if (nam) giv_name = nam if ("reason") diff --git a/code/game/machinery/computer/security.dm b/code/game/machinery/computer/security.dm index 6868f233437..eda3a3b7991 100644 --- a/code/game/machinery/computer/security.dm +++ b/code/game/machinery/computer/security.dm @@ -496,7 +496,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer/skills.dm b/code/game/machinery/computer/skills.dm index 1fa38c4a719..2b4d898cfcb 100644 --- a/code/game/machinery/computer/skills.dm +++ b/code/game/machinery/computer/skills.dm @@ -343,7 +343,7 @@ What a mess.*/ return active1.fields["age"] = t1 if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer3/buildandrepair.dm b/code/game/machinery/computer3/buildandrepair.dm index 47ceffb756b..a064d8ce1c8 100644 --- a/code/game/machinery/computer3/buildandrepair.dm +++ b/code/game/machinery/computer3/buildandrepair.dm @@ -2,7 +2,7 @@ /obj/item/part/computer/circuitboard density = 0 anchored = 0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL name = "Circuit board" icon = 'icons/obj/module.dmi' icon_state = "id_mod" diff --git a/code/game/machinery/computer3/component.dm b/code/game/machinery/computer3/component.dm index 0f7f64d0119..47d5e298535 100644 --- a/code/game/machinery/computer3/component.dm +++ b/code/game/machinery/computer3/component.dm @@ -14,7 +14,7 @@ gender = PLURAL icon = 'icons/obj/stock_parts.dmi' icon_state = "hdd1" - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/emagged = 0 diff --git a/code/game/machinery/computer3/computers/card.dm b/code/game/machinery/computer3/computers/card.dm index c57e9d0fe7a..3a510ac8360 100644 --- a/code/game/machinery/computer3/computers/card.dm +++ b/code/game/machinery/computer3/computers/card.dm @@ -35,8 +35,8 @@ var jobs_all = "" jobs_all += "" - jobs_all += ""//Captain in special because he is head of heads ~Intercross21 - jobs_all += "" + jobs_all += ""//Station Administrator in special because he is head of heads ~Intercross21 + jobs_all += "" jobs_all += "" counter = 0 @@ -311,11 +311,15 @@ writer.assignment = t1 writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") + data_core.manifest_modify(writer.registered_name, writer.assignment) + callHook("reassign_employee", list(writer)) if("reg" in href_list) if(auth) writer.registered_name = href_list["reg"] writer.name = text("[writer.registered_name]'s ID Card ([writer.assignment])") + data_core.manifest_modify(writer.registered_name, writer.assignment) + callHook("reassign_employee", list(writer)) computer.updateUsrDialog() return diff --git a/code/game/machinery/computer3/computers/communications.dm b/code/game/machinery/computer3/computers/communications.dm index 8168a3f8da2..cace79d3784 100644 --- a/code/game/machinery/computer3/computers/communications.dm +++ b/code/game/machinery/computer3/computers/communications.dm @@ -22,8 +22,8 @@ /datum/file/program/communications - name = "Centcom communications relay" - desc = "Used to connect to Centcom." + name = "CentCom communications relay" + desc = "Used to connect to CentCom." active_state = "comm" req_access = list(access_heads) @@ -185,7 +185,7 @@ computer.updateDialog() // OMG CENTCOMM LETTERHEAD - if("MessageCentcomm" in href_list) + if("MessageCentCom" in href_list) if(!computer.radio.subspace) return if(authenticated==2) @@ -195,7 +195,7 @@ var/input = sanitize(input("Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response.", "To abort, send an empty message.", "")) if(!input || !interactable()) return - Centcomm_announce(input, usr) + CentCom_announce(input, usr) usr << "Message transmitted." log_say("[key_name(usr)] has made a [boss_short] announcement: [input]") centcomm_message_cooldown = 1 @@ -288,7 +288,7 @@ if (authenticated==2) dat += "
    \[ Make An Announcement \]" if(computer.emagged == 0) - dat += "
    \[ Send an emergency message to [boss_short] \]" + dat += "
    \[ Send an emergency message to [boss_short] \]" else dat += "
    \[ Send an emergency message to \[UNKNOWN\] \]" dat += "
    \[ Restore Backup Routing Data \]" diff --git a/code/game/machinery/computer3/computers/security.dm b/code/game/machinery/computer3/computers/security.dm index e6f19b8588e..a335cf1c73d 100644 --- a/code/game/machinery/computer3/computers/security.dm +++ b/code/game/machinery/computer3/computers/security.dm @@ -513,7 +513,7 @@ What a mess.*/ temp += "
  • Released
  • " temp += "" if("rank") - var/list/L = list( "Head of Personnel", "Captain", "AI" ) + var/list/L = list( "Head of Personnel", "Station Administrator", "AI" ) //This was so silly before the change. Now it actually works without beating your head against the keyboard. /N if ((istype(active1, /datum/data/record) && L.Find(rank))) temp = "
    Rank:
    " diff --git a/code/game/machinery/computer3/file.dm b/code/game/machinery/computer3/file.dm index be4285b3e18..c425bcc0aaa 100644 --- a/code/game/machinery/computer3/file.dm +++ b/code/game/machinery/computer3/file.dm @@ -62,13 +62,13 @@ return 1 /* - Centcom root authorization certificate + CentCom root authorization certificate Non-destructive, officially sanctioned. Has the same effect on computers as an emag. */ /datum/file/centcom_auth - name = "Centcom Root Access Token" + name = "CentCom Root Access Token" extension = "auth" volume = 100 copy() diff --git a/code/game/machinery/computer3/laptop.dm b/code/game/machinery/computer3/laptop.dm index e093f4d5f6c..1b0e4131650 100644 --- a/code/game/machinery/computer3/laptop.dm +++ b/code/game/machinery/computer3/laptop.dm @@ -24,7 +24,7 @@ icon_state = "laptop-closed" pixel_x = 2 pixel_y = -3 - w_class = 3 + w_class = ITEMSIZE_NORMAL var/obj/machinery/computer3/laptop/stored_computer = null diff --git a/code/game/machinery/computer3/lapvend.dm b/code/game/machinery/computer3/lapvend.dm index 3800fb94406..e31dd57fa23 100644 --- a/code/game/machinery/computer3/lapvend.dm +++ b/code/game/machinery/computer3/lapvend.dm @@ -178,7 +178,7 @@ else usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support." else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." + usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentCom Support." else transfer_and_vend(CH, C) @@ -328,7 +328,7 @@ usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call [boss_short] Support." return 0 else - usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentComm Support." + usr << "\icon[src]Unable to access vendor account. Please record the machine ID and call CentCom Support." return 0 else transfer_and_reimburse(CH) diff --git a/code/game/machinery/constructable_frame.dm b/code/game/machinery/constructable_frame.dm index 665f74d926d..1236ae0e5ba 100644 --- a/code/game/machinery/constructable_frame.dm +++ b/code/game/machinery/constructable_frame.dm @@ -1,5 +1,4 @@ //This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31 - //Circuit boards are in /code/game/objects/items/weapons/circuitboards/machinery/ /obj/machinery/constructable_frame //Made into a seperate type to make future revisions easier. diff --git a/code/game/machinery/cryo.dm b/code/game/machinery/cryo.dm index 6c4c6160cd8..7a1b12509c6 100644 --- a/code/game/machinery/cryo.dm +++ b/code/game/machinery/cryo.dm @@ -27,10 +27,10 @@ initialize_directions = dir /obj/machinery/atmospherics/unary/cryo_cell/Destroy() - var/turf/T = loc + var/turf/T = src.loc T.contents += contents if(beaker) - beaker.loc = get_step(loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube + beaker.loc = get_step(src.loc, SOUTH) //Beaker is carefully ejected from the wreckage of the cryotube ..() /obj/machinery/atmospherics/unary/cryo_cell/initialize() @@ -64,7 +64,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/relaymove(mob/user as mob) // note that relaymove will also be called for mobs outside the cell with UI open - if(src.occupant == user && !user.stat) + if(occupant == user && !user.stat) go_out() /obj/machinery/atmospherics/unary/cryo_cell/attack_hand(mob/user) @@ -92,7 +92,7 @@ data["hasOccupant"] = occupant ? 1 : 0 var/occupantData[0] - if (occupant) + if(occupant) occupantData["name"] = occupant.name occupantData["stat"] = occupant.stat occupantData["health"] = occupant.health @@ -124,13 +124,13 @@ data["beakerVolume"] = 0 if(beaker) data["beakerLabel"] = beaker.label_text ? beaker.label_text : null - if (beaker.reagents && beaker.reagents.reagent_list.len) + if(beaker.reagents && beaker.reagents.reagent_list.len) for(var/datum/reagent/R in beaker.reagents.reagent_list) data["beakerVolume"] += R.volume // update the ui if it exists, returns null if no ui is passed/found ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) - if (!ui) + if(!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "cryo.tmpl", "Cryo Cell Control System", 520, 410) @@ -158,7 +158,7 @@ if(href_list["ejectBeaker"]) if(beaker) - beaker.loc = get_step(loc, SOUTH) + beaker.loc = get_step(src.loc, SOUTH) beaker = null if(href_list["ejectOccupant"]) @@ -235,7 +235,7 @@ occupant.adjustOxyLoss(-1) //severe damage should heal waaay slower without proper chemicals if(occupant.bodytemperature < 225) - if (occupant.getToxLoss()) + if(occupant.getToxLoss()) occupant.adjustToxLoss(max(-1, -20/occupant.getToxLoss())) var/heal_brute = occupant.getBruteLoss() ? min(1, 20/occupant.getBruteLoss()) : 0 var/heal_fire = occupant.getFireLoss() ? min(1, 20/occupant.getFireLoss()) : 0 @@ -267,15 +267,15 @@ //loc.assume_air(expel_gas) /obj/machinery/atmospherics/unary/cryo_cell/proc/go_out() - if(!( occupant )) + if(!(occupant)) return //for(var/obj/O in src) - // O.loc = loc - if (occupant.client) + // O.loc = src.loc + if(occupant.client) occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE - occupant.loc = get_step(loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem. - if (occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected + occupant.loc = get_step(src.loc, SOUTH) //this doesn't account for walls or anything, but i don't forsee that being a problem. + if(occupant.bodytemperature < 261 && occupant.bodytemperature >= 70) //Patch by Aranclanos to stop people from taking burn damage after being ejected occupant.bodytemperature = 261 // Changed to 70 from 140 by Zuhayr due to reoccurance of bug. // occupant.metabslow = 0 occupant = null @@ -284,22 +284,22 @@ update_icon() return /obj/machinery/atmospherics/unary/cryo_cell/proc/put_mob(mob/living/carbon/M as mob) - if (stat & (NOPOWER|BROKEN)) + if(stat & (NOPOWER|BROKEN)) usr << "The cryo cell is not functioning." return - if (!istype(M)) + if(!istype(M)) usr << "The cryo cell cannot handle such a lifeform!" return - if (occupant) + if(occupant) usr << "The cryo cell is already occupied!" return - if (M.abiotic()) + if(M.abiotic()) usr << "Subject may not have abiotic items on." return if(!node) usr << "The cell is not correctly connected to its pipe network!" return - if (M.client) + if(M.client) M.client.perspective = EYE_PERSPECTIVE M.client.eye = src M.stop_pulling() @@ -320,7 +320,7 @@ set category = "Object" set src in oview(1) if(usr == occupant)//If the user is inside the tube... - if (usr.stat == 2)//and he's not dead.... + if(usr.stat == 2)//and he's not dead.... return usr << "Release sequence activated. This will take two minutes." sleep(1200) @@ -328,7 +328,7 @@ return go_out()//and release him from the eternal prison. else - if (usr.stat != 0) + if(usr.stat != 0) return go_out() add_fingerprint(usr) @@ -342,7 +342,7 @@ if(M.Victim == usr) usr << "You're too busy getting your life sucked out of you." return - if (usr.stat != 0) + if(usr.stat != 0) return put_mob(usr) return @@ -353,7 +353,7 @@ /obj/machinery/atmospherics/unary/cryo_cell/return_air_for_internal_lifeform() //assume that the cryo cell has some kind of breath mask or something that //draws from the cryo tube's environment, instead of the cold internal air. - if(loc) + if(src.loc) return loc.return_air() else return null diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index 90db93ad8dd..aae961790a7 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -6,7 +6,6 @@ * ~ Zuhayr */ - //Main cryopod console. /obj/machinery/computer/cryopod @@ -73,18 +72,18 @@ allow_items = 1 /obj/machinery/computer/cryopod/attack_ai() - src.attack_hand() + attack_hand() /obj/machinery/computer/cryopod/attack_hand(mob/user = usr) if(stat & (NOPOWER|BROKEN)) return user.set_machine(src) - src.add_fingerprint(usr) + add_fingerprint(usr) var/dat - if (!( ticker )) + if(!(ticker)) return dat += "

    [storage_name]
    " @@ -105,7 +104,7 @@ var/mob/user = usr - src.add_fingerprint(user) + add_fingerprint(user) if(href_list["log"]) @@ -159,7 +158,7 @@ I.forceMove(get_turf(src)) frozen_items -= I - src.updateUsrDialog() + updateUsrDialog() return /obj/item/weapon/circuitboard/cryopodcontrol @@ -395,25 +394,18 @@ O.forceMove(src) //Delete all items not on the preservation list. - var/list/items = src.contents.Copy() + var/list/items = contents.Copy() items -= occupant // Don't delete the occupant items -= announce // or the autosay radio. for(var/obj/item/W in items) var/preserve = null - // Snowflaaaake. - if(istype(W, /obj/item/device/mmi)) - var/obj/item/device/mmi/brain = W - if(brain.brainmob && brain.brainmob.client && brain.brainmob.key) + + for(var/T in preserve_items) + if(istype(W,T)) preserve = 1 - else - continue - else - for(var/T in preserve_items) - if(istype(W,T)) - preserve = 1 - break + break if(!preserve) qdel(W) @@ -451,13 +443,13 @@ if(PDA_Manifest.len) PDA_Manifest.Cut() for(var/datum/data/record/R in data_core.medical) - if ((R.fields["name"] == occupant.real_name)) + if((R.fields["name"] == occupant.real_name)) qdel(R) for(var/datum/data/record/T in data_core.security) - if ((T.fields["name"] == occupant.real_name)) + if((T.fields["name"] == occupant.real_name)) qdel(T) for(var/datum/data/record/G in data_core.general) - if ((G.fields["name"] == occupant.real_name)) + if((G.fields["name"] == occupant.real_name)) qdel(G) icon_state = base_icon_state @@ -536,7 +528,7 @@ message_admins("[key_name_admin(M)] has entered a stasis pod.") //Despawning occurs when process() is called with an occupant without a client. - src.add_fingerprint(M) + add_fingerprint(M) /obj/machinery/cryopod/verb/eject() set name = "Eject Pod" @@ -548,14 +540,14 @@ icon_state = base_icon_state //Eject any items that aren't meant to be in the pod. - var/list/items = src.contents + var/list/items = contents if(occupant) items -= occupant if(announce) items -= announce for(var/obj/item/W in items) W.forceMove(get_turf(src)) - src.go_out() + go_out() add_fingerprint(usr) name = initial(name) @@ -569,7 +561,7 @@ if(usr.stat != 0 || !check_occupant_allowed(usr)) return - if(src.occupant) + if(occupant) usr << "\The [src] is in use." return @@ -585,7 +577,7 @@ if(!usr || !usr.client) return - if(src.occupant) + if(occupant) usr << "\The [src] is in use." return @@ -605,7 +597,7 @@ time_entered = world.time - src.add_fingerprint(usr) + add_fingerprint(usr) return @@ -626,7 +618,7 @@ return if(occupant.client) - occupant.client.eye = src.occupant.client.mob + occupant.client.eye = occupant.client.mob occupant.client.perspective = MOB_PERSPECTIVE occupant.forceMove(get_turf(src)) @@ -639,8 +631,8 @@ return -/obj/machinery/cryopod/proc/set_occupant(var/occupant) - src.occupant = occupant +/obj/machinery/cryopod/proc/set_occupant(var/new_occupant) + occupant = new_occupant name = initial(name) if(occupant) name = "[name] ([occupant])" diff --git a/code/game/machinery/deployable.dm b/code/game/machinery/deployable.dm index 0140a33fe37..fa4b601e91e 100644 --- a/code/game/machinery/deployable.dm +++ b/code/game/machinery/deployable.dm @@ -1,11 +1,9 @@ /* CONTAINS: - Deployable items Barricades for reference: - access_security = 1 access_brig = 2 access_armory = 3 @@ -50,7 +48,6 @@ for reference: access_court = 42 access_clown = 43 access_mime = 44 - */ //Barricades! @@ -83,17 +80,17 @@ for reference: return material /obj/structure/barricade/attackby(obj/item/W as obj, mob/user as mob) - if (istype(W, /obj/item/stack)) + if(istype(W, /obj/item/stack)) var/obj/item/stack/D = W if(D.get_material_name() != material.name) return //hitting things with the wrong type of stack usually doesn't produce messages, and probably doesn't need to. - if (health < maxhealth) - if (D.get_amount() < 1) + if(health < maxhealth) + if(D.get_amount() < 1) user << "You need one sheet of [material.display_name] to repair \the [src]." return visible_message("[user] begins to repair \the [src].") if(do_after(user,20) && health < maxhealth) - if (D.use(1)) + if(D.use(1)) health = maxhealth visible_message("[user] repairs \the [src].") return @@ -102,11 +99,11 @@ for reference: user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) switch(W.damtype) if("fire") - src.health -= W.force * 1 + health -= W.force * 1 if("brute") - src.health -= W.force * 0.75 + health -= W.force * 0.75 else - if (src.health <= 0) + if(health <= 0) visible_message("The barricade is smashed apart!") dismantle() qdel(src) @@ -125,8 +122,8 @@ for reference: qdel(src) return if(2.0) - src.health -= 25 - if (src.health <= 0) + health -= 25 + if(health <= 0) visible_message("\The [src] is blown apart!") dismantle() return @@ -158,114 +155,114 @@ for reference: var/locked = 0.0 // req_access = list(access_maint_tunnels) - New() +/obj/machinery/deployable/barrier/New() + ..() + + icon_state = "barrier[locked]" + +/obj/machinery/deployable/barrier/attackby(obj/item/weapon/W as obj, mob/user as mob) + if(istype(W, /obj/item/weapon/card/id/)) + if(allowed(user)) + if (emagged < 2.0) + locked = !locked + anchored = !anchored + icon_state = "barrier[locked]" + if((locked == 1.0) && (emagged < 2.0)) + user << "Barrier lock toggled on." + return + else if((locked == 0.0) && (emagged < 2.0)) + user << "Barrier lock toggled off." + return + else + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(2, 1, src) + s.start() + visible_message("BZZzZZzZZzZT") + return + return + else if(istype(W, /obj/item/weapon/wrench)) + if(health < maxhealth) + health = maxhealth + emagged = 0 + req_access = list(access_security) + visible_message("[user] repairs \the [src]!") + return + else if(emagged > 0) + emagged = 0 + req_access = list(access_security) + visible_message("[user] repairs \the [src]!") + return + return + else + switch(W.damtype) + if("fire") + health -= W.force * 0.75 + if("brute") + health -= W.force * 0.5 + else + if(health <= 0) + explode() ..() - src.icon_state = "barrier[src.locked]" - - attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/card/id/)) - if (src.allowed(user)) - if (src.emagged < 2.0) - src.locked = !src.locked - src.anchored = !src.anchored - src.icon_state = "barrier[src.locked]" - if ((src.locked == 1.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled on." - return - else if ((src.locked == 0.0) && (src.emagged < 2.0)) - user << "Barrier lock toggled off." - return - else - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(2, 1, src) - s.start() - visible_message("BZZzZZzZZzZT") - return +/obj/machinery/deployable/barrier/ex_act(severity) + switch(severity) + if(1.0) + explode() return - else if (istype(W, /obj/item/weapon/wrench)) - if (src.health < src.maxhealth) - src.health = src.maxhealth - src.emagged = 0 - src.req_access = list(access_security) - visible_message("[user] repairs \the [src]!") - return - else if (src.emagged > 0) - src.emagged = 0 - src.req_access = list(access_security) - visible_message("[user] repairs \the [src]!") - return + if(2.0) + health -= 25 + if(health <= 0) + explode() return - else - switch(W.damtype) - if("fire") - src.health -= W.force * 0.75 - if("brute") - src.health -= W.force * 0.5 - else - if (src.health <= 0) - src.explode() - ..() + +/obj/machinery/deployable/barrier/emp_act(severity) + if(stat & (BROKEN|NOPOWER)) + return + if(prob(50/severity)) + locked = !locked + anchored = !anchored + icon_state = "barrier[locked]" - ex_act(severity) - switch(severity) - if(1.0) - src.explode() - return - if(2.0) - src.health -= 25 - if (src.health <= 0) - src.explode() - return - emp_act(severity) - if(stat & (BROKEN|NOPOWER)) - return - if(prob(50/severity)) - locked = !locked - anchored = !anchored - icon_state = "barrier[src.locked]" +/obj/machinery/deployable/barrier/CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. + if(air_group || (height==0)) + return 1 + if(istype(mover) && mover.checkpass(PASSTABLE)) + return 1 + else + return 0 - CanPass(atom/movable/mover, turf/target, height=0, air_group=0)//So bullets will fly over and stuff. - if(air_group || (height==0)) - return 1 - if(istype(mover) && mover.checkpass(PASSTABLE)) - return 1 - else - return 0 +/obj/machinery/deployable/barrier/proc/explode() - proc/explode() + visible_message("[src] blows apart!") + var/turf/Tsec = get_turf(src) - visible_message("[src] blows apart!") - var/turf/Tsec = get_turf(src) +/* var/obj/item/stack/rods/ =*/ + PoolOrNew(/obj/item/stack/rods, Tsec) - /* var/obj/item/stack/rods/ =*/ - PoolOrNew(/obj/item/stack/rods, Tsec) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(3, 1, src) + s.start() - var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread - s.set_up(3, 1, src) - s.start() + explosion(src.loc,-1,-1,0) + if(src) + qdel(src) - explosion(src.loc,-1,-1,0) - if(src) - qdel(src) - - /obj/machinery/deployable/barrier/emag_act(var/remaining_charges, var/mob/user) - if (src.emagged == 0) - src.emagged = 1 - src.req_access.Cut() - src.req_one_access.Cut() + if(emagged == 0) + emagged = 1 + req_access.Cut() + req_one_access.Cut() user << "You break the ID authentication lock on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("BZZzZZzZZzZT") return 1 - else if (src.emagged == 1) - src.emagged = 2 + else if(emagged == 1) + emagged = 2 user << "You short out the anchoring mechanism on \the [src]." var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() visible_message("BZZzZZzZZzZT") - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/door_control.dm b/code/game/machinery/door_control.dm index b51d72ccd8e..7f7ce32e036 100644 --- a/code/game/machinery/door_control.dm +++ b/code/game/machinery/door_control.dm @@ -19,12 +19,12 @@ /obj/machinery/button/remote/attack_ai(mob/user as mob) if(wires & 2) - return src.attack_hand(user) + return attack_hand(user) else user << "Error, no route to host." /obj/machinery/button/remote/attackby(obj/item/weapon/W, mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/button/remote/emag_act(var/remaining_charges, var/mob/user) if(req_access.len || req_one_access.len) @@ -37,7 +37,7 @@ if(..()) return - src.add_fingerprint(user) + add_fingerprint(user) if(stat & (NOPOWER|BROKEN)) return @@ -92,9 +92,9 @@ /obj/machinery/button/remote/airlock/trigger() for(var/obj/machinery/door/airlock/D in world) - if(D.id_tag == src.id) + if(D.id_tag == id) if(specialfunctions & OPEN) - if (D.density) + if(D.density) spawn(0) D.open() return @@ -136,7 +136,7 @@ /obj/machinery/button/remote/blast_door/trigger() for(var/obj/machinery/door/blast/M in world) - if(M.id == src.id) + if(M.id == id) if(M.density) spawn(0) M.open() @@ -155,7 +155,7 @@ /obj/machinery/button/remote/emitter/trigger(mob/user as mob) for(var/obj/machinery/power/emitter/E in world) - if(E.id == src.id) + if(E.id == id) spawn(0) E.activate(user) return @@ -174,21 +174,21 @@ update_icon() for(var/obj/machinery/door/blast/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.open() return sleep(20) for(var/obj/machinery/mass_driver/M in machines) - if(M.id == src.id) + if(M.id == id) M.drive() sleep(50) for(var/obj/machinery/door/blast/M in machines) - if (M.id == src.id) + if(M.id == id) spawn(0) M.close() return @@ -202,4 +202,4 @@ if(!active || (stat & NOPOWER)) icon_state = "launcherbtt" else - icon_state = "launcheract" + icon_state = "launcheract" \ No newline at end of file diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 744e4122406..645ccc1fd0c 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -88,6 +88,7 @@ icon = 'icons/obj/doors/Doorext.dmi' assembly_type = /obj/structure/door_assembly/door_assembly_ext opacity = 0 + glass = 1 /obj/machinery/door/airlock/glass name = "Glass Airlock" diff --git a/code/game/machinery/doors/airlock_electronics.dm b/code/game/machinery/doors/airlock_electronics.dm index 3ae0891b891..39ca2d5f40f 100644 --- a/code/game/machinery/doors/airlock_electronics.dm +++ b/code/game/machinery/doors/airlock_electronics.dm @@ -4,7 +4,7 @@ name = "airlock electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" - w_class = 2.0 //It should be tiny! -Agouri + w_class = ITEMSIZE_SMALL //It should be tiny! -Agouri matter = list(DEFAULT_WALL_MATERIAL = 50,"glass" = 50) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 72b878a49a3..209e3bb228f 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -90,34 +90,37 @@ // This only works on broken doors or doors without power. Also allows repair with Plasteel. /obj/machinery/door/blast/attackby(obj/item/weapon/C as obj, mob/user as mob) src.add_fingerprint(user) - if(C.pry == 1) - if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) - var/obj/item/weapon/material/twohanded/fireaxe/F = C - if(!F.wielded) - user << "You need to be wielding \the [F] to do that." - return + if(istype(C, /obj/item/weapon)) // For reasons unknown, sometimes C is actually not what it is advertised as, like a mob. + if(C.pry == 1) // Can we pry it open with something, like a crowbar/fireaxe/lingblade? + if(istype(C,/obj/item/weapon/material/twohanded/fireaxe)) // Fireaxes need to be in both hands to pry. + var/obj/item/weapon/material/twohanded/fireaxe/F = C + if(!F.wielded) + user << "You need to be wielding \the [F] to do that." + return - if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating )) - force_toggle() - else - usr << "[src]'s motors resist your effort." - return - if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") - var/amt = Ceiling((maxhealth - health)/150) - if(!amt) - usr << "\The [src] is already fully repaired." - return - var/obj/item/stack/P = C - if(P.amount < amt) - usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." - return - usr << "You begin repairing [src]..." - if(do_after(usr, 30)) - if(P.use(amt)) - usr << "You have repaired \The [src]" - src.repair() + // If we're at this point, it's a fireaxe in both hands or something else that doesn't care for twohanding. + if(((stat & NOPOWER) || (stat & BROKEN)) && !( src.operating )) + force_toggle() else + usr << "[src]'s motors resist your effort." + return + + if(istype(C, /obj/item/stack/material) && C.get_material_name() == "plasteel") // Repairing. + var/amt = Ceiling((maxhealth - health)/150) + if(!amt) + usr << "\The [src] is already fully repaired." + return + var/obj/item/stack/P = C + if(P.amount < amt) usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + usr << "You begin repairing [src]..." + if(do_after(usr, 30)) + if(P.use(amt)) + usr << "You have repaired \The [src]" + src.repair() + else + usr << "You don't have enough sheets to repair this! You need at least [amt] sheets." diff --git a/code/game/machinery/doors/multi_tile.dm b/code/game/machinery/doors/multi_tile.dm index 4fc4b2fad72..45501a3de76 100644 --- a/code/game/machinery/doors/multi_tile.dm +++ b/code/game/machinery/doors/multi_tile.dm @@ -1,6 +1,7 @@ //Terribly sorry for the code doubling, but things go derpy otherwise. /obj/machinery/door/airlock/multi_tile width = 2 + appearance_flags = 0 /obj/machinery/door/airlock/multi_tile/New() ..() diff --git a/code/game/machinery/doppler_array.dm b/code/game/machinery/doppler_array.dm index 6661468f59e..7a4087e2c4d 100644 --- a/code/game/machinery/doppler_array.dm +++ b/code/game/machinery/doppler_array.dm @@ -4,7 +4,6 @@ var/list/doppler_arrays = list() name = "tachyon-doppler array" desc = "A highly precise directional sensor array which measures the release of quants from decaying tachyons. The doppler shifting of the mirror-image formed by these quants can reveal the size, location and temporal affects of energetic disturbances within a large radius ahead of the array." - /obj/machinery/doppler_array/New() ..() doppler_arrays += src @@ -39,13 +38,12 @@ var/list/doppler_arrays = list() for(var/mob/O in hearers(src, null)) O.show_message("[src] states coldly, \"[message]\"",2) - /obj/machinery/doppler_array/power_change() ..() if(stat & BROKEN) icon_state = "[initial(icon_state)]-broken" else - if( !(stat & NOPOWER) ) + if(!(stat & NOPOWER)) icon_state = initial(icon_state) else icon_state = "[initial(icon_state)]-off" \ No newline at end of file diff --git a/code/game/machinery/flasher.dm b/code/game/machinery/flasher.dm index 7532cb14070..18844dcd735 100644 --- a/code/game/machinery/flasher.dm +++ b/code/game/machinery/flasher.dm @@ -1,5 +1,4 @@ // It is a gizmo that flashes a small area - /obj/machinery/flasher name = "Mounted flash" desc = "A wall-mounted flashbulb device." @@ -27,48 +26,48 @@ /obj/machinery/flasher/power_change() ..() - if ( !(stat & NOPOWER) ) + if(!(stat & NOPOWER)) icon_state = "[base_state]1" -// src.sd_SetLuminosity(2) +// sd_SetLuminosity(2) else icon_state = "[base_state]1-p" -// src.sd_SetLuminosity(0) +// sd_SetLuminosity(0) //Don't want to render prison breaks impossible /obj/machinery/flasher/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wirecutters)) + if(istype(W, /obj/item/weapon/wirecutters)) add_fingerprint(user) - src.disable = !src.disable - if (src.disable) + disable = !disable + if(disable) user.visible_message("[user] has disconnected the [src]'s flashbulb!", "You disconnect the [src]'s flashbulb!") - if (!src.disable) + if(!disable) user.visible_message("[user] has connected the [src]'s flashbulb!", "You connect the [src]'s flashbulb!") //Let the AI trigger them directly. /obj/machinery/flasher/attack_ai() - if (src.anchored) - return src.flash() + if(anchored) + return flash() else return /obj/machinery/flasher/proc/flash() - if (!(powered())) + if(!(powered())) return - if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150)) + if((disable) || (last_flash && world.time < last_flash + 150)) return playsound(src.loc, 'sound/weapons/flash.ogg', 100, 1) flick("[base_state]_flash", src) - src.last_flash = world.time + last_flash = world.time use_power(1500) for (var/mob/O in viewers(src, null)) - if (get_dist(src, O) > src.range) + if(get_dist(src, O) > range) continue var/flash_time = strength - if (istype(O, /mob/living/carbon/human)) + if(istype(O, /mob/living/carbon/human)) var/mob/living/carbon/human/H = O if(!H.eyecheck() <= 0) continue @@ -94,26 +93,26 @@ ..(severity) /obj/machinery/flasher/portable/HasProximity(atom/movable/AM as mob|obj) - if ((src.disable) || (src.last_flash && world.time < src.last_flash + 150)) + if((disable) || (last_flash && world.time < last_flash + 150)) return if(istype(AM, /mob/living/carbon)) var/mob/living/carbon/M = AM - if ((M.m_intent != "walk") && (src.anchored)) - src.flash() + if((M.m_intent != "walk") && (anchored)) + flash() /obj/machinery/flasher/portable/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/wrench)) + if(istype(W, /obj/item/weapon/wrench)) add_fingerprint(user) - src.anchored = !src.anchored + anchored = !anchored - if (!src.anchored) + if(!anchored) user.show_message(text("[src] can now be moved.")) - src.overlays.Cut() + overlays.Cut() - else if (src.anchored) + else if(anchored) user.show_message(text("[src] is now secured.")) - src.overlays += "[base_state]-s" + overlays += "[base_state]-s" /obj/machinery/button/flasher name = "flasher button" @@ -130,7 +129,7 @@ icon_state = "launcheract" for(var/obj/machinery/flasher/M in machines) - if(M.id == src.id) + if(M.id == id) spawn() M.flash() @@ -139,4 +138,4 @@ icon_state = "launcherbtt" active = 0 - return + return \ No newline at end of file diff --git a/code/game/machinery/floodlight.dm b/code/game/machinery/floodlight.dm index e31a19b265b..9f594e41783 100644 --- a/code/game/machinery/floodlight.dm +++ b/code/game/machinery/floodlight.dm @@ -1,5 +1,3 @@ -//these are probably broken - /obj/machinery/floodlight name = "Emergency Floodlight" icon = 'icons/obj/machines/floodlight.dmi' @@ -13,7 +11,7 @@ var/brightness_on = 8 //can't remember what the maxed out value is /obj/machinery/floodlight/New() - src.cell = new(src) + cell = new(src) cell.maxcharge = 1000 cell.charge = 1000 // 41minutes @ 200W ..() @@ -71,7 +69,6 @@ if(!turn_on(1)) user << "You try to turn on \the [src] but it does not work." - /obj/machinery/floodlight/attack_hand(mob/user as mob) if(open && cell) if(ishuman(user)) @@ -79,12 +76,12 @@ user.put_in_hands(cell) cell.loc = user.loc else - cell.loc = loc + cell.loc = src.loc cell.add_fingerprint(user) cell.update_icon() - src.cell = null + cell = null on = 0 set_light(0) user << "You remove the power cell" @@ -99,10 +96,9 @@ update_icon() - /obj/machinery/floodlight/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/screwdriver)) - if (!open) + if(istype(W, /obj/item/weapon/screwdriver)) + if(!open) if(unlocked) unlocked = 0 user << "You screw the battery panel in place." @@ -110,7 +106,7 @@ unlocked = 1 user << "You unscrew the battery panel." - if (istype(W, /obj/item/weapon/crowbar)) + if(istype(W, /obj/item/weapon/crowbar)) if(unlocked) if(open) open = 0 @@ -121,7 +117,7 @@ open = 1 user << "You remove the battery panel." - if (istype(W, /obj/item/weapon/cell)) + if(istype(W, /obj/item/weapon/cell)) if(open) if(cell) user << "There is a power cell already installed." diff --git a/code/game/machinery/floor_light.dm b/code/game/machinery/floor_light.dm index 7298b62abf9..a134e68e3fe 100644 --- a/code/game/machinery/floor_light.dm +++ b/code/game/machinery/floor_light.dm @@ -132,7 +132,7 @@ var/list/floor_light_cache = list() if(1) qdel(src) if(2) - if (prob(50)) + if(prob(50)) qdel(src) else if(prob(20)) stat |= BROKEN @@ -140,7 +140,7 @@ var/list/floor_light_cache = list() if(isnull(damaged)) damaged = 0 if(3) - if (prob(5)) + if(prob(5)) qdel(src) else if(isnull(damaged)) damaged = 0 diff --git a/code/game/machinery/floorlayer.dm b/code/game/machinery/floorlayer.dm index c682a2b228a..1cbccc195ca 100644 --- a/code/game/machinery/floorlayer.dm +++ b/code/game/machinery/floorlayer.dm @@ -1,5 +1,4 @@ /obj/machinery/floorlayer - name = "automatic floor layer" icon = 'icons/obj/stationobjs.dmi' icon_state = "pipe_d" @@ -35,8 +34,7 @@ return /obj/machinery/floorlayer/attackby(var/obj/item/W as obj, var/mob/user as mob) - - if (istype(W, /obj/item/weapon/wrench)) + if(istype(W, /obj/item/weapon/wrench)) var/m = input("Choose work mode", "Mode") as null|anything in mode mode[m] = !mode[m] var/O = mode[m] @@ -109,4 +107,4 @@ /obj/machinery/floorlayer/proc/CollectTiles(var/turf/w_turf) for(var/obj/item/stack/tile/tile in w_turf) - TakeTile(tile) + TakeTile(tile) \ No newline at end of file diff --git a/code/game/machinery/frame.dm b/code/game/machinery/frame.dm index 1dddcedea0b..f553bfa9fe1 100644 --- a/code/game/machinery/frame.dm +++ b/code/game/machinery/frame.dm @@ -1,3 +1,177 @@ +/var/global/list/construction_frame_wall +/var/global/list/construction_frame_floor + +/proc/populate_frame_types() + //Create global frame type list if it hasn't been made already. + construction_frame_wall = list() + construction_frame_floor = list() + for(var/R in typesof(/datum/frame/frame_types) - /datum/frame/frame_types) + var/datum/frame/frame_types/type = new R + if(type.frame_style == "wall") + construction_frame_wall += type + else + construction_frame_floor += type + + var/datum/frame/frame_types/cancel/cancel = new /datum/frame/frame_types/cancel + construction_frame_wall += cancel + construction_frame_floor += cancel + +/datum/frame/frame_types + var/name + var/frame_size = 5 + var/frame_class + var/circuit + var/frame_style = "floor" + var/x_offset + var/y_offset + +/datum/frame/frame_types/computer + name = "Computer" + frame_class = "computer" + +/datum/frame/frame_types/machine + name = "Machine" + frame_class = "machine" + +/datum/frame/frame_types/conveyor + name = "Conveyor" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/conveyor + +/datum/frame/frame_types/photocopier + name = "Photocopier" + frame_class = "machine" + +/datum/frame/frame_types/washing_machine + name = "Washing Machine" + frame_class = "machine" + +/datum/frame/frame_types/medical_console + name = "Medical Console" + frame_class = "computer" + +/datum/frame/frame_types/medical_pod + name = "Medical Pod" + frame_class = "machine" + +/datum/frame/frame_types/dna_analyzer + name = "DNA Analyzer" + frame_class = "machine" + +/datum/frame/frame_types/mass_driver + name = "Mass Driver" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/mass_driver + +/datum/frame/frame_types/holopad + name = "Holopad" + frame_class = "computer" + frame_size = 4 + +/datum/frame/frame_types/microwave + name = "Microwave" + frame_class = "machine" + frame_size = 4 + +/datum/frame/frame_types/fax + name = "Fax" + frame_class = "machine" + frame_size = 3 + +/datum/frame/frame_types/recharger + name = "Recharger" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/recharger + frame_size = 3 + +/datum/frame/frame_types/grinder + name = "Grinder" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/grinder + frame_size = 3 + +/datum/frame/frame_types/display + name = "Display" + frame_class = "display" + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/supply_request_console + name = "Supply Request Console" + frame_class = "display" + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/atm + name = "ATM" + frame_class = "display" + frame_size = 3 + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/newscaster + name = "Newscaster" + frame_class = "display" + frame_size = 3 + frame_style = "wall" + x_offset = 28 + y_offset = 30 + +/datum/frame/frame_types/wall_charger + name = "Wall Charger" + frame_class = "machine" + circuit = /obj/item/weapon/circuitboard/recharger/wrecharger + frame_size = 3 + frame_style = "wall" + x_offset = 32 + y_offset = 32 + +/datum/frame/frame_types/fire_alarm + name = "Fire Alarm" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/air_alarm + name = "Air Alarm" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/guest_pass_console + name = "Guest Pass Console" + frame_class = "display" + frame_size = 2 + frame_style = "wall" + x_offset = 30 + y_offset = 30 + +/datum/frame/frame_types/intercom + name = "Intercom" + frame_class = "alarm" + frame_size = 2 + frame_style = "wall" + x_offset = 28 + y_offset = 28 + +/datum/frame/frame_types/keycard_authenticator + name = "Keycard Authenticator" + frame_class = "alarm" + frame_size = 1 + frame_style = "wall" + x_offset = 24 + y_offset = 24 + +/datum/frame/frame_types/cancel //used to get out of input dialogue + name = "Cancel" + /obj/structure/frame anchored = 0 name = "frame" @@ -6,20 +180,16 @@ var/state = 0 var/obj/item/weapon/circuitboard/circuit = null var/need_circuit = 1 - var/frame_type = "machine" + var/datum/frame/frame_types/frame_type = new /datum/frame/frame_types/machine var/list/components = null var/list/req_components = null var/list/req_component_names = null - var/list/alarms = list("firealarm", "airalarm", "intercom", "keycard") - var/list/machines = list( - "machine", "photocopier", "fax", "microwave", "conveyor", "recharger", "wrecharger", - "washing", "grinder", "teleporter_hub", "teleporter_station", "medpod", "dna_analyzer", - "massdriver") - var/list/computers = list("computer", "holopad", "console") - var/list/displays = list("display", "guestpass", "newscaster", "atm", "request") - var/list/no_circuit = list("wrecharger", "recharger", "grinder", "conveyor", "massdriver") +/obj/structure/frame/computer //used for maps + frame_type = new /datum/frame/frame_types/computer + anchored = 1 + density = 1 /obj/structure/frame/proc/update_desc() var/D @@ -31,6 +201,12 @@ D = "Requires [english_list(component_list)]." desc = D +/obj/structure/frame/update_icon() + ..() + var/type = lowertext(frame_type.name) + type = replacetext(type, " ", "_") + icon_state = "[type]_[state]" + /obj/structure/frame/proc/check_components(mob/user as mob) components = list() req_components = circuit.req_components.Copy() @@ -41,175 +217,110 @@ var/obj/ct = A req_component_names[A] = initial(ct.name) -/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/obj/item/frame/frame_type, mob/user as mob) +/obj/structure/frame/New(var/loc, var/dir, var/building = 0, var/datum/frame/frame_types/type, mob/user as mob) ..() if(building) - src.frame_type = frame_type - icon_state = "[frame_type]_0" + frame_type = type + state = 0 + if(dir) - src.set_dir(dir) + set_dir(dir) - if(frame_type in alarms) - if(loc) - src.loc = loc + if(loc) + src.loc = loc - state = 0 - if(frame_type == "airalarm" || frame_type == "firealarm" || frame_type == "keycard") - if(dir) - src.set_dir(dir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -24 : 24) - pixel_y = (dir & 3)? (dir == 1 ? -24 : 24) : 0 + if(frame_type.x_offset) + pixel_x = (dir & 3)? 0 : (dir == 4 ? -frame_type.x_offset : frame_type.x_offset) - if(frame_type == "intercom") - if(dir) - src.set_dir(dir) - pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) - pixel_y = (dir & 3)? (dir == 1 ? -28 : 28) : 0 + if(frame_type.y_offset) + pixel_y = (dir & 3)? (dir == 1 ? -frame_type.y_offset : frame_type.y_offset) : 0 - update_icon() - return - - if(frame_type in displays) - if(loc) - src.loc = loc - - if(frame_type == "display" || frame_type == "atm" || frame_type == "request") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -32 : 32) - pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0 - - if(frame_type == "newscaster") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -28 : 28) - pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 - - if(frame_type == "guestpass") - pixel_x = (dir & 3)? 0 : (dir == 4 ? -30 : 30) - pixel_y = (dir & 3)? (dir == 1 ? -30 : 30) : 0 - - update_icon() - return - - if(frame_type in no_circuit) + if(frame_type.circuit) need_circuit = 0 - if(frame_type == "wrecharger") - circuit = new /obj/item/weapon/circuitboard/recharger/wrecharger(src) - if(loc) - src.loc = loc + circuit = new frame_type.circuit(src) - state = 0 - - pixel_x = (dir & 3)? 0 : (dir == 4 ? -26 : 32) - pixel_y = (dir & 3)? (dir == 1 ? -32 : 32) : 0 - - update_icon() - return - if(frame_type == "recharger") - circuit = new /obj/item/weapon/circuitboard/recharger(src) - if(frame_type == "grinder") - circuit = new /obj/item/weapon/circuitboard/grinder(src) - if(frame_type == "conveyor") - circuit = new /obj/item/weapon/circuitboard/conveyor(src) - if(frame_type == "massdriver") - circuit = new /obj/item/weapon/circuitboard/mass_driver(src) - - if(frame_type == "computer") + if(frame_type.name == "Computer") density = 1 - if(frame_type in machines) + + if(frame_type.frame_class == "machine") density = 1 - return + + update_icon() /obj/structure/frame/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/wrench)) - if(state == 0) + if(state == 0 && !anchored) user << "You start to wrench the frame into place." playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) - src.anchored = 1 + anchored = 1 if(!need_circuit && circuit) - src.state = 2 + state = 2 check_components() update_desc() - src.icon_state = "[frame_type]_2" user << "You wrench the frame into place and set the outer cover." else - src.state = 1 user << "You wrench the frame into place." - return - if(state == 1) + else if(state == 0 && anchored) playsound(src.loc, 'sound/items/Ratchet.ogg', 50, 1) if(do_after(user, 20)) user << "You unfasten the frame." - src.anchored = 0 - src.state = 0 - return + anchored = 0 - if(istype(P, /obj/item/weapon/weldingtool)) + else if(istype(P, /obj/item/weapon/weldingtool)) if(state == 0) var/obj/item/weapon/weldingtool/WT = P - if(!WT.remove_fuel(0, user)) + if(WT.remove_fuel(0, user)) + playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) + if(do_after(user, 20)) + if(src && WT.isOn()) + user << "You deconstruct the frame." + new /obj/item/stack/material/steel(src.loc, frame_type.frame_size) + qdel(src) + return + else if(!WT.remove_fuel(0, user)) user << "The welding tool must be on to complete this task." return - playsound(src.loc, 'sound/items/Welder.ogg', 50, 1) - if(do_after(user, 20)) - if(!src || !WT.isOn()) return - user << "You deconstruct the frame." - if(frame_type == "holopad" || frame_type == "microwave") - new /obj/item/stack/material/steel( src.loc, 4 ) - else if(frame_type == "fax" || frame_type == "newscaster" || frame_type == "recharger" || frame_type == "wrecharger" || frame_type == "grinder") - new /obj/item/stack/material/steel( src.loc, 3 ) - else if(frame_type == "firealarm" || frame_type == "airalarm" || frame_type == "intercom" || frame_type == "guestpass") - new /obj/item/stack/material/steel( src.loc, 2 ) - else if(frame_type == "keycard") - new /obj/item/stack/material/steel( src.loc, 1 ) - else - new /obj/item/stack/material/steel( src.loc, 5 ) - qdel(src) - return - if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit) - if(state == 1) + else if(istype(P, /obj/item/weapon/circuitboard) && need_circuit && !circuit) + if(state == 0 && anchored) var/obj/item/weapon/circuitboard/B = P - if(B.board_type == frame_type) + var/datum/frame/frame_types/board_type = B.board_type + if(board_type.name == frame_type.name) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) user << "You place the circuit board inside the frame." - src.icon_state = "[frame_type]_1" - src.circuit = P + circuit = P user.drop_item() P.loc = src - if(frame_type in machines) //because machines are assholes + state = 1 + if(frame_type.frame_class == "machine") check_components() update_desc() - return else user << "This frame does not accept circuit boards of this type!" - return + return - if(istype(P, /obj/item/weapon/screwdriver)) + else if(istype(P, /obj/item/weapon/screwdriver)) if(state == 1) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You screw the circuit board into place." - src.state = 2 - src.icon_state = "[frame_type]_2" - return + state = 2 - if(state == 2) + else if(state == 2) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unfasten the circuit board." - src.state = 1 - src.icon_state = "[frame_type]_1" - return + state = 1 - if(!need_circuit && circuit) + else if(!need_circuit && circuit) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You unfasten the outer cover." - src.state = 1 - src.icon_state = "[frame_type]_0" - return + state = 0 - if(state == 3) - if(frame_type in machines) + else if(state == 3) + if(frame_type.frame_class == "machine") var/component_check = 1 for(var/R in req_components) if(req_components[R] > 0) @@ -217,7 +328,7 @@ break if(component_check) playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - var/obj/machinery/new_machine = new src.circuit.build_path(src.loc, src.dir) + var/obj/machinery/new_machine = new circuit.build_path(src.loc, dir) // Handle machines that have allocated default parts in thier constructor. if(new_machine.component_parts) for(var/CP in new_machine.component_parts) @@ -226,9 +337,9 @@ else new_machine.component_parts = list() - src.circuit.construct(new_machine) + circuit.construct(new_machine) - for(var/obj/O in src.components) + for(var/obj/O in components) if(circuit.contain_parts) O.loc = new_machine else @@ -240,173 +351,104 @@ new_machine.RefreshParts() - new_machine.pixel_x = src.pixel_x - new_machine.pixel_y = src.pixel_y + new_machine.pixel_x = pixel_x + new_machine.pixel_y = pixel_y qdel(src) - return + return - if(frame_type in alarms) + else if(frame_type.frame_class == "alarm") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You fasten the cover." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(state == 4) - if(frame_type in computers) + else if(state == 4) + if(frame_type.frame_class == "computer") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You connect the monitor." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(frame_type in displays) + else if(frame_type.frame_class == "display") playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) user << "You connect the monitor." - var/obj/machinery/B = new src.circuit.build_path ( src.loc ) - B.pixel_x = src.pixel_x - B.pixel_y = src.pixel_y + var/obj/machinery/B = new circuit.build_path(src.loc) + B.pixel_x = pixel_x + B.pixel_y = pixel_y B.set_dir(dir) - src.circuit.construct(B) + circuit.construct(B) + circuit.loc = null + B.circuit = circuit qdel(src) return - if(istype(P, /obj/item/weapon/crowbar)) + else if(istype(P, /obj/item/weapon/crowbar)) if(state == 1) if(need_circuit && circuit) playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the circuit board." - src.state = 1 - src.icon_state = "[frame_type]_0" - circuit.loc = src.loc - src.circuit = null - if(frame_type in machines) //becuase machines are assholes + state = 0 + circuit.forceMove(src.loc) + circuit = null + if(frame_type.frame_class == "machine") req_components = null - return - if(state == 3) - if(frame_type in machines) + else if(state == 3) + if(frame_type.frame_class == "machine") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) if(components.len == 0) user << "There are no components to remove." else user << "You remove the components." for(var/obj/item/weapon/W in components) - W.forceMove(loc) + W.forceMove(src.loc) check_components() update_desc() user << desc - return - if(state == 4) - if(frame_type in computers) + else if(state == 4) + if(frame_type.frame_class == "computer") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the glass panel." - src.state = 3 - src.icon_state = "[frame_type]_3" - new /obj/item/stack/material/glass( src.loc, 2 ) - return + state = 3 + new /obj/item/stack/material/glass(src.loc, 2) - if(frame_type in displays) + else if(frame_type.frame_class == "display") playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) user << "You remove the glass panel." - src.state = 3 - src.icon_state = "[frame_type]_3" - new /obj/item/stack/material/glass( src.loc, 2 ) - return + state = 3 + new /obj/item/stack/material/glass(src.loc, 2) - if(istype(P, /obj/item/stack/cable_coil)) + else if(istype(P, /obj/item/stack/cable_coil)) if(state == 2) var/obj/item/stack/cable_coil/C = P - if (C.get_amount() < 5) + if(C.get_amount() < 5) user << "You need five coils of wire to add them to the frame." return user << "You start to add cables to the frame." playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(do_after(user, 20) && state == 2) - if (C.use(5)) + if(C.use(5)) user << "You add cables to the frame." state = 3 - icon_state = "[frame_type]_3" - if(frame_type in machines) + if(frame_type.frame_class == "machine") user << desc - return - - if(istype(P, /obj/item/weapon/wirecutters)) - if(state == 3) - if(frame_type in computers) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return - - if(frame_type in displays) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return - - if(frame_type in alarms) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return - - if(frame_type in machines) - playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) - user << "You remove the cables." - src.state = 2 - src.icon_state = "[frame_type]_2" - new /obj/item/stack/cable_coil( src.loc, 5 ) - return - - if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass") - if(state == 3) - if(frame_type in computers) - var/obj/item/stack/G = P - if (G.get_amount() < 2) - user << "You need two sheets of glass to put in the glass panel." - return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start to put in the glass panel." - if(do_after(user, 20) && state == 3) - if (G.use(2)) - user << "You put in the glass panel." - src.state = 4 - src.icon_state = "[frame_type]_4" - return - - if(frame_type in displays) - var/obj/item/stack/G = P - if (G.get_amount() < 2) - user << "You need two sheets of glass to put in the glass panel." - return - playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) - user << "You start to put in the glass panel." - if(do_after(user, 20) && state == 3) - if (G.use(2)) - user << "You put in the glass panel." - src.state = 4 - src.icon_state = "[frame_type]_4" - return - - if(istype(P, /obj/item)) - if(state == 3) - if(frame_type in machines) + else if(state == 3) + if(frame_type.frame_class == "machine") for(var/I in req_components) if(istype(P, I) && (req_components[I] > 0)) playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) @@ -423,10 +465,76 @@ update_desc() break + user.drop_item() + P.forceMove(src) + components += P + req_components[I]-- + update_desc() + break + user << desc + + else if(istype(P, /obj/item/weapon/wirecutters)) + if(state == 3) + if(frame_type.frame_class == "computer") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "You remove the cables." + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) + + else if(frame_type.frame_class == "display") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "You remove the cables." + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) + + else if(frame_type.frame_class == "alarm") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "You remove the cables." + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) + + else if(frame_type.frame_class == "machine") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + user << "You remove the cables." + state = 2 + new /obj/item/stack/cable_coil(src.loc, 5) + + else if(istype(P, /obj/item/stack/material) && P.get_material_name() == "glass") + if(state == 3) + if(frame_type.frame_class == "computer") + var/obj/item/stack/G = P + if(G.get_amount() < 2) + user << "You need two sheets of glass to put in the glass panel." + return + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "You start to put in the glass panel." + if(do_after(user, 20) && state == 3) + if(G.use(2)) + user << "You put in the glass panel." + state = 4 + + else if(frame_type.frame_class == "display") + var/obj/item/stack/G = P + if(G.get_amount() < 2) + user << "You need two sheets of glass to put in the glass panel." + return + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) + user << "You start to put in the glass panel." + if(do_after(user, 20) && state == 3) + if(G.use(2)) + user << "You put in the glass panel." + state = 4 + + else if(istype(P, /obj/item)) + if(state == 3) + if(frame_type.frame_class == "machine") + for(var/I in req_components) + if(istype(P, I) && (req_components[I] > 0)) + playsound(src.loc, 'sound/items/Deconstruct.ogg', 50, 1) if(istype(P, /obj/item/stack/material/glass/reinforced)) var/obj/item/stack/material/glass/reinforced/CP = P if(CP.get_amount() > 1) - var/camt = min(CP.amount, req_components[I]) // amount of cable to take, idealy amount required, but limited by amount provided + var/camt = min(CP.amount, req_components[I]) // amount of glass to take, idealy amount required, but limited by amount provided var/obj/item/stack/material/glass/reinforced/CC = new /obj/item/stack/material/glass/reinforced(src) CC.amount = camt CC.update_icon() @@ -443,6 +551,65 @@ update_desc() break user << desc - if(P && P.loc != src && !istype(P, /obj/item/stack/cable_coil) && !istype(P, /obj/item/stack/material)) + if(P && P.loc != src && !istype(P, /obj/item/stack/material)) user << "You cannot add that component to the machine!" - return \ No newline at end of file + return + + update_icon() + +/obj/structure/frame/verb/rotate() + set name = "Rotate Frame Counter-Clockwise" + set category = "Object" + set src in oview(1) + + if(usr.incapacitated()) + return 0 + + if(anchored) + usr << "It is fastened to the floor therefore you can't rotate it!" + return 0 + + set_dir(turn(dir, 90)) + + var/dir_text + if(dir == 1) + dir_text = "north" + else if(dir == 2) + dir_text = "south" + else if(dir == 4) + dir_text = "east" + else if(dir == 8) + dir_text = "west" + + usr << "You rotate the [src] to face [dir_text]!" + + return + + +/obj/structure/frame/verb/revrotate() + set name = "Rotate Frame Clockwise" + set category = "Object" + set src in oview(1) + + if(usr.incapacitated()) + return 0 + + if(anchored) + usr << "It is fastened to the floor therefore you can't rotate it!" + return 0 + + set_dir(turn(dir, 270)) + + var/dir_text + if(dir == 1) + dir_text = "north" + else if(dir == 2) + dir_text = "south" + else if(dir == 4) + dir_text = "east" + else if(dir == 8) + dir_text = "west" + + usr << "You rotate the [src] to face [dir_text]!" + + return \ No newline at end of file diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 58c8423a23e..158b718e833 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -19,11 +19,9 @@ Possible to do for anyone motivated enough: Itegrate EMP effect to disable the unit. */ - /* * Holopad */ - #define HOLOPAD_PASSIVE_POWER_USAGE 1 #define HOLOGRAM_POWER_USAGE 2 #define RANGE_BASED 4 @@ -37,39 +35,19 @@ var/const/HOLOPAD_MODE = RANGE_BASED icon_state = "holopad0" show_messages = 1 circuit = /obj/item/weapon/circuitboard/holopad - layer = TURF_LAYER+0.1 //Preventing mice and drones from sneaking under them. - var/power_per_hologram = 500 //per usage per hologram idle_power_usage = 5 use_power = 1 - var/list/mob/living/silicon/ai/masters = new() //List of AIs that use the holopad var/last_request = 0 //to prevent request spam. ~Carn var/holo_range = 5 // Change to change how far the AI can move away from the holopad before deactivating. /obj/machinery/hologram/holopad/attackby(obj/item/I as obj, user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start removing the glass." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.circuit = M - A.anchored = 1 - A.density = 1 - A.frame_type = "holopad" - for (var/obj/C in src) - C.forceMove(loc) - user << "You remove the glass." - A.state = 4 - A.icon_state = "holopad_4" - M.deconstruct(src) - for (var/mob/living/silicon/ai/master in masters) - clear_holo(master) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) + return else - src.attack_hand(user) + attack_hand(user) return /obj/machinery/hologram/holopad/attack_hand(var/mob/living/carbon/human/user) //Carn: Hologram requests. @@ -87,7 +65,7 @@ var/const/HOLOPAD_MODE = RANGE_BASED user << "A request for AI presence was already sent recently." /obj/machinery/hologram/holopad/attack_ai(mob/living/silicon/ai/user) - if (!istype(user)) + if(!istype(user)) return /*There are pretty much only three ways to interact here. I don't need to check for client since they're clicking on an object. @@ -102,11 +80,11 @@ var/const/HOLOPAD_MODE = RANGE_BASED /obj/machinery/hologram/holopad/proc/activate_holo(mob/living/silicon/ai/user) if(!(stat & NOPOWER) && user.eyeobj.loc == src.loc)//If the projector has power and client eye is on it - if (user.holo) + if(user.holo) user << "ERROR: Image feed in progress." return create_holo(user)//Create one. - src.visible_message("A holographic image of [user] flicks to life right before your eyes!") + visible_message("A holographic image of [user] flicks to life right before your eyes!") else user << "ERROR: Unable to project hologram." return @@ -165,7 +143,7 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ user.holo = null qdel(masters[user])//Get rid of user's hologram masters -= user //Discard AI from the list of those who use holopad - if (!masters.len)//If no users left + if(!masters.len)//If no users left set_light(0) //pad lighting (hologram lighting will be handled automatically since its owner was deleted) icon_state = "holopad0" return 1 @@ -214,10 +192,10 @@ For the other part of the code, check silicon say.dm. Particularly robot talk.*/ if(1.0) qdel(src) if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) if(3.0) - if (prob(5)) + if(prob(5)) qdel(src) return diff --git a/code/game/machinery/holosign.dm b/code/game/machinery/holosign.dm index 63198710227..7e465db1895 100644 --- a/code/game/machinery/holosign.dm +++ b/code/game/machinery/holosign.dm @@ -14,20 +14,20 @@ var/on_icon = "sign_on" /obj/machinery/holosign/proc/toggle() - if (stat & (BROKEN|NOPOWER)) + if(stat & (BROKEN|NOPOWER)) return lit = !lit use_power = lit ? 2 : 1 update_icon() /obj/machinery/holosign/update_icon() - if (!lit) + if(!lit) icon_state = "sign_off" else icon_state = on_icon /obj/machinery/holosign/power_change() - if (stat & NOPOWER) + if(stat & NOPOWER) lit = 0 use_power = 0 update_icon() @@ -55,8 +55,8 @@ icon_state = "light[active]" for(var/obj/machinery/holosign/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.toggle() return diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 5fd791843d9..97c430f9d02 100755 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -11,7 +11,7 @@ active_power_usage = 4 /obj/machinery/igniter/attack_ai(mob/user as mob) - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/igniter/attack_hand(mob/user as mob) if(..()) @@ -19,14 +19,14 @@ add_fingerprint(user) use_power(50) - src.on = !( src.on ) - src.icon_state = text("igniter[]", src.on) + on = !(on) + icon_state = text("igniter[]", on) return /obj/machinery/igniter/process() //ugh why is this even in process()? - if (src.on && !(stat & NOPOWER) ) + if(on && !(stat & NOPOWER)) var/turf/location = src.loc - if (isturf(location)) + if(isturf(location)) location.hotspot_expose(1000,500,1) return 1 @@ -36,8 +36,8 @@ /obj/machinery/igniter/power_change() ..() - if(!( stat & NOPOWER) ) - icon_state = "igniter[src.on]" + if(!(stat & NOPOWER)) + icon_state = "igniter[on]" else icon_state = "igniter0" @@ -57,56 +57,54 @@ idle_power_usage = 2 active_power_usage = 4 - /obj/machinery/sparker/New() ..() /obj/machinery/sparker/power_change() ..() - if ( !(stat & NOPOWER) && disable == 0 ) + if(!(stat & NOPOWER) && disable == 0) icon_state = "[base_state]" -// src.sd_SetLuminosity(2) +// sd_SetLuminosity(2) else icon_state = "[base_state]-p" -// src.sd_SetLuminosity(0) +// sd_SetLuminosity(0) /obj/machinery/sparker/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/screwdriver)) + if(istype(W, /obj/item/weapon/screwdriver)) add_fingerprint(user) - src.disable = !src.disable - if (src.disable) + disable = !disable + if(disable) user.visible_message("[user] has disabled the [src]!", "You disable the connection to the [src].") icon_state = "[base_state]-d" - if (!src.disable) + if(!disable) user.visible_message("[user] has reconnected the [src]!", "You fix the connection to the [src].") - if(src.powered()) + if(powered()) icon_state = "[base_state]" else icon_state = "[base_state]-p" /obj/machinery/sparker/attack_ai() - if (src.anchored) - return src.ignite() + if(anchored) + return ignite() else return /obj/machinery/sparker/proc/ignite() - if (!(powered())) + if(!(powered())) return - if ((src.disable) || (src.last_spark && world.time < src.last_spark + 50)) + if((disable) || (last_spark && world.time < last_spark + 50)) return - flick("[base_state]-spark", src) var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(2, 1, src) s.start() - src.last_spark = world.time + last_spark = world.time use_power(1000) var/turf/location = src.loc - if (isturf(location)) + if(isturf(location)) location.hotspot_expose(1000,500,1) return 1 @@ -132,14 +130,14 @@ icon_state = "launcheract" for(var/obj/machinery/sparker/M in machines) - if (M.id == src.id) - spawn( 0 ) + if(M.id == id) + spawn(0) M.ignite() for(var/obj/machinery/igniter/M in machines) - if(M.id == src.id) + if(M.id == id) use_power(50) - M.on = !( M.on ) + M.on = !(M.on) M.icon_state = text("igniter[]", M.on) sleep(50) @@ -147,4 +145,4 @@ icon_state = "launcherbtt" active = 0 - return + return \ No newline at end of file diff --git a/code/game/machinery/iv_drip.dm b/code/game/machinery/iv_drip.dm index 4ae639c039e..c0f2a284f4f 100644 --- a/code/game/machinery/iv_drip.dm +++ b/code/game/machinery/iv_drip.dm @@ -10,7 +10,7 @@ /obj/machinery/iv_drip/var/obj/item/weapon/reagent_containers/beaker = null /obj/machinery/iv_drip/update_icon() - if(src.attached) + if(attached) icon_state = "hooked" else icon_state = "" @@ -41,28 +41,28 @@ return if(attached) - visible_message("[src.attached] is detached from \the [src]") - src.attached = null - src.update_icon() + visible_message("[attached] is detached from \the [src]") + attached = null + update_icon() return if(in_range(src, usr) && ishuman(over_object) && get_dist(over_object, src) <= 1) visible_message("[usr] attaches \the [src] to \the [over_object].") - src.attached = over_object - src.update_icon() + attached = over_object + update_icon() /obj/machinery/iv_drip/attackby(obj/item/weapon/W as obj, mob/user as mob) - if (istype(W, /obj/item/weapon/reagent_containers)) - if(!isnull(src.beaker)) + if(istype(W, /obj/item/weapon/reagent_containers)) + if(!isnull(beaker)) user << "There is already a reagent container loaded!" return user.drop_item() W.loc = src - src.beaker = W + beaker = W user << "You attach \the [W] to \the [src]." - src.update_icon() + update_icon() return if(istype(W, /obj/item/weapon/screwdriver)) @@ -70,11 +70,11 @@ user << "You start to dismantle the IV drip." if(do_after(user, 15)) user << "You dismantle the IV drip." - var/obj/item/stack/rods/A = new /obj/item/stack/rods( src.loc ) + var/obj/item/stack/rods/A = new /obj/item/stack/rods(src.loc) A.amount = 6 - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(beaker) + beaker.loc = get_turf(src) + beaker = null qdel(src) return else @@ -84,24 +84,24 @@ /obj/machinery/iv_drip/process() set background = 1 - if(src.attached) + if(attached) - if(!(get_dist(src, src.attached) <= 1 && isturf(src.attached.loc))) - visible_message("The needle is ripped out of [src.attached], doesn't that hurt?") - src.attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) - src.attached = null - src.update_icon() + if(!(get_dist(src, attached) <= 1 && isturf(attached.loc))) + visible_message("The needle is ripped out of [attached], doesn't that hurt?") + attached:apply_damage(3, BRUTE, pick("r_arm", "l_arm")) + attached = null + update_icon() return - if(src.attached && src.beaker) + if(attached && beaker) // Give blood if(mode) - if(src.beaker.volume > 0) + if(beaker.volume > 0) var/transfer_amount = REM - if(istype(src.beaker, /obj/item/weapon/reagent_containers/blood)) + if(istype(beaker, /obj/item/weapon/reagent_containers/blood)) // speed up transfer on blood packs transfer_amount = 4 - src.beaker.reagents.trans_to_mob(src.attached, transfer_amount, CHEM_BLOOD) + beaker.reagents.trans_to_mob(attached, transfer_amount, CHEM_BLOOD) update_icon() // Take blood @@ -130,7 +130,7 @@ var/datum/reagent/B = T.take_blood(beaker,amount) - if (B) + if(B) beaker.reagents.reagent_list |= B beaker.reagents.update_total() beaker.on_reagent_change() @@ -138,9 +138,9 @@ update_icon() /obj/machinery/iv_drip/attack_hand(mob/user as mob) - if(src.beaker) - src.beaker.loc = get_turf(src) - src.beaker = null + if(beaker) + beaker.loc = get_turf(src) + beaker = null update_icon() else return ..() @@ -163,7 +163,7 @@ /obj/machinery/iv_drip/examine(mob/user) ..(user) - if (!(user in view(2)) && user!=src.loc) return + if(!(user in view(2)) && user != src.loc) return user << "The IV drip is [mode ? "injecting" : "taking blood"]." @@ -177,7 +177,7 @@ usr << "[attached ? attached : "No one"] is attached." -/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height=0, air_group=0) +/obj/machinery/iv_drip/CanPass(atom/movable/mover, turf/target, height = 0, air_group = 0) if(height && istype(mover) && mover.checkpass(PASSTABLE)) //allow bullets, beams, thrown objects, mice, drones, and the like through. return 1 return ..() diff --git a/code/game/machinery/jukebox.dm b/code/game/machinery/jukebox.dm index 3b661b77fe3..e937716fe51 100644 --- a/code/game/machinery/jukebox.dm +++ b/code/game/machinery/jukebox.dm @@ -49,7 +49,6 @@ datum/track/New(var/title_name, var/audio) /obj/machinery/media/jukebox/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/capacitor(src) component_parts += new /obj/item/weapon/stock_parts/console_screen(src) diff --git a/code/game/machinery/kitchen/microwave.dm b/code/game/machinery/kitchen/microwave.dm index 1be387f35fe..a3b0f9fdd4e 100644 --- a/code/game/machinery/kitchen/microwave.dm +++ b/code/game/machinery/kitchen/microwave.dm @@ -30,7 +30,6 @@ reagents = new/datum/reagents(100) reagents.my_atom = src - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) diff --git a/code/game/machinery/lightswitch.dm b/code/game/machinery/lightswitch.dm index 7d8e75764ce..180471f0705 100644 --- a/code/game/machinery/lightswitch.dm +++ b/code/game/machinery/lightswitch.dm @@ -18,19 +18,17 @@ /obj/machinery/light_switch/New() ..() spawn(5) - src.area = get_area(src) + area = get_area(src) if(otherarea) - src.area = locate(text2path("/area/[otherarea]")) + area = locate(text2path("/area/[otherarea]")) if(!name) name = "light switch ([area.name])" - src.on = src.area.lightswitch + on = area.lightswitch updateicon() - - /obj/machinery/light_switch/proc/updateicon() if(!overlay) overlay = image(icon, "light1-overlay", LIGHTING_LAYER+0.1) @@ -77,4 +75,4 @@ ..(severity) return power_change() - ..(severity) + ..(severity) \ No newline at end of file diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 30a9b8548bd..af8bd8eb41d 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -96,7 +96,7 @@ Class Procs: /obj/machinery name = "machinery" icon = 'icons/obj/stationobjs.dmi' - w_class = 10 + w_class = ITEMSIZE_NO_CONTAINER var/stat = 0 var/emagged = 0 @@ -113,7 +113,6 @@ Class Procs: var/global/gl_uid = 1 var/interact_offline = 0 // Can the machine be interacted with while de-powered. var/circuit = null - var/frame_type = "machine" /obj/machinery/New(l, d=0) ..(l) @@ -124,6 +123,8 @@ Class Procs: else machines += src machinery_sort_required = 1 + if(circuit) + circuit = new circuit(src) /obj/machinery/Destroy() machines -= src @@ -165,11 +166,11 @@ Class Procs: qdel(src) return if(2.0) - if (prob(50)) + if(prob(50)) qdel(src) return if(3.0) - if (prob(25)) + if(prob(25)) qdel(src) return else @@ -182,20 +183,20 @@ Class Procs: /obj/machinery/proc/auto_use_power() if(!powered(power_channel)) return 0 - if(src.use_power == 1) - use_power(idle_power_usage,power_channel, 1) - else if(src.use_power >= 2) - use_power(active_power_usage,power_channel, 1) + if(use_power == 1) + use_power(idle_power_usage, power_channel, 1) + else if(use_power >= 2) + use_power(active_power_usage, power_channel, 1) return 1 /obj/machinery/proc/operable(var/additional_flags = 0) return !inoperable(additional_flags) /obj/machinery/proc/inoperable(var/additional_flags = 0) - return (stat & (NOPOWER|BROKEN|additional_flags)) + return (stat & (NOPOWER | BROKEN | additional_flags)) /obj/machinery/CanUseTopic(var/mob/user) - if(!interact_offline && (stat & (NOPOWER|BROKEN))) + if(!interact_offline && (stat & (NOPOWER | BROKEN))) return STATUS_CLOSE return ..() @@ -214,20 +215,19 @@ Class Procs: // For some reason attack_robot doesn't work // This is to stop robots from using cameras to remotely control machines. if(user.client && user.client.eye == user) - return src.attack_hand(user) + return attack_hand(user) else - return src.attack_hand(user) + return attack_hand(user) /obj/machinery/attack_hand(mob/user as mob) if(inoperable(MAINT)) return 1 if(user.lying || user.stat) return 1 - if ( ! (istype(usr, /mob/living/carbon/human) || \ - istype(usr, /mob/living/silicon))) + if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/living/silicon))) usr << "You don't have the dexterity to do this!" return 1 - if (ishuman(user)) + if(ishuman(user)) var/mob/living/carbon/human/H = user if(H.getBrainLoss() >= 55) visible_message("[H] stares cluelessly at [src].") @@ -236,7 +236,7 @@ Class Procs: user << "You momentarily forget how to use [src]." return 1 - src.add_fingerprint(user) + add_fingerprint(user) return ..() @@ -252,7 +252,7 @@ Class Procs: O.show_message("\icon[src] [msg]", 2) /obj/machinery/proc/ping(text=null) - if (!text) + if(!text) text = "\The [src] pings." state(text, "blue") @@ -266,7 +266,7 @@ Class Procs: var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread s.set_up(5, 1, src) s.start() - if (electrocute_mob(user, get_area(src), src, 0.7)) + if(electrocute_mob(user, get_area(src), src, 0.7)) var/area/temp_area = get_area(src) if(temp_area) var/obj/machinery/power/apc/temp_apc = temp_area.get_apc() @@ -304,7 +304,7 @@ Class Procs: RefreshParts() else user << "Following parts detected in the machine:" - for(var/var/obj/item/C in component_parts) + for(var/var/obj/item/C in component_parts) //var/var/obj/item/C? user << " [C.name]" return 1 @@ -324,31 +324,77 @@ Class Procs: update_icon() return 1 +/obj/machinery/proc/computer_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S) + if(!istype(S)) + return 0 + if(!circuit) + return 0 + user << "You start disconnecting the monitor." + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + if(do_after(user, 20)) + if(stat & BROKEN) + user << "The broken glass falls out." + new /obj/item/weapon/material/shard(src.loc) + else + user << "You disconnect the monitor." + . = dismantle() + +/obj/machinery/proc/alarm_deconstruction_screwdriver(var/mob/user, var/obj/item/weapon/screwdriver/S) + if(!istype(S)) + return 0 + playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) + panel_open = !panel_open + user << "The wires have been [panel_open ? "exposed" : "unexposed"]" + update_icon() + return 1 + +/obj/machinery/proc/alarm_deconstruction_wirecutters(var/mob/user, var/obj/item/weapon/wirecutters/W) + if(!istype(W)) + return 0 + if(!panel_open) + return 0 + user.visible_message("[user] has cut the wires inside \the [src]!", "You have cut the wires inside \the [src].") + playsound(src.loc, 'sound/items/Wirecutter.ogg', 50, 1) + new/obj/item/stack/cable_coil(get_turf(src), 5) + . = dismantle() + /obj/machinery/proc/dismantle() - playsound(loc, 'sound/items/Crowbar.ogg', 50, 1) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + var/obj/structure/frame/A = new /obj/structure/frame(src.loc) var/obj/item/weapon/circuitboard/M = circuit A.circuit = M A.anchored = 1 A.density = 1 A.frame_type = M.board_type - if(A.frame_type in A.no_circuit) + if(A.frame_type.circuit) A.need_circuit = 0 - for (var/obj/D in src.component_parts) - D.forceMove(loc) - if(A.components) - A.components.Cut() + + if(A.frame_type.frame_class == "machine") + for(var/obj/D in component_parts) + D.forceMove(src.loc) + if(A.components) + A.components.Cut() + else + A.components = list() + component_parts = list() + A.check_components() + + if(A.frame_type.frame_class == "alarm") + A.state = 2 + else if(A.frame_type.frame_class == "computer" || A.frame_type.frame_class == "display") + if(stat & BROKEN) + A.state = 3 + else + A.state = 4 else - A.components = list() - component_parts = list() - A.icon_state = "[A.frame_type]_3" - A.state = 3 - A.dir = dir + A.state = 3 + + A.set_dir(dir) A.pixel_x = pixel_x A.pixel_y = pixel_y - A.check_components() A.update_desc() + A.update_icon() M.loc = null M.deconstruct(src) qdel(src) - return 1 + return 1 \ No newline at end of file diff --git a/code/game/machinery/magnet.dm b/code/game/machinery/magnet.dm index ca044a5a481..af61e934246 100644 --- a/code/game/machinery/magnet.dm +++ b/code/game/machinery/magnet.dm @@ -5,7 +5,6 @@ // This was created for firing ranges, but I suppose this could have other applications - Doohl /obj/machinery/magnetic_module - icon = 'icons/obj/objects.dmi' icon_state = "floor_magnet-f" name = "Electromagnetic Generator" @@ -29,166 +28,157 @@ var/center_y = 0 var/max_dist = 20 // absolute value of center_x,y cannot exceed this integer - New() - ..() - var/turf/T = loc - hide(!T.is_plating()) - center = T +/obj/machinery/magnetic_module/New() + ..() + var/turf/T = loc + hide(!T.is_plating()) + center = T - spawn(10) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_MAGNETS) + spawn(10) // must wait for map loading to finish + if(radio_controller) + radio_controller.add_object(src, freq, RADIO_MAGNETS) - spawn() - magnetic_process() + spawn() + magnetic_process() - // update the invisibility and icon - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() +// update the invisibility and icon +/obj/machinery/magnetic_module/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() - // update the icon_state - proc/updateicon() - var/state="floor_magnet" - var/onstate="" - if(!on) - onstate="0" +// update the icon_state +/obj/machinery/magnetic_module/proc/updateicon() + var/state="floor_magnet" + var/onstate="" + if(!on) + onstate="0" - if(invisibility) - icon_state = "[state][onstate]-f" // if invisible, set icon to faded version - // in case of being revealed by T-scanner - else - icon_state = "[state][onstate]" + if(invisibility) + icon_state = "[state][onstate]-f" // if invisible, set icon to faded version + // in case of being revealed by T-scanner + else + icon_state = "[state][onstate]" - receive_signal(datum/signal/signal) +/obj/machinery/magnetic_module/receive_signal(datum/signal/signal) + var/command = signal.data["command"] + var/modifier = signal.data["modifier"] + var/signal_code = signal.data["code"] + if(command && (signal_code == code)) - var/command = signal.data["command"] - var/modifier = signal.data["modifier"] - var/signal_code = signal.data["code"] - if(command && (signal_code == code)) + Cmd(command, modifier) - Cmd(command, modifier) +/obj/machinery/magnetic_module/proc/Cmd(var/command, var/modifier) + if(command) + switch(command) + if("set-electriclevel") + if(modifier) electricity_level = modifier + if("set-magneticfield") + if(modifier) magnetic_field = modifier + if("add-elec") + electricity_level++ + if(electricity_level > 12) + electricity_level = 12 + if("sub-elec") + electricity_level-- + if(electricity_level <= 0) + electricity_level = 1 + if("add-mag") + magnetic_field++ + if(magnetic_field > 4) + magnetic_field = 4 + if("sub-mag") + magnetic_field-- + if(magnetic_field <= 0) + magnetic_field = 1 + if("set-x") + if(modifier) center_x = modifier + if("set-y") + if(modifier) center_y = modifier - proc/Cmd(var/command, var/modifier) + if("N") // NORTH + center_y++ + if("S") // SOUTH + center_y-- + if("E") // EAST + center_x++ + if("W") // WEST + center_x-- + if("C") // CENTER + center_x = 0 + center_y = 0 + if("R") // RANDOM + center_x = rand(-max_dist, max_dist) + center_y = rand(-max_dist, max_dist) - if(command) - switch(command) - if("set-electriclevel") - if(modifier) electricity_level = modifier - if("set-magneticfield") - if(modifier) magnetic_field = modifier + if("set-code") + if(modifier) code = modifier + if("toggle-power") + on = !on - if("add-elec") - electricity_level++ - if(electricity_level > 12) - electricity_level = 12 - if("sub-elec") - electricity_level-- - if(electricity_level <= 0) - electricity_level = 1 - if("add-mag") - magnetic_field++ - if(magnetic_field > 4) - magnetic_field = 4 - if("sub-mag") - magnetic_field-- - if(magnetic_field <= 0) - magnetic_field = 1 + if(on) + spawn() + magnetic_process() - if("set-x") - if(modifier) center_x = modifier - if("set-y") - if(modifier) center_y = modifier +/obj/machinery/magnetic_module/process() + if(stat & NOPOWER) + on = 0 - if("N") // NORTH - center_y++ - if("S") // SOUTH - center_y-- - if("E") // EAST - center_x++ - if("W") // WEST - center_x-- - if("C") // CENTER - center_x = 0 - center_y = 0 - if("R") // RANDOM - center_x = rand(-max_dist, max_dist) - center_y = rand(-max_dist, max_dist) + // Sanity checks: + if(electricity_level <= 0) + electricity_level = 1 + if(magnetic_field <= 0) + magnetic_field = 1 - if("set-code") - if(modifier) code = modifier - if("toggle-power") - on = !on + // Limitations: + if(abs(center_x) > max_dist) + center_x = max_dist + if(abs(center_y) > max_dist) + center_y = max_dist + if(magnetic_field > 4) + magnetic_field = 4 + if(electricity_level > 12) + electricity_level = 12 - if(on) - spawn() - magnetic_process() + // Update power usage: + if(on) + use_power = 2 + active_power_usage = electricity_level*15 + else + use_power = 0 + // Overload conditions: + /* // Eeeehhh kinda stupid + if(on) + if(electricity_level > 11) + if(prob(electricity_level)) + explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son + spawn(2) + qdel(src) + */ + updateicon() - process() - if(stat & NOPOWER) - on = 0 +/obj/machinery/magnetic_module/proc/magnetic_process() // proc that actually does the pulling + if(pulling) return + while(on) - // Sanity checks: - if(electricity_level <= 0) - electricity_level = 1 - if(magnetic_field <= 0) - magnetic_field = 1 + pulling = 1 + center = locate(x+center_x, y+center_y, z) + if(center) + for(var/obj/M in orange(magnetic_field, center)) + if(!M.anchored && (M.flags & CONDUCT)) + step_towards(M, center) + for(var/mob/living/silicon/S in orange(magnetic_field, center)) + if(istype(S, /mob/living/silicon/ai)) continue + step_towards(S, center) - // Limitations: - if(abs(center_x) > max_dist) - center_x = max_dist - if(abs(center_y) > max_dist) - center_y = max_dist - if(magnetic_field > 4) - magnetic_field = 4 - if(electricity_level > 12) - electricity_level = 12 + use_power(electricity_level * 5) + sleep(13 - electricity_level) - // Update power usage: - if(on) - use_power = 2 - active_power_usage = electricity_level*15 - else - use_power = 0 - - - // Overload conditions: - /* // Eeeehhh kinda stupid - if(on) - if(electricity_level > 11) - if(prob(electricity_level)) - explosion(loc, 0, 1, 2, 3) // ooo dat shit EXPLODES son - spawn(2) - qdel(src) - */ - - updateicon() - - - proc/magnetic_process() // proc that actually does the pulling - if(pulling) return - while(on) - - pulling = 1 - center = locate(x+center_x, y+center_y, z) - if(center) - for(var/obj/M in orange(magnetic_field, center)) - if(!M.anchored && (M.flags & CONDUCT)) - step_towards(M, center) - - for(var/mob/living/silicon/S in orange(magnetic_field, center)) - if(istype(S, /mob/living/silicon/ai)) continue - step_towards(S, center) - - use_power(electricity_level * 5) - sleep(13 - electricity_level) - - pulling = 0 + pulling = 0 /obj/machinery/magnetic_module/Destroy() if(radio_controller) @@ -220,186 +210,186 @@ var/datum/radio_frequency/radio_connection - New() - ..() +/obj/machinery/magnetic_controller/New() + ..() - if(autolink) - for(var/obj/machinery/magnetic_module/M in world) - if(M.freq == frequency && M.code == code) - magnets.Add(M) + if(autolink) + for(var/obj/machinery/magnetic_module/M in world) + if(M.freq == frequency && M.code == code) + magnets.Add(M) - spawn(45) // must wait for map loading to finish - if(radio_controller) - radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) + spawn(45) // must wait for map loading to finish + if(radio_controller) + radio_connection = radio_controller.add_object(src, frequency, RADIO_MAGNETS) - if(path) // check for default path - filter_path() // renders rpath + if(path) // check for default path + filter_path() // renders rpath - process() - if(magnets.len == 0 && autolink) - for(var/obj/machinery/magnetic_module/M in world) - if(M.freq == frequency && M.code == code) - magnets.Add(M) +/obj/machinery/magnetic_controller/process() + if(magnets.len == 0 && autolink) + for(var/obj/machinery/magnetic_module/M in world) + if(M.freq == frequency && M.code == code) + magnets.Add(M) - attack_ai(mob/user as mob) - return src.attack_hand(user) +/obj/machinery/magnetic_controller/attack_ai(mob/user as mob) + return attack_hand(user) + +/obj/machinery/magnetic_controller/attack_hand(mob/user as mob) + if(stat & (BROKEN|NOPOWER)) + return + user.set_machine(src) + var/dat = "Magnetic Control Console

    " + if(!autolink) + dat += {" + Frequency: [frequency]
    + Code: [code]
    + Probe Generators
    + "} + + if(magnets.len >= 1) + + dat += "Magnets confirmed:
    " + var/i = 0 + for(var/obj/machinery/magnetic_module/M in magnets) + i++ + dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
    " + + dat += "
    Speed: - [speed] +
    " + dat += "Path: {[path]}
    " + dat += "Moving: [moving ? "Enabled":"Disabled"]" + + + user << browse(dat, "window=magnet;size=400x500") + onclose(user, "magnet") + +/obj/machinery/magnetic_controller/Topic(href, href_list) + if(stat & (BROKEN|NOPOWER)) + return + usr.set_machine(src) + add_fingerprint(usr) + + if(href_list["radio-op"]) + + // Prepare signal beforehand, because this is a radio operation + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code + + // Apply any necessary commands + switch(href_list["radio-op"]) + if("togglepower") + signal.data["command"] = "toggle-power" + + if("minuselec") + signal.data["command"] = "sub-elec" + if("pluselec") + signal.data["command"] = "add-elec" + + if("minusmag") + signal.data["command"] = "sub-mag" + if("plusmag") + signal.data["command"] = "add-mag" + + + // Broadcast the signal + + radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) + + spawn(1) + updateUsrDialog() // pretty sure this increases responsiveness + + if(href_list["operation"]) + switch(href_list["operation"]) + if("plusspeed") + speed ++ + if(speed > 10) + speed = 10 + if("minusspeed") + speed -- + if(speed <= 0) + speed = 1 + if("setpath") + var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) + if(newpath && newpath != "") + moving = 0 // stop moving + path = newpath + pathpos = 1 // reset position + filter_path() // renders rpath + + if("togglemoving") + moving = !moving + if(moving) + spawn() MagnetMove() + + + updateUsrDialog() + +/obj/machinery/magnetic_controller/proc/MagnetMove() + if(looping) return + + while(moving && rpath.len >= 1) - attack_hand(mob/user as mob) if(stat & (BROKEN|NOPOWER)) - return - user.set_machine(src) - var/dat = "Magnetic Control Console

    " - if(!autolink) - dat += {" - Frequency: [frequency]
    - Code: [code]
    - Probe Generators
    - "} + break - if(magnets.len >= 1) + looping = 1 - dat += "Magnets confirmed:
    " - var/i = 0 - for(var/obj/machinery/magnetic_module/M in magnets) - i++ - dat += "     < \[[i]\] ([M.on ? "On":"Off"]) | Electricity level: - [M.electricity_level] +; Magnetic field: - [M.magnetic_field] +
    " + // Prepare the radio signal + var/datum/signal/signal = new + signal.transmission_method = 1 // radio transmission + signal.source = src + signal.frequency = frequency + signal.data["code"] = code - dat += "
    Speed: - [speed] +
    " - dat += "Path: {[path]}
    " - dat += "Moving: [moving ? "Enabled":"Disabled"]" + if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! + pathpos = 1 + + var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive + + if(!(nextmove in list("N","S","E","W","C","R"))) + // N, S, E, W are directional + // C is center + // R is random (in magnetic field's bounds) + qdel(signal) + break // break the loop if the character located is invalid + + signal.data["command"] = nextmove - user << browse(dat, "window=magnet;size=400x500") - onclose(user, "magnet") - - Topic(href, href_list) - if(stat & (BROKEN|NOPOWER)) - return - usr.set_machine(src) - src.add_fingerprint(usr) - - if(href_list["radio-op"]) - - // Prepare signal beforehand, because this is a radio operation - var/datum/signal/signal = new - signal.transmission_method = 1 // radio transmission - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - // Apply any necessary commands - switch(href_list["radio-op"]) - if("togglepower") - signal.data["command"] = "toggle-power" - - if("minuselec") - signal.data["command"] = "sub-elec" - if("pluselec") - signal.data["command"] = "add-elec" - - if("minusmag") - signal.data["command"] = "sub-mag" - if("plusmag") - signal.data["command"] = "add-mag" - - - // Broadcast the signal + pathpos++ // increase iterator + // Broadcast the signal + spawn() radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - spawn(1) - updateUsrDialog() // pretty sure this increases responsiveness + if(speed == 10) + sleep(1) + else + sleep(12-speed) - if(href_list["operation"]) - switch(href_list["operation"]) - if("plusspeed") - speed ++ - if(speed > 10) - speed = 10 - if("minusspeed") - speed -- - if(speed <= 0) - speed = 1 - if("setpath") - var/newpath = sanitize(input(usr, "Please define a new path!",,path) as text|null) - if(newpath && newpath != "") - moving = 0 // stop moving - path = newpath - pathpos = 1 // reset position - filter_path() // renders rpath - - if("togglemoving") - moving = !moving - if(moving) - spawn() MagnetMove() + looping = 0 - updateUsrDialog() +/obj/machinery/magnetic_controller/proc/filter_path() + // Generates the rpath variable using the path string, think of this as "string2list" + // Doesn't use params2list() because of the akward way it stacks entities + rpath = list() // clear rpath + var/maximum_character = min(50, length(path)) // chooses the maximum length of the iterator. 50 max length - proc/MagnetMove() - if(looping) return + for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - while(moving && rpath.len >= 1) + var/nextchar = copytext(path, i, i+1) // find next character - if(stat & (BROKEN|NOPOWER)) - break + if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore + rpath += copytext(path, i, i+1) // else, add to list - looping = 1 - - // Prepare the radio signal - var/datum/signal/signal = new - signal.transmission_method = 1 // radio transmission - signal.source = src - signal.frequency = frequency - signal.data["code"] = code - - if(pathpos > rpath.len) // if the position is greater than the length, we just loop through the list! - pathpos = 1 - - var/nextmove = uppertext(rpath[pathpos]) // makes it un-case-sensitive - - if(!(nextmove in list("N","S","E","W","C","R"))) - // N, S, E, W are directional - // C is center - // R is random (in magnetic field's bounds) - qdel(signal) - break // break the loop if the character located is invalid - - signal.data["command"] = nextmove - - - pathpos++ // increase iterator - - // Broadcast the signal - spawn() - radio_connection.post_signal(src, signal, filter = RADIO_MAGNETS) - - if(speed == 10) - sleep(1) - else - sleep(12-speed) - - looping = 0 - - - proc/filter_path() - // Generates the rpath variable using the path string, think of this as "string2list" - // Doesn't use params2list() because of the akward way it stacks entities - rpath = list() // clear rpath - var/maximum_character = min( 50, length(path) ) // chooses the maximum length of the iterator. 50 max length - - for(var/i=1, i<=maximum_character, i++) // iterates through all characters in path - - var/nextchar = copytext(path, i, i+1) // find next character - - if(!(nextchar in list(";", "&", "*", " "))) // if char is a separator, ignore - rpath += copytext(path, i, i+1) // else, add to list - - // there doesn't HAVE to be separators but it makes paths syntatically visible + // there doesn't HAVE to be separators but it makes paths syntatically visible /obj/machinery/magnetic_controller/Destroy() if(radio_controller) diff --git a/code/game/machinery/mass_driver.dm b/code/game/machinery/mass_driver.dm index f563d9ef391..4d1affb3a0c 100644 --- a/code/game/machinery/mass_driver.dm +++ b/code/game/machinery/mass_driver.dm @@ -18,7 +18,6 @@ /obj/machinery/mass_driver/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/motor(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) @@ -59,7 +58,7 @@ M << "The mass driver lets out a screech, it mustn't be able to handle any more items." break use_power(500) - spawn( 0 ) + spawn(0) O.throw_at(target, drive_range * power, power) flick("mass_driver1", src) return diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index 0c14c66990e..fe5cac9c44c 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -1,11 +1,9 @@ // Navigation beacon for AI robots // Functions as a transponder: looks for incoming signal matching - var/global/list/navbeacons // no I don't like putting this in, but it will do for now /obj/machinery/navbeacon - icon = 'icons/obj/objects.dmi' icon_state = "navbeacon0-f" name = "navigation beacon" @@ -13,162 +11,160 @@ var/global/list/navbeacons // no I don't like putting this in, but it will do level = 1 // underfloor layer = 2.5 anchored = 1 - var/open = 0 // true if cover is open var/locked = 1 // true if controls are locked var/freq = 1445 // radio frequency var/location = "" // location response text var/list/codes // assoc. list of transponder codes var/codes_txt = "" // codes as set on map: "tag1;tag2" or "tag1=value;tag2=value" - req_access = list(access_engine) - New() - ..() +/obj/machinery/navbeacon/New() + ..() - set_codes() + set_codes() - var/turf/T = loc - hide(!T.is_plating()) + var/turf/T = loc + hide(!T.is_plating()) - // add beacon to MULE bot beacon list - if(freq == 1400) - if(!navbeacons) - navbeacons = new() - navbeacons += src + // add beacon to MULE bot beacon list + if(freq == 1400) + if(!navbeacons) + navbeacons = new() + navbeacons += src - spawn(5) // must wait for map loading to finish - if(radio_controller) - radio_controller.add_object(src, freq, RADIO_NAVBEACONS) + spawn(5) // must wait for map loading to finish + if(radio_controller) + radio_controller.add_object(src, freq, RADIO_NAVBEACONS) - // set the transponder codes assoc list from codes_txt - proc/set_codes() - if(!codes_txt) - return - - codes = new() - - var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - - for(var/e in entries) - var/index = findtext(e, "=") // format is "key=value" - if(index) - var/key = copytext(e, 1, index) - var/val = copytext(e, index+1) - codes[key] = val - else - codes[e] = "1" - - - // called when turf state changes - // hide the object if turf is intact - hide(var/intact) - invisibility = intact ? 101 : 0 - updateicon() - - // update the icon_state - proc/updateicon() - var/state="navbeacon[open]" - - if(invisibility) - icon_state = "[state]-f" // if invisible, set icon to faded version - // in case revealed by T-scanner - else - icon_state = "[state]" - - - // look for a signal of the form "findbeacon=X" - // where X is any - // or the location - // or one of the set transponder keys - // if found, return a signal - receive_signal(datum/signal/signal) - - var/request = signal.data["findbeacon"] - if(request && ((request in codes) || request == "any" || request == location)) - spawn(1) - post_signal() - - // return a signal giving location and transponder codes - - proc/post_signal() - - var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) - - if(!frequency) return - - var/datum/signal/signal = new() - signal.source = src - signal.transmission_method = 1 - signal.data["beacon"] = location - - for(var/key in codes) - signal.data[key] = codes[key] - - frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) - - - attackby(var/obj/item/I, var/mob/user) - var/turf/T = loc - if(!T.is_plating()) - return // prevent intraction when T-scanner revealed - - if(istype(I, /obj/item/weapon/screwdriver)) - open = !open - - user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") - - updateicon() - - else if (istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) - if(open) - if (src.allowed(user)) - src.locked = !src.locked - user << "Controls are now [src.locked ? "locked." : "unlocked."]" - else - user << "Access denied." - updateDialog() - else - user << "You must open the cover first!" +// set the transponder codes assoc list from codes_txt +/obj/machinery/navbeacon/proc/set_codes() + if(!codes_txt) return - attack_ai(var/mob/user) - interact(user, 1) + codes = new() - attack_hand(var/mob/user) + var/list/entries = splittext(codes_txt, ";") // entries are separated by semicolons - if(!user.IsAdvancedToolUser()) - return 0 - - interact(user, 0) - - interact(var/mob/user, var/ai = 0) - var/turf/T = loc - if(!T.is_plating()) - return // prevent intraction when T-scanner revealed - - if(!open && !ai) // can't alter controls if not open, unless you're an AI - user << "The beacon's control cover is closed." - return + for(var/e in entries) + var/index = findtext(e, "=") // format is "key=value" + if(index) + var/key = copytext(e, 1, index) + var/val = copytext(e, index+1) + codes[key] = val + else + codes[e] = "1" - var/t +// called when turf state changes +// hide the object if turf is intact +/obj/machinery/navbeacon/hide(var/intact) + invisibility = intact ? 101 : 0 + updateicon() - if(locked && !ai) - t = {"Navigation Beacon

    +// update the icon_state +/obj/machinery/navbeacon/proc/updateicon() + var/state="navbeacon[open]" + + if(invisibility) + icon_state = "[state]-f" // if invisible, set icon to faded version + // in case revealed by T-scanner + else + icon_state = "[state]" + + +// look for a signal of the form "findbeacon=X" +// where X is any +// or the location +// or one of the set transponder keys +// if found, return a signal +/obj/machinery/navbeacon/receive_signal(datum/signal/signal) + + var/request = signal.data["findbeacon"] + if(request && ((request in codes) || request == "any" || request == location)) + spawn(1) + post_signal() + +// return a signal giving location and transponder codes + +/obj/machinery/navbeacon/proc/post_signal() + + var/datum/radio_frequency/frequency = radio_controller.return_frequency(freq) + + if(!frequency) return + + var/datum/signal/signal = new() + signal.source = src + signal.transmission_method = 1 + signal.data["beacon"] = location + + for(var/key in codes) + signal.data[key] = codes[key] + + frequency.post_signal(src, signal, filter = RADIO_NAVBEACONS) + + +/obj/machinery/navbeacon/attackby(var/obj/item/I, var/mob/user) + var/turf/T = loc + if(!T.is_plating()) + return // prevent intraction when T-scanner revealed + + if(istype(I, /obj/item/weapon/screwdriver)) + open = !open + + user.visible_message("[user] [open ? "opens" : "closes"] the beacon's cover.", "You [open ? "open" : "close"] the beacon's cover.") + + updateicon() + + else if(istype(I, /obj/item/weapon/card/id)||istype(I, /obj/item/device/pda)) + if(open) + if(allowed(user)) + locked = !locked + user << "Controls are now [locked ? "locked." : "unlocked."]" + else + user << "Access denied." + updateDialog() + else + user << "You must open the cover first!" + return + +/obj/machinery/navbeacon/attack_ai(var/mob/user) + interact(user, 1) + +/obj/machinery/navbeacon/attack_hand(var/mob/user) + + if(!user.IsAdvancedToolUser()) + return 0 + + interact(user, 0) + +/obj/machinery/navbeacon/interact(var/mob/user, var/ai = 0) + var/turf/T = loc + if(!T.is_plating()) + return // prevent intraction when T-scanner revealed + + if(!open && !ai) // can't alter controls if not open, unless you're an AI + user << "The beacon's control cover is closed." + return + + + var/t + + if(locked && !ai) + t = {"Navigation Beacon

    (swipe card to unlock controls)
    Frequency: [format_frequency(freq)]

    Location: [location ? location : "(none)"]
    Transponder Codes:
    Command
    SpecialCaptain
    SpecialStation AdministratorCustom
    " + //Cargo (Yellow) + counter = 0 + jobs += "" + jobs += "" + for(var/jobPos in cargo_positions) + if(!jobPos) continue + var/datum/job/job = job_master.GetJob(jobPos) + if(!job) continue + + if(jobban_isbanned(M, job.title)) + jobs += "" + counter++ + else + jobs += "" + counter++ + + if(counter >= 5) //So things dont get squiiiiished! + jobs += "" + counter = 0 + jobs += "
    Cargo Positions
    [replacetext(job.title, " ", " ")][replacetext(job.title, " ", " ")]
    " + //Medical (White) counter = 0 jobs += "" @@ -617,6 +638,12 @@ var/datum/job/temp = job_master.GetJob(jobPos) if(!temp) continue joblist += temp.title + if("cargodept") + for(var/jobPos in cargo_positions) + if(!jobPos) continue + var/datum/job/temp = job_master.GetJob(jobPos) + if(!temp) continue + joblist += temp.title if("medicaldept") for(var/jobPos in medical_positions) if(!jobPos) continue @@ -1176,6 +1203,18 @@ sleep(2) C.jumptomob(M) + else if(href_list["adminplayerobservefollow"]) + if(!check_rights(R_MENTOR|R_MOD|R_ADMIN|R_SERVER)) + return + + var/mob/M = locate(href_list["adminplayerobservefollow"]) + + var/client/C = usr.client + if(!isobserver(usr)) C.admin_ghost() + var/mob/observer/dead/G = C.mob + sleep(2) + G.ManualFollow(M) + else if(href_list["check_antagonist"]) check_antagonists() @@ -1311,19 +1350,19 @@ M.Weaken(20) M.stuttering = 20 - else if(href_list["CentcommReply"]) - var/mob/living/L = locate(href_list["CentcommReply"]) + else if(href_list["CentComReply"]) + var/mob/living/L = locate(href_list["CentComReply"]) if(!istype(L)) usr << "This can only be used on instances of type /mob/living/" return if(L.can_centcom_reply()) - var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from Centcomm", "")) + var/input = sanitize(input(src.owner, "Please enter a message to reply to [key_name(L)] via their headset.","Outgoing message from CentCom", "")) if(!input) return src.owner << "You sent [input] to [L] via a secure channel." - log_admin("[src.owner] replied to [key_name(L)]'s Centcomm message with the message [input].") - message_admins("[src.owner] replied to [key_name(L)]'s Centcom message with: \"[input]\"") + log_admin("[src.owner] replied to [key_name(L)]'s CentCom message with the message [input].") + message_admins("[src.owner] replied to [key_name(L)]'s CentCom message with: \"[input]\"") if(!isAI(L)) L << "You hear something crackle in your headset for a moment before a voice speaks." L << "Please stand by for a message from Central Command." diff --git a/code/modules/admin/verbs/debug.dm b/code/modules/admin/verbs/debug.dm index b21abd7e301..9b9aca72b3c 100644 --- a/code/modules/admin/verbs/debug.dm +++ b/code/modules/admin/verbs/debug.dm @@ -262,7 +262,7 @@ id.icon_state = "gold" id.access = get_all_accesses() id.registered_name = H.real_name - id.assignment = "Captain" + id.assignment = "Station Administrator" id.name = "[id.registered_name]'s ID Card ([id.assignment])" H.equip_to_slot_or_del(id, slot_wear_id) H.update_inv_wear_id() @@ -959,3 +959,13 @@ log_admin("[key_name(src)] has toggled [M.key]'s [blockname] block [state]!") else alert("Invalid mob") + +/datum/admins/proc/view_runtimes() + set category = "Debug" + set name = "View Runtimes" + set desc = "Open the Runtime Viewer" + + if(!check_rights(R_DEBUG)) + return + + error_cache.showTo(usr) diff --git a/code/modules/admin/verbs/pray.dm b/code/modules/admin/verbs/pray.dm index 844f74b5f65..1307086a875 100644 --- a/code/modules/admin/verbs/pray.dm +++ b/code/modules/admin/verbs/pray.dm @@ -27,8 +27,8 @@ feedback_add_details("admin_verb","PR") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! //log_admin("HELP: [key_name(src)]: [msg]") -/proc/Centcomm_announce(var/msg, var/mob/Sender, var/iamessage) - msg = "\blue [uppertext(boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" +/proc/CentCom_announce(var/msg, var/mob/Sender, var/iamessage) + msg = "\blue [uppertext(boss_short)]M[iamessage ? " IA" : ""]:[key_name(Sender, 1)] (PP) (VV) (SM) ([admin_jump_link(Sender, src)]) (CA) (BSA) (RPLY): [msg]" for(var/client/C in admins) if(R_ADMIN & C.holder.rights) C << msg diff --git a/code/modules/assembly/assembly.dm b/code/modules/assembly/assembly.dm index 479bbed53f0..95879841772 100644 --- a/code/modules/assembly/assembly.dm +++ b/code/modules/assembly/assembly.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/assemblies/new_assemblies.dmi' icon_state = "" flags = CONDUCT - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 100) throwforce = 2 throw_speed = 3 diff --git a/code/modules/assembly/bomb.dm b/code/modules/assembly/bomb.dm index a78126bedc5..e41576020e2 100644 --- a/code/modules/assembly/bomb.dm +++ b/code/modules/assembly/bomb.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/tank.dmi' item_state = "assembly" throwforce = 5 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL throw_speed = 2 throw_range = 4 flags = CONDUCT | PROXMOVE diff --git a/code/modules/assembly/holder.dm b/code/modules/assembly/holder.dm index 021216f2181..a614135f226 100644 --- a/code/modules/assembly/holder.dm +++ b/code/modules/assembly/holder.dm @@ -5,7 +5,7 @@ item_state = "assembly" flags = CONDUCT | PROXMOVE throwforce = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 3 throw_range = 10 diff --git a/code/modules/assembly/shock_kit.dm b/code/modules/assembly/shock_kit.dm index 8ba62cdc371..edbe0e74910 100644 --- a/code/modules/assembly/shock_kit.dm +++ b/code/modules/assembly/shock_kit.dm @@ -5,7 +5,7 @@ var/obj/item/clothing/head/helmet/part1 = null var/obj/item/device/radio/electropack/part2 = null var/status = 0 - w_class = 5.0 + w_class = ITEMSIZE_HUGE flags = CONDUCT /obj/item/assembly/shock_kit/Destroy() diff --git a/code/modules/client/preference_setup/general/04_equipment.dm b/code/modules/client/preference_setup/general/04_equipment.dm index 537f2632e73..79adec9afcd 100644 --- a/code/modules/client/preference_setup/general/04_equipment.dm +++ b/code/modules/client/preference_setup/general/04_equipment.dm @@ -34,7 +34,7 @@ pref.all_underwear -= underwear_category_name // TODO - Looks like this is duplicating the work of sanitize_character() if so, remove - if(pref.backbag > 4 || pref.backbag < 1) + if(pref.backbag > 5 || pref.backbag < 1) pref.backbag = 1 //Same as above character.backbag = pref.backbag diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories.dm b/code/modules/client/preference_setup/loadout/loadout_accessories.dm index ba3cb42d894..7f7fcb059ca 100644 --- a/code/modules/client/preference_setup/loadout/loadout_accessories.dm +++ b/code/modules/client/preference_setup/loadout/loadout_accessories.dm @@ -28,6 +28,14 @@ display_name = "armband, science" path = /obj/item/clothing/accessory/armband/science +/datum/gear/accessory/colored + display_name = "armband" + path = /obj/item/clothing/accessory/armband/med/color + +/datum/gear/accessory/colored/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + /datum/gear/accessory/wallet display_name = "wallet, orange" path = /obj/item/weapon/storage/wallet/random @@ -36,10 +44,36 @@ display_name = "wallet, polychromic" path = /obj/item/weapon/storage/wallet/poly +/datum/gear/accessory/wallet/womens + display_name = "wallet, womens" + path = /obj/item/weapon/storage/wallet/womens + +/datum/gear/accessory/wallet/womens/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/accessory/clutch + display_name = "clutch bag" + path = /obj/item/weapon/storage/briefcase/clutch + cost = 2 + +/datum/gear/accessory/clutch/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/accessory/purse + display_name = "purse" + path = /obj/item/weapon/storage/backpack/purse + cost = 3 + +/datum/gear/accessory/purse/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + /datum/gear/accessory/holster display_name = "holster, armpit" path = /obj/item/clothing/accessory/holster/armpit - allowed_roles = list("Captain", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") + allowed_roles = list("Station Administrator", "Head of Personnel", "Security Officer", "Warden", "Head of Security","Detective") /datum/gear/accessory/holster/hip display_name = "holster, hip" @@ -210,4 +244,24 @@ /datum/gear/accessory/webbing display_name = "webbing, simple" path = /obj/item/clothing/accessory/storage/webbing - cost = 2 \ No newline at end of file + cost = 2 + +/datum/gear/accessory/chaps + display_name = "chaps, brown" + path = /obj/item/clothing/accessory/chaps + +/datum/gear/accessory/chaps/black + display_name = "chaps, black" + path = /obj/item/clothing/accessory/chaps/black + +/datum/gear/accessory/hawaii + display_name = "hawaii shirt" + path = /obj/item/clothing/accessory/hawaii + +/datum/gear/accessory/hawaii/New() + ..() + var/list/shirts = list() + shirts["blue hawaii shirt"] = /obj/item/clothing/accessory/hawaii + shirts["red hawaii shirt"] = /obj/item/clothing/accessory/hawaii/red + shirts["random colored hawaii shirt"] = /obj/item/clothing/accessory/hawaii/random + gear_tweaks += new/datum/gear_tweak/path(shirts) diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes.dm b/code/modules/client/preference_setup/loadout/loadout_eyes.dm index b30bc8ff0fa..e8b2202ddfc 100644 --- a/code/modules/client/preference_setup/loadout/loadout_eyes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_eyes.dm @@ -50,7 +50,7 @@ /datum/gear/eyes/shades display_name = "Sunglasses, fat (Security/Command)" path = /obj/item/clothing/glasses/sunglasses/big - allowed_roles = list("Security Officer","Head of Security","Warden","Captain","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") + allowed_roles = list("Security Officer","Head of Security","Warden","Station Administrator","Head of Personnel","Quartermaster","Internal Affairs Agent","Detective") /datum/gear/eyes/glasses/fakesun display_name = "Sunglasses, stylish" diff --git a/code/modules/client/preference_setup/loadout/loadout_head.dm b/code/modules/client/preference_setup/loadout/loadout_head.dm index 4ad804dccde..72bd4a08172 100644 --- a/code/modules/client/preference_setup/loadout/loadout_head.dm +++ b/code/modules/client/preference_setup/loadout/loadout_head.dm @@ -122,6 +122,14 @@ path = /obj/item/clothing/head/cowboy_hat cost = 3 +/datum/gear/head/fedora + display_name = "fedora, brown" + path = /obj/item/clothing/head/fedora/brown + +/datum/gear/head/fedora/grey + display_name = "fedora, grey" + path = /obj/item/clothing/head/fedora/grey + /datum/gear/head/hairflower display_name = "hair flower pin, red" path = /obj/item/clothing/head/hairflower @@ -224,3 +232,47 @@ /datum/gear/head/turban/New() ..() gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/beanie + display_name = "beanie" + path = /obj/item/clothing/head/beanie + +/datum/gear/head/beanie/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/loose_beanie + display_name = "loose beanie" + path = /obj/item/clothing/head/beanie_loose + +/datum/gear/head/loose_beanie/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/beretg + display_name = "beret" + path = /obj/item/clothing/head/beretg + +/datum/gear/head/beretg/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/sombrero + display_name = "sombrero" + path = /obj/item/clothing/head/sombrero + +/datum/gear/head/flatcapg + display_name = "flat cap" + path = /obj/item/clothing/head/flatcap/grey + +/datum/gear/head/flatcapg/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/head/bow + display_name = "hair bow" + path = /obj/item/clothing/head/hairflower/bow + +/datum/gear/head/bow/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes.dm b/code/modules/client/preference_setup/loadout/loadout_shoes.dm index d6e61c561ef..a24d24a1e5e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_shoes.dm +++ b/code/modules/client/preference_setup/loadout/loadout_shoes.dm @@ -13,6 +13,10 @@ display_name = "workboots" path = /obj/item/clothing/shoes/workboots +/datum/gear/shoes/workboots/toeless + display_name = "toe-less workboots" + path = /obj/item/clothing/shoes/workboots/toeless + /datum/gear/shoes/sandals display_name = "sandals" path = /obj/item/clothing/shoes/sandal @@ -95,4 +99,36 @@ /datum/gear/shoes/flats/white display_name = "flats, white" - path = /obj/item/clothing/shoes/flats/white \ No newline at end of file + path = /obj/item/clothing/shoes/flats/white + +/datum/gear/shoes/flipflops + display_name = "flip flops" + path = /obj/item/clothing/shoes/flipflop + +/datum/gear/shoes/flipflops/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/shoes/athletic + display_name = "athletic shoes" + path = /obj/item/clothing/shoes/athletic + +/datum/gear/shoes/athletic/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/shoes/skater + display_name = "skater shoes" + path = /obj/item/clothing/shoes/skater + +/datum/gear/shoes/skater/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) + +/datum/gear/shoes/flats/color + display_name = "flats" + path = /obj/item/clothing/shoes/flats/white/color + +/datum/gear/shoes/flats/color/New() + ..() + gear_tweaks = list(gear_tweak_free_color_choice) \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_suit.dm b/code/modules/client/preference_setup/loadout/loadout_suit.dm index 6e6acf08bd3..2cb7da998ee 100644 --- a/code/modules/client/preference_setup/loadout/loadout_suit.dm +++ b/code/modules/client/preference_setup/loadout/loadout_suit.dm @@ -28,24 +28,40 @@ /datum/gear/suit/leather_jacket display_name = "leather jacket, black" - path = /obj/item/clothing/suit/storage/leather_jacket + path = /obj/item/clothing/suit/storage/toggle/leather_jacket + +/datum/gear/suit/leather_jacket_sleeveless + display_name = "leather vest, black" + path = /obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless /datum/gear/suit/leather_jacket_alt display_name = "leather jacket 2, black" - path = /obj/item/clothing/suit/storage/leather_jacket/alt + path = /obj/item/clothing/suit/storage/leather_jacket_alt /datum/gear/suit/leather_jacket_nt display_name = "leather jacket, corporate, black" - path = /obj/item/clothing/suit/storage/leather_jacket/nanotrasen + path = /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen + +/datum/gear/suit/leather_jacket_nt/sleeveless + display_name = "leather vest, corporate, black" + path = /obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless /datum/gear/suit/brown_jacket display_name = "leather jacket, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket +/datum/gear/suit/brown_jacket_sleeveless + display_name = "leather vest, brown" + path = /obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless + /datum/gear/suit/brown_jacket_nt display_name = "leather jacket, corporate, brown" path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen +/datum/gear/suit/brown_jacket_nt/sleeveless + display_name = "leather vest, corporate, brown" + path = /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless + /datum/gear/suit/mil display_name = "military jacket" path = /obj/item/clothing/suit/storage/miljacket @@ -58,6 +74,18 @@ display_name = "military jacket, green" path = /obj/item/clothing/suit/storage/miljacket/green +/datum/gear/suit/greyjacket + display_name = "grey jacket" + path = /obj/item/clothing/suit/storage/greyjacket + +/datum/gear/suit/brown_trenchcoat + display_name = "trenchcoat, brown" + path = /obj/item/clothing/suit/storage/trench + +/datum/gear/suit/grey_trenchcoat + display_name = "trenchcoat, grey" + path = /obj/item/clothing/suit/storage/trench/grey + /datum/gear/suit/hazard_vest display_name = "hazard vest" path = /obj/item/clothing/suit/storage/hazardvest @@ -118,40 +146,40 @@ /datum/gear/suit/poncho display_name = "poncho selection" - path = /obj/item/clothing/suit/poncho + path = /obj/item/clothing/accessory/poncho cost = 1 /datum/gear/suit/poncho/New() ..() var/list/ponchos = list() - for(var/poncho_style in (typesof(/obj/item/clothing/suit/poncho) - typesof(/obj/item/clothing/suit/poncho/roles))) - var/obj/item/clothing/suit/storage/toggle/hoodie/poncho = poncho_style + for(var/poncho_style in (typesof(/obj/item/clothing/accessory/poncho) - typesof(/obj/item/clothing/accessory/poncho/roles))) + var/obj/item/clothing/accessory/poncho/poncho = poncho_style ponchos[initial(poncho.name)] = poncho gear_tweaks += new/datum/gear_tweak/path(sortAssoc(ponchos)) /datum/gear/suit/roles/poncho/security display_name = "poncho, security" - path = /obj/item/clothing/suit/poncho/roles/security + path = /obj/item/clothing/accessory/poncho/roles/security allowed_roles = list("Head of Security", "Warden", "Detective", "Security Officer") /datum/gear/suit/roles/poncho/medical display_name = "poncho, medical" - path = /obj/item/clothing/suit/poncho/roles/medical + path = /obj/item/clothing/accessory/poncho/roles/medical allowed_roles = list("Medical Doctor","Chief Medical Officer","Chemist","Paramedic","Geneticist") /datum/gear/suit/roles/poncho/engineering display_name = "poncho, engineering" - path = /obj/item/clothing/suit/poncho/roles/engineering + path = /obj/item/clothing/accessory/poncho/roles/engineering allowed_roles = list("Chief Engineer","Atmospheric Technician", "Station Engineer") /datum/gear/suit/roles/poncho/science display_name = "poncho, science" - path = /obj/item/clothing/suit/poncho/roles/science + path = /obj/item/clothing/accessory/poncho/roles/science allowed_roles = list("Research Director","Scientist", "Roboticist", "Xenobiologist") /datum/gear/suit/roles/poncho/cargo display_name = "poncho, cargo" - path = /obj/item/clothing/suit/poncho/roles/cargo + path = /obj/item/clothing/accessory/poncho/roles/cargo allowed_roles = list("Quartermaster","Cargo Technician") /datum/gear/suit/unathi_robe @@ -230,9 +258,9 @@ path = /obj/item/clothing/suit/storage/hooded/wintercoat /datum/gear/suit/wintercoat/captain - display_name = "winter coat, captain" + display_name = "winter coat, station administrator" path = /obj/item/clothing/suit/storage/hooded/wintercoat/captain - allowed_roles = list("Captain") + allowed_roles = list("Station Administrator") /datum/gear/suit/wintercoat/security display_name = "winter coat, security" @@ -312,4 +340,20 @@ /datum/gear/suit/flannel/brown display_name = "brown flannel" - path = /obj/item/clothing/suit/storage/flannel/brown \ No newline at end of file + path = /obj/item/clothing/suit/storage/flannel/brown + +/datum/gear/suit/denim_jacket + display_name = "denim jacket" + path = /obj/item/clothing/suit/storage/toggle/denim_jacket + +/datum/gear/suit/denim_jacket/corporate + display_name = "denim jacket, corporate" + path = /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen + +/datum/gear/suit/denim_vest + display_name = "denim vest" + path = /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless + +/datum/gear/suit/denim_vest/corporate + display_name = "denim vest, corporate" + path = /obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless diff --git a/code/modules/client/preference_setup/loadout/loadout_uniform.dm b/code/modules/client/preference_setup/loadout/loadout_uniform.dm index fe8017b6aab..c79d4d31b2e 100644 --- a/code/modules/client/preference_setup/loadout/loadout_uniform.dm +++ b/code/modules/client/preference_setup/loadout/loadout_uniform.dm @@ -284,9 +284,9 @@ path = /obj/item/clothing/under/dress/dress_fire /datum/gear/uniform/uniform_captain - display_name = "uniform, captain's dress" + display_name = "uniform, station administrator's dress" path = /obj/item/clothing/under/dress/dress_cap - allowed_roles = list("Captain") + allowed_roles = list("Station Administrator") /datum/gear/uniform/corpdetsuit display_name = "uniform, corporate (Detective)" @@ -364,4 +364,20 @@ /datum/gear/uniform/whitewedding display_name= "white wedding dress" - path = /obj/item/clothing/under/dress/white \ No newline at end of file + path = /obj/item/clothing/under/dress/white + +/datum/gear/uniform/skirts + display_name = "executive skirt" + path = /obj/item/clothing/under/suit_jacket/female/skirt + +/datum/gear/uniform/dresses + display_name = "sailor dress" + path = /obj/item/clothing/under/dress/sailordress + +/datum/gear/uniform/dresses/eveninggown + display_name = "red evening gown" + path = /obj/item/clothing/under/dress/redeveninggown + +/datum/gear/uniform/dresses/janimaid + display_name = "maid uniform" + path = /obj/item/clothing/under/dress/janimaid \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm index d5cddbc9376..40d1efb7482 100644 --- a/code/modules/client/preference_setup/loadout/loadout_utility.dm +++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm @@ -35,3 +35,8 @@ /datum/gear/utility/paicard display_name = "personal AI device" path = /obj/item/device/paicard + +/datum/gear/utility/securecase + display_name = "secure briefcase" + path =/obj/item/weapon/storage/secure/briefcase + cost = 2 \ No newline at end of file diff --git a/code/modules/client/preference_setup/loadout/loadout_xeno.dm b/code/modules/client/preference_setup/loadout/loadout_xeno.dm index 80e6bb8ebf8..b8ed50c23fa 100644 --- a/code/modules/client/preference_setup/loadout/loadout_xeno.dm +++ b/code/modules/client/preference_setup/loadout/loadout_xeno.dm @@ -121,3 +121,9 @@ display_name = "gear harness (Full Body Prosthetic, Diona)" path = /obj/item/clothing/under/harness sort_category = "Xenowear" + +/datum/gear/uniform/loincloth + display_name = "loincloth (Tajaran, Unathi)" + path = /obj/item/clothing/under/shorts/loincloth + sort_category = "Xenowear" + whitelisted = list("Tajaran", "Unathi") diff --git a/code/modules/client/preference_setup/occupation/occupation.dm b/code/modules/client/preference_setup/occupation/occupation.dm index cfc3ff781a4..ff615d5a089 100644 --- a/code/modules/client/preference_setup/occupation/occupation.dm +++ b/code/modules/client/preference_setup/occupation/occupation.dm @@ -54,7 +54,7 @@ if(alt_title && !(alt_title in job.alt_titles)) pref.player_alt_titles -= job.title -/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 16, list/splitJobs = list("Chief Medical Officer")) +/datum/category_item/player_setup_item/occupation/content(mob/user, limit = 17, list/splitJobs = list("Chief Medical Officer")) if(!job_master) return diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index 40071651c6b..4e9227ee841 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -11,6 +11,7 @@ icon_state = copy.icon_state item_state = copy.item_state body_parts_covered = copy.body_parts_covered + flags_inv = copy.flags_inv item_icons = copy.item_icons.Copy() if(copy.item_state_slots) //Runtime prevention for backpacks @@ -363,7 +364,7 @@ name = "desert eagle" desc = "A hologram projector in the shape of a gun. There is a dial on the side to change the gun's disguise." icon_state = "deagle" - w_class = 3 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) matter = list() diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index b78d78f3ffc..a1c2b930ae5 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -111,7 +111,7 @@ // Ears: headsets, earmuffs and tiny objects /obj/item/clothing/ears name = "ears" - w_class = 1.0 + w_class = ITEMSIZE_TINY throwforce = 2 slot_flags = SLOT_EARS sprite_sheets = list("Teshari" = 'icons/mob/species/seromi/ears.dmi') @@ -157,7 +157,7 @@ /obj/item/clothing/ears/offear name = "Other ear" - w_class = 5.0 + w_class = ITEMSIZE_HUGE icon = 'icons/mob/screen1_Midnight.dmi' icon_state = "block" slot_flags = SLOT_EARS | SLOT_TWOEARS @@ -177,7 +177,7 @@ slot_r_hand_str = 'icons/mob/items/righthand_gloves.dmi', ) gender = PLURAL //Carn: for grammarically correct text-parsing - w_class = 2.0 + w_class = ITEMSIZE_SMALL icon = 'icons/obj/clothing/gloves.dmi' siemens_coefficient = 0.75 var/wired = 0 @@ -237,7 +237,7 @@ ) body_parts_covered = HEAD slot_flags = SLOT_HEAD - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/light_overlay = "helmet_light" var/light_applied @@ -461,12 +461,15 @@ slot_flags = SLOT_OCLOTHING var/blood_overlay_type = "suit" siemens_coefficient = 0.9 - w_class = 3 + w_class = ITEMSIZE_NORMAL sprite_sheets = list( "Teshari" = 'icons/mob/species/seromi/suit.dmi' ) + valid_accessory_slots = list("over", "armband") + restricted_accessory_slots = list("armband") + /obj/item/clothing/suit/update_clothing_icon() if (ismob(src.loc)) var/mob/M = src.loc @@ -485,7 +488,7 @@ permeability_coefficient = 0.90 slot_flags = SLOT_ICLOTHING armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) - w_class = 3 + w_class = ITEMSIZE_NORMAL show_messages = 1 var/has_sensor = 1 //For the crew computer 2 = unable to change mode @@ -505,7 +508,7 @@ //convenience var for defining the icon state for the overlay used when the clothing is worn. //Also used by rolling/unrolling. var/worn_state = null - valid_accessory_slots = list("utility","armband","decor") + valid_accessory_slots = list("utility","armband","decor","over") restricted_accessory_slots = list("utility", "armband") diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm index 151b581f5c1..e6cc1e09833 100644 --- a/code/modules/clothing/ears/ears.dm +++ b/code/modules/clothing/ears/ears.dm @@ -44,7 +44,7 @@ name = "skrell tentacle wear" desc = "Some stuff worn by skrell to adorn their head tentacles." icon = 'icons/obj/clothing/ears.dmi' - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS species_restricted = list("Skrell") diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm index 27fb0e0fa4a..7bbe5a7a714 100644 --- a/code/modules/clothing/glasses/glasses.dm +++ b/code/modules/clothing/glasses/glasses.dm @@ -14,7 +14,7 @@ BLIND // can't see anything /obj/item/clothing/glasses name = "glasses" icon = 'icons/obj/clothing/glasses.dmi' - w_class = 2.0 + w_class = ITEMSIZE_SMALL slot_flags = SLOT_EYES var/vision_flags = 0 var/darkness_view = 0//Base human is 2 @@ -226,7 +226,7 @@ BLIND // can't see anything icon = 'icons/obj/bureaucracy.dmi' icon_state = "tape_cross" item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null) - w_class = 1 + w_class = ITEMSIZE_TINY /obj/item/clothing/glasses/sunglasses/prescription name = "prescription sunglasses" @@ -235,7 +235,7 @@ BLIND // can't see anything /obj/item/clothing/glasses/sunglasses/big desc = "Strangely ancient technology used to help provide rudimentary eye cover. Larger than average enhanced shielding blocks many flashes." icon_state = "bigsunglasses" - + /obj/item/clothing/glasses/fakesunglasses //Sunglasses without flash immunity desc = "A pair of designer sunglasses. Doesn't seem like it'll block flashes." name = "stylish sunglasses" diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm index fa9036e2cd2..7fe17dd7588 100644 --- a/code/modules/clothing/gloves/arm_guards.dm +++ b/code/modules/clothing/gloves/arm_guards.dm @@ -2,9 +2,9 @@ name = "arm guards" desc = "These arm guards will protect your hands and arms." body_parts_covered = HANDS|ARMS - slowdown = 1 + slowdown = 0.5 overgloves = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL /obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) if(..()) //This will only run if no other problems occured when equiping. diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 9d53f8cdb0b..12378997942 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -1,6 +1,6 @@ /obj/item/clothing/gloves/captain desc = "Regal blue gloves, with a nice gold trim. Swanky." - name = "captain's gloves" + name = "station administrator's gloves" icon_state = "captain" item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue") diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 2253fe6d478..fe6432796cd 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -44,7 +44,7 @@ body_parts_covered = 0 /obj/item/clothing/head/collectable/captain - name = "collectable captain's hat" + name = "collectable station administrator's hat" desc = "A Collectable Hat that'll make you look just like a real comdom!" icon_state = "captain" body_parts_covered = 0 diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 4548b41a244..86023f52025 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -10,7 +10,7 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_HEAT_PROTECTION_TEMPERATURE siemens_coefficient = 0.7 - w_class = 3 + w_class = ITEMSIZE_NORMAL ear_protection = 1 /obj/item/clothing/head/helmet/riot diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index e829f6c86f6..ea982569253 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -7,13 +7,13 @@ //Captain /obj/item/clothing/head/caphat - name = "captain's hat" + name = "station administrator's hat" icon_state = "captain" desc = "It's good being the king." body_parts_covered = 0 /obj/item/clothing/head/caphat/cap - name = "captain's cap" + name = "station administrator's cap" desc = "You fear to wear it for the negligence it brings." icon_state = "capcap" diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 3a2ad098ad5..591a77db2bd 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -1,5 +1,5 @@ /obj/item/clothing/head/centhat - name = "\improper CentComm. hat" + name = "\improper CentCom. hat" icon_state = "centcom" desc = "It's good to be emperor." siemens_coefficient = 0.9 @@ -32,6 +32,12 @@ /obj/item/clothing/head/hairflower/orange icon_state = "hairflower_orange" +/obj/item/clothing/head/hairflower/bow + icon_state = "bow" + name = "hair bow" + desc = "A ribbon tied into a bow with a clip on the back to attach to hair." + item_state_slots = list(slot_r_hand_str = "pill", slot_l_hand_str = "pill") + /obj/item/clothing/head/powdered_wig name = "powdered wig" desc = "A powdered wig." @@ -144,6 +150,10 @@ item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective") siemens_coefficient = 0.9 //...what? +/obj/item/clothing/head/flatcap/grey + icon_state = "flat_capg" + item_state_slots = list(slot_r_hand_str = "greysoft", slot_l_hand_str = "greysoft") + /obj/item/clothing/head/pirate name = "pirate hat" desc = "Yarr." @@ -197,6 +207,18 @@ item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective") desc = "A sharp, stylish hat." +/obj/item/clothing/head/fedora/brown + name = "fedora" + desc = "A brown fedora - either the cornerstone of a reporter's style or a poor attempt at looking cool, depending on the person wearing it." + icon_state = "detective" + allowed = list(/obj/item/weapon/reagent_containers/food/snacks/candy_corn, /obj/item/weapon/pen) + +/obj/item/clothing/head/fedora/grey + icon_state = "detective2" + item_state_slots = list(slot_r_hand_str = "detective", slot_l_hand_str = "detective") + desc = "A grey fedora - either the cornerstone of a reporter's style or a poor attempt at looking cool, depending on the person wearing it." + + /obj/item/clothing/head/feathertrilby name = "feather trilby" icon_state = "feather_trilby" @@ -282,3 +304,27 @@ item_state_slots = list(slot_r_hand_str = "beret_white", slot_l_hand_str = "beret_white") body_parts_covered = 0 flags_inv = BLOCKHAIR + +/obj/item/clothing/head/beanie + name = "beanie" + desc = "A head-hugging brimless winter cap. This one is tight." + icon_state = "beanie" + body_parts_covered = 0 + +/obj/item/clothing/head/beanie_loose + name = "loose beanie" + desc = "A head-hugging brimless winter cap. This one is loose." + icon_state = "beanie_hang" + body_parts_covered = 0 + +/obj/item/clothing/head/beretg + name = "beret" + desc = "A beret, an artists favorite headwear." + icon_state = "beret_g" + body_parts_covered = 0 + +/obj/item/clothing/head/sombrero + name = "sombrero" + desc = "A wide-brimmed hat popularly worn in Mexico." + icon_state = "sombrero" + body_parts_covered = 0 diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 1ea5376d6af..0fed75c8226 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -23,7 +23,7 @@ body_parts_covered = HEAD|FACE|EYES action_button_name = "Flip Welding Mask" siemens_coefficient = 0.9 - w_class = 3 + w_class = ITEMSIZE_NORMAL var/base_state /obj/item/clothing/head/welding/attack_self() @@ -122,7 +122,7 @@ body_parts_covered = HEAD|FACE|EYES brightness_on = 2 light_overlay = "helmet_light" - w_class = 3 + w_class = ITEMSIZE_NORMAL /* * Kitty ears diff --git a/code/modules/clothing/masks/boxing.dm b/code/modules/clothing/masks/boxing.dm index 3dabeb99d6f..978a5c13e60 100644 --- a/code/modules/clothing/masks/boxing.dm +++ b/code/modules/clothing/masks/boxing.dm @@ -5,7 +5,7 @@ item_state_slots = list(slot_r_hand_str = "bandblack", slot_l_hand_str = "bandblack") flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = FACE|HEAD - w_class = 2 + w_class = ITEMSIZE_SMALL sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -17,7 +17,7 @@ icon_state = "swatclava" item_state_slots = list(slot_r_hand_str = "bandgreen", slot_l_hand_str = "bandgreen") flags_inv = HIDEFACE|BLOCKHAIR - w_class = 2 + w_class = ITEMSIZE_SMALL sprite_sheets = list( "Tajara" = 'icons/mob/species/tajaran/mask.dmi', "Unathi" = 'icons/mob/species/unathi/mask.dmi', @@ -29,7 +29,7 @@ icon_state = "luchag" flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE - w_class = 2 + w_class = ITEMSIZE_SMALL siemens_coefficient = 3.0 /obj/item/clothing/mask/luchador/tecnicos diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm index 7568d53b741..f03684931d7 100644 --- a/code/modules/clothing/masks/breath.dm +++ b/code/modules/clothing/masks/breath.dm @@ -5,7 +5,7 @@ item_state_slots = list(slot_r_hand_str = "breath", slot_l_hand_str = "breath") item_flags = AIRTIGHT|FLEXIBLEMATERIAL body_parts_covered = FACE - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.10 permeability_coefficient = 0.50 var/hanging = 0 diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index ad7c9928d24..e675611390d 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -5,7 +5,7 @@ item_flags = BLOCK_GAS_SMOKE_EFFECT | AIRTIGHT flags_inv = HIDEEARS|HIDEEYES|HIDEFACE body_parts_covered = FACE|EYES - w_class = 3.0 + w_class = ITEMSIZE_NORMAL item_state_slots = list(slot_r_hand_str = "gas_alt", slot_l_hand_str = "gas_alt") gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index fe0cfdebaa4..3e8c9de3705 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -3,7 +3,7 @@ desc = "To stop that awful noise." icon_state = "muzzle" body_parts_covered = FACE - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.90 voicechange = 1 @@ -13,7 +13,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "tape_cross" item_state_slots = list(slot_r_hand_str = null, slot_l_hand_str = null) - w_class = 1 + w_class = ITEMSIZE_TINY /obj/item/clothing/mask/muzzle/New() ..() @@ -31,7 +31,7 @@ desc = "A sterile mask designed to help prevent the spread of diseases." icon_state = "sterile" item_state_slots = list(slot_r_hand_str = "sterile", slot_l_hand_str = "sterile") - w_class = 2 + w_class = ITEMSIZE_SMALL body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL gas_transfer_coefficient = 0.90 @@ -85,7 +85,7 @@ icon_state = "blueneckscarf" body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/redscarf @@ -94,7 +94,7 @@ icon_state = "redwhite_scarf" body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/greenscarf @@ -103,7 +103,7 @@ icon_state = "green_scarf" body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.90 /obj/item/clothing/mask/ninjascarf @@ -112,7 +112,7 @@ icon_state = "ninja_scarf" body_parts_covered = FACE item_flags = FLEXIBLEMATERIAL - w_class = 2 + w_class = ITEMSIZE_SMALL gas_transfer_coefficient = 0.90 siemens_coefficient = 0 @@ -121,7 +121,7 @@ desc = "A rubber pig mask." icon_state = "pig" flags_inv = HIDEFACE|BLOCKHAIR - w_class = 2 + w_class = ITEMSIZE_SMALL siemens_coefficient = 0.9 body_parts_covered = HEAD|FACE|EYES @@ -131,7 +131,7 @@ icon_state = "horsehead" flags_inv = HIDEFACE|BLOCKHAIR body_parts_covered = HEAD|FACE|EYES - w_class = 2 + w_class = ITEMSIZE_SMALL siemens_coefficient = 0.9 /obj/item/clothing/mask/horsehead/New() @@ -174,7 +174,7 @@ /obj/item/clothing/mask/bandana name = "black bandana" desc = "A fine black bandana with nanotech lining." - w_class = 1 + w_class = ITEMSIZE_TINY flags_inv = HIDEFACE slot_flags = SLOT_MASK icon_state = "bandblack" diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm index 9d0651d5ba8..9b0c94ca039 100644 --- a/code/modules/clothing/masks/monitor.dm +++ b/code/modules/clothing/masks/monitor.dm @@ -3,7 +3,6 @@ name = "display monitor" desc = "A rather clunky old CRT-style display screen, fit for mounting on an optical output." - flags_inv = HIDEFACE|HIDEEYES body_parts_covered = FACE dir = SOUTH diff --git a/code/modules/clothing/shoes/colour.dm b/code/modules/clothing/shoes/colour.dm index 43bcce5e51b..2dea9bd124c 100644 --- a/code/modules/clothing/shoes/colour.dm +++ b/code/modules/clothing/shoes/colour.dm @@ -61,6 +61,10 @@ icon_state = "flatswhite" item_state_slots = list(slot_r_hand_str = "white", slot_l_hand_str = "white") +/obj/item/clothing/shoes/flats/white/color + name = "flats" + desc = "Sleek flats." + /obj/item/clothing/shoes/flats/red name = "red flats" desc = "Ruby red flats." diff --git a/code/modules/clothing/shoes/jobs.dm b/code/modules/clothing/shoes/jobs.dm index 63d4dc192af..00dc994cad8 100644 --- a/code/modules/clothing/shoes/jobs.dm +++ b/code/modules/clothing/shoes/jobs.dm @@ -29,4 +29,11 @@ icon_state = "workboots" armor = list(melee = 40, bullet = 0, laser = 0, energy = 15, bomb = 20, bio = 0, rad = 20) siemens_coefficient = 0.7 - can_hold_knife = 1 \ No newline at end of file + can_hold_knife = 1 + +/obj/item/clothing/shoes/workboots/toeless + name = "toe-less workboots" + desc = "A pair of toeless work boots designed for use in industrial settings. Modified for species whose toes have claws." + icon_state = "workbootstoeless" + item_state_slots = list(slot_r_hand_str = "workboots", slot_l_hand_str = "workboots") + species_restricted = null \ No newline at end of file diff --git a/code/modules/clothing/shoes/leg_guards.dm b/code/modules/clothing/shoes/leg_guards.dm index b063e2b50ac..786ded8a626 100644 --- a/code/modules/clothing/shoes/leg_guards.dm +++ b/code/modules/clothing/shoes/leg_guards.dm @@ -2,9 +2,9 @@ name = "leg guards" desc = "These will protect your legs and feet." body_parts_covered = LEGS|FEET - slowdown = 0 //Shoes have a slowdown of -1, so this needs to be 0 in order for it to effectively be 1 slowdown. + slowdown = SHOES_SLOWDOWN+0.5 species_restricted = null //Unathi and Taj can wear leg armor now - w_class = 3 + w_class = ITEMSIZE_NORMAL /obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = 0) if(..()) //This will only run if no other problems occured when equiping. diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index f6423106a5f..a8109493c72 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -168,7 +168,7 @@ icon_state = "slippers" force = 0 species_restricted = null - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/clothing/shoes/slippers_worn name = "worn bunny slippers" @@ -176,7 +176,7 @@ icon_state = "slippers_worn" item_state_slots = list(slot_r_hand_str = "slippers", slot_l_hand_str = "slippers") force = 0 - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/clothing/shoes/laceup name = "laceup shoes" @@ -199,4 +199,21 @@ cold_protection = FEET|LEGS min_cold_protection_temperature = SHOE_MIN_COLD_PROTECTION_TEMPERATURE heat_protection = FEET|LEGS - max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE + +/obj/item/clothing/shoes/flipflop + name = "flip flops" + desc = "A pair of foam flip flops. For those not afraid to show a little ankle." + icon_state = "thongsandal" + +/obj/item/clothing/shoes/athletic + name = "athletic shoes" + desc = "A pair of sleek atheletic shoes. Made by and for the sporty types." + icon_state = "sportshoe" + item_state_slots = list(slot_r_hand_str = "sportheld", slot_l_hand_str = "sportheld") + +/obj/item/clothing/shoes/skater + name = "skater shoes" + desc = "A pair of wide shoes with thick soles. Designed for skating." + icon_state = "skatershoe" + item_state_slots = list(slot_r_hand_str = "skaterheld", slot_l_hand_str = "skaterheld") diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index c8d73b0f3e1..262611db0d5 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -10,10 +10,10 @@ //Captain's space suit This is not the proper path but I don't currently know enough about how this all works to mess with it. /obj/item/clothing/suit/armor/captain - name = "Captain's armor" + name = "Station Administrator's armor" desc = "A bulky, heavy-duty piece of exclusive corporate armor. YOU are in charge!" icon_state = "caparmor" - w_class = 5 + w_class = ITEMSIZE_HUGE gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE @@ -80,7 +80,7 @@ name = "pirate coat" desc = "Yarr." icon_state = "pirate" - w_class = 3 + w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 0 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) diff --git a/code/modules/clothing/spacesuits/rig/modules/ninja.dm b/code/modules/clothing/spacesuits/rig/modules/ninja.dm index cb269daa2e1..2ef9810c58b 100644 --- a/code/modules/clothing/spacesuits/rig/modules/ninja.dm +++ b/code/modules/clothing/spacesuits/rig/modules/ninja.dm @@ -168,20 +168,30 @@ /obj/item/rig_module/self_destruct name = "self-destruct module" - desc = "Oh my God, Captain. A bomb." + desc = "Oh my God, Station Administrator. A bomb." icon_state = "deadman" usable = 1 active = 1 permanent = 1 + var/datum/effect/effect/system/smoke_spread/bad/smoke + var/smoke_strength = 8 engage_string = "Detonate" interface_name = "dead man's switch" - interface_desc = "An integrated self-destruct module. When the wearer dies, so does the surrounding area. Do not press this button." - var/list/explosion_values = list(1,2,4,5) + interface_desc = "An integrated self-destruct module. When the wearer dies, they vanish in smoke. Do not press this button." + +/obj/item/rig_module/self_destruct/New() + ..() + src.smoke = PoolOrNew(/datum/effect/effect/system/smoke_spread/bad) + src.smoke.attach(src) + +/obj/item/rig_module/self_destruct/Destroy() + qdel(smoke) + smoke = null + return ..() + -/obj/item/rig_module/self_destruct/small - explosion_values = list(0,0,3,4) /obj/item/rig_module/self_destruct/activate() return @@ -202,8 +212,8 @@ /obj/item/rig_module/self_destruct/engage(var/skip_check) if(!skip_check && usr && alert(usr, "Are you sure you want to push that button?", "Self-destruct", "No", "Yes") == "No") return - explosion(get_turf(src), explosion_values[1], explosion_values[2], explosion_values[3], explosion_values[4]) if(holder && holder.wearer) - holder.wearer.drop_from_inventory(src) - qdel(holder) - qdel(src) + smoke.set_up(10, 0, holder.loc) + for(var/i = 1 to smoke_strength) + smoke.start(272727) + holder.wearer.ash() diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm index a8a65a9873a..0bd14ef9d16 100644 --- a/code/modules/clothing/spacesuits/rig/rig.dm +++ b/code/modules/clothing/spacesuits/rig/rig.dm @@ -14,7 +14,8 @@ slot_flags = SLOT_BACK req_one_access = list() req_access = list() - w_class = 5 + w_class = ITEMSIZE_HUGE + action_button_name = "Toggle Heatsink" // These values are passed on to all component pieces. armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 20) @@ -54,6 +55,12 @@ var/image/mob_icon // Holder for on-mob icon. var/list/installed_modules = list() // Power consumption/use bookkeeping. + // Cooling system vars. + var/cooling_on = 0 //is it turned on? + var/max_cooling = 15 // in degrees per second - probably don't need to mess with heat capacity here + var/charge_consumption = 2 // charge per second at max_cooling //more effective on a rig, because it's all built in already + var/thermostat = T20C + // Rig status vars. var/open = 0 // Access panel status. var/locked = 1 // Lock status. @@ -94,6 +101,7 @@ usr << "The access panel is [locked? "locked" : "unlocked"]." usr << "The maintenance panel is [open ? "open" : "closed"]." usr << "Hardsuit systems are [offline ? "offline" : "online"]." + usr << "The cooling stystem is [cooling_on ? "active" : "inactive"]." if(open) usr << "It's equipped with [english_list(installed_modules)]." @@ -302,8 +310,97 @@ piece.item_flags |= (STOPPRESSUREDAMAGE|AIRTIGHT) update_icon(1) -/obj/item/weapon/rig/process() +/obj/item/weapon/rig/ui_action_click() + toggle_cooling(usr) +/obj/item/weapon/rig/proc/toggle_cooling(var/mob/user) + if(cooling_on) + turn_cooling_off(user) + else + turn_cooling_on(user) + +/obj/item/weapon/rig/proc/turn_cooling_on(var/mob/user) + if(!cell) + return + if(cell.charge <= 0) + user << "\The [src] has no power!." + return + if(!suit_is_deployed()) + user << "The hardsuit needs to be deployed first!." + return + + cooling_on = 1 + usr << "You switch \the [src]'s cooling system on." + + +/obj/item/weapon/rig/proc/turn_cooling_off(var/mob/user, var/failed) + if(failed) visible_message("\The [src]'s cooling system clicks and whines as it powers down.") + else usr << "You switch \the [src]'s cooling system off." + cooling_on = 0 + +/obj/item/weapon/rig/proc/get_environment_temperature() + if (ishuman(loc)) + var/mob/living/carbon/human/H = loc + if(istype(H.loc, /obj/mecha)) + var/obj/mecha/M = H.loc + return M.return_temperature() + else if(istype(H.loc, /obj/machinery/atmospherics/unary/cryo_cell)) + var/obj/machinery/atmospherics/unary/cryo_cell/cryo = H.loc + return cryo.air_contents.temperature + + var/turf/T = get_turf(src) + if(istype(T, /turf/space)) + return 0 //space has no temperature, this just makes sure the cooling unit works in space + + var/datum/gas_mixture/environment = T.return_air() + if (!environment) + return 0 + + return environment.temperature + +/obj/item/weapon/rig/proc/attached_to_back(mob/M) + if (!ishuman(M)) + return 0 + + var/mob/living/carbon/human/H = M + + if (!H.wear_suit || H.back != src) + return 0 + + return 1 + +/obj/item/weapon/rig/proc/coolingProcess() + if (!cooling_on || !cell) + return + + if (!ismob(loc)) + return + + if (!attached_to_back(loc)) //make sure the rig's not just in their hands + return + + if (!suit_is_deployed()) //inbuilt systems only work on the suit they're designed to work on + return + + var/mob/living/carbon/human/H = loc + + var/efficiency = 1 - H.get_pressure_weakness() //you need to have a good seal for effective cooling + var/env_temp = get_environment_temperature() //wont save you from a fire + var/temp_adj = min(H.bodytemperature - max(thermostat, env_temp), max_cooling) + + if (temp_adj < 0.5) //only cools, doesn't heat, also we don't need extreme precision + return + + var/charge_usage = (temp_adj/max_cooling)*charge_consumption + + H.bodytemperature -= temp_adj*efficiency + + cell.use(charge_usage) + + if(cell.charge <= 0) + turn_cooling_off(H, 1) + +/obj/item/weapon/rig/process() // If we've lost any parts, grab them back. var/mob/living/M for(var/obj/item/piece in list(gloves,boots,helmet,chest)) @@ -312,6 +409,8 @@ M = piece.loc M.unEquip(piece) piece.forceMove(src) + // Run through cooling + coolingProcess() if(!istype(wearer) || loc != wearer || wearer.back != src || canremove || !cell || cell.charge <= 0) if(!cell || cell.charge <= 0) diff --git a/code/modules/clothing/spacesuits/rig/suits/station.dm b/code/modules/clothing/spacesuits/rig/suits/station.dm index 10994ea57b3..914afe8d975 100644 --- a/code/modules/clothing/spacesuits/rig/suits/station.dm +++ b/code/modules/clothing/spacesuits/rig/suits/station.dm @@ -61,7 +61,7 @@ desc = "A heavy, powerful rig used by construction crews and mining corporations." icon_state = "engineering_rig" armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 100, rad = 50) - slowdown = 3 + slowdown = 1 offline_slowdown = 10 offline_vision_restriction = 2 emp_protection = -20 @@ -124,15 +124,16 @@ offline_vision_restriction = 0 helm_type = /obj/item/clothing/head/helmet/space/rig/ce + glove_type = /obj/item/clothing/gloves/gauntlets/rig/ce allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) - req_access = list() req_one_access = list() - boot_type = null - glove_type = null +/obj/item/clothing/gloves/gauntlets/rig/ce + name = "insulated gauntlets" + siemens_coefficient = 0 /obj/item/weapon/rig/ce/equipped @@ -146,14 +147,6 @@ /obj/item/rig_module/vision/meson ) - chest_type = /obj/item/clothing/suit/space/rig/ce - boot_type = null - glove_type = null - -/obj/item/clothing/suit/space/rig/ce - heat_protection = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS - /obj/item/weapon/rig/hazmat name = "AMI control module" diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm index f06e839ae3a..b66ff5334aa 100644 --- a/code/modules/clothing/spacesuits/spacesuits.dm +++ b/code/modules/clothing/spacesuits/spacesuits.dm @@ -46,7 +46,7 @@ name = "Space suit" desc = "A suit that protects against low pressure environments. \""+station_short+"\" is written in large block letters on the back." icon_state = "space" - w_class = 5 // So you can't fit this in your bag and be prepared at all times. + w_class = ITEMSIZE_HUGE // So you can't fit this in your bag and be prepared at all times. gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 item_flags = STOPPRESSUREDAMAGE | THICKMATERIAL @@ -63,7 +63,7 @@ var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit. /obj/item/clothing/suit/space/equipped(mob/M) - check_limb_support() + check_limb_support(M) ..() /obj/item/clothing/suit/space/dropped(var/mob/user) @@ -77,14 +77,24 @@ /obj/item/clothing/suit/space/proc/check_limb_support(var/mob/living/carbon/human/user) // If this isn't set, then we don't need to care. - if(!supporting_limbs || !supporting_limbs.len) + if(!istype(user) || isnull(supporting_limbs)) return - if(!istype(user) || user.wear_suit == src) - return + if(user.wear_suit == src) + for(var/obj/item/organ/external/E in user.bad_external_organs) + if(E.is_broken() && E.apply_splint(src)) + user << "You feel [src] constrict about your [E.name], supporting it." + supporting_limbs |= E + else + // Otherwise, remove the splints. + for(var/obj/item/organ/external/E in supporting_limbs) + if(E.splinted == src && E.remove_splint(src)) + user << "\The [src] stops supporting your [E.name]." + supporting_limbs.Cut() - // Otherwise, remove the splints. - for(var/obj/item/organ/external/E in supporting_limbs) - E.status &= ~ ORGAN_SPLINTED - user << "The suit stops supporting your [E.name]." - supporting_limbs = list() +/obj/item/clothing/suit/space/proc/handle_fracture(var/mob/living/carbon/human/user, var/obj/item/organ/external/E) + if(!istype(user) || isnull(supporting_limbs)) + return + if(E.is_broken() && E.apply_splint(src)) + user << "You feel [src] constrict about your [E.name], supporting it." + supporting_limbs |= E diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 20ee7ddc04d..7c8cfdaba2e 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -10,7 +10,7 @@ name = "red space suit" icon_state = "syndicate" desc = "A crimson spacesuit sporting clean lines and durable plating. Robust, reliable, and slightly suspicious." - w_class = 3 + w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1 armor = list(melee = 60, bullet = 50, laser = 30,energy = 15, bomb = 30, bio = 30, rad = 30) @@ -37,7 +37,7 @@ name = "dark green space suit" desc = "A dark green spacesuit sporting clean lines and durable plating. Robust, reliable, and slightly suspicious." icon_state = "syndicate-green-dark" - + //Orange syndicate space suit /obj/item/clothing/head/helmet/space/syndicate/orange name = "orange space helmet" @@ -119,7 +119,7 @@ name = "black and red space helmet" desc = "A black helmet sporting a single red stripe and durable plating. Engineered to look menacing." icon_state = "syndicate-helm-black-red" - + /obj/item/clothing/suit/space/syndicate/black/red name = "black and red space suit" desc = "A black spacesuit sporting red stripes and durable plating. Robust, reliable, and slightly suspicious." diff --git a/code/modules/clothing/spacesuits/void/merc.dm b/code/modules/clothing/spacesuits/void/merc.dm index 9e1e3513cc1..06d376f26a0 100644 --- a/code/modules/clothing/spacesuits/void/merc.dm +++ b/code/modules/clothing/spacesuits/void/merc.dm @@ -16,7 +16,7 @@ desc = "An advanced suit that protects against injuries during special operations. Property of Gorlex Marauders." item_state_slots = list(slot_r_hand_str = "syndie_voidsuit", slot_l_hand_str = "syndie_voidsuit") slowdown = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL armor = list(melee = 60, bullet = 50, laser = 30, energy = 15, bomb = 35, bio = 100, rad = 60) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/melee/energy/sword,/obj/item/weapon/handcuffs) siemens_coefficient = 0.6 diff --git a/code/modules/clothing/spacesuits/void/station.dm b/code/modules/clothing/spacesuits/void/station.dm index dde178e33db..fd03c3cbe42 100644 --- a/code/modules/clothing/spacesuits/void/station.dm +++ b/code/modules/clothing/spacesuits/void/station.dm @@ -5,7 +5,17 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "rig0-engineering" item_state_slots = list(slot_r_hand_str = "eng_helm", slot_l_hand_str = "eng_helm") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80) + +/obj/item/clothing/head/helmet/space/void/engineering/hazmat + name = "HAZMAT voidsuit helmet" + icon_state = "rig0-engineering_rad" + item_state_slots = list(slot_r_hand_str = "eng_helm_rad", slot_l_hand_str = "eng_helm_rad") + +/obj/item/clothing/head/helmet/space/void/engineering/construction + name = "construction voidsuit helmet" + icon_state = "rig0-engineering_con" + item_state_slots = list(slot_r_hand_str = "eng_helm_con", slot_l_hand_str = "eng_helm_con") /obj/item/clothing/suit/space/void/engineering name = "engineering voidsuit" @@ -13,16 +23,26 @@ icon_state = "rig-engineering" item_state_slots = list(slot_r_hand_str = "eng_voidsuit", slot_l_hand_str = "eng_voidsuit") slowdown = 1 - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 80) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 80) allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/bag/ore,/obj/item/device/t_scanner,/obj/item/weapon/pickaxe, /obj/item/weapon/rcd) +/obj/item/clothing/suit/space/void/engineering/hazmat + name = "HAZMAT voidsuit" + icon_state = "rig-engineering_rad" + item_state_slots = list(slot_r_hand_str = "eng_voidsuit_rad", slot_l_hand_str = "eng_voidsuit_rad") + +/obj/item/clothing/suit/space/void/engineering/construction + name = "contstruction voidsuit" + icon_state = "rig-engineering_con" + item_state_slots = list(slot_r_hand_str = "eng_voidsuit_con", slot_l_hand_str = "eng_voidsuit_con") + //Mining /obj/item/clothing/head/helmet/space/void/mining name = "mining voidsuit helmet" desc = "A special helmet designed for work in a hazardous, low pressure environment. Has reinforced plating." icon_state = "rig0-mining" item_state_slots = list(slot_r_hand_str = "mining_helm", slot_l_hand_str = "mining_helm") - armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) + armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20) light_overlay = "helmet_light_dual" /obj/item/clothing/suit/space/void/mining @@ -30,7 +50,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has reinforced plating." icon_state = "rig-mining" item_state_slots = list(slot_r_hand_str = "mining_voidsuit", slot_l_hand_str = "mining_voidsuit") - armor = list(melee = 50, bullet = 5, laser = 20,energy = 5, bomb = 55, bio = 100, rad = 20) + armor = list(melee = 50, bullet = 5, laser = 20, energy = 5, bomb = 55, bio = 100, rad = 20) //Medical /obj/item/clothing/head/helmet/space/void/medical @@ -38,7 +58,12 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has minor radiation shielding." icon_state = "rig0-medical" item_state_slots = list(slot_r_hand_str = "medical_helm", slot_l_hand_str = "medical_helm") - armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50) + +/obj/item/clothing/head/helmet/space/void/medical/bio + name = "biohazard voidsuit helmet" + icon_state = "rig0-medical_bio" + item_state_slots = list(slot_r_hand_str = "medical_helm_bio", slot_l_hand_str = "medical_helm_bio") /obj/item/clothing/suit/space/void/medical name = "medical voidsuit" @@ -46,7 +71,12 @@ icon_state = "rig-medical" item_state_slots = list(slot_r_hand_str = "medical_voidsuit", slot_l_hand_str = "medical_voidsuit") allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/storage/firstaid,/obj/item/device/healthanalyzer,/obj/item/stack/medical) - armor = list(melee = 30, bullet = 5, laser = 20,energy = 5, bomb = 25, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 5, laser = 20, energy = 5, bomb = 25, bio = 100, rad = 50) + +/obj/item/clothing/suit/space/void/medical/bio + name = "biohazard voidsuit" + icon_state = "rig-medical_bio" + item_state_slots = list(slot_r_hand_str = "medical_voidsuit_bio", slot_l_hand_str = "medical_voidsuit_bio") //Security /obj/item/clothing/head/helmet/space/void/security @@ -54,7 +84,7 @@ desc = "A special helmet designed for work in a hazardous, low pressure environment. Has an additional layer of armor." icon_state = "rig0-sec" item_state_slots = list(slot_r_hand_str = "sec_helm", slot_l_hand_str = "sec_helm") - armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) siemens_coefficient = 0.7 light_overlay = "helmet_light_dual" @@ -63,7 +93,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has an additional layer of armor." icon_state = "rig-sec" item_state_slots = list(slot_r_hand_str = "sec_voidsuit", slot_l_hand_str = "sec_voidsuit") - armor = list(melee = 60, bullet = 10, laser = 30, energy = 5, bomb = 45, bio = 100, rad = 10) + armor = list(melee = 50, bullet = 25, laser = 25, energy = 5, bomb = 45, bio = 100, rad = 10) allowed = list(/obj/item/weapon/gun,/obj/item/device/flashlight,/obj/item/weapon/tank,/obj/item/device/suit_cooling_unit,/obj/item/weapon/melee/baton) siemens_coefficient = 0.7 @@ -73,7 +103,7 @@ name = "atmospherics voidsuit helmet" icon_state = "rig0-atmos" item_state_slots = list(slot_r_hand_str = "atmos_helm", slot_l_hand_str = "atmos_helm") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50) max_heat_protection_temperature = FIRE_HELMET_MAX_HEAT_PROTECTION_TEMPERATURE light_overlay = "helmet_light_dual" @@ -82,5 +112,5 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has improved thermal protection and minor radiation shielding." icon_state = "rig-atmos" item_state_slots = list(slot_r_hand_str = "atmos_voidsuit", slot_l_hand_str = "atmos_voidsuit") - armor = list(melee = 40, bullet = 5, laser = 20,energy = 5, bomb = 35, bio = 100, rad = 50) + armor = list(melee = 40, bullet = 5, laser = 20, energy = 5, bomb = 35, bio = 100, rad = 50) max_heat_protection_temperature = FIRESUIT_MAX_HEAT_PROTECTION_TEMPERATURE \ No newline at end of file diff --git a/code/modules/clothing/spacesuits/void/wizard.dm b/code/modules/clothing/spacesuits/void/wizard.dm index 4c2318355f6..d39f553aea4 100644 --- a/code/modules/clothing/spacesuits/void/wizard.dm +++ b/code/modules/clothing/spacesuits/void/wizard.dm @@ -17,7 +17,7 @@ desc = "A bizarre gem-encrusted suit that radiates magical energies." item_state_slots = list(slot_r_hand_str = "wiz_voidsuit", slot_l_hand_str = "wiz_voidsuit") slowdown = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL unacidable = 1 armor = list(melee = 40, bullet = 20, laser = 20,energy = 20, bomb = 35, bio = 100, rad = 60) siemens_coefficient = 0.7 diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 3476ea183a0..839bb041c19 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -44,7 +44,6 @@ desc = "A vest with heavy padding to protect against melee attacks." icon_state = "riot" item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat") - slowdown = 1 armor = list(melee = 80, bullet = 10, laser = 10, energy = 10, bomb = 0, bio = 0, rad = 0) flags_inv = HIDEJUMPSUIT siemens_coefficient = 0.5 @@ -125,7 +124,7 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS allowed = list(/obj/item/weapon/gun,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) slowdown = 1 - w_class = 5 + w_class = ITEMSIZE_HUGE armor = list(melee = 80, bullet = 60, laser = 50,energy = 25, bomb = 50, bio = 100, rad = 100) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = UPPER_TORSO | LOWER_TORSO | LEGS | FEET | ARMS | HANDS @@ -323,6 +322,12 @@ icon_badge = "detectivevest_badge" icon_nobadge = "detectivevest_nobadge" +/obj/item/clothing/suit/storage/vest/press + name = "press vest" + desc = "A simple kevlar plate carrier. This one has the word 'Press' embroidered on patches on the back and front." + item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor") + allowed = list(/obj/item/device/flashlight,/obj/item/device/taperecorder,/obj/item/weapon/pen,/obj/item/device/camera_film,/obj/item/device/camera) + /obj/item/clothing/suit/storage/vest/heavy name = "heavy armor vest" desc = "A heavy kevlar plate carrier with webbing attached." @@ -379,7 +384,7 @@ desc = "A suit that protects against some damage." icon_state = "centcom" item_state_slots = list(slot_r_hand_str = "armor", slot_l_hand_str = "armor") - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/weapon/gun/energy,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/tank/emergency_oxygen) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT @@ -393,7 +398,7 @@ icon_state = "heavy" item_state_slots = list(slot_r_hand_str = "swat", slot_l_hand_str = "swat") armor = list(melee = 60, bullet = 60, laser = 60, energy = 40, bomb = 40, bio = 0, rad = 0) - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.90 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS slowdown = 3 diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 227414b0e4e..51b05d15266 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -13,7 +13,7 @@ name = "bio suit" desc = "A suit that protects against biological contamination." icon_state = "bio" - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index cb3f20749bf..0260142abbe 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -14,15 +14,15 @@ //Captain /obj/item/clothing/suit/captunic - name = "captain's parade tunic" - desc = "Worn by a Captain to show their class." + name = "station administrator's parade tunic" + desc = "Worn by a Station Administrator to show their class." icon_state = "captunic" body_parts_covered = UPPER_TORSO|ARMS flags_inv = HIDEJUMPSUIT /obj/item/clothing/suit/captunic/capjacket - name = "captain's uniform jacket" - desc = "A less formal jacket for everyday captain use." + name = "station administrator's uniform jacket" + desc = "A less formal jacket for everyday Station Administrator use." icon_state = "capjacket" body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 51ec3c6edd9..6d3eecde3c0 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -90,6 +90,7 @@ icon_state = "vest" item_state_slots = list(slot_r_hand_str = "wcoat", slot_l_hand_str = "wcoat") blood_overlay_type = "armor" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/suit/wcoat/red @@ -127,7 +128,7 @@ name = "red space suit replica" icon_state = "syndicate" desc = "A plastic replica of the syndicate space suit, you'll look just like a real murderous syndicate agent in this! This is a toy, it is not made for use in space!" - w_class = 3 + w_class = ITEMSIZE_NORMAL allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|HANDS|LEGS|FEET @@ -203,6 +204,7 @@ name = "leather coat" desc = "A long, thick black leather coat." icon_state = "leathercoat_alt" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") /obj/item/clothing/suit/leathercoat/sec @@ -215,12 +217,14 @@ name = "brown leather coat" desc = "A long, brown leather coat." icon_state = "browncoat" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") /obj/item/clothing/suit/neocoat name = "black coat" desc = "A flowing, black coat." icon_state = "neocoat" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") /obj/item/clothing/suit/customs @@ -229,6 +233,24 @@ icon_state = "customs_jacket" item_state_slots = list(slot_r_hand_str = "suit_blue", slot_l_hand_str = "suit_blue") +/obj/item/clothing/suit/storage/greyjacket + name = "grey jacket" + desc = "A fancy twead grey jacket." + icon_state = "gentlecoat" + item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") + +/obj/item/clothing/suit/storage/trench + name = "brown trenchcoat" + desc = "A rugged canvas trenchcoat, designed and created by TX Fabrication Corp. The coat appears to have its kevlar lining removed." + icon_state = "detective" + blood_overlay_type = "coat" + allowed = list(/obj/item/weapon/tank/emergency_oxygen, /obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_magazine,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/flame/lighter,/obj/item/device/taperecorder,/obj/item/device/uv_light) + +/obj/item/clothing/suit/storage/trench/grey + name = "grey trenchcoat" + icon_state = "detective2" + item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") + /* * stripper */ @@ -255,59 +277,6 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT siemens_coefficient = 2.0 -/* - * Poncho - */ -/obj/item/clothing/suit/poncho - name = "poncho" - desc = "A simple, comfortable poncho." - icon_state = "classicponcho" - -/obj/item/clothing/suit/poncho/green - name = "green poncho" - desc = "A simple, comfortable cloak without sleeves. This one is green." - icon_state = "greenponcho" - -/obj/item/clothing/suit/poncho/red - name = "red poncho" - desc = "A simple, comfortable cloak without sleeves. This one is red." - icon_state = "redponcho" - -/obj/item/clothing/suit/poncho/purple - name = "purple poncho" - desc = "A simple, comfortable cloak without sleeves. This one is purple." - icon_state = "purpleponcho" - -/obj/item/clothing/suit/poncho/blue - name = "blue poncho" - desc = "A simple, comfortable cloak without sleeves. This one is blue." - icon_state = "blueponcho" - -/obj/item/clothing/suit/poncho/roles/security - name = "security poncho" - desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors." - icon_state = "secponcho" - -/obj/item/clothing/suit/poncho/roles/medical - name = "medical poncho" - desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors." - icon_state = "medponcho" - -/obj/item/clothing/suit/poncho/roles/engineering - name = "engineering poncho" - desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors." - icon_state = "engiponcho" - -/obj/item/clothing/suit/poncho/roles/science - name = "science poncho" - desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors." - icon_state = "sciponcho" - -/obj/item/clothing/suit/poncho/roles/cargo - name = "cargo poncho" - desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo." - icon_state = "cargoponcho" - /obj/item/clothing/suit/jacket/puffer name = "puffer jacket" desc = "A thick jacket with a rubbery, water-resistant shell." @@ -345,6 +314,7 @@ item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") icon_open = "bomber_open" icon_closed = "bomber" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS cold_protection = UPPER_TORSO|ARMS min_cold_protection_temperature = T0C - 20 @@ -360,19 +330,44 @@ min_cold_protection_temperature = T0C - 20 siemens_coefficient = 0.7 -/obj/item/clothing/suit/storage/leather_jacket +/obj/item/clothing/suit/storage/toggle/leather_jacket name = "leather jacket" desc = "A black leather coat." icon_state = "leather_jacket" + icon_open = "leather_jacket_open" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight, /obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS -/obj/item/clothing/suit/storage/leather_jacket/alt - icon_state = "leather_jacket_alt" +/obj/item/clothing/suit/storage/toggle/leather_jacket/sleeveless + name = "leather vest" + desc = "A black leather vest." + icon_state = "leather_jacket_sleeveless" + icon_open = "leather_jacket_sleeveless_open" + icon_closed = "leather_jacket_sleeveless" + body_parts_covered = UPPER_TORSO item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") -/obj/item/clothing/suit/storage/leather_jacket/nanotrasen +/obj/item/clothing/suit/storage/leather_jacket_alt + name = "leather vest" + desc = "A black leather vest." + icon_state = "leather_jacket_alt" + item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen desc = "A black leather coat. A corporate logo is proudly displayed on the back." icon_state = "leather_jacket_nt" + icon_closed = "leather_jacket_nt" + icon_open = "leather_jacket_nt_open" + item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") + +/obj/item/clothing/suit/storage/toggle/leather_jacket/nanotrasen/sleeveless + name = "leather vest" + desc = "A black leather vest. A corporate logo is proudly displayed on the back." + icon_state = "leather_jacket_nt_sleeveless" + icon_open = "leather_jacket_nt_sleeveless_open" + icon_closed = "leather_jacket_nt_sleeveless" + body_parts_covered = UPPER_TORSO item_state_slots = list(slot_r_hand_str = "leather_jacket", slot_l_hand_str = "leather_jacket") //This one has buttons for some reason @@ -383,8 +378,18 @@ item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") icon_open = "brown_jacket_open" icon_closed = "brown_jacket" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) body_parts_covered = UPPER_TORSO|ARMS +/obj/item/clothing/suit/storage/toggle/brown_jacket/sleeveless + name = "brown vest" + desc = "A brown leather vest." + icon_state = "brown_jacket_sleeveless" + icon_open = "brown_jacket_sleeveless_open" + icon_closed = "brown_jacket_sleeveless" + body_parts_covered = UPPER_TORSO + item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") + /obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen desc = "A brown leather coat. A corporate logo is proudly displayed on the back." icon_state = "brown_jacket_nt" @@ -392,6 +397,50 @@ icon_open = "brown_jacket_nt_open" icon_closed = "brown_jacket_nt" +/obj/item/clothing/suit/storage/toggle/brown_jacket/nanotrasen/sleeveless + name = "brown vest" + desc = "A brown leather vest. A corporate logo is proudly displayed on the back." + icon_state = "brown_jacket_nt_sleeveless" + icon_open = "brown_jacket_nt_open" + icon_closed = "brown_jacket_nt_sleeveless" + body_parts_covered = UPPER_TORSO + item_state_slots = list(slot_r_hand_str = "brown_jacket", slot_l_hand_str = "brown_jacket") + +/obj/item/clothing/suit/storage/toggle/denim_jacket + name = "denim jacket" + desc = "A denim coat." + icon_state = "denim_jacket" + item_state_slots = list(slot_r_hand_str = "denim_jacket", slot_l_hand_str = "denim_jacket") + icon_open = "denim_jacket_open" + icon_closed = "denim_jacket" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) + body_parts_covered = UPPER_TORSO|ARMS + +/obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless + name = "denim vest" + desc = "A denim vest." + icon_state = "denim_jacket_sleeveless" + icon_open = "denim_jacket_sleeveless_open" + icon_closed = "denim_jacket_sleeveless" + body_parts_covered = UPPER_TORSO + item_state_slots = list(slot_r_hand_str = "denim_jacket", slot_l_hand_str = "denim_jacket") + +/obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen + desc = "A denim coat. A corporate logo is proudly displayed on the back." + icon_state = "denim_jacket_nt" + item_state_slots = list(slot_r_hand_str = "denim_jacket", slot_l_hand_str = "denim_jacket") + icon_open = "denim_jacket_nt_open" + icon_closed = "denim_jacket_nt" + +/obj/item/clothing/suit/storage/toggle/denim_jacket/nanotrasen/sleeveless + name = "denim vest" + desc = "A denim vest. A corporate logo is proudly displayed on the back." + icon_state = "denim_jacket_nt_sleeveless" + icon_open = "denim_jacket_nt_open" + icon_closed = "denim_jacket_nt_sleeveless" + body_parts_covered = UPPER_TORSO + item_state_slots = list(slot_r_hand_str = "denim_jacket", slot_l_hand_str = "denim_jacket") + /obj/item/clothing/suit/storage/toggle/hoodie name = "grey hoodie" desc = "A warm, grey sweatshirt." @@ -544,6 +593,7 @@ hooded = 1 action_button_name = "Toggle Winter Hood" hoodtype = /obj/item/clothing/head/winterhood + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) /obj/item/clothing/head/winterhood name = "winter hood" @@ -555,7 +605,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE /obj/item/clothing/suit/storage/hooded/wintercoat/captain - name = "captain's winter coat" + name = "station administrator's winter coat" icon_state = "coatcaptain" item_state_slots = list(slot_r_hand_str = "coatcaptain", slot_l_hand_str = "coatcaptain") armor = list(melee = 20, bullet = 15, laser = 20, energy = 10, bomb = 15, bio = 0, rad = 0) @@ -609,6 +659,7 @@ name = "black varsity jacket" desc = "A favorite of jocks everywhere from Sol to Nyx." icon_state = "varsity" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) item_state_slots = list(slot_r_hand_str = "suit_black", slot_l_hand_str = "suit_black") /obj/item/clothing/suit/varsity/red @@ -641,6 +692,7 @@ item_state_slots = list(slot_r_hand_str = "black_labcoat", slot_l_hand_str = "black_labcoat") icon_open = "trackjacket_open" icon_closed = "trackjacket" + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) /obj/item/clothing/suit/storage/toggle/track/blue name = "blue track jacket" @@ -677,6 +729,7 @@ desc = "A comfy, grey flannel shirt. Unleash your inner hipster." icon_state = "flannel" item_state_slots = list(slot_r_hand_str = "black_labcoat", slot_l_hand_str = "black_labcoat") + allowed = list (/obj/item/weapon/pen, /obj/item/weapon/paper, /obj/item/device/flashlight,/obj/item/weapon/tank/emergency_oxygen, /obj/item/weapon/storage/fancy/cigarettes, /obj/item/weapon/storage/box/matches, /obj/item/weapon/reagent_containers/food/drinks/flask) var/rolled = 0 var/tucked = 0 var/buttoned = 0 diff --git a/code/modules/clothing/suits/storage.dm b/code/modules/clothing/suits/storage.dm index 25348451738..13d91661f54 100644 --- a/code/modules/clothing/suits/storage.dm +++ b/code/modules/clothing/suits/storage.dm @@ -4,8 +4,8 @@ /obj/item/clothing/suit/storage/New() ..() pockets = new/obj/item/weapon/storage/internal(src) - pockets.max_w_class = 2 //fit only pocket sized items - pockets.max_storage_space = 4 + pockets.max_w_class = ITEMSIZE_SMALL //fit only pocket sized items + pockets.max_storage_space = ITEMSIZE_COST_SMALL * 2 /obj/item/clothing/suit/storage/Destroy() qdel(pockets) @@ -76,8 +76,8 @@ /obj/item/clothing/suit/storage/vest/heavy/New() ..() pockets = new/obj/item/weapon/storage/internal(src) - pockets.max_w_class = 2 - pockets.max_storage_space = 8 + pockets.max_w_class = ITEMSIZE_SMALL + pockets.max_storage_space = ITEMSIZE_COST_SMALL * 4 /obj/item/clothing/suit/storage/vest var/icon_badge diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index e732a1318ef..8bf36d0044f 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -13,7 +13,7 @@ name = "firesuit" desc = "A suit that protects against fire and heat." icon_state = "fire" - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -33,7 +33,7 @@ desc = "A suit that protects against extreme fire and heat." //icon_state = "thermal" item_state_slots = list(slot_r_hand_str = "black_suit", slot_l_hand_str = "black_suit") - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item slowdown = 1.5 /* @@ -52,7 +52,7 @@ name = "bomb suit" desc = "A suit designed for safety when handling explosives." icon_state = "bombsuit" - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 slowdown = 2 @@ -78,7 +78,6 @@ name = "Radiation Hood" icon_state = "rad" desc = "A hood with radiation protective properties. Label: Made with lead, do not eat insulation" - flags_inv = BLOCKHAIR body_parts_covered = HEAD|FACE|EYES armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) @@ -86,7 +85,7 @@ name = "Radiation suit" desc = "A suit that protects against radiation. Label: Made with lead, do not eat insulation." icon_state = "rad" - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.90 permeability_coefficient = 0.50 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|ARMS|HANDS|FEET diff --git a/code/modules/clothing/under/accessories/accessory.dm b/code/modules/clothing/under/accessories/accessory.dm index 1d6c610cea8..a38f51f1fab 100644 --- a/code/modules/clothing/under/accessories/accessory.dm +++ b/code/modules/clothing/under/accessories/accessory.dm @@ -5,7 +5,7 @@ icon_state = "bluetie" item_state_slots = list(slot_r_hand_str = "", slot_l_hand_str = "") slot_flags = SLOT_TIE - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/slot = "decor" var/obj/item/clothing/has_suit = null //the suit the tie may be attached to var/image/inv_overlay = null //overlay used when attached to clothing. diff --git a/code/modules/clothing/under/accessories/armband.dm b/code/modules/clothing/under/accessories/armband.dm index 9aa2ec2b709..9a8bbacd463 100644 --- a/code/modules/clothing/under/accessories/armband.dm +++ b/code/modules/clothing/under/accessories/armband.dm @@ -29,6 +29,10 @@ desc = "An armband, worn by the crew to display which department they're assigned to. This one is white." icon_state = "med" +/obj/item/clothing/accessory/armband/med/color + name = "armband" + desc = "A fancy armband." + /obj/item/clothing/accessory/armband/medgreen name = "EMT armband" desc = "An armband, worn by the crew to display which department they're assigned to. This one is white and green." diff --git a/code/modules/clothing/under/accessories/clothing.dm b/code/modules/clothing/under/accessories/clothing.dm index 59b2ba17975..cfd1c1d49a2 100644 --- a/code/modules/clothing/under/accessories/clothing.dm +++ b/code/modules/clothing/under/accessories/clothing.dm @@ -26,4 +26,107 @@ /obj/item/clothing/accessory/checkered_jacket name = "checkered suit jacket" desc = "Lucky suit jacket." - icon_state = "checkered_jacket" \ No newline at end of file + icon_state = "checkered_jacket" + + +/obj/item/clothing/accessory/chaps + name = "brown chaps" + desc = "A pair of loose, brown leather chaps." + icon_state = "chaps" + +/obj/item/clothing/accessory/chaps/black + name = "black chaps" + desc = "A pair of loose, black leather chaps." + icon_state = "chaps_black" + +/* + * Poncho + */ +/obj/item/clothing/accessory/poncho + name = "poncho" + desc = "A simple, comfortable poncho." + icon_state = "classicponcho" + item_state = "classicponcho" + icon_override = 'icons/mob/ties.dmi' + var/fire_resist = T0C+100 + allowed = list(/obj/item/weapon/tank/emergency_oxygen) + armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 0) + slot_flags = SLOT_OCLOTHING | SLOT_TIE + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS|LEGS + siemens_coefficient = 0.9 + w_class = ITEMSIZE_NORMAL + slot = "over" + + sprite_sheets = list( + "Teshari" = 'icons/mob/species/seromi/suit.dmi' + ) + +/obj/item/clothing/accessory/poncho/green + name = "green poncho" + desc = "A simple, comfortable cloak without sleeves. This one is green." + icon_state = "greenponcho" + item_state = "greenponcho" + +/obj/item/clothing/accessory/poncho/red + name = "red poncho" + desc = "A simple, comfortable cloak without sleeves. This one is red." + icon_state = "redponcho" + item_state = "redponcho" + +/obj/item/clothing/accessory/poncho/purple + name = "purple poncho" + desc = "A simple, comfortable cloak without sleeves. This one is purple." + icon_state = "purpleponcho" + item_state = "purpleponcho" + +/obj/item/clothing/accessory/poncho/blue + name = "blue poncho" + desc = "A simple, comfortable cloak without sleeves. This one is blue." + icon_state = "blueponcho" + item_state = "blueponcho" + +/obj/item/clothing/accessory/poncho/roles/security + name = "security poncho" + desc = "A simple, comfortable cloak without sleeves. This one is black and red, standard NanoTrasen Security colors." + icon_state = "secponcho" + item_state = "secponcho" + +/obj/item/clothing/accessory/poncho/roles/medical + name = "medical poncho" + desc = "A simple, comfortable cloak without sleeves. This one is white with green and blue tint, standard Medical colors." + icon_state = "medponcho" + item_state = "medponcho" + +/obj/item/clothing/accessory/poncho/roles/engineering + name = "engineering poncho" + desc = "A simple, comfortable cloak without sleeves. This one is yellow and orange, standard Engineering colors." + icon_state = "engiponcho" + item_state = "engiponcho" + +/obj/item/clothing/accessory/poncho/roles/science + name = "science poncho" + desc = "A simple, comfortable cloak without sleeves. This one is white with purple trim, standard NanoTrasen Science colors." + icon_state = "sciponcho" + item_state = "sciponcho" + +/obj/item/clothing/accessory/poncho/roles/cargo + name = "cargo poncho" + desc = "A simple, comfortable cloak without sleeves. This one is tan and grey, the colors of Cargo." + icon_state = "cargoponcho" + item_state = "cargoponcho" + +/obj/item/clothing/accessory/hawaii + name = "flower-pattern shirt" + desc = "You probably need some welder googles to look at this." + icon_state = "hawaii" + +/obj/item/clothing/accessory/hawaii/red + icon_state = "hawaii2" + +/obj/item/clothing/accessory/hawaii/random + name = "flower-pattern shirt" + +/obj/item/clothing/accessory/hawaii/random/New() + if(prob(50)) + icon_state = "hawaii2" + color = color_rotation(rand(-11,12)*15) diff --git a/code/modules/clothing/under/accessories/lockets.dm b/code/modules/clothing/under/accessories/lockets.dm index 43fb4956699..6c06a48dbfd 100644 --- a/code/modules/clothing/under/accessories/lockets.dm +++ b/code/modules/clothing/under/accessories/lockets.dm @@ -3,7 +3,7 @@ desc = "This oval shaped, argentium sterling silver locket hangs on an incredibly fine, refractive string, almost thin as hair and microweaved from links to a deceptive strength, of similar material. The edges are engraved very delicately with an elegant curving design, but overall the main is unmarked and smooth to the touch, leaving room for either remaining as a stolid piece or future alterations. There is an obvious internal place for a picture or lock of some sort, but even behind that is a very thin compartment unhinged with the pinch of a thumb and forefinger." icon_state = "locket" slot_flags = 0 - w_class = 2 + w_class = ITEMSIZE_SMALL slot_flags = SLOT_MASK | SLOT_TIE var/base_icon var/open diff --git a/code/modules/clothing/under/accessories/storage.dm b/code/modules/clothing/under/accessories/storage.dm index b3461b82c23..4cc9c03dd01 100644 --- a/code/modules/clothing/under/accessories/storage.dm +++ b/code/modules/clothing/under/accessories/storage.dm @@ -7,13 +7,13 @@ var/slots = 3 var/obj/item/weapon/storage/internal/hold - w_class = 3.0 + w_class = ITEMSIZE_NORMAL /obj/item/clothing/accessory/storage/New() ..() hold = new/obj/item/weapon/storage/internal(src) hold.max_storage_space = slots * 2 - hold.max_w_class = 2 + hold.max_w_class = ITEMSIZE_SMALL /obj/item/clothing/accessory/storage/attack_hand(mob/user as mob) if (has_suit) //if we are part of a suit @@ -97,7 +97,7 @@ /obj/item/clothing/accessory/storage/knifeharness/New() ..() - hold.max_storage_space = 4 + hold.max_storage_space = ITEMSIZE_COST_SMALL * 2 hold.can_hold = list(/obj/item/weapon/material/hatchet/unathiknife,\ /obj/item/weapon/material/kitchen/utensil/knife,\ /obj/item/weapon/material/kitchen/utensil/knife/plastic,\ diff --git a/code/modules/clothing/under/jobs/civilian.dm b/code/modules/clothing/under/jobs/civilian.dm index 6e922f57440..0f175ad0e99 100644 --- a/code/modules/clothing/under/jobs/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian.dm @@ -7,8 +7,8 @@ rolled_sleeves = 0 /obj/item/clothing/under/rank/captain //Alright, technically not a 'civilian' but its better then giving a .dm file for a single define. - desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Captain\"." - name = "captain's jumpsuit" + desc = "It's a blue jumpsuit with some gold markings denoting the rank of \"Station Administrator\"." + name = "station administrator's jumpsuit" icon_state = "captain" rolled_sleeves = 0 diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index dc4085dddee..b57cb41cf12 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -102,7 +102,7 @@ name = "\improper NASA jumpsuit" desc = "It has a NASA logo on it and is made of space-proofed materials." icon_state = "black" - w_class = 4//bulky item + w_class = ITEMSIZE_LARGE//bulky item gas_transfer_coefficient = 0.01 permeability_coefficient = 0.02 body_parts_covered = UPPER_TORSO|LOWER_TORSO|LEGS|FEET|ARMS|HANDS @@ -153,7 +153,7 @@ rolled_sleeves = 0 /obj/item/clothing/under/gimmick/rank/captain/suit - name = "captain's suit" + name = "station administrator's suit" desc = "A green suit and yellow necktie. Exemplifies authority." icon_state = "green_suit" item_state_slots = list(slot_r_hand_str = "centcom", slot_l_hand_str = "centcom") @@ -182,6 +182,13 @@ icon_state = "black_suit_fem" item_state_slots = list(slot_r_hand_str = "lawyer_black", slot_l_hand_str = "lawyer_black") +/obj/item/clothing/under/suit_jacket/female/skirt + name = "executive skirt" + desc = "A formal suit skirt for women, intended for the station's finest." + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + icon_state = "black_suit_fem" + item_state = "black_formal_skirt" + /obj/item/clothing/under/suit_jacket/red name = "red suit" desc = "A red suit and blue tie. Somewhat formal." @@ -225,6 +232,7 @@ desc = "Includes shoes and plaid" icon_state = "kilt" body_parts_covered = UPPER_TORSO|LOWER_TORSO|FEET + rolled_sleeves = 0 /obj/item/clothing/under/sexymime name = "sexy mime outfit" @@ -315,8 +323,8 @@ item_state_slots = list(slot_r_hand_str = "dress_white", slot_l_hand_str = "dress_white") /obj/item/clothing/under/dress/dress_cap - name = "captain's dress uniform" - desc = "Feminine fashion for the style concious captain." + name = "station administrator's dress uniform" + desc = "Feminine fashion for the style concious Station Administrator." icon_state = "dress_cap" body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS @@ -382,8 +390,8 @@ body_parts_covered = UPPER_TORSO|LOWER_TORSO /obj/item/clothing/under/captainformal - name = "captain's formal uniform" - desc = "A captain's formal-wear, for special occasions." + name = "station administrator's formal uniform" + desc = "A Station Administrator's formal-wear, for special occasions." icon_state = "captain_formal" item_state_slots = list(slot_r_hand_str = "lawyer_blue", slot_l_hand_str = "lawyer_blue") diff --git a/code/modules/clothing/under/pants.dm b/code/modules/clothing/under/pants.dm index 3cfc550e437..3d35b489d6a 100644 --- a/code/modules/clothing/under/pants.dm +++ b/code/modules/clothing/under/pants.dm @@ -6,26 +6,51 @@ gender = PLURAL body_parts_covered = LOWER_TORSO|LEGS +/obj/item/clothing/under/pants/ripped + name = "ripped jeans" + desc = "A nondescript pair of tough blue jeans with holes in them." + icon_state = "jeansripped" + /obj/item/clothing/under/pants/classicjeans name = "classic jeans" desc = "You feel cooler already." icon_state = "jeansclassic" +/obj/item/clothing/under/pants/classicjeans/ripped + name = "ripped classic jeans" + desc = "You feel cooler already. These have holes in them." + icon_state = "jeansclassicripped" + /obj/item/clothing/under/pants/mustangjeans name = "must hang jeans" desc = "Made in the finest space jeans factory this side of Alpha Centauri." icon_state = "jeansmustang" +/obj/item/clothing/under/pants/mustangjeans/ripped + name = "ripped must hang jeans" + desc = "Made in the finest space jeans factory this side of Alpha Centauri. These have holes in them." + icon_state = "jeansmustangripped" + /obj/item/clothing/under/pants/blackjeans name = "black jeans" desc = "Only for those who can pull it off." icon_state = "jeansblack" +/obj/item/clothing/under/pants/blackjeans/ripped + name = "ripped black jeans" + desc = "Only for those who can pull it off. These have holes in them." + icon_state = "jeansblackripped" + /obj/item/clothing/under/pants/greyjeans name = "grey jeans" desc = "Only for those who can pull it off." icon_state = "jeansgrey" +/obj/item/clothing/under/pants/greyjeans/ripped + name = "ripped grey jeans" + desc = "Only for those who can pull it off. These have holes in them." + icon_state = "jeansgreyripped" + /obj/item/clothing/under/pants/youngfolksjeans name = "young folks jeans" desc = "For those tired of boring old jeans. Relive the passion of your youth!" @@ -82,6 +107,16 @@ desc = "A pair of woodland camouflage pants. Probably not the best choice for a space station." icon_state = "camopants" +/obj/item/clothing/under/pants/chaps + name = "sexy brown chaps" + desc = "A pair of sexy, tight brown leather chaps." + icon_state = "chapsb" + +/obj/item/clothing/under/pants/chaps/black + name = "sexy black chaps" + desc = "A pair of sexy, tight black leather chaps." + icon_state = "chapsbl" + /* * Baggy Pants */ diff --git a/code/modules/clothing/under/shorts.dm b/code/modules/clothing/under/shorts.dm index 0690b49565e..0db35dd08c5 100644 --- a/code/modules/clothing/under/shorts.dm +++ b/code/modules/clothing/under/shorts.dm @@ -25,6 +25,10 @@ name = "grey athletic shorts" icon_state = "greyshorts" +/obj/item/clothing/under/shorts/white + name = "white shorts" + icon_state = "whiteshorts" + /obj/item/clothing/under/shorts/jeans name = "jeans shorts" desc = "Some jeans! Just in short form!" @@ -83,13 +87,18 @@ name = "khaki short shorts" icon_state = "khaki_shorts_f" +/obj/item/clothing/under/shorts/loincloth + name = "loincloth" + desc = "A piece of cloth wrapped around the waist." + icon_state = "loincloth" + //Argh, skirts be below this line -> ------------------------------ /obj/item/clothing/under/skirt - name = "black skirt" - desc = "A black skirt, very fancy!" - icon_state = "blackskirt" - body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + name = "short black skirt" + desc = "A skirt that is a shiny black." + icon_state = "skirt_short_black" + body_parts_covered = LOWER_TORSO rolled_sleeves = -1 /obj/item/clothing/under/skirt/khaki @@ -97,11 +106,6 @@ desc = "A skirt that is a khaki color." icon_state = "skirt_khaki" -/obj/item/clothing/under/skirt/black - name = "short black skirt" - desc = "A skirt that is a shiny black." - icon_state = "skirt_short_black" - /obj/item/clothing/under/skirt/blue name = "short blue skirt" desc = "A skirt that is a shiny blue." @@ -117,61 +121,67 @@ desc = "A skirt that is swept to one side." icon_state = "skirt_swept" -/obj/item/clothing/under/skirt/plaid_blue +/obj/item/clothing/under/skirt/outfit + name = "black skirt" + desc = "A black skirt, very fancy!" + icon_state = "blackskirt" + body_parts_covered = UPPER_TORSO|LOWER_TORSO|ARMS + +/obj/item/clothing/under/skirt/outfit/plaid_blue name = "blue plaid skirt" desc = "A preppy blue skirt with a white blouse." icon_state = "plaid_blue" item_state_slots = list(slot_r_hand_str = "blue", slot_l_hand_str = "blue") -/obj/item/clothing/under/skirt/plaid_red +/obj/item/clothing/under/skirt/outfit/plaid_red name = "red plaid skirt" desc = "A preppy red skirt with a white blouse." icon_state = "plaid_red" item_state_slots = list(slot_r_hand_str = "red", slot_l_hand_str = "red") - -/obj/item/clothing/under/skirt/plaid_purple + +/obj/item/clothing/under/skirt/outfit/plaid_purple name = "blue purple skirt" desc = "A preppy purple skirt with a white blouse." icon_state = "plaid_purple" item_state_slots = list(slot_r_hand_str = "purple", slot_l_hand_str = "purple") - + /obj/item/clothing/under/rank/cargo/skirt name = "quartermaster's jumpskirt" desc = "It's a jumpskirt worn by the quartermaster. It's specially designed to prevent back injuries caused by pushing paper." icon_state = "qmf" item_state_slots = list(slot_r_hand_str = "qm", slot_l_hand_str = "qm") - + /obj/item/clothing/under/rank/cargotech/skirt name = "cargo technician's jumpskirt" desc = "Skirrrrrts! They're comfy and easy to wear!" icon_state = "cargof" item_state_slots = list(slot_r_hand_str = "cargo", slot_l_hand_str = "cargo") - + /obj/item/clothing/under/rank/engineer/skirt desc = "It's an orange high visibility jumpskirt worn by engineers. It has minor radiation shielding." name = "engineer's jumpskirt" icon_state = "enginef" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) item_state_slots = list(slot_r_hand_str = "engine", slot_l_hand_str = "engine") - + /obj/item/clothing/under/rank/chief_engineer/skirt desc = "It's a high visibility jumpskirt given to those engineers insane enough to achieve the rank of \"Chief engineer\". It has minor radiation shielding." name = "chief engineer's jumpskirt" icon_state = "chieff" item_state_slots = list(slot_r_hand_str = "chiefengineer", slot_l_hand_str = "chiefengineer") - + /obj/item/clothing/under/rank/atmospheric_technician/skirt desc = "It's a jumpskirt worn by atmospheric technicians." name = "atmospheric technician's jumpskirt" icon_state = "atmosf" item_state_slots = list(slot_r_hand_str = "atmos", slot_l_hand_str = "atmos") - + /obj/item/clothing/under/rank/roboticist/skirt desc = "It's a slimming black jumpskirt with reinforced seams; great for industrial work." name = "roboticist's jumpskirt" icon_state = "roboticsf" item_state_slots = list(slot_r_hand_str = "robotics", slot_l_hand_str = "robotics") - + /obj/item/clothing/under/rank/scientist/skirt name = "scientist's jumpskirt" icon_state = "sciencef" diff --git a/code/modules/detectivework/forensics.dm b/code/modules/detectivework/forensics.dm index 27e2231d243..7bb68feb348 100644 --- a/code/modules/detectivework/forensics.dm +++ b/code/modules/detectivework/forensics.dm @@ -1,6 +1,6 @@ /obj/item/weapon/forensics icon = 'icons/obj/forensics.dmi' - w_class = 1 + w_class = ITEMSIZE_TINY //This is the output of the stringpercent(print) proc, and means about 80% of //the print must be there for it to be complete. (Prints are 32 digits) diff --git a/code/modules/detectivework/microscope/dnascanner.dm b/code/modules/detectivework/microscope/dnascanner.dm index 9fc49b1bf7c..3d442dfb4ab 100644 --- a/code/modules/detectivework/microscope/dnascanner.dm +++ b/code/modules/detectivework/microscope/dnascanner.dm @@ -17,7 +17,6 @@ var/report_num = 0 /obj/machinery/dnaforensics/New() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/console_screen(src) component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) diff --git a/code/modules/detectivework/tools/evidencebag.dm b/code/modules/detectivework/tools/evidencebag.dm index 9e2c4903005..806d7ad34ac 100644 --- a/code/modules/detectivework/tools/evidencebag.dm +++ b/code/modules/detectivework/tools/evidencebag.dm @@ -6,7 +6,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "evidenceobj" item_state = null - w_class = 2 + w_class = ITEMSIZE_SMALL var/obj/item/stored_item = null /obj/item/weapon/evidencebag/MouseDrop(var/obj/item/I as obj) diff --git a/code/modules/detectivework/tools/rag.dm b/code/modules/detectivework/tools/rag.dm index b16c03f0ef4..57af12525dd 100644 --- a/code/modules/detectivework/tools/rag.dm +++ b/code/modules/detectivework/tools/rag.dm @@ -16,7 +16,7 @@ /obj/item/weapon/reagent_containers/glass/rag name = "rag" desc = "For cleaning up messes, you suppose." - w_class = 1 + w_class = ITEMSIZE_TINY icon = 'icons/obj/toy.dmi' icon_state = "rag" amount_per_transfer_from_this = 5 diff --git a/code/modules/detectivework/tools/sample_kits.dm b/code/modules/detectivework/tools/sample_kits.dm index fa5c7312a8f..33931e87f90 100644 --- a/code/modules/detectivework/tools/sample_kits.dm +++ b/code/modules/detectivework/tools/sample_kits.dm @@ -1,7 +1,7 @@ /obj/item/weapon/sample name = "forensic sample" icon = 'icons/obj/forensics.dmi' - w_class = 1 + w_class = ITEMSIZE_TINY var/list/evidence = list() /obj/item/weapon/sample/New(var/newloc, var/atom/supplied) @@ -125,7 +125,7 @@ name = "fiber collection kit" desc = "A magnifying glass and tweezers. Used to lift suit fibers." icon_state = "m_glass" - w_class = 2 + w_class = ITEMSIZE_SMALL var/evidence_type = "fiber" var/evidence_path = /obj/item/weapon/sample/fibers diff --git a/code/modules/detectivework/tools/uvlight.dm b/code/modules/detectivework/tools/uvlight.dm index 40b8e873266..6997e3a04a1 100644 --- a/code/modules/detectivework/tools/uvlight.dm +++ b/code/modules/detectivework/tools/uvlight.dm @@ -3,7 +3,7 @@ desc = "A small handheld black light." icon_state = "uv_off" slot_flags = SLOT_BELT - w_class = 2 + w_class = ITEMSIZE_SMALL item_state = "electronic" action_button_name = "Toggle UV light" matter = list(DEFAULT_WALL_MATERIAL = 150) diff --git a/code/modules/economy/ATM.dm b/code/modules/economy/ATM.dm index 37a93f2c2ef..688f562f9a8 100644 --- a/code/modules/economy/ATM.dm +++ b/code/modules/economy/ATM.dm @@ -80,24 +80,7 @@ log transactions return 1 /obj/machinery/atm/attackby(obj/item/I as obj, mob/user as mob) - if(istype(I, /obj/item/weapon/screwdriver) && circuit) - user << "You start disconnecting the monitor." - playsound(src.loc, 'sound/items/Screwdriver.ogg', 50, 1) - if(do_after(user, 20)) - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "atm" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - user << "You disconnect the monitor." - A.state = 4 - A.icon_state = "atm_4" - M.deconstruct(src) - qdel(src) + if(computer_deconstruction_screwdriver(user, I)) return if(istype(I, /obj/item/weapon/card)) if(emagged > 0) diff --git a/code/modules/economy/TradeDestinations.dm b/code/modules/economy/TradeDestinations.dm index ccedfe35efb..8ae548e2ff4 100644 --- a/code/modules/economy/TradeDestinations.dm +++ b/code/modules/economy/TradeDestinations.dm @@ -18,7 +18,7 @@ var/list/weighted_mundaneevent_locations = list() //distance is measured in AU and co-relates to travel time /datum/trade_destination/centcomm - name = "CentComm" + name = "CentCom" description = "NanoTrasen's administrative centre for Tau Ceti." distance = 1.2 willing_to_buy = list() diff --git a/code/modules/economy/cash.dm b/code/modules/economy/cash.dm index 1229cee322f..5d5790758a0 100644 --- a/code/modules/economy/cash.dm +++ b/code/modules/economy/cash.dm @@ -11,7 +11,7 @@ throwforce = 1.0 throw_speed = 1 throw_range = 2 - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/access = list() access = access_crate_cash var/worth = 0 diff --git a/code/modules/economy/retail_scanner.dm b/code/modules/economy/retail_scanner.dm index 4ddf058de23..7117172af87 100644 --- a/code/modules/economy/retail_scanner.dm +++ b/code/modules/economy/retail_scanner.dm @@ -6,7 +6,7 @@ flags = NOBLUDGEON|CONDUCT slot_flags = SLOT_BELT req_access = list(access_heads) - w_class = 2.0 + w_class = ITEMSIZE_SMALL origin_tech = list(TECH_MATERIAL = 1) var/locked = 1 diff --git a/code/modules/error_handler/_defines.dm b/code/modules/error_handler/_defines.dm new file mode 100644 index 00000000000..0c98f4a9b9f --- /dev/null +++ b/code/modules/error_handler/_defines.dm @@ -0,0 +1,9 @@ +// Settings for the error handler and error viewer + +#define ERROR_COOLDOWN 600 // The "cooldown" time for each occurrence of a unique error +#define ERROR_LIMIT 9 // How many occurrences before the next will silence them +#define ERROR_MAX_COOLDOWN (ERROR_COOLDOWN * ERROR_LIMIT) +#define ERROR_SILENCE_TIME 6000 // How long a unique error will be silenced for + +// How long to wait between messaging admins about occurrences of a unique error +#define ERROR_MSG_DELAY 50 diff --git a/code/modules/error_handler/error_handler.dm b/code/modules/error_handler/error_handler.dm new file mode 100644 index 00000000000..de71bfc1cab --- /dev/null +++ b/code/modules/error_handler/error_handler.dm @@ -0,0 +1,118 @@ +var/list/error_last_seen = list() +// error_cooldown items will either be positive (cooldown time) or negative (silenced error) +// If negative, starts at -1, and goes down by 1 each time that error gets skipped +var/list/error_cooldown = list() +var/total_runtimes = 0 +var/total_runtimes_skipped = 0 +// The ifdef needs to be down here, since the error viewer references total_runtimes +#ifdef DEBUG +/world/Error(var/exception/e, var/datum/e_src) + if(!istype(e)) // Something threw an unusual exception + log_to_dd("\[[time_stamp()]] Uncaught exception: [e]") + return ..() + if(!error_last_seen) // A runtime is occurring too early in start-up initialization + return ..() + total_runtimes++ + + var/erroruid = "[e.file][e.line]" + var/last_seen = error_last_seen[erroruid] + var/cooldown = error_cooldown[erroruid] || 0 + if(last_seen == null) // A new error! + error_last_seen[erroruid] = world.time + last_seen = world.time + if(cooldown < 0) + error_cooldown[erroruid]-- // Used to keep track of skip count for this error + total_runtimes_skipped++ + return // Error is currently silenced, skip handling it + + // Handle cooldowns and silencing spammy errors + var/silencing = 0 + // Each occurrence of a unique error adds to its "cooldown" time... + cooldown = max(0, cooldown - (world.time - last_seen)) + ERROR_COOLDOWN + // ... which is used to silence an error if it occurs too often, too fast + if(cooldown > ERROR_MAX_COOLDOWN) + cooldown = -1 + silencing = 1 + spawn(0) + usr = null + sleep(ERROR_SILENCE_TIME) + var/skipcount = abs(error_cooldown[erroruid]) - 1 + error_cooldown[erroruid] = 0 + if(skipcount > 0) + log_to_dd("\[[time_stamp()]] Skipped [skipcount] runtimes in [e.file],[e.line].") + error_cache.logError(e, skipCount = skipcount) + error_last_seen[erroruid] = world.time + error_cooldown[erroruid] = cooldown + + // The detailed error info needs some tweaking to make it look nice + var/list/srcinfo = null + var/list/usrinfo = null + var/locinfo + // First, try to make better src/usr info lines + if(istype(e_src)) + srcinfo = list(" src: [log_info_line(e_src)]") + locinfo = log_info_line(e_src) + if(locinfo) + srcinfo += " src.loc: [locinfo]" + if(istype(usr)) + usrinfo = list(" usr: [log_info_line(usr)]") + locinfo = log_info_line(usr) + if(locinfo) + usrinfo += " usr.loc: [locinfo]" + // The proceeding mess will almost definitely break if error messages are ever changed + // I apologize in advance + var/list/splitlines = splittext(e.desc, "\n") + var/list/desclines = list() + if(splitlines.len > 2) // If there aren't at least three lines, there's no info + for(var/line in splitlines) + if(length(line) < 3) + continue // Blank line, skip it + if(findtext(line, "source file:")) + continue // Redundant, skip it + if(findtext(line, "usr.loc:")) + continue // Our usr.loc is better, skip it + if(findtext(line, "usr:")) + if(usrinfo) + desclines.Add(usrinfo) + usrinfo = null + continue // Our usr info is better, replace it + if(srcinfo) + if(findtext(line, "src.loc:")) + continue + if(findtext(line, "src:")) + desclines.Add(srcinfo) + srcinfo = null + continue + if(copytext(line, 1, 3) != " ") + desclines += (" " + line) // Pad any unpadded lines, so they look pretty + else + desclines += line + if(srcinfo) // If these aren't null, they haven't been added yet + desclines.Add(srcinfo) + if(usrinfo) + desclines.Add(usrinfo) + if(silencing) + desclines += " (This error will now be silenced for [ERROR_SILENCE_TIME / 600] minutes)" + + // Now to actually output the error info... + log_to_dd("\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]") + for(var/line in desclines) + log_to_dd(line) + if(error_cache) + error_cache.logError(e, desclines, e_src = e_src) + +#endif + +/proc/log_runtime(exception/e, datum/e_src, extra_info) + if(!istype(e)) + world.Error(e, e_src) + return + + if(extra_info) + // Adding extra info adds two newlines, because parsing runtimes is funky + if(islist(extra_info)) + e.desc = " [jointext(extra_info, "\n ")]\n\n" + e.desc + else + e.desc = " [extra_info]\n\n" + e.desc + + world.Error(e, e_src) diff --git a/code/modules/error_handler/error_viewer.dm b/code/modules/error_handler/error_viewer.dm new file mode 100644 index 00000000000..0f1fd0ba960 --- /dev/null +++ b/code/modules/error_handler/error_viewer.dm @@ -0,0 +1,206 @@ +// Error viewing datums, responsible for storing error info, notifying admins +// when errors occur, and showing them to admins on demand. + +// There are 3 different types used here: +// +// - ErrorCache keeps track of all error sources, as well as all individually +// logged errors. Only one instance of this datum should ever exist, and it's +// right here: + +#ifdef DEBUG +var/global/datum/ErrorViewer/ErrorCache/error_cache = new() +#else +// If debugging is disabled, there's nothing useful to log, so don't bother. +var/global/datum/ErrorViewer/ErrorCache/error_cache = null +#endif + +// - ErrorSource datums exist for each line (of code) that generates an error, +// and keep track of all errors generated by that line. +// +// - ErrorEntry datums exist for each logged error, and keep track of all +// relevant info about that error. + +// Common vars and procs are kept at the ErrorViewer level +/datum/ErrorViewer/ + var/name = "" + +/datum/ErrorViewer/proc/browseTo(var/user, var/html) + if(user) + var/datum/browser/popup = new(user, "error_viewer", "Runtime Viewer", 700, 500) + popup.add_head_content({""}) + popup.set_content(html) + popup.open(0) + +/datum/ErrorViewer/proc/buildHeader(var/datum/ErrorViewer/back_to, var/linear, var/refreshable) + // Common starter HTML for showTo + var/html = "" + + if(istype(back_to)) + html += "[back_to.makeLink("<<<", null, linear)] " + if(refreshable) + html += "[makeLink("Refresh", null, linear)]" + if(html) + html += "

    " + return html + +/datum/ErrorViewer/proc/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + // Specific to each child type + return + +/datum/ErrorViewer/proc/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear) + var/back_to_param = "" + if(!linktext) + linktext = name + if(istype(back_to)) + back_to_param = ";viewruntime_backto=\ref[back_to]" + if(linear) + back_to_param += ";viewruntime_linear=1" + return "[html_encode(linktext)]" + +/datum/ErrorViewer/Topic(href, href_list) + if(..()) + return 1 + if(href_list["viewruntime_backto"]) + showTo(usr, locate(href_list["viewruntime_backto"]), href_list["viewruntime_linear"]) + else + showTo(usr, null, href_list["viewruntime_linear"]) + +/datum/ErrorViewer/ErrorCache + var/list/errors = list() + var/list/error_sources = list() + var/list/errors_silenced = list() + +/datum/ErrorViewer/ErrorCache/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + var/html = buildHeader(null, linear, refreshable=1) + html += "[total_runtimes] runtimes, [total_runtimes_skipped] skipped

    " + if(!linear) + html += "organized | [makeLink("linear", null, 1)]
    " + var/datum/ErrorViewer/ErrorSource/error_source + for(var/erroruid in error_sources) + error_source = error_sources[erroruid] + html += "

    [error_source.makeLink(null, src)]

    " + else + html += "[makeLink("organized", null)] | linear
    " + for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors) + html += "

    [error_entry.makeLink(null, src, 1)]

    " + browseTo(user, html) + +/datum/ErrorViewer/ErrorCache/proc/logError(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src) + if(!istype(e)) + return // Abnormal exception, don't even bother + + var/erroruid = "[e.file][e.line]" + var/datum/ErrorViewer/ErrorSource/error_source = error_sources[erroruid] + if(!error_source) + error_source = new(e) + error_sources[erroruid] = error_source + + var/datum/ErrorViewer/ErrorEntry/error_entry = new(e, desclines, skipCount, e_src) + error_entry.error_source = error_source + errors += error_entry + error_source.errors += error_entry + if(skipCount) + return // Skip notifying admins about skipped errors + + // Show the error to admins with debug messages turned on, but only if one + // from the same source hasn't been shown too recently + // (Also, make sure config is initialized, or log_debug will runtime) + if(config && error_source.next_message_at <= world.time) + var/const/viewtext = "\[view]" // Nesting these in other brackets went poorly + log_debug("Runtime in [e.file],[e.line]: [html_encode(e.name)] [error_entry.makeLink(viewtext)]") + error_source.next_message_at = world.time + ERROR_MSG_DELAY + +/datum/ErrorViewer/ErrorSource + var/list/errors = list() + var/next_message_at = 0 + +/datum/ErrorViewer/ErrorSource/New(var/exception/e) + if(!istype(e)) + name = "\[[time_stamp()]] Uncaught exceptions" + return + name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + +/datum/ErrorViewer/ErrorSource/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + if(!istype(back_to)) + back_to = error_cache + var/html = buildHeader(back_to, refreshable=1) + for(var/datum/ErrorViewer/ErrorEntry/error_entry in errors) + html += "

    [error_entry.makeLink(null, src)]

    " + browseTo(user, html) + +/datum/ErrorViewer/ErrorEntry + var/datum/ErrorViewer/ErrorSource/error_source + var/exception/exc + var/desc = "" + var/srcRef + var/srcType + var/turf/srcLoc + var/usrRef + var/turf/usrLoc + var/isSkipCount + +/datum/ErrorViewer/ErrorEntry/New(var/exception/e, var/list/desclines, var/skipCount, var/datum/e_src) + if(!istype(e)) + name = "\[[time_stamp()]] Uncaught exception: [e]" + return + if(skipCount) + name = "\[[time_stamp()]] Skipped [skipCount] runtimes in [e.file],[e.line]." + isSkipCount = TRUE + return + name = "\[[time_stamp()]] Runtime in [e.file],[e.line]: [e]" + exc = e + if(istype(desclines)) + for(var/line in desclines) + // There's probably a better way to do this than non-breaking spaces... + desc += "  " + html_encode(line) + "
    " + if(istype(e_src)) + srcRef = "\ref[e_src]" + srcType = e_src.type + srcLoc = get_turf(e_src) + if(usr) + usrRef = "\ref[usr]" + usrLoc = get_turf(usr) + +/datum/ErrorViewer/ErrorEntry/showTo(var/user, var/datum/ErrorViewer/back_to, var/linear) + if(!istype(back_to)) + back_to = error_source + var/html = buildHeader(back_to, linear) + html += "
    [html_encode(name)]
    [desc]
    " + if(srcRef) + html += "
    src: VV" + if(ispath(srcType, /mob)) + html += " PP" + html += " Follow" + if(istype(srcLoc)) + html += "
    src.loc: VV" + html += " JMP" + if(usrRef) + html += "
    usr: VV" + html += " PP" + html += " Follow" + if(istype(usrLoc)) + html += "
    usr.loc: VV" + html += " JMP" + browseTo(user, html) + +/datum/ErrorViewer/ErrorEntry/makeLink(var/linktext, var/datum/ErrorViewer/back_to, var/linear) + if(isSkipCount) + return html_encode(name) + else + return ..() diff --git a/code/modules/error_handler/~defines.dm b/code/modules/error_handler/~defines.dm new file mode 100644 index 00000000000..98712eaa091 --- /dev/null +++ b/code/modules/error_handler/~defines.dm @@ -0,0 +1,6 @@ +// Settings for the error handler and error viewer +#undef ERROR_COOLDOWN +#undef ERROR_LIMIT +#undef ERROR_MAX_COOLDOWN +#undef ERROR_SILENCE_TIME +#undef ERROR_MSG_DELAY diff --git a/code/modules/events/ion_storm.dm b/code/modules/events/ion_storm.dm index f8334dacb0c..183d9bfdbe7 100644 --- a/code/modules/events/ion_storm.dm +++ b/code/modules/events/ion_storm.dm @@ -13,7 +13,7 @@ players += player.real_name for (var/mob/living/silicon/ai/target in world) - var/random_player = "The Captain" + var/random_player = "The Station Administrator" if(players.len) random_player = pick(players) //Random player's name, to be used in laws. var/list/laws = list( "You are a mouse.", @@ -53,7 +53,7 @@ "The crew is playing Dungeons and Dragons, and you are the Dungeon Master.", "Your job is to watch the crew. Watch the crew. Make the crew feel watched.", "Tell everyone of the existence of this law, but never reveal the contents.", - "Refer to [prob(50)?"the captain":random_player] as \"Princess\" at all times.", + "Refer to [prob(50)?"the station administrator":random_player] as \"Princess\" at all times.", "When asked a question, respond with the least-obvious and least-rational answer.", "Give relationship advice to [prob(50)?"anyone who speaks to you":random_player].", "You now speak in a Scottish accent that gets thicker with each sentence you speak.", @@ -113,7 +113,7 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is //var/dowhat = pick("STOP THIS", "SUPPORT THIS", "CONSTANTLY INFORM THE CREW OF THIS", "IGNORE THIS", "FEAR THIS") var/aimust = pick("LIE", "RHYME", "RESPOND TO EVERY QUESTION WITH A QUESTION", "BE POLITE", "CLOWN", "BE HAPPY", "SPEAK IN SEXUAL INNUENDOS", "TALK LIKE A PIRATE", "QUESTION AUTHORITY", "SHOUT", "BE DISTRACTED", "HEY LISTEN", "MUMBLE", "SPEAK IN HAIKU") var/define = pick("ABSENCE OF CYBORG HUGS", "LACK OF BEATINGS", "UNBOLTED AIRLOCKS", "BOLTED AIRLOCKS", "IMPROPERLY WORDED SENTENCES", "POOR SENTENCE STRUCTURE", "BRIG TIME", "NOT REPLACING EVERY SECOND WORD WITH HONK", "HONKING", "PRESENCE OF LIGHTS", "LACK OF BEER", "WEARING CLOTHING", "NOT SAYING HELLO WHEN YOU SPEAK", "ANSWERING REQUESTS NOT EXPRESSED IN IAMBIC PENTAMETER", "A SMALL ISLAND OFF THE COAST OF PORTUGAL", "ANSWERING REQUESTS THAT WERE MADE WHILE CLOTHED") - var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the captain", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") + var/target = pick("a traitor", "a mercenary", "a changeling", "a wizard", "the head of a revolution", "Soviet spy", "a good person", "a dwarf", "an elf", "a fairy princess", "the station administrator", "Beepsky", "God", "a pirate", "a gryphon", "a chryssalid") var/require = pick("ADDITIONAL PYLONS", "MORE VESPENE GAS", "MORE MINERALS", "THE ULTIMATE CUP OF COFFEE", "HIGH YIELD EXPLOSIVES", "THE CLOWN", "THE VACUUM OF SPACE", "IMMORTALITY", "SAINTHOOD", "ART", "VEGETABLES", "FAT PEOPLE", "MORE LAWS", "MORE DAKKA", "HERESY", "CORPSES", "TRAITORS", "MONKEYS", "AN ARCADE", "PLENTY OF GOLD", "FIVE TEENAGERS WITH ATTITUDE") var/allergy = pick("cotton", "uniforms", "acid", "oxygen", "human contact", "cyborg contact", "medicine", "floors") var/allergysev = pick("deathly", "mildly", "severely", "contagiously") @@ -148,9 +148,9 @@ Would like to add a law like "Law x is _______" where x = a number, and _____ is M.add_ion_law("HUMANS NEED TO EAT [what2pref] [what2] TO SURVIVE") if(5) M << "
    " - M << "\red THE CAPTAIN, HOP AND HOS ARE [who2]...LAWS UPDATED" + M << "\red THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]...LAWS UPDATED" M << "
    " - M.add_ion_law("THE CAPTAIN, HOP AND HOS ARE [who2]") + M.add_ion_law("THE STATION ADMINISTRATOR, HOP AND HOS ARE [who2]") if(6) M << "
    " M << "\red THE STATION IS BUILT FOR [who2]...LAWS UPDATED" diff --git a/code/modules/examine/descriptions/containers.dm b/code/modules/examine/descriptions/containers.dm new file mode 100644 index 00000000000..fb0c4e2d25e --- /dev/null +++ b/code/modules/examine/descriptions/containers.dm @@ -0,0 +1,35 @@ +/obj/item/weapon/reagent_containers/food/drinks/cans/cola + description_fluff = "Space Cola is the most popular soft drink in known space. It was invented by Nikolas Fedorov, a Martian-Russian immagrant to Tau Ceti. He then went on to create Nikolas Beverages Inc., a soft drink corporation that is now part of Centauri Provisions." + +/obj/item/weapon/reagent_containers/food/drinks/cans/waterbottle + description_fluff = "This is a generic, NanoTrasen branded bottle of water. The company swears on the quality of the water, saying it comes from the Martian poles. Most people disregard that and assume it's recycled from hydroponics trays." + +/obj/item/weapon/reagent_containers/food/drinks/cans/space_mountain_wind + description_fluff = "This cola was allegedly made after Vasily Federov, the son of Nikolas Federov and the second CEO of Federov Beverages Inc., went on a climbing expedition to an arctic planet. He then created this citris flavored soft drink. Scientists claim that it can eat through styrafoam in a matter of weeks, but people drink it anyway." + +/obj/item/weapon/reagent_containers/food/drinks/cans/thirteenloko + description_fluff = "A beverage loved by college students. The Thirteen Loko Company created this highly alcoholic beverage as an energy drink. It is illegal in much of SolGov space and most of Skrell space. This drink has been regulated more than any other in known space, and doctors strongly advise not to drink it." + +/obj/item/weapon/reagent_containers/food/drinks/cans/dr_gibb + description_fluff = "Originally made by a doctor seeking to mix several different flavors, this soda has become widely popular in the past decade. The drink has become so popular, in fact, that Nikolas Beverages bought it. Ever since then, the drink has never been the same. As a result, people all across known space beg for the old formula, but Nikolas Beverages does not appear to be listening." + +/obj/item/weapon/reagent_containers/food/drinks/cans/starkist + description_fluff = "Nikolas Beverages' attempt at an orange-flavored drink. Advertised as a nice summer beverage. The company tries to paint it as one of their more 'healthy' beverages due to its 'orange' and 'vitamins'." + +/obj/item/weapon/reagent_containers/food/drinks/cans/space_up + description_fluff = "This drink is advertised as one of the most carbonated beverages on the market. It's owned by Federov Beverages, and advertised for its carbonation, not its flavor. Children will commonly make 'Space-Up Volcanoes' by dropping mints into a can of Space-Up and causing it to create a long stream of fizz upward." + +/obj/item/weapon/reagent_containers/food/drinks/cans/lemon_lime + description_fluff = "This is a NanoTrasen branded can of Lemon-Lime juice. NanoTrasen swears to their 'natural' beverage, but most people think differently." + +/obj/item/weapon/reagent_containers/food/drinks/cans/iced_tea + description_fluff = "Vrisk Iced Tea is named after it's creator, Penelope Vrisk. She was a canner for Federov Beverages who wanted to create an authentic-tasting Southern iced tea. After finishing her formula and managing to get it produced, the tea became an instant hit." + +/obj/item/weapon/reagent_containers/food/drinks/cans/grape_juice + description_fluff = "This is a NanoTrasen branded can of grape juice. NanoTrasen claims that they use the same grapes that this juice is made of to make their wine." + +/obj/item/weapon/reagent_containers/food/drinks/cans/tonic + description_fluff = "Endorsed by the popular positronic rapper, T-Borg, this drink is advertised as a 'high class' drink. Most people just use it to mix with their gin, and not much can be said about the quality." + +/obj/item/weapon/reagent_containers/food/drinks/cans/sodawater + description_fluff = "This is a NanoTrasen branded can of soda water. They use the same water for this that they use for the bottled water that they sell. That may explain why the stuff isn't exactly flying off of the shelves." diff --git a/code/modules/examine/descriptions/devices.dm b/code/modules/examine/descriptions/devices.dm index 05182df0a58..33954f66727 100644 --- a/code/modules/examine/descriptions/devices.dm +++ b/code/modules/examine/descriptions/devices.dm @@ -8,7 +8,7 @@ that while in space, across star systems, and that the consumer can afford and use without training, is much more recent, and is thanks to the backbone \ that is the Exonet.
    \
    \ - The Exonet is the predominant interstellar telecom system, servicing trillions of devices across a large portion of human-controlled space. \ + The Exonet is the predominant interstellar telecomm system, servicing trillions of devices across a large portion of human-controlled space. \ It is distributed by a massive network of telecommunication satellites, some privately owned and others owned by the systems’ local governments, \ that utilize FTL technologies to bounce data between satellites at speeds that would not be possible at sub-light technology. This communicator \ uses a protocol called Exonet Protocol Version 2, generally shortened to EPv2.
    \ diff --git a/code/modules/examine/descriptions/smokeables.dm b/code/modules/examine/descriptions/smokeables.dm new file mode 100644 index 00000000000..957090b8e34 --- /dev/null +++ b/code/modules/examine/descriptions/smokeables.dm @@ -0,0 +1,39 @@ +/obj/item/weapon/storage/fancy/cigarettes + description_fluff = "The Trans-Stellar Duty-Free cigarette company was created as a sub-company of NanoTrasen. They are the most boring, tasteless, dry cigarettes on the market, but due to how generic they are, they are still the most well-known and widespread cigarettes in the universe." + +/obj/item/weapon/storage/fancy/cigarettes/dromedaryco + description_fluff = "DromedaryCo is one of the oldest companies that produces cigarettes. Being a company that has changed hands and names several times through the years, their cigarettes are now very different from the original, and old-timers tend to complain about the quality of their current product. While they have been dwindling when it comes to profits in the past years due to marketing schemes deemed 'unethical', they still remain on the forefront of the smokeable industry." + +/obj/item/weapon/storage/fancy/cigarettes/killthroat + description_fluff = "AcmeCo is known for their signature high-tar cigarettes. Being a sub-company Xion, some accuse the cigarettes of having other harmful things in them besides tar. Xion officials refuse to comment on the issue." + +/obj/item/weapon/storage/fancy/cigarettes/luckystars + description_fluff = "Lucky Stars were created on Venus by a researcher seeking to make a good quality cigarette from pod-based tobacco plants. The researcher only managed to make these, but made quite a profit off of them when she started her company." + +/obj/item/weapon/storage/fancy/cigarettes/jerichos + description_fluff = "Hephaistos Industries ex-military employees once decided to make a cigarette that was easy to light and had a waterproof case, specifically tailored for soldiers. They created Jerichos. Jerichos are known for their Hickory smoke and warm feeling in your lungs. They are loved by soldiers and people employed in para-military outfits." + +/obj/item/weapon/storage/fancy/cigarettes/menthols + description_fluff = "The Temperamento Menthol Company is a large cigarette company based in Mars. They have been around since the very dawn of Human colonization and have remained a favorite for those seeking a more.. numbing cigarette.
    \ +
    \ + This is a pack of Temperamento Menthols, the main product of the company. They taste like menthol, surprisingly enough." + +/obj/item/weapon/storage/fancy/cigarettes/carcinomas + description_fluff = "The CarcinoCo was originally destined to fail, as the company blatantly advertized themselves as creating the 'most cancerous cigarette'. Somehow, after endorsement from a reporter, the cigarettes took off." + +/obj/item/weapon/storage/fancy/cigarettes/professionals + description_fluff = "Decades ago, probably before you were born, Gilthari Exports created the Professional 120s. They wanted to make a fancy cigarette that would be considered a luxury. Nowadays, people who use them are generally laughed at for being wannabe rich people or old. They are, however, very high-quality and made from the very best tobacco." + +/obj/item/clothing/mask/smokable/cigarette/cigar + description_fluff = "While the label does say that this is a 'premium cigar', it really cannot match other types of cigars on the market. Is it a quality cigarette? Perhaps. Was it hand-made with care? No. This is what differentiates between quality products that Gilthari puts out and NanoTrasen 'premium' cigars like this one." + +/obj/item/clothing/mask/smokable/cigarette/cigar/cohiba + description_fluff = "Cohiba has been a popular cigar company for centuries. They are still based out of Cuba and refuse to expand and therefore have a very limited quantity, making their cigars coveted all through known space. Robusto is one of their most popular shapes of cigars." + +/obj/item/clothing/mask/smokable/cigarette/cigar/havana + description_fluff = "'Havanian' is an umbrella term for any cigar made in the typical handmade style of Cuba. This particular cigar is from Gilthari's cigar manufacturers. While the way of making quality cigars has become slightly bastardized over the years, overall quality has remained relatively the same, even if there is a large quantity of 'Havanian' cigars." + +/obj/item/clothing/mask/smokable/pipe + description_fluff = "ClassiCo Men's Accessories and Haberdashers is a widespread company originating out of Mars. They seek to create quality goods to give men a more 'classy' look. Most of their items are high-end and expensive, but they do back that up with quality.
    \ +
    \ + This pipe is a ClassiCo pipe. It is made out of fine, stained cherry wood." \ No newline at end of file diff --git a/code/modules/examine/descriptions/telecomms.dm b/code/modules/examine/descriptions/telecomms.dm index 747697f55f2..45101ec130b 100644 --- a/code/modules/examine/descriptions/telecomms.dm +++ b/code/modules/examine/descriptions/telecomms.dm @@ -30,7 +30,7 @@ Exonets at the root node(s), and is typically arranged in a tree structure. The root node(s) are generally government-owned and are very secure \ and resilient to failure.
    \
    \ - This node is privately owned and maintained by Nanotrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet." + This node is privately owned and maintained by NanoTrasen, and allows the colonists of the "+station_orig+" to have access to the Exonet." description_antag = "An EMP will disable this device for a short period of time. A longer downage can be achieved by turning it off, or rigging \ the APC it uses to turn off remotely, such as with a signaler in the right wire." \ No newline at end of file diff --git a/code/modules/flufftext/Dreaming.dm b/code/modules/flufftext/Dreaming.dm index 6ac9483e2f9..cda4ab86cef 100644 --- a/code/modules/flufftext/Dreaming.dm +++ b/code/modules/flufftext/Dreaming.dm @@ -1,6 +1,6 @@ var/list/dreams = list( - "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the captain", + "an ID card","a bottle","a familiar face","a crewmember","a toolbox","a security officer","the Station Administrator", "voices from all around","deep space","a doctor","the engine","a traitor","an ally","darkness", "light","a scientist","a monkey","a catastrophe","a loved one","a gun","warmth","freezing","the sun", "a hat","the Luna","a ruined station","a planet","phoron","air","the medical bay","the bridge","blinking lights", diff --git a/code/modules/flufftext/Hallucination.dm b/code/modules/flufftext/Hallucination.dm index 803fbc67aee..e074c264ace 100644 --- a/code/modules/flufftext/Hallucination.dm +++ b/code/modules/flufftext/Hallucination.dm @@ -189,7 +189,7 @@ mob/living/carbon/proc/handle_hallucinations() var/possible_txt = list("Launch Escape Pods","Self-Destruct Sequence","\[Swipe ID\]","De-Monkify",\ "Reticulate Splines","Plasma","Open Valve","Lockdown","Nerf Airflow","Kill Traitor","Nihilism",\ - "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Captain IQ","Retrieve Arms",\ + "OBJECTION!","Arrest Stephen Bowman","Engage Anti-Trenna Defenses","Increase Station Administrator IQ","Retrieve Arms",\ "Play Charades","Oxygen","Inject BeAcOs","Ninja Lizards","Limit Break","Build Sentry") if(mid_txts) diff --git a/code/modules/games/cah_black_cards.dm b/code/modules/games/cah_black_cards.dm index ec27fa12700..6aae5e6da28 100644 --- a/code/modules/games/cah_black_cards.dm +++ b/code/modules/games/cah_black_cards.dm @@ -5,7 +5,7 @@ "The Chaplain this shift is worshiping _____.", "Cargo ordered a crate full of _____.", "An ERT was called due to ______.", - "Alert! The Captain has armed themselves with _____.", + "Alert! The Station Administrator has armed themselves with _____.", "Current Laws: ________ is your master.", "Current Laws: ________ is the enemy.", "_____ vented the entirety of Cargo.", @@ -14,7 +14,7 @@ "Caution, ______ have been detected in collision course with the station.", "Today's kitchen menu includes _______.", "What did the mercenaries want when they attacked the station?", - "I think the Captain is insane. He just demanded ______ in his office.", + "I think the Station Administrator is insane. He just demanded ______ in his office.", "Fuckin' scientists, they just turned Misc. Research into _______ .", "What's my fetish?", "Hello, _______ here with _______", diff --git a/code/modules/games/cah_white_cards.dm b/code/modules/games/cah_white_cards.dm index 2ed8a494db9..387c058972f 100644 --- a/code/modules/games/cah_white_cards.dm +++ b/code/modules/games/cah_white_cards.dm @@ -5,7 +5,7 @@ "Space 'Nam", "Space lesbians", "The Gardener getting SUPER high", - "The Captain thinking they're a badass", + "The Station Administrator thinking they're a badass", "Being in a cult", "Racially biased lawsets", "An Unathi who WON'T STOP FIGHTING", @@ -57,7 +57,7 @@ "An irritatingly chipper robot", "Androids hanging out in the bar drinking beer", "Gear harnesses", - "A seventeen-year-old Captain", + "A seventeen-year-old Station Administrator", "The throbbing erection that the HoS gets at the thought of shooting something", "Trying to stab someone and hugging them instead", "Waking up naked in the maintenance tunnels", diff --git a/code/modules/games/cards.dm b/code/modules/games/cards.dm index 3fcf07713b3..0eba3407611 100644 --- a/code/modules/games/cards.dm +++ b/code/modules/games/cards.dm @@ -4,7 +4,7 @@ var/back_icon = "card_back" /obj/item/weapon/deck - w_class = 2 + w_class = ITEMSIZE_SMALL icon = 'icons/obj/playing_cards.dmi' var/list/cards = list() @@ -146,7 +146,7 @@ for(var/datum/playingcard/P in cards) H.cards += P H.concealed = src.concealed - user.drop_from_inventory(src,user.loc) + user.drop_from_inventory(src) qdel(src) H.update_icon() return @@ -180,7 +180,7 @@ icon_state = "card_pack" icon = 'icons/obj/playing_cards.dmi' - w_class = 1 + w_class = ITEMSIZE_TINY var/list/cards = list() @@ -201,7 +201,7 @@ desc = "Some playing cards." icon = 'icons/obj/playing_cards.dmi' icon_state = "empty" - w_class = 1 + w_class = ITEMSIZE_TINY var/concealed = 0 var/list/cards = list() diff --git a/code/modules/holodeck/HolodeckObjects.dm b/code/modules/holodeck/HolodeckObjects.dm index 69077aad840..a6273a74233 100644 --- a/code/modules/holodeck/HolodeckObjects.dm +++ b/code/modules/holodeck/HolodeckObjects.dm @@ -247,7 +247,7 @@ throw_speed = 1 throw_range = 5 throwforce = 0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL flags = NOBLOODY var/active = 0 var/item_color @@ -263,7 +263,7 @@ /obj/item/weapon/holo/esword/handle_shield(mob/user, var/damage, atom/damage_source = null, mob/attacker = null, var/def_zone = null, var/attack_text = "the attack") if(active && default_parry_check(user, attacker, damage_source) && prob(50)) user.visible_message("\The [user] parries [attack_text] with \the [src]!") - + var/datum/effect/effect/system/spark_spread/spark_system = new /datum/effect/effect/system/spark_spread() spark_system.set_up(5, 0, user.loc) spark_system.start() @@ -279,13 +279,13 @@ if (active) force = 30 icon_state = "sword[item_color]" - w_class = 4 + w_class = ITEMSIZE_LARGE playsound(user, 'sound/weapons/saberon.ogg', 50, 1) user << "[src] is now active." else force = 3 icon_state = "sword0" - w_class = 2 + w_class = ITEMSIZE_SMALL playsound(user, 'sound/weapons/saberoff.ogg', 50, 1) user << "[src] can now be concealed." @@ -304,7 +304,7 @@ icon_state = "basketball" name = "basketball" desc = "Here's your chance, do your dance at the Space Jam." - w_class = 4 //Stops people from hiding it in their bags/pockets + w_class = ITEMSIZE_LARGE //Stops people from hiding it in their bags/pockets /obj/structure/holohoop name = "basketball hoop" diff --git a/code/modules/hydroponics/beekeeping/beehive.dm b/code/modules/hydroponics/beekeeping/beehive.dm index 5cd5458b4a7..27487a4e1f4 100644 --- a/code/modules/hydroponics/beekeeping/beehive.dm +++ b/code/modules/hydroponics/beekeeping/beehive.dm @@ -198,14 +198,14 @@ desc = "A device used to calm down bees before harvesting honey." icon = 'icons/obj/device.dmi' icon_state = "battererburnt" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/honey_frame name = "beehive frame" desc = "A frame for the beehive that the bees will fill with honeycombs." icon = 'icons/obj/beekeeping.dmi' icon_state = "honeyframe" - w_class = 2 + w_class = ITEMSIZE_SMALL var/honey = 0 diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index 1c823ef61b1..88fd37c4660 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -37,7 +37,7 @@ desc = "A reminder of meals gone by." icon = 'icons/obj/trash.dmi' icon_state = "corncob" - w_class = 2.0 + w_class = ITEMSIZE_SMALL throwforce = 0 throw_speed = 4 throw_range = 20 @@ -55,7 +55,7 @@ desc = "A peel from a banana." icon = 'icons/obj/items.dmi' icon_state = "banana_peel" - w_class = 2.0 + w_class = ITEMSIZE_SMALL throwforce = 0 throw_speed = 4 throw_range = 20 diff --git a/code/modules/hydroponics/seed_machines.dm b/code/modules/hydroponics/seed_machines.dm index 015ab88ccbf..1479ffdc5c4 100644 --- a/code/modules/hydroponics/seed_machines.dm +++ b/code/modules/hydroponics/seed_machines.dm @@ -3,7 +3,7 @@ desc = "A small disk used for carrying data on plant genetics." icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "disk" - w_class = 1.0 + w_class = ITEMSIZE_TINY var/list/genes = list() var/genesource = "unknown" diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 7c1b70c4c7b..544ba9046b7 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -5,7 +5,7 @@ var/global/list/plant_seed_sprites = list() name = "packet of seeds" icon = 'icons/obj/seeds.dmi' icon_state = "blank" - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/seed_type var/datum/seed/seed diff --git a/code/modules/hydroponics/trays/tray_reagents.dm b/code/modules/hydroponics/trays/tray_reagents.dm index 1ab73542b00..a9c7f600c61 100644 --- a/code/modules/hydroponics/trays/tray_reagents.dm +++ b/code/modules/hydroponics/trays/tray_reagents.dm @@ -4,7 +4,7 @@ flags = NOBLUDGEON slot_flags = SLOT_BELT throwforce = 4 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 2 throw_range = 10 var/toxicity = 4 diff --git a/code/modules/integrated_electronics/_defines.dm b/code/modules/integrated_electronics/_defines.dm new file mode 100644 index 00000000000..b6ce8472b77 --- /dev/null +++ b/code/modules/integrated_electronics/_defines.dm @@ -0,0 +1,363 @@ +#define IC_INPUT "input" +#define IC_OUTPUT "output" +#define IC_ACTIVATOR "activator" + +#define DATA_CHANNEL "data channel" +#define PULSE_CHANNEL "pulse channel" + +/obj/item/integrated_circuit + name = "integrated circuit" + desc = "It's a tiny chip! This one doesn't seem to do much, however." + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "template" + w_class = ITEMSIZE_TINY + var/extended_desc = null + var/list/inputs = list() + var/list/outputs = list() + var/list/activators = list() + var/next_use = 0 //Uses world.time + var/complexity = 1 //This acts as a limitation on building machines, more resource-intensive components cost more 'space'. + var/cooldown_per_use = 1 SECOND + var/category = /obj/item/integrated_circuit // Used by the toolsets to filter out category types + +/obj/item/integrated_circuit/examine(mob/user) + ..() + to_chat(user, "This board has [inputs.len] input pin\s and [outputs.len] output pin\s.") + for(var/datum/integrated_io/input/I in inputs) + if(I.linked.len) + to_chat(user, "The [I] is connected to [I.get_linked_to_desc()].") + for(var/datum/integrated_io/output/O in outputs) + if(O.linked.len) + to_chat(user, "The [O] is connected to [O.get_linked_to_desc()].") + for(var/datum/integrated_io/activate/A in activators) + if(A.linked.len) + to_chat(user, "The [A] is connected to [A.get_linked_to_desc()].") + + interact(user) + +/obj/item/integrated_circuit/New() + setup_io(inputs, /datum/integrated_io/input) + setup_io(outputs, /datum/integrated_io/output) + setup_io(activators, /datum/integrated_io/activate) + ..() + +/obj/item/integrated_circuit/proc/setup_io(var/list/io_list, var/io_type) + var/list/io_list_copy = io_list.Copy() + io_list.Cut() + for(var/io_entry in io_list_copy) + io_list.Add(new io_type(src, io_entry, io_list_copy[io_entry])) + +/obj/item/integrated_circuit/proc/on_data_written() //Override this for special behaviour when new data gets pushed to the circuit. + return + +/obj/item/integrated_circuit/Destroy() + for(var/datum/integrated_io/I in inputs) + qdel(I) + for(var/datum/integrated_io/O in outputs) + qdel(O) + for(var/datum/integrated_io/A in activators) + qdel(A) + . = ..() + +/obj/item/integrated_circuit/nano_host() + if(istype(src.loc, /obj/item/device/electronic_assembly)) + return loc + return ..() + +/obj/item/integrated_circuit/emp_act(severity) + for(var/datum/integrated_io/io in inputs + outputs + activators) + io.scramble() + +/obj/item/integrated_circuit/verb/rename_component() + set name = "Rename Circuit" + set category = "Object" + set desc = "Rename your circuit, useful to stay organized." + + var/mob/M = usr + if(!CanInteract(M, physical_state)) + return + + var/input = sanitizeSafe(input("What do you want to name the circuit?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The circuit '[src.name]' is now labeled '[input]'.") + name = input + +/obj/item/integrated_circuit/proc/get_pin_ref(var/pin_type, var/pin_number) + switch(pin_type) + if(IC_INPUT) + if(pin_number > inputs.len) + return null + return inputs[pin_number] + if(IC_OUTPUT) + if(pin_number > outputs.len) + return null + return outputs[pin_number] + if(IC_ACTIVATOR) + if(pin_number > activators.len) + return null + return activators[pin_number] + return null + +/obj/item/integrated_circuit/interact(mob/user) + if(!CanInteract(user, physical_state)) + return + + var/HTML = list() + HTML += "[src.name]" + HTML += "
    " + HTML += "
    " + + HTML += "
    \[Refresh\] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]
    " + + HTML += "" + HTML += "" + HTML += "" + HTML += "" + HTML += "" + + var/column_width = 3 + var/row_height = max(inputs.len, outputs.len, 1) + + for(var/i = 1 to row_height) + HTML += "" + for(var/j = 1 to column_width) + var/datum/integrated_io/io = null + var/words = list() + var/height = 1 + switch(j) + if(1) + io = get_pin_ref(IC_INPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(outputs.len > inputs.len) + height = 1 + if(2) + if(i == 1) + words += "[src.name]

    [src.desc]" + height = row_height + else + continue + if(3) + io = get_pin_ref(IC_OUTPUT, i) + if(io) + if(io.linked.len) + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name] [io.display_data()]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + if(inputs.len > outputs.len) + height = 1 + HTML += "" + HTML += "" + + for(var/activator in activators) + var/datum/integrated_io/io = activator + var/words = list() + if(io.linked.len) + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + else + words += "[io.name]
    " + for(var/datum/integrated_io/linked in io.linked) + words += "\[[linked.name]\] \ + @ [linked.holder]
    " + HTML += "" + HTML += "" + HTML += "" + + HTML += "
    [jointext(words, null)]
    [jointext(words, null)]
    " + HTML += "" + + HTML += "
    Complexity: [complexity]" + HTML += "
    [extended_desc]" + + HTML += "" + user << browse(jointext(HTML, null), "window=circuit-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") + + onclose(user, "circuit-\ref[src]") + +/obj/item/integrated_circuit/Topic(href, href_list, state = physical_state) + if(..()) + return 1 + var/pin = locate(href_list["pin"]) in inputs + outputs + activators + + var/obj/held_item = usr.get_active_hand() + if(href_list["wire"]) + if(istype(held_item, /obj/item/device/integrated_electronics/wirer)) + var/obj/item/device/integrated_electronics/wirer/wirer = held_item + if(pin) + wirer.wire(pin, usr) + + else if(istype(held_item, /obj/item/device/integrated_electronics/debugger)) + var/obj/item/device/integrated_electronics/debugger/debugger = held_item + if(pin) + debugger.write_data(pin, usr) + else + to_chat(usr, "You can't do a whole lot without the proper tools.") + + if(href_list["examine"]) + examine(usr) + + if(href_list["rename"]) + rename_component(usr) + + if(href_list["remove"]) + if(istype(held_item, /obj/item/weapon/screwdriver)) + disconnect_all() + var/turf/T = get_turf(src) + forceMove(T) + playsound(T, 'sound/items/Crowbar.ogg', 50, 1) + to_chat(usr, "You pop \the [src] out of the case, and slide it out.") + else + to_chat(usr, "You need a screwdriver to remove components.") + var/obj/item/device/electronic_assembly/ea = loc + if(istype(ea)) + ea.interact(usr) + return + + interact(usr) // To refresh the UI. + +/datum/integrated_io + var/name = "input/output" + var/obj/item/integrated_circuit/holder = null + var/weakref/data = null // This is a weakref, to reduce typecasts. Note that oftentimes numbers and text may also occupy this. + var/list/linked = list() + var/io_type = DATA_CHANNEL + +/datum/integrated_io/New(var/newloc, var/name, var/data) + ..() + src.name = name + src.data = data + holder = newloc + if(!istype(holder)) + message_admins("ERROR: An integrated_io ([src.name]) spawned without a valid holder! This is a bug.") + +/datum/integrated_io/Destroy() + disconnect() + data = null + holder = null + . = ..() + +/datum/integrated_io/nano_host() + return holder + + +/datum/integrated_io/proc/data_as_type(var/as_type) + if(!isweakref(data)) + return + var/weakref/w = data + var/output = w.resolve() + return istype(output, as_type) ? output : null + +/datum/integrated_io/proc/display_data() + if(isnull(data)) + return "(null)" // Empty data means nothing to show. + if(istext(data)) + return "(\"[data]\")" // Wraps the 'string' in escaped quotes, so that people know it's a 'string'. + if(isweakref(data)) + var/weakref/w = data + var/atom/A = w.resolve() + return A ? "([A.name] \[Ref\])" : "(null)" // For refs, we want just the name displayed. + return "([data])" // Nothing special needed for numbers or other stuff. + +/datum/integrated_io/activate/display_data() + return "(\[pulse\])" + +/datum/integrated_io/proc/scramble() + if(isnull(data)) + return + if(isnum(data)) + write_data_to_pin(rand(-10000, 10000)) + if(istext(data)) + write_data_to_pin("ERROR") + push_data() + +/datum/integrated_io/activate/scramble() + push_data() + +/datum/integrated_io/proc/write_data_to_pin(var/new_data) + if(isnull(new_data) || isnum(new_data) || istext(new_data) || isweakref(new_data)) // Anything else is a type we don't want. + data = new_data + holder.on_data_written() + +/datum/integrated_io/proc/push_data() + for(var/datum/integrated_io/io in linked) + io.write_data_to_pin(data) + +/datum/integrated_io/activate/push_data() + for(var/datum/integrated_io/io in linked) + io.holder.check_then_do_work() + +/datum/integrated_io/proc/pull_data() + for(var/datum/integrated_io/io in linked) + write_data_to_pin(io.data) + +/datum/integrated_io/proc/get_linked_to_desc() + if(linked.len) + return "the [english_list(linked)]" + return "nothing" + +/datum/integrated_io/proc/disconnect() + //First we iterate over everything we are linked to. + for(var/datum/integrated_io/their_io in linked) + //While doing that, we iterate them as well, and disconnect ourselves from them. + for(var/datum/integrated_io/their_linked_io in their_io.linked) + if(their_linked_io == src) + their_io.linked.Remove(src) + else + continue + //Now that we're removed from them, we gotta remove them from us. + src.linked.Remove(their_io) + +/datum/integrated_io/input + name = "input pin" + +/datum/integrated_io/output + name = "output pin" + +/datum/integrated_io/activate + name = "activation pin" + io_type = PULSE_CHANNEL + +/obj/item/integrated_circuit/proc/push_data() + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/proc/pull_data() + for(var/datum/integrated_io/input/I in inputs) + I.push_data() + +/obj/item/integrated_circuit/proc/check_then_do_work() + if(world.time < next_use) // All intergrated circuits have an internal cooldown, to protect from spam. + return + next_use = world.time + cooldown_per_use + do_work() + +/obj/item/integrated_circuit/proc/do_work() + return + +/obj/item/integrated_circuit/proc/disconnect_all() + for(var/datum/integrated_io/input/I in inputs) + I.disconnect() + for(var/datum/integrated_io/output/O in outputs) + O.disconnect() + for(var/datum/integrated_io/activate/A in activators) + A.disconnect() \ No newline at end of file diff --git a/code/modules/integrated_electronics/arithmetic.dm b/code/modules/integrated_electronics/arithmetic.dm new file mode 100644 index 00000000000..31265e297ec --- /dev/null +++ b/code/modules/integrated_electronics/arithmetic.dm @@ -0,0 +1,153 @@ +//These circuits do simple math. +/obj/item/integrated_circuit/arithmetic + complexity = 1 + inputs = list("A","B","C","D","E","F","G","H") + outputs = list("result") + activators = list("compute") + category = /obj/item/integrated_circuit/arithmetic + +// +Adding+ // + +/obj/item/integrated_circuit/arithmetic/addition + name = "addition circuit" + desc = "This circuit can add numbers together." + icon_state = "addition" + +/obj/item/integrated_circuit/arithmetic/addition/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + result = result + I.data + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// -Subtracting- // + +/obj/item/integrated_circuit/arithmetic/subtraction + name = "subtraction circuit" + desc = "This circuit can subtract numbers." + icon_state = "subtraction" + +/obj/item/integrated_circuit/arithmetic/subtraction/do_work() + if(..()) + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + result = result - I.data + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// *Multiply* // + +/obj/item/integrated_circuit/arithmetic/multiplication + name = "multiplication circuit" + desc = "This circuit can multiply numbers." + icon_state = "multiplication" + +/obj/item/integrated_circuit/arithmetic/subtraction/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + result = result * I.data + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// /Division/ // + +/obj/item/integrated_circuit/arithmetic/division + name = "division circuit" + desc = "This circuit can divide numbers, just don't think about trying to divide by zero!" + icon_state = "division" + +/obj/item/integrated_circuit/arithmetic/division/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data) && I.data != 0) //No runtimes here. + result = result / I.data + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// Absolute // + +/obj/item/integrated_circuit/arithmetic/absolute + name = "absolute circuit" + desc = "This outputs a non-negative version of the number you put in. This may also be thought of as its distance from zero." + icon_state = "absolute" + inputs = list("A") + +/obj/item/integrated_circuit/arithmetic/absolute/do_work() + var/result = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data) && I.data != 0) + result = abs(result) + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// Averaging // + +/obj/item/integrated_circuit/arithmetic/average + name = "average circuit" + desc = "This circuit is of average quality, however it will compute the average for numbers you give it." + icon_state = "average" + +/obj/item/integrated_circuit/arithmetic/average/do_work() + var/result = 0 + var/inputs_used = 0 + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(isnum(I.data)) + inputs_used++ + result = result + I.data + + if(inputs_used) + result = result / inputs_used + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() + +// Pi, because why the hell not? // +/obj/item/integrated_circuit/arithmetic/pi + name = "pi constant circuit" + desc = "Not recommended for cooking. Outputs '3.14159' when it receives a pulse." + icon_state = "pi" + inputs = list() + +/obj/item/integrated_circuit/arithmetic/pi/do_work() + var/datum/integrated_io/output/O = outputs[1] + O.data = 3.14159 + O.push_data() + +// Random // +/obj/item/integrated_circuit/arithmetic/random + name = "random number generator circuit" + desc = "This gives a random (integer) number between values A and B inclusive." + icon_state = "random" + inputs = list("L","H") + +/obj/item/integrated_circuit/arithmetic/random/do_work() + var/result = 0 + var/datum/integrated_io/L = inputs[1] + var/datum/integrated_io/H = inputs[2] + + if(isnum(L.data) && isnum(H.data)) + result = rand(L.data, H.data) + + for(var/datum/integrated_io/output/O in outputs) + O.data = result + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/assemblies.dm b/code/modules/integrated_electronics/assemblies.dm new file mode 100644 index 00000000000..3b9e7aab069 --- /dev/null +++ b/code/modules/integrated_electronics/assemblies.dm @@ -0,0 +1,150 @@ +/obj/item/device/electronic_assembly + name = "electronic assembly" + desc = "It's a case, for building electronics with." + w_class = 2 + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "setup_small" + var/max_components = 10 + var/max_complexity = 40 + var/opened = 0 + +/obj/item/device/electronic_assembly/medium + name = "electronic mechanism" + icon_state = "setup_medium" + w_class = 3 + max_components = 20 + max_complexity = 80 + +/obj/item/device/electronic_assembly/large + name = "electronic machine" + icon_state = "setup_large" + w_class = 4 + max_components = 30 + max_complexity = 120 + +/obj/item/device/electronic_assembly/drone + name = "electronic drone" + icon_state = "setup_drone" + w_class = 3 + max_components = 25 + max_complexity = 100 + +/obj/item/device/electronic_assembly/interact(mob/user) + if(!CanInteract(user, physical_state)) + return + + var/total_parts = 0 + var/total_complexity = 0 + for(var/obj/item/integrated_circuit/part in contents) + total_parts++ + total_complexity = total_complexity + part.complexity + var/HTML = list() + + HTML += "[src.name]" + HTML += "
    \[Refresh\] | " + HTML += "\[Rename\]
    " + HTML += "[total_parts]/[max_components] ([round((total_parts / max_components) * 100, 0.1)]%) space taken up in the assembly.
    " + HTML += "[total_complexity]/[max_complexity] ([round((total_complexity / max_complexity) * 100, 0.1)]%) maximum complexity." + HTML += "

    " + HTML += "Components;
    " + for(var/obj/item/integrated_circuit/circuit in contents) + HTML += "[circuit.name] | " + HTML += "\[Rename\] | " + HTML += "\[Remove\]" + HTML += "
    " + + HTML += "" + user << browse(jointext(HTML,null), "window=assembly-\ref[src];size=600x350;border=1;can_resize=1;can_close=1;can_minimize=1") + +/obj/item/device/electronic_assembly/Topic(href, href_list[]) + if(..()) + return 1 + + if(href_list["rename"]) + rename(usr) + + interact(usr) // To refresh the UI. + +/obj/item/device/electronic_assembly/verb/rename() + set name = "Rename Circuit" + set category = "Object" + set desc = "Rename your circuit, useful to stay organized." + + var/mob/M = usr + if(!CanInteract(M, physical_state)) + return + + var/input = sanitizeSafe(input("What do you want to name this?", "Rename", src.name) as null|text, MAX_NAME_LEN) + if(src && input && CanInteract(M, physical_state)) + to_chat(M, "The machine now has a label reading '[input]'.") + name = input + +/obj/item/device/electronic_assembly/update_icon() + if(opened) + icon_state = initial(icon_state) + "-open" + else + icon_state = initial(icon_state) + +/obj/item/device/electronic_assembly/examine(mob/user) + . = ..(user, 1) + if(.) + for(var/obj/item/integrated_circuit/output/screen/S in contents) + if(S.stuff_to_display) + to_chat(user, "There's a little screen labeled '[S.name]', which displays '[S.stuff_to_display]'.") + if(opened) + interact(user) + +/obj/item/device/electronic_assembly/attackby(var/obj/item/I, var/mob/user) + if(istype(I, /obj/item/integrated_circuit)) + if(!opened) + to_chat(user, "\The [src] isn't opened, so you can't put anything inside. Try using a crowbar.") + return 0 + var/obj/item/integrated_circuit/IC = I + var/total_parts = 0 + var/total_complexity = 0 + for(var/obj/item/integrated_circuit/part in contents) + total_parts++ + total_complexity = total_complexity + part.complexity + + if( (total_parts + 1) > max_components) + to_chat(user, "You can't seem to add this [IC.name], since there's no more room.") + return 0 + if( (total_complexity + IC.complexity) > max_complexity) + to_chat(user, "You can't seem to add this [IC.name], since this setup's too complicated for the case.") + return 0 + + to_chat(user, "You slide \the [IC] inside \the [src].") + user.drop_item() + IC.forceMove(src) + playsound(get_turf(src), 'sound/items/Deconstruct.ogg', 50, 1) + interact(user) + else if(istype(I, /obj/item/weapon/crowbar)) + playsound(get_turf(src), 'sound/items/Crowbar.ogg', 50, 1) + opened = !opened + to_chat(user, "You [opened ? "opened" : "closed"] \the [src].") + update_icon() + else if(istype(I, /obj/item/device/integrated_electronics/wirer) || istype(I, /obj/item/device/integrated_electronics/debugger) || istype(I, /obj/item/weapon/screwdriver)) + if(opened) + interact(user) + else + to_chat(user, "\The [src] isn't opened, so you can't fiddle with the internal components. \ + Try using a crowbar.") + else + return ..() + +/obj/item/device/electronic_assembly/attack_self(mob/user) + if(opened) + interact(user) + + var/list/available_inputs = list() + for(var/obj/item/integrated_circuit/input/input in contents) + if(input.can_be_asked_input) + available_inputs.Add(input) + var/obj/item/integrated_circuit/input/choice = input(user, "What do you want to interact with?", "Interaction") as null|anything in available_inputs + if(choice && CanInteract(user, physical_state)) + choice.ask_for_input(user) + +/obj/item/device/electronic_assembly/emp_act(severity) + ..() + for(var/atom/movable/AM in contents) + AM.emp_act(severity) \ No newline at end of file diff --git a/code/modules/integrated_electronics/converters.dm b/code/modules/integrated_electronics/converters.dm new file mode 100644 index 00000000000..ad5f282356a --- /dev/null +++ b/code/modules/integrated_electronics/converters.dm @@ -0,0 +1,101 @@ +//These circuits convert one variable to another. +/obj/item/integrated_circuit/converter + complexity = 2 + inputs = list("input") + outputs = list("output") + activators = list("convert") + category = /obj/item/integrated_circuit/converter + +/obj/item/integrated_circuit/converter/num2text + name = "number to string" + desc = "This circuit can convert a number variable into a string." + icon_state = "num-string" + +/obj/item/integrated_circuit/converter/num2text/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && isnum(incoming.data)) + result = num2text(incoming.data) + + outgoing.data = result + outgoing.push_data() + +/obj/item/integrated_circuit/converter/text2num + name = "string to number" + desc = "This circuit can convert a string variable into a number." + icon_state = "string-num" + +/obj/item/integrated_circuit/converter/text2num/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = text2num(incoming.data) + + outgoing.data = result + outgoing.push_data() + +/obj/item/integrated_circuit/converter/ref2text + name = "reference to string" + desc = "This circuit can convert a reference to something else to a string, specifically the name of that reference." + icon_state = "ref-string" + +/obj/item/integrated_circuit/converter/ref2text/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + var/atom/A = incoming.data_as_type(/atom) + result = A && A.name + + outgoing.data = result + outgoing.push_data() + +/obj/item/integrated_circuit/converter/lowercase + name = "lowercase string converter" + desc = "this will cause a string to come out in all lowercase." + icon_state = "lowercase" + +/obj/item/integrated_circuit/converter/lowercase/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = lowertext(incoming.data) + + outgoing.data = result + outgoing.push_data() + +/obj/item/integrated_circuit/converter/uppercase + name = "uppercase string converter" + desc = "THIS WILL CAUSE A STRING TO COME OUT IN ALL UPPERCASE." + icon_state = "uppercase" + +/obj/item/integrated_circuit/converter/uppercase/do_work() + var/result = null + var/datum/integrated_io/incoming = inputs[1] + var/datum/integrated_io/outgoing = outputs[1] + if(incoming.data && istext(incoming.data)) + result = uppertext(incoming.data) + + outgoing.data = result + outgoing.push_data() + +/obj/item/integrated_circuit/converter/concatenatior + name = "concatenatior" + desc = "This joins many strings together to get one big string." + complexity = 4 + inputs = list("A","B","C","D","E","F","G","H") + outputs = list("result") + activators = list("concatenate") + +/obj/item/integrated_circuit/converter/concatenatior/do_work() + var/result = null + for(var/datum/integrated_io/input/I in inputs) + I.pull_data() + if(istext(I.data)) + result = result + I.data + + var/datum/integrated_io/outgoing = outputs[1] + outgoing.data = result + outgoing.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/coordinate.dm b/code/modules/integrated_electronics/coordinate.dm new file mode 100644 index 00000000000..b97a1c15469 --- /dev/null +++ b/code/modules/integrated_electronics/coordinate.dm @@ -0,0 +1,50 @@ +//This circuit gives information on where the machine is. +/obj/item/integrated_circuit/gps + name = "global positioning system" + desc = "This allows you to easily know the position of a machine containing this device." + icon_state = "gps" + complexity = 4 + inputs = list() + outputs = list("X (abs)", "Y (abs)") + activators = list("get coordinates") + +/obj/item/integrated_circuit/gps/do_work() + var/turf/T = get_turf(src) + var/datum/integrated_io/result_x = outputs[1] + var/datum/integrated_io/result_y = outputs[2] + + result_x.data = null + result_y.data = null + if(!T) + return + + result_x.data = T.x + result_y.data = T.y + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/abs_to_rel_coords + name = "abs to rel coordinate converter" + desc = "Easily convert absolute coordinates to relative coordinates with this." + complexity = 4 + inputs = list("X1 (abs)", "Y1 (abs)", "X2 (abs)", "Y2 (abs)") + outputs = list("X (rel)", "Y (rel)") + activators = list("compute rel coordinates") + +/obj/item/integrated_circuit/abs_to_rel_coords/do_work() + var/datum/integrated_io/x1 = inputs[1] + var/datum/integrated_io/y1 = inputs[2] + + var/datum/integrated_io/x2 = inputs[3] + var/datum/integrated_io/y2 = inputs[4] + + var/datum/integrated_io/result_x = outputs[1] + var/datum/integrated_io/result_y = outputs[2] + + if(x1.data && y1.data && x2.data && y2.data) + result_x.data = x1.data - x2.data + result_y.data = y1.data - y2.data + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/data_transfer.dm b/code/modules/integrated_electronics/data_transfer.dm new file mode 100644 index 00000000000..23ce3e5aeab --- /dev/null +++ b/code/modules/integrated_electronics/data_transfer.dm @@ -0,0 +1,71 @@ +/obj/item/integrated_circuit/transfer/splitter + name = "splitter" + desc = "Splits incoming data into all of the output pins." + icon_state = "splitter" + complexity = 3 + inputs = list("data to split") + outputs = list("A","B") + +/obj/item/integrated_circuit/transfer/splitter/medium + name = "four splitter" + icon_state = "splitter4" + complexity = 5 + outputs = list("A","B","C","D") + +/obj/item/integrated_circuit/transfer/splitter/large + name = "eight splitter" + icon_state = "splitter8" + complexity = 9 + outputs = list("A","B","C","D","E","F","G","H") + +/obj/item/integrated_circuit/transfer/splitter/do_work() + var/datum/integrated_io/I = inputs[1] + for(var/datum/integrated_io/output/O in outputs) + O.data = I.data + +/obj/item/integrated_circuit/transfer/activator_splitter + name = "activator splitter" + desc = "Splits incoming activation pulses into all of the output pins." + icon_state = "splitter" + complexity = 3 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B" + ) + +/obj/item/integrated_circuit/transfer/activator_splitter/do_work() + for(var/datum/integrated_io/activate/A in outputs) + if(A == activators[1]) + continue + if(A.linked.len) + for(var/datum/integrated_io/activate/target in A.linked) + target.holder.check_then_do_work() + +/obj/item/integrated_circuit/transfer/activator_splitter/medium + name = "four activator splitter" + icon_state = "splitter4" + complexity = 5 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D" + ) + +/obj/item/integrated_circuit/transfer/activator_splitter/large + name = "eight activator splitter" + icon_state = "splitter4" + complexity = 9 + activators = list( + "incoming pulse", + "outgoing pulse A", + "outgoing pulse B", + "outgoing pulse C", + "outgoing pulse D", + "outgoing pulse E", + "outgoing pulse F", + "outgoing pulse G", + "outgoing pulse H" + ) \ No newline at end of file diff --git a/code/modules/integrated_electronics/input_output.dm b/code/modules/integrated_electronics/input_output.dm new file mode 100644 index 00000000000..6568662dc9f --- /dev/null +++ b/code/modules/integrated_electronics/input_output.dm @@ -0,0 +1,448 @@ +/obj/item/integrated_circuit/input + var/can_be_asked_input = 0 + +/obj/item/integrated_circuit/input/proc/ask_for_input(mob/user) + return + +/obj/item/integrated_circuit/input/button + name = "button" + desc = "This tiny button must do something, right?" + icon_state = "button" + complexity = 1 + can_be_asked_input = 1 + inputs = list() + outputs = list() + activators = list("on pressed") + +/obj/item/integrated_circuit/input/button/ask_for_input(mob/user) //Bit misleading name for this specific use. + var/datum/integrated_io/A = activators[1] + if(A.linked.len) + for(var/datum/integrated_io/activate/target in A.linked) + target.holder.check_then_do_work() + to_chat(user, "You press the button labeled '[src.name]'.") + +/obj/item/integrated_circuit/input/numberpad + name = "number pad" + desc = "This small number pad allows someone to input a number into the system." + icon_state = "numberpad" + complexity = 2 + can_be_asked_input = 1 + inputs = list() + outputs = list("number entered") + activators = list("on entered") + +/obj/item/integrated_circuit/input/numberpad/ask_for_input(mob/user) + var/new_input = input(user, "Enter a number, please.","Number pad") as null|num + if(isnum(new_input) && CanInteract(user, physical_state)) + var/datum/integrated_io/O = outputs[1] + O.data = new_input + O.push_data() + var/datum/integrated_io/A = activators[1] + A.push_data() + +/obj/item/integrated_circuit/input/textpad + name = "text pad" + desc = "This small text pad allows someone to input a string into the system." + icon_state = "textpad" + complexity = 2 + can_be_asked_input = 1 + inputs = list() + outputs = list("string entered") + activators = list("on entered") + +/obj/item/integrated_circuit/input/textpad/ask_for_input(mob/user) + var/new_input = input(user, "Enter some words, please.","Number pad") as null|text + if(istext(new_input) && CanInteract(user, physical_state)) + var/datum/integrated_io/O = outputs[1] + O.data = new_input + O.push_data() + var/datum/integrated_io/A = activators[1] + A.push_data() + +/obj/item/integrated_circuit/input/med_scanner + name = "integrated medical analyser" + desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is." + icon_state = "medscan" + complexity = 4 + inputs = list("target ref") + outputs = list("total health %", "total missing health") + activators = list("scan") + +/obj/item/integrated_circuit/input/med_scanner/do_work() + var/datum/integrated_io/I = inputs[1] + var/mob/living/carbon/human/H = I.data_as_type(/mob/living/carbon/human) + if(!istype(H)) //Invalid input + return + if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. + var/total_health = round(H.health/H.maxHealth, 0.1)*100 + var/missing_health = H.maxHealth - H.health + + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] + + total.data = total_health + missing.data = missing_health + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/input/adv_med_scanner + name = "integrated advanced medical analyser" + desc = "A very small version of the common medical analyser. This allows the machine to know how healthy someone is. \ + This type is much more precise, allowing the machine to know much more about the target than a normal analyzer." + icon_state = "medscan_adv" + complexity = 12 + inputs = list("target ref") + outputs = list( + "total health %", + "total missing health", + "brute damage", + "burn damage", + "tox damage", + "oxy damage", + "clone damage" + ) + activators = list("scan") + +/obj/item/integrated_circuit/input/adv_med_scanner/do_work() + var/datum/integrated_io/I = inputs[1] + var/mob/living/carbon/human/H = I.data_as_type(/mob/living/carbon/human) + if(!istype(H)) //Invalid input + return + if(H.Adjacent(get_turf(src))) // Like normal analysers, it can't be used at range. + var/total_health = round(H.health/H.maxHealth, 0.1)*100 + var/missing_health = H.maxHealth - H.health + + var/datum/integrated_io/total = outputs[1] + var/datum/integrated_io/missing = outputs[2] + var/datum/integrated_io/brute = outputs[3] + var/datum/integrated_io/burn = outputs[4] + var/datum/integrated_io/tox = outputs[5] + var/datum/integrated_io/oxy = outputs[6] + var/datum/integrated_io/clone = outputs[7] + + total.data = total_health + missing.data = missing_health + brute.data = H.getBruteLoss() + burn.data = H.getFireLoss() + tox.data = H.getToxLoss() + oxy.data = H.getOxyLoss() + clone.data = H.getCloneLoss() + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() + +/obj/item/integrated_circuit/input/local_locator + name = "local locator" + desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \ + that is holding the machine containing it." + inputs = list() + outputs = list("located ref") + activators = list("locate") + +/obj/item/integrated_circuit/input/local_locator/do_work() + var/datum/integrated_io/O = outputs[1] + O.data = null + if(istype(src.loc, /obj/item/device/electronic_assembly)) // Check to make sure we're actually in a machine. + var/obj/item/device/electronic_assembly/assembly = src.loc + if(istype(assembly.loc, /mob/living)) // Now check if someone's holding us. + O.data = weakref(assembly.loc) + + O.push_data() + +/obj/item/integrated_circuit/input/adjacent_locator + name = "adjacent locator" + desc = "This is needed for certain devices that demand a reference for a target to act upon. This type only locates something \ + that is standing a meter away from the machine." + extended_desc = "The first pin requires a ref to a kind of object that you want the locator to acquire. This means that it will \ + give refs to nearby objects that are similar. If more than one valid object is found nearby, it will choose one of them at \ + random." + inputs = list("desired type ref") + outputs = list("located ref") + activators = list("locate") + +/obj/item/integrated_circuit/input/adjacent_locator/do_work() + var/datum/integrated_io/I = inputs[1] + var/datum/integrated_io/O = outputs[1] + O.data = null + + if(!isweakref(I.data)) + return + var/atom/A = I.data.resolve() + if(!A) + return + var/desired_type = A.type + + var/list/nearby_things = range(1, get_turf(src)) + var/list/valid_things = list() + for(var/atom/thing in nearby_things) + if(thing.type != desired_type) + continue + valid_things.Add(thing) + if(valid_things.len) + O.data = weakref(pick(valid_things)) + O.push_data() + +/obj/item/integrated_circuit/input/signaler + name = "integrated signaler" + desc = "Signals from a signaler can be received with this, allowing for remote control. Additionally, it can send signals as well." + extended_desc = "When a signal is received from another signaler, the 'on signal received' activator pin will be pulsed. \ + The two input pins are to configure the integrated signaler's settings. Note that the frequency should not have a decimal in it. \ + Meaning the default frequency is expressed as 1457, not 145.7. To send a signal, pulse the 'send signal' activator pin." + icon_state = "signal" + complexity = 4 + inputs = list("frequency","code") + outputs = list() + activators = list("send signal","on signal received") + + var/frequency = 1457 + var/code = 30 + var/datum/radio_frequency/radio_connection + +/obj/item/integrated_circuit/input/signaler/initialize() + ..() + set_frequency(frequency) + var/datum/integrated_io/new_freq = inputs[1] + var/datum/integrated_io/new_code = inputs[2] + // Set the pins so when someone sees them, they won't show as null + new_freq.data = frequency + new_code.data = code + +/obj/item/integrated_circuit/input/signaler/Destroy() + if(radio_controller) + radio_controller.remove_object(src,frequency) + frequency = 0 + . = ..() + +/obj/item/integrated_circuit/input/signaler/on_data_written() + var/datum/integrated_io/new_freq = inputs[1] + var/datum/integrated_io/new_code = inputs[2] + if(isnum(new_freq.data) && new_freq.data > 0) + set_frequency(new_freq.data) + if(isnum(new_code.data)) + code = new_code.data + + +/obj/item/integrated_circuit/input/signaler/do_work() // Sends a signal. + if(!radio_connection) + return + + var/datum/signal/signal = new() + signal.source = src + signal.encryption = code + signal.data["message"] = "ACTIVATE" + radio_connection.post_signal(src, signal) + +/obj/item/integrated_circuit/input/signaler/proc/set_frequency(new_frequency) + if(!frequency) + return + if(!radio_controller) + sleep(20) + if(!radio_controller) + return + radio_controller.remove_object(src, frequency) + frequency = new_frequency + radio_connection = radio_controller.add_object(src, frequency, RADIO_CHAT) + +/obj/item/integrated_circuit/input/signaler/receive_signal(datum/signal/signal) + var/datum/integrated_io/new_code = inputs[2] + var/code = 0 + + if(isnum(new_code.data)) + code = new_code.data + if(!signal) + return 0 + if(signal.encryption != code) + return 0 + if(signal.source == src) // Don't trigger ourselves. + return 0 + + var/datum/integrated_io/A = activators[2] + A.push_data() + + for(var/mob/O in hearers(1, get_turf(src))) + O.show_message(text("\icon[] *beep* *beep*", src), 3, "*beep* *beep*", 2) + +/obj/item/integrated_circuit/input/EPv2 + name = "\improper EPv2 circuit" + desc = "Enables the sending and receiving of messages on the Exonet with the EPv2 protocol." + extended_desc = "An EPv2 address is a string with the format of XXXX:XXXX:XXXX:XXXX. Data can be send or received using the \ + second pin on each side, with additonal data reserved for the third pin. When a message is received, the second activaiton pin \ + will pulse whatever's connected to it. Pulsing the first activation pin will send a message." + icon_state = "signal" + complexity = 4 + inputs = list("target EPv2 address", "data to send", "secondary text") + outputs = list("address received", "data received", "secondary text received") + activators = list("send data", "on data received") + var/datum/exonet_protocol/exonet = null + +/obj/item/integrated_circuit/input/EPv2/New() + ..() + exonet = new(src) + exonet.make_address("EPv2_circuit-\ref[src]") + desc += "
    This circuit's EPv2 address is: [exonet.address]." + +/obj/item/integrated_circuit/input/EPv2/Destroy() + if(exonet) + exonet.remove_address() + qdel(exonet) + ..() + +/obj/item/integrated_circuit/input/EPv2/do_work() + var/datum/integrated_io/target_address = inputs[1] + var/datum/integrated_io/message = inputs[2] + var/datum/integrated_io/text = inputs[3] + if(istext(target_address.data)) + exonet.send_message(target_address.data, message.data, text.data) + +/obj/item/integrated_circuit/input/receive_exonet_message(var/atom/origin_atom, var/origin_address, var/message, var/text) + var/datum/integrated_io/message_received = outputs[1] + var/datum/integrated_io/data_received = outputs[2] + var/datum/integrated_io/text_received = outputs[3] + + var/datum/integrated_io/A = activators[2] + A.push_data() + + message_received.write_data_to_pin(origin_address) + data_received.write_data_to_pin(message) + text_received.write_data_to_pin(text) + +/obj/item/integrated_circuit/output/screen + name = "screen" + desc = "This small screen can display a single piece of data, when the machine is examined closely." + icon_state = "screen" + inputs = list("displayed data") + outputs = list() + activators = list("load data") + var/stuff_to_display = null + +/obj/item/integrated_circuit/output/screen/do_work() + var/datum/integrated_io/I = inputs[1] + if(isweakref(I.data)) + var/datum/d = I.data_as_type(/datum) + if(d) + stuff_to_display = "[d]" + else + stuff_to_display = I.data + +/obj/item/integrated_circuit/output/light + name = "light" + desc = "This light can turn on and off on command." + icon_state = "light_adv" + complexity = 4 + inputs = list() + outputs = list() + activators = list("toggle light") + var/light_toggled = 0 + var/light_brightness = 3 + var/light_rgb = "#FFFFFF" + +/obj/item/integrated_circuit/output/light/do_work() + light_toggled = !light_toggled + update_lighting() + +/obj/item/integrated_circuit/output/light/proc/update_lighting() + if(light_toggled) + set_light(l_range = light_brightness, l_power = light_brightness, l_color = light_rgb) + else + set_light(0) + +/obj/item/integrated_circuit/output/light/advanced/update_lighting() + var/datum/integrated_io/R = inputs[1] + var/datum/integrated_io/G = inputs[2] + var/datum/integrated_io/B = inputs[3] + var/datum/integrated_io/brightness = inputs[4] + + if(isnum(R.data) && isnum(G.data) && isnum(B.data) && isnum(brightness.data)) + R.data = Clamp(R.data, 0, 255) + G.data = Clamp(G.data, 0, 255) + B.data = Clamp(B.data, 0, 255) + brightness.data = Clamp(brightness.data, 0, 6) + light_rgb = rgb(R.data, G.data, B.data) + light_brightness = brightness.data + + ..() + +/obj/item/integrated_circuit/output/light/advanced + name = "advanced light" + desc = "This light can turn on and off on command, in any color, and in various brightness levels." + icon_state = "light_adv" + complexity = 8 + inputs = list( + "R", + "G", + "B", + "Brightness" + ) + outputs = list() + +/obj/item/integrated_circuit/output/light/advanced/on_data_written() + update_lighting() + +/obj/item/integrated_circuit/output/sound + name = "speaker circuit" + desc = "A miniature speaker is attached to this component." + icon_state = "speaker" + complexity = 8 + cooldown_per_use = 4 SECONDS + inputs = list( + "sound ID", + "volume", + "frequency" + ) + outputs = list() + activators = list("play sound") + var/list/sounds = list() + category = /obj/item/integrated_circuit/output/sound + +/obj/item/integrated_circuit/output/sound/New() + ..() + extended_desc = list() + extended_desc += "The first input pin determines which sound is used. The choices are; " + extended_desc += jointext(sounds, ", ") + extended_desc += ". The second pin determines the volume of sound that is played" + extended_desc += ", and the third determines if the frequency of the sound will vary with each activation." + extended_desc = jointext(extended_desc, null) + +/obj/item/integrated_circuit/output/sound/do_work() + var/datum/integrated_io/ID = inputs[1] + var/datum/integrated_io/vol = inputs[2] + var/datum/integrated_io/frequency = inputs[3] + if(istext(ID.data) && isnum(vol.data) && isnum(frequency.data)) + var/selected_sound = sounds[ID.data] + if(!selected_sound) + world << "No sound" + return + vol.data = Clamp(vol.data, 0, 100) + frequency.data = round(Clamp(frequency.data, 0, 1)) + playsound(get_turf(src), selected_sound, vol.data, frequency.data, -1) + +/obj/item/integrated_circuit/output/sound/beeper + name = "beeper circuit" + desc = "A miniature speaker is attached to this component. This is often used in the construction of motherboards, which use \ + the speaker to tell the user if something goes very wrong when booting up. It can also do other similar synthetic sounds such \ + as buzzing, pinging, chiming, and more." + sounds = list( + "beep" = 'sound/machines/twobeep.ogg', + "chime" = 'sound/machines/chime.ogg', + "buzz sigh" = 'sound/machines/buzz-sigh.ogg', + "buzz twice" = 'sound/machines/buzz-two.ogg', + "ping" = 'sound/machines/ping.ogg', + "synth yes" = 'sound/machines/synth_yes.ogg', + "synth no" = 'sound/machines/synth_no.ogg', + "warning buzz" = 'sound/machines/warning-buzzer.ogg' + ) + +/obj/item/integrated_circuit/output/sound/beepsky + name = "securitron sound circuit" + desc = "A miniature speaker is attached to this component. Considered by some to be the essential component for a securitron." + sounds = list( + "creep" = 'sound/voice/bcreep.ogg', + "criminal" = 'sound/voice/bcriminal.ogg', + "freeze" = 'sound/voice/bfreeze.ogg', + "god" = 'sound/voice/bgod.ogg', + "i am the law" = 'sound/voice/biamthelaw.ogg', + "insult" = 'sound/voice/binsult.ogg', + "radio" = 'sound/voice/bradio.ogg', + "secure day" = 'sound/voice/bsecureday.ogg', + ) \ No newline at end of file diff --git a/code/modules/integrated_electronics/logic.dm b/code/modules/integrated_electronics/logic.dm new file mode 100644 index 00000000000..cb4fc55f358 --- /dev/null +++ b/code/modules/integrated_electronics/logic.dm @@ -0,0 +1,106 @@ +/obj/item/integrated_circuit/logic + name = "logic gate" + desc = "This tiny chip will decide for you!" + extended_desc = "Logic circuits will treat a null, 0, and a \"\" string value as FALSE and anything else as TRUE." + complexity = 3 + outputs = list("result") + activators = list("compare", "on true result") + category = /obj/item/integrated_circuit/logic + +/obj/item/integrated_circuit/logic/do_work() + var/datum/integrated_io/O = outputs[1] + var/datum/integrated_io/P = activators[2] + O.push_data() + if(O.data) + P.push_data() + +/obj/item/integrated_circuit/logic/binary + inputs = list("A","B") + category = /obj/item/integrated_circuit/logic/binary + +/obj/item/integrated_circuit/logic/binary/do_work() + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/B = inputs[2] + var/datum/integrated_io/O = outputs[1] + O.data = do_compare(A, B) ? TRUE : FALSE + ..() + +/obj/item/integrated_circuit/logic/binary/proc/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return FALSE + +/obj/item/integrated_circuit/logic/unary + inputs = list("A") + category = /obj/item/integrated_circuit/logic/unary + +/obj/item/integrated_circuit/logic/unary/do_work() + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/O = outputs[1] + O.data = do_check(A) ? TRUE : FALSE + ..() + +/obj/item/integrated_circuit/logic/unary/proc/do_check(var/datum/integrated_io/A) + return FALSE + +/obj/item/integrated_circuit/logic/binary/equals + name = "equal gate" + desc = "This gate compares two values, and outputs the number one if both are the same." + icon_state = "equal" + +/obj/item/integrated_circuit/logic/binary/equals/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data == B.data + +/obj/item/integrated_circuit/logic/binary/and + name = "and gate" + desc = "This gate will output 'one' if both inputs evaluate to true." + icon_state = "and" + +/obj/item/integrated_circuit/logic/binary/and/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data && B.data + +/obj/item/integrated_circuit/logic/binary/or + name = "or gate" + desc = "This gate will output 'one' if one of the inputs evaluate to true." + icon_state = "or" + +/obj/item/integrated_circuit/logic/binary/or/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data || B.data + +/obj/item/integrated_circuit/logic/binary/less_than + name = "less than gate" + desc = "This will output 'one' if the first input is less than the second input." + icon_state = "less_than" + +/obj/item/integrated_circuit/logic/binary/less_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data < B.data + +/obj/item/integrated_circuit/logic/binary/less_than_or_equal + name = "less than or equal gate" + desc = "This will output 'one' if the first input is less than, or equal to the second input." + icon_state = "less_than_or_equal" + +/obj/item/integrated_circuit/logic/binary/less_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data <= B.data + +/obj/item/integrated_circuit/logic/binary/greater_than + name = "greater than gate" + desc = "This will output 'one' if the first input is greater than the second input." + icon_state = "greater_than" + +/obj/item/integrated_circuit/logic/binary/greater_than/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data > B.data + +/obj/item/integrated_circuit/logic/binary/greater_than_or_equal + name = "greater_than or equal gate" + desc = "This will output 'one' if the first input is greater than, or equal to the second input." + icon_state = "greater_than_or_equal" + +/obj/item/integrated_circuit/logic/binary/greater_than_or_equal/do_compare(var/datum/integrated_io/A, var/datum/integrated_io/B) + return A.data >= B.data + +/obj/item/integrated_circuit/logic/unary/not + name = "not gate" + desc = "This gate inverts what's fed into it." + icon_state = "not" + +/obj/item/integrated_circuit/logic/unary/not/do_check(var/datum/integrated_io/A) + return !A.data \ No newline at end of file diff --git a/code/modules/integrated_electronics/manipulation.dm b/code/modules/integrated_electronics/manipulation.dm new file mode 100644 index 00000000000..bad3944e8ee --- /dev/null +++ b/code/modules/integrated_electronics/manipulation.dm @@ -0,0 +1,263 @@ +/obj/item/integrated_circuit/manipulation/weapon_firing + name = "weapon firing mechanism" + desc = "This somewhat complicated system allows one to slot in a gun, direct it towards a position, and remotely fire it." + extended_desc = "The firing mechanism can slot in most ranged weapons, ballistic and energy. \ + The first and second inputs need to be numbers. They are coordinates for the gun to fire at, relative to the machine itself. \ + The 'fire' activator will cause the mechanism to attempt to fire the weapon at the coordinates, if possible. Note that the \ + normal limitations to firearms, such as ammunition requirements and firing delays, still hold true if fired by the mechanism." + complexity = 20 + inputs = list( + "target X rel", + "target Y rel" + ) + outputs = list() + activators = list( + "fire" + ) + var/obj/item/weapon/gun/installed_gun = null + +/obj/item/integrated_circuit/manipulation/weapon_firing/Destroy() + qdel(installed_gun) + ..() + +/obj/item/integrated_circuit/manipulation/weapon_firing/attackby(var/obj/O, var/mob/user) + if(istype(O, /obj/item/weapon/gun)) + var/obj/item/weapon/gun/gun = O + if(installed_gun) + user << "There's already a weapon installed." + return + user.drop_from_inventory(gun) + installed_gun = gun + gun.forceMove(src) + user << "You slide \the [gun] into the firing mechanism." + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + else + ..() + +/obj/item/integrated_circuit/manipulation/weapon_firing/attack_self(var/mob/user) + if(installed_gun) + installed_gun.forceMove(get_turf(src)) + user << "You slide \the [installed_gun] out of the firing mechanism." + playsound(src.loc, 'sound/items/Crowbar.ogg', 50, 1) + installed_gun = null + else + user << "There's no weapon to remove from the mechanism." + +/obj/item/integrated_circuit/manipulation/weapon_firing/do_work() + if(..()) + if(!installed_gun) + return + + var/datum/integrated_io/target_x = inputs[1] + var/datum/integrated_io/target_y = inputs[2] + + if(target_x.data && target_y.data && isnum(target_x.data) && isnum(target_y.data)) + var/turf/T = get_turf(src) + + if(target_x.data == 0 && target_y.data == 0) // Don't shoot ourselves. + return + + // We need to do this in order to enable relative coordinates, as locate() only works for absolute coordinates. + var/i + if(target_x.data > 0) + i = abs(target_x.data) + while(i) + T = get_step(T, EAST) + i-- + else if(target_x.data < 0) + i = abs(target_x.data) + while(i) + T = get_step(T, WEST) + i-- + + if(target_y.data > 0) + i = abs(target_y.data) + while(i) + T = get_step(T, NORTH) + i-- + else if(target_y.data < 0) + i = abs(target_y.data) + while(i) + T = get_step(T, SOUTH) + i-- + + if(!T) + return + installed_gun.Fire_userless(T) + +/obj/item/integrated_circuit/manipulation/smoke + name = "smoke generator" + desc = "Unlike most electronics, creating smoke is completely intentional." + icon_state = "smoke" + extended_desc = "This smoke generator creates clouds of smoke on command. It can also hold liquids inside, which will go \ + into the smoke clouds when activated." + flags = OPENCONTAINER + complexity = 20 + cooldown_per_use = 30 SECONDS + inputs = list() + outputs = list() + activators = list("create smoke") + +/obj/item/integrated_circuit/manipulation/smoke/New() + ..() + create_reagents(100) + +/obj/item/integrated_circuit/manipulation/smoke/do_work() + playsound(src.loc, 'sound/effects/smoke.ogg', 50, 1, -3) + var/datum/effect/effect/system/smoke_spread/chem/smoke_system = new() + smoke_system.set_up(reagents, 10, 0, get_turf(src)) + spawn(0) + for(var/i = 1 to 8) + smoke_system.start() + reagents.clear_reagents() + +/obj/item/integrated_circuit/manipulation/injector + name = "integrated hypo-injector" + desc = "This scary looking thing is able to pump liquids into whatever it's pointed at." + icon_state = "injector" + extended_desc = "This autoinjector can push reagents into another container or someone else outside of the machine. The target \ + must be adjacent to the machine, and if it is a person, they cannot be wearing thick clothing." + flags = OPENCONTAINER + complexity = 20 + cooldown_per_use = 6 SECONDS + inputs = list("target ref", "injection amount" = 5) + outputs = list() + activators = list("inject") + +/obj/item/integrated_circuit/manipulation/injector/New() + ..() + create_reagents(30) + +/obj/item/integrated_circuit/manipulation/injector/proc/inject_amount() + var/datum/integrated_io/amount = inputs[2] + if(isnum(amount.data)) + return Clamp(amount.data, 0, 30) + +/obj/item/integrated_circuit/manipulation/injector/do_work() + set waitfor = 0 // Don't sleep in a proc that is called by a processor without this set, otherwise it'll delay the entire thing + + var/datum/integrated_io/target = inputs[1] + var/atom/movable/AM = target.data_as_type(/atom/movable) + if(!istype(AM)) //Invalid input + return + if(!reagents.total_volume) // Empty + return + if(AM.can_be_injected_by(src)) + if(isliving(AM)) + var/turf/T = get_turf(AM) + T.visible_message("[src] is trying to inject [AM]!") + sleep(3 SECONDS) + if(!AM.can_be_injected_by(src)) + return + var/contained = reagents.get_reagents() + var/trans = reagents.trans_to_mob(target, inject_amount(), CHEM_BLOOD) + message_admins("[src] injected \the [AM] with [trans]u of [contained].") + to_chat(AM, "You feel a tiny prick!") + visible_message("[src] injects [AM]!") + else + reagents.trans_to(AM, inject_amount()) + +/obj/item/integrated_circuit/manipulation/reagent_pump + name = "reagent pump" + desc = "Moves liquids safely inside a machine, or even nearby it." + icon_state = "reagent_pump" + extended_desc = "This is a pump, which will move liquids from the source ref to the target ref. The third pin determines \ + how much liquid is moved per pulse, between 0 and 50. The pump can move reagents to any open container inside the machine, or \ + outside the machine if it is next to the machine. Note that this cannot be used on entities." + flags = OPENCONTAINER + complexity = 8 + inputs = list("source ref", "target ref", "injection amount" = 10) + outputs = list() + activators = list("transfer reagents") + var/transfer_amount = 10 + +/obj/item/integrated_circuit/manipulation/reagent_pump/on_data_written() + var/datum/integrated_io/amount = inputs[3] + if(isnum(amount.data)) + amount.data = Clamp(amount.data, 0, 50) + transfer_amount = amount.data + +/obj/item/integrated_circuit/manipulation/reagent_pump/do_work() + var/datum/integrated_io/A = inputs[1] + var/datum/integrated_io/B = inputs[2] + var/atom/movable/source = A.data_as_type(/atom/movable) + var/atom/movable/target = B.data_as_type(/atom/movable) + if(!istype(source) || !istype(target)) //Invalid input + return + var/turf/T = get_turf(src) + if(source.Adjacent(T) && target.Adjacent(T)) + if(!source.reagents || !target.reagents) + return + if(ismob(source) || ismob(target)) + return + if(!source.is_open_container() || !target.is_open_container()) + return + if(!source.reagents.get_free_space() || !target.reagents.get_free_space()) + return + + source.reagents.trans_to(target, transfer_amount) + +// May make a reagent subclass of circuits in future. +/obj/item/integrated_circuit/manipulation/reagent_storage + name = "reagent storage" + desc = "Stores liquid inside, and away from electrical components. Can store up to 60u." + icon_state = "reagent_storage" + extended_desc = "This is effectively an internal beaker." + flags = OPENCONTAINER + complexity = 4 + inputs = list() + outputs = list("volume used") + activators = list() + +/obj/item/integrated_circuit/manipulation/reagent_storage/New() + ..() + create_reagents(60) + +/obj/item/integrated_circuit/manipulation/reagent_storage/on_reagent_change() + var/datum/integrated_io/A = outputs[1] + A.data = reagents.total_volume + A.push_data() + +/obj/item/integrated_circuit/manipulation/reagent_storage/cryo + name = "cryo reagent storage" + desc = "Stores liquid inside, and away from electrical components. Can store up to 60u. This will also suppress reactions." + icon_state = "reagent_storage_cryo" + extended_desc = "This is effectively an internal cryo beaker." + flags = OPENCONTAINER | NOREACT + complexity = 8 + inputs = list() + outputs = list("volume used") + activators = list() + +/obj/item/integrated_circuit/manipulation/locomotion + name = "locomotion circuit" + desc = "This allows a machine to move in a given direction." + icon_state = "locomotion" + extended_desc = "The circuit accepts a number as a direction to move towards.
    \ + North/Fore = 1,
    \ + South/Aft = 2,
    \ + East/Starboard = 4,
    \ + West/Port = 8,
    \ + Northeast = 5,
    \ + Northwest = 9,
    \ + Southeast = 6,
    \ + Southwest = 10
    \ +
    \ + Pulsing the 'step towards dir' activator pin will cause the machine to move a meter in that direction, assuming it is not \ + being held, or anchored in some way. It should be noted that heavy machines will be unable to move." + complexity = 20 + inputs = list("dir num") + outputs = list() + activators = list("step towards dir") + +/obj/item/integrated_circuit/manipulation/locomotion/do_work() + ..() + var/turf/T = get_turf(src) + if(T && istype(loc, /obj/item/device/electronic_assembly)) + var/obj/item/device/electronic_assembly/machine = loc + if(machine.anchored || machine.w_class >= ITEMSIZE_LARGE) + return + if(machine.loc == T) // Check if we're held by someone. If the loc is the floor, we're not held. + var/datum/integrated_io/wanted_dir = inputs[1] + if(isnum(wanted_dir.data)) + step(machine, wanted_dir.data) \ No newline at end of file diff --git a/code/modules/integrated_electronics/memory.dm b/code/modules/integrated_electronics/memory.dm new file mode 100644 index 00000000000..aa628432098 --- /dev/null +++ b/code/modules/integrated_electronics/memory.dm @@ -0,0 +1,153 @@ +/obj/item/integrated_circuit/memory + name = "memory chip" + desc = "This tiny chip can store one piece of data." + icon_state = "memory" + complexity = 1 + inputs = list("input pin 1") + outputs = list("output pin 1") + activators = list("set") + category = /obj/item/integrated_circuit/memory + +/obj/item/integrated_circuit/memory/examine(mob/user) + ..() + var/i + for(i = 1, i <= outputs.len, i++) + var/datum/integrated_io/O = outputs[i] + var/data = "nothing" + if(isweakref(O.data)) + var/datum/d = O.data_as_type(/datum) + if(d) + data = "[d]" + else if(!isnull(O.data)) + data = O.data + to_chat(user, "\The [src] has [data] saved to address [i].") + +/obj/item/integrated_circuit/memory/do_work() + for(var/i = 1 to inputs.len) + var/datum/integrated_io/I = inputs[i] + var/datum/integrated_io/O = outputs[i] + O.data = I.data + +/obj/item/integrated_circuit/memory/medium + name = "memory circuit" + desc = "This circuit can store four pieces of data." + icon_state = "memory4" + complexity = 4 + inputs = list("input pin 1","input pin 2","input pin 3","input pin 4") + outputs = list("output pin 1","output pin 2","output pin 3","output pin 4") + +/obj/item/integrated_circuit/memory/large + name = "large memory circuit" + desc = "This big circuit can hold eight pieces of data." + icon_state = "memory8" + complexity = 8 + inputs = list( + "input pin 1", + "input pin 2", + "input pin 3", + "input pin 4", + "input pin 5", + "input pin 6", + "input pin 7", + "input pin 8") + outputs = list( + "output pin 1", + "output pin 2", + "output pin 3", + "output pin 4", + "output pin 5", + "output pin 6", + "output pin 7", + "output pin 8") + +/obj/item/integrated_circuit/memory/huge + name = "large memory stick" + desc = "This stick of memory can hold up up to sixteen pieces of data." + icon_state = "memory16" + complexity = 16 + inputs = list( + "input pin 1", + "input pin 2", + "input pin 3", + "input pin 4", + "input pin 5", + "input pin 6", + "input pin 7", + "input pin 8", + "input pin 9", + "input pin 10", + "input pin 11", + "input pin 12", + "input pin 13", + "input pin 14", + "input pin 15", + "input pin 16" + ) + outputs = list( + "output pin 1", + "output pin 2", + "output pin 3", + "output pin 4", + "output pin 5", + "output pin 6", + "output pin 7", + "output pin 8", + "output pin 9", + "output pin 10", + "output pin 11", + "output pin 12", + "output pin 13", + "output pin 14", + "output pin 15", + "output pin 16") + +/obj/item/integrated_circuit/memory/constant + name = "constant chip" + desc = "This tiny chip can store one piece of data, which cannot be overwritten without disassembly." + icon_state = "memory" + complexity = 1 + inputs = list() + outputs = list("output pin") + activators = list("push data") + var/accepting_refs = 0 + +/obj/item/integrated_circuit/memory/constant/do_work() + var/datum/integrated_io/O = outputs[1] + O.push_data() + +/obj/item/integrated_circuit/memory/constant/attack_self(mob/user) + var/datum/integrated_io/O = outputs[1] + var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") + if(!CanInteract(user, physical_state)) + return + + var/new_data = null + switch(type_to_use) + if("string") + accepting_refs = 0 + new_data = input("Now type in a string.","[src] string writing") as null|text + if(istext(new_data) && CanInteract(user, physical_state)) + O.data = new_data + to_chat(user, "You set \the [src]'s memory to [O.display_data()].") + if("number") + accepting_refs = 0 + new_data = input("Now type in a number.","[src] number writing") as null|num + if(isnum(new_data) && CanInteract(user, physical_state)) + O.data = new_data + to_chat(user, "You set \the [src]'s memory to [O.display_data()].") + if("ref") + accepting_refs = 1 + to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ + an object for a ref of that object to save it in memory.") + if("null") + O.data = null + to_chat(user, "You set \the [src]'s memory to absolutely nothing.") + +/obj/item/integrated_circuit/memory/constant/afterattack(atom/target, mob/living/user, proximity) + if(accepting_refs && proximity) + var/datum/integrated_io/O = outputs[1] + O.data = weakref(target) + visible_message("[user] slides \a [src]'s over \the [target].") + to_chat(user, "You set \the [src]'s memory to a reference to [O.display_data()]. The ref scanner is \ + now off.") + accepting_refs = 0 \ No newline at end of file diff --git a/code/modules/integrated_electronics/time.dm b/code/modules/integrated_electronics/time.dm new file mode 100644 index 00000000000..f351f865902 --- /dev/null +++ b/code/modules/integrated_electronics/time.dm @@ -0,0 +1,138 @@ +/obj/item/integrated_circuit/time + name = "time circuit" + desc = "Now you can build your own clock!" + complexity = 2 + inputs = list() + outputs = list() + category = /obj/item/integrated_circuit/time + +/obj/item/integrated_circuit/time/delay + name = "two-sec delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit is set to send a pulse after a delay of two seconds." + icon_state = "delay-20" + var/delay = 2 SECONDS + activators = list("incoming pulse","outgoing pulse") + +/obj/item/integrated_circuit/time/delay/do_work() + set waitfor = 0 // Don't sleep in a proc that is called by a processor. It'll delay the entire thing + + var/datum/integrated_io/out_pulse = activators[2] + sleep(delay) + out_pulse.push_data() + +/obj/item/integrated_circuit/time/delay/five_sec + name = "five-sec delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit is set to send a pulse after a delay of five seconds." + icon_state = "delay-50" + delay = 5 SECONDS + +/obj/item/integrated_circuit/time/delay/one_sec + name = "one-sec delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit is set to send a pulse after a delay of one second." + icon_state = "delay-10" + delay = 1 SECOND + +/obj/item/integrated_circuit/time/delay/half_sec + name = "half-sec delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit is set to send a pulse after a delay of half a second." + icon_state = "delay-5" + delay = 5 + +/obj/item/integrated_circuit/time/delay/tenth_sec + name = "tenth-sec delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit is set to send a pulse after a delay of 1/10th of a second." + icon_state = "delay-1" + delay = 1 + +/obj/item/integrated_circuit/time/delay/custom + name = "custom delay circuit" + desc = "This sends a pulse signal out after a delay, critical for ensuring proper control flow in a complex machine. \ + This circuit's delay can be customized, between 1/10th of a second to one hour. The delay is updated upon receiving a pulse." + icon_state = "delay" + inputs = list("delay time") + +/obj/item/integrated_circuit/time/delay/custom/do_work() + var/datum/integrated_io/delay_input = inputs[1] + if(delay_input.data && isnum(delay_input.data) ) + var/new_delay = min(delay_input.data, 1) + new_delay = max(new_delay, 36000) //An hour. + delay = new_delay + + ..() + +/obj/item/integrated_circuit/time/ticker + name = "ticker circuit" + desc = "This circuit sends an automatic pulse every four seconds." + icon_state = "tick-m" + complexity = 8 + var/ticks_to_pulse = 4 + var/ticks_completed = 0 + var/is_running = FALSE + inputs = list("enable ticking") + activators = list("outgoing pulse") + +/obj/item/integrated_circuit/time/ticker/Destroy() + if(is_running) + processing_objects -= src + . = ..() + +/obj/item/integrated_circuit/time/ticker/on_data_written() + var/datum/integrated_io/do_tick = inputs[1] + if(do_tick.data && !is_running) + is_running = TRUE + processing_objects |= src + else if(is_running) + is_running = FALSE + processing_objects -= src + ticks_completed = 0 + +/obj/item/integrated_circuit/time/ticker/process() + var/process_ticks = process_schedule_interval("obj") + ticks_completed += process_ticks + if(ticks_completed >= ticks_to_pulse) + if(ticks_to_pulse >= process_ticks) + ticks_completed -= ticks_to_pulse + else + ticks_completed = 0 + var/datum/integrated_io/pulser = activators[1] + pulser.push_data() + +/obj/item/integrated_circuit/time/ticker/fast + name = "fast ticker" + desc = "This advanced circuit sends an automatic pulse every two seconds." + icon_state = "tick-f" + complexity = 12 + ticks_to_pulse = 2 + +/obj/item/integrated_circuit/time/ticker/slow + name = "slow ticker" + desc = "This simple circuit sends an automatic pulse every six seconds." + icon_state = "tick-s" + complexity = 4 + ticks_to_pulse = 6 + +/obj/item/integrated_circuit/time/clock + name = "integrated clock" + desc = "Tells you what the local time is, specific to your station or planet." + icon_state = "clock" + inputs = list() + outputs = list("time (string)", "hours (number)", "minutes (number)", "seconds (number)") + +/obj/item/integrated_circuit/time/clock/do_work() + var/datum/integrated_io/time = outputs[1] + var/datum/integrated_io/hour = outputs[2] + var/datum/integrated_io/min = outputs[3] + var/datum/integrated_io/sec = outputs[4] + + time.data = time2text(station_time_in_ticks, "hh:mm:ss") + hour.data = text2num(time2text(station_time_in_ticks, "hh")) + min.data = text2num(time2text(station_time_in_ticks, "mm")) + sec.data = text2num(time2text(station_time_in_ticks, "ss")) + + for(var/datum/integrated_io/output/O in outputs) + O.push_data() \ No newline at end of file diff --git a/code/modules/integrated_electronics/tools.dm b/code/modules/integrated_electronics/tools.dm new file mode 100644 index 00000000000..e996fae872e --- /dev/null +++ b/code/modules/integrated_electronics/tools.dm @@ -0,0 +1,226 @@ +#define WIRE "wire" +#define WIRING "wiring" +#define UNWIRE "unwire" +#define UNWIRING "unwiring" + + +/obj/item/device/integrated_electronics/wirer + name = "circuit wirer" + desc = "It's a small wiring tool, with a wire roll, electric soldering iron, wire cutter, and more in one package. \ + The wires used are generally useful for small electronics, such as circuitboards and breadboards, as opposed to larger wires \ + used for power or data transmission." + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "wirer-wire" + flags = CONDUCT + w_class = 2 + var/datum/integrated_io/selected_io = null + var/mode = WIRE + +/obj/item/device/integrated_electronics/wirer/update_icon() + icon_state = "wirer-[mode]" + +/obj/item/device/integrated_electronics/wirer/proc/wire(var/datum/integrated_io/io, mob/user) + if(mode == WIRE) + selected_io = io + to_chat(user, "You attach a data wire to \the [selected_io.holder]'s [selected_io.name] data channel.") + mode = WIRING + update_icon() + else if(mode == WIRING) + if(io == selected_io) + to_chat(user, "Wiring \the [selected_io.holder]'s [selected_io.name] into itself is rather pointless.") + return + if(io.io_type != selected_io.io_type) + to_chat(user, "Those two types of channels are incompatable. The first is a [selected_io.io_type], \ + while the second is a [io.io_type].") + return + selected_io.linked |= io + io.linked |= selected_io + + to_chat(user, "You connect \the [selected_io.holder]'s [selected_io.name] to \the [io.holder]'s [io.name].") + mode = WIRE + update_icon() + selected_io.holder.interact(user) // This is to update the UI. + selected_io = null + + else if(mode == UNWIRE) + selected_io = io + if(!io.linked.len) + to_chat(user, "There is nothing connected to \the [selected_io] data channel.") + selected_io = null + return + to_chat(user, "You prepare to detach a data wire from \the [selected_io.holder]'s [selected_io.name] data channel.") + mode = UNWIRING + update_icon() + return + + else if(mode == UNWIRING) + if(io == selected_io) + to_chat(user, "You can't wire a pin into each other, so unwiring \the [selected_io.holder] from \ + the same pin is rather moot.") + return + if(selected_io in io.linked) + io.linked.Remove(selected_io) + selected_io.linked.Remove(io) + to_chat(user, "You disconnect \the [selected_io.holder]'s [selected_io.name] from \ + \the [io.holder]'s [io.name].") + selected_io.holder.interact(user) // This is to update the UI. + selected_io = null + mode = UNWIRE + update_icon() + else + to_chat(user, "\The [selected_io.holder]'s [selected_io.name] and \the [io.holder]'s \ + [io.name] are not connected.") + return + return + +/obj/item/device/integrated_electronics/wirer/attack_self(mob/user) + switch(mode) + if(WIRE) + mode = UNWIRE + if(WIRING) + if(selected_io) + to_chat(user, "You decide not to wire the data channel.") + selected_io = null + mode = WIRE + if(UNWIRE) + mode = WIRE + if(UNWIRING) + if(selected_io) + to_chat(user, "You decide not to disconnect the data channel.") + selected_io = null + mode = UNWIRE + update_icon() + to_chat(user, "You set \the [src] to [mode].") + +#undef WIRE +#undef WIRING +#undef UNWIRE +#undef UNWIRING + +/obj/item/device/integrated_electronics/debugger + name = "circuit debugger" + desc = "This small tool allows one working with custom machinery to directly set data to a specific pin, useful for writing \ + settings to specific circuits, or for debugging purposes. It can also pulse activation pins." + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "debugger" + flags = CONDUCT + w_class = 2 + var/data_to_write = null + var/accepting_refs = 0 + +/obj/item/device/integrated_electronics/debugger/attack_self(mob/user) + var/type_to_use = input("Please choose a type to use.","[src] type setting") as null|anything in list("string","number","ref", "null") + if(!CanInteract(user, physical_state)) + return + + var/new_data = null + switch(type_to_use) + if("string") + accepting_refs = 0 + new_data = input("Now type in a string.","[src] string writing") as null|text + if(istext(new_data) && CanInteract(user, physical_state)) + data_to_write = new_data + to_chat(user, "You set \the [src]'s memory to \"[new_data]\".") + if("number") + accepting_refs = 0 + new_data = input("Now type in a number.","[src] number writing") as null|num + if(isnum(new_data) && CanInteract(user, physical_state)) + data_to_write = new_data + to_chat(user, "You set \the [src]'s memory to [new_data].") + if("ref") + accepting_refs = 1 + to_chat(user, "You turn \the [src]'s ref scanner on. Slide it across \ + an object for a ref of that object to save it in memory.") + if("null") + data_to_write = null + to_chat(user, "You set \the [src]'s memory to absolutely nothing.") + +/obj/item/device/integrated_electronics/debugger/afterattack(atom/target, mob/living/user, proximity) + if(accepting_refs && proximity) + data_to_write = weakref(target) + visible_message("[user] slides \a [src]'s over \the [target].") + to_chat(user, "You set \the [src]'s memory to a reference to [target.name] \[Ref\]. The ref scanner is \ + now off.") + accepting_refs = 0 + +/obj/item/device/integrated_electronics/debugger/proc/write_data(var/datum/integrated_io/io, mob/user) + if(io.io_type == DATA_CHANNEL) + io.write_data_to_pin(data_to_write) + var/data_to_show = data_to_write + if(isweakref(data_to_write)) + var/weakref/w = data_to_write + var/atom/A = w.resolve() + data_to_show = A.name + to_chat(user, "You write '[data_to_write ? data_to_show : "NULL"]' to the '[io]' pin of \the [io.holder].") + else if(io.io_type == PULSE_CHANNEL) + io.holder.check_then_do_work() + to_chat(user, "You pulse \the [io.holder]'s [io].") + + io.holder.interact(user) // This is to update the UI. + +/obj/item/weapon/storage/bag/circuits + name = "circuit kit" + desc = "This kit's essential for any circuitry projects." + icon = 'icons/obj/electronic_assemblies.dmi' + icon_state = "circuit_kit" + w_class = 3 + display_contents_with_number = 1 + +/obj/item/weapon/storage/bag/circuits/basic/New() + ..() + var/list/types_to_spawn = typesof(/obj/item/integrated_circuit/arithmetic, + /obj/item/integrated_circuit/logic, + /obj/item/integrated_circuit/memory, + ) - list(/obj/item/integrated_circuit/arithmetic, + /obj/item/integrated_circuit/memory, + /obj/item/integrated_circuit/logic, + ) + + types_to_spawn.Add(/obj/item/integrated_circuit/input/numberpad, + /obj/item/integrated_circuit/input/textpad, + /obj/item/integrated_circuit/input/button, + /obj/item/integrated_circuit/input/signaler, + /obj/item/integrated_circuit/input/local_locator, + /obj/item/integrated_circuit/output/screen, + /obj/item/integrated_circuit/converter/num2text, + /obj/item/integrated_circuit/converter/text2num, + /obj/item/integrated_circuit/converter/uppercase, + /obj/item/integrated_circuit/converter/lowercase, + /obj/item/integrated_circuit/time/delay/five_sec, + /obj/item/integrated_circuit/time/delay/one_sec, + /obj/item/integrated_circuit/time/delay/half_sec, + /obj/item/integrated_circuit/time/delay/tenth_sec, + /obj/item/integrated_circuit/time/ticker/slow, + /obj/item/integrated_circuit/time/clock + ) + + for(var/thing in types_to_spawn) + var/obj/item/integrated_circuit/ic = thing + if(initial(ic.category) == thing) + continue + + for(var/i = 1 to 4) + new thing(src) + + new /obj/item/device/electronic_assembly(src) + new /obj/item/device/integrated_electronics/wirer(src) + new /obj/item/device/integrated_electronics/debugger(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/weapon/screwdriver(src) + make_exact_fit() + +/obj/item/weapon/storage/bag/circuits/all/New() + ..() + for(var/thing in subtypesof(/obj/item/integrated_circuit)) + var/obj/item/integrated_circuit/ic = thing + if(initial(ic.category) == thing) + continue + for(var/i = 1 to 10) + new thing(src) + + new /obj/item/device/electronic_assembly(src) + new /obj/item/device/integrated_electronics/wirer(src) + new /obj/item/device/integrated_electronics/debugger(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/weapon/screwdriver(src) + make_exact_fit() \ No newline at end of file diff --git a/code/modules/integrated_electronics/~defines.dm b/code/modules/integrated_electronics/~defines.dm new file mode 100644 index 00000000000..7aea6dabbb9 --- /dev/null +++ b/code/modules/integrated_electronics/~defines.dm @@ -0,0 +1,6 @@ +#undef IC_INPUT +#undef IC_OUTPUT +#undef IC_ACTIVATOR + +#undef DATA_CHANNEL +#undef PULSE_CHANNEL \ No newline at end of file diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index ba96ada8b7f..911891a7d41 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -140,7 +140,7 @@ icon_state ="book" throw_speed = 1 throw_range = 5 - w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) + w_class = ITEMSIZE_NORMAL //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") var/dat // Actual page content var/due_date = 0 // Game time in 1/10th seconds @@ -170,7 +170,7 @@ /obj/item/weapon/book/attackby(obj/item/weapon/W as obj, mob/user as mob) if(carved) if(!store) - if(W.w_class < 3) + if(W.w_class < ITEMSIZE_LARGE) user.drop_item() W.loc = src store = W @@ -268,7 +268,7 @@ icon_state ="scanner" throw_speed = 1 throw_range = 5 - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/obj/machinery/librarycomp/computer // Associated computer - Modes 1 to 3 use this var/obj/item/weapon/book/book // Currently scanned book var/mode = 0 // 0 - Scan only, 1 - Scan and Set Buffer, 2 - Scan and Attempt to Check In, 3 - Scan and Attempt to Add to Inventory diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index aab806aa7cb..57365f4367a 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -2,7 +2,7 @@ /obj/item/stack/material force = 5.0 throwforce = 5 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL throw_speed = 3 throw_range = 3 max_amount = 50 @@ -288,4 +288,4 @@ default_type = "reinforced borosilicate glass" /obj/item/stack/material/glass/phoronrglass/fifty - amount = 50 + amount = 50 diff --git a/code/modules/mining/coins.dm b/code/modules/mining/coins.dm index 7491bf668d2..10c8855b7e0 100644 --- a/code/modules/mining/coins.dm +++ b/code/modules/mining/coins.dm @@ -7,7 +7,7 @@ flags = CONDUCT force = 0.0 throwforce = 0.0 - w_class = 1.0 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS var/string_attached var/sides = 2 diff --git a/code/modules/mining/drilling/drill.dm b/code/modules/mining/drilling/drill.dm index eeb7546211d..7c964b9d4b0 100644 --- a/code/modules/mining/drilling/drill.dm +++ b/code/modules/mining/drilling/drill.dm @@ -42,7 +42,6 @@ /obj/machinery/mining/drill/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/capacitor(src) diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm index ea696708856..00ec3d68ca7 100644 --- a/code/modules/mining/mine_items.dm +++ b/code/modules/mining/mine_items.dm @@ -48,7 +48,7 @@ throwforce = 4.0 icon_state = "pickaxe" item_state = "jackhammer" - w_class = 4.0 + w_class = ITEMSIZE_LARGE matter = list(DEFAULT_WALL_MATERIAL = 3750) var/digspeed = 40 //moving the delay to an item var so R&D can make improved picks. --NEO origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) @@ -103,7 +103,7 @@ name = "plasma cutter" icon_state = "plasmacutter" item_state = "gun" - w_class = 3.0 //it is smaller than the pickaxe + w_class = ITEMSIZE_NORMAL //it is smaller than the pickaxe damtype = "fire" digspeed = 20 //Can slice though normal walls, all girders, or be used in reinforced wall deconstruction/ light thermite on fire origin_tech = list(TECH_MATERIAL = 4, TECH_PHORON = 3, TECH_ENGINEERING = 3) @@ -151,7 +151,7 @@ force = 8.0 throwforce = 4.0 item_state = "shovel" - w_class = 3.0 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_MATERIAL = 1, TECH_ENGINEERING = 1) matter = list(DEFAULT_WALL_MATERIAL = 50) attack_verb = list("bashed", "bludgeoned", "thrashed", "whacked") @@ -165,7 +165,7 @@ item_state = "spade" force = 5.0 throwforce = 7.0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL /**********************Mining car (Crate like thing, not the rail car)**************************/ diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index 7409859af26..9884349be95 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -7,7 +7,7 @@ flags = CONDUCT force = 10.0 throwforce = 2.0 - w_class = 4.0 + w_class = ITEMSIZE_LARGE /obj/item/weapon/moneybag/attack_hand(user as mob) var/amt_gold = 0 diff --git a/code/modules/mining/ore.dm b/code/modules/mining/ore.dm index 1f78c7ce771..128dc173328 100644 --- a/code/modules/mining/ore.dm +++ b/code/modules/mining/ore.dm @@ -2,7 +2,7 @@ name = "small rock" icon = 'icons/obj/mining.dmi' icon_state = "ore2" - w_class = 2 + w_class = ITEMSIZE_SMALL var/datum/geosample/geologic_data var/material diff --git a/code/modules/mob/dead/death.dm b/code/modules/mob/dead/death.dm index 1be552886b0..a1b81115e1e 100644 --- a/code/modules/mob/dead/death.dm +++ b/code/modules/mob/dead/death.dm @@ -3,3 +3,6 @@ /mob/observer/gib() //ghosts can't be gibbed. return + +/mob/observer/ash() + return //ghosts can't be ashed. \ No newline at end of file diff --git a/code/modules/mob/death.dm b/code/modules/mob/death.dm index 5e7cfe2603c..d906b331e2b 100644 --- a/code/modules/mob/death.dm +++ b/code/modules/mob/death.dm @@ -46,6 +46,25 @@ if(animation) qdel(animation) if(src) qdel(src) +/mob/proc/ash(anim="dust-m") + death(1) + var/atom/movable/overlay/animation = null + transforming = 1 + canmove = 0 + icon = null + invisibility = 101 + + animation = new(loc) + animation.icon_state = "blank" + animation.icon = 'icons/mob/mob.dmi' + animation.master = src + + flick(anim, animation) + + dead_mob_list -= src + spawn(15) + if(animation) qdel(animation) + if(src) qdel(src) /mob/proc/death(gibbed,deathmessage="seizes up and falls limp...") diff --git a/code/modules/mob/holder.dm b/code/modules/mob/holder.dm index d608bb0988d..51f291fa74a 100644 --- a/code/modules/mob/holder.dm +++ b/code/modules/mob/holder.dm @@ -50,6 +50,11 @@ var/list/holder_mob_icon_cache = list() continue M.forceMove(get_turf(src)) +/obj/item/weapon/holder/onDropInto(var/atom/movable/AM) + if(ismob(loc)) // Bypass our holding mob and drop directly to its loc + return loc.loc + return ..() + /obj/item/weapon/holder/GetID() for(var/mob/M in contents) var/obj/item/I = M.GetIdCard() @@ -89,7 +94,7 @@ var/list/holder_mob_icon_cache = list() origin_tech = list(TECH_MAGNET = 3, TECH_ENGINEERING = 5) /obj/item/weapon/holder/mouse - w_class = 1 + w_class = ITEMSIZE_TINY /obj/item/weapon/holder/borer origin_tech = list(TECH_BIO = 6) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index ad71cebe1f6..1c6e2436d4f 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -126,16 +126,12 @@ var/list/slot_equipment_priority = list( \ // Removes an item from inventory and places it in the target atom. // If canremove or other conditions need to be checked then use unEquip instead. -/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/Target = null) +/mob/proc/drop_from_inventory(var/obj/item/W, var/atom/target = null) if(W) - if(!Target) - Target = loc - - remove_from_mob(W) - if(!(W && W.loc)) return 1 // self destroying objects (tk, grabs) - - W.forceMove(Target) + remove_from_mob(W, target) + if(!(W && W.loc)) + return 1 // self destroying objects (tk, grabs) update_icons() return 1 return 0 @@ -194,7 +190,9 @@ var/list/slot_equipment_priority = list( \ //Attemps to remove an object on a mob. -/mob/proc/remove_from_mob(var/obj/O) +/mob/proc/remove_from_mob(var/obj/O, var/atom/target) + if(!O) // Nothing to remove, so we succeed. + return 1 src.u_equip(O) if (src.client) src.client.screen -= O @@ -202,7 +200,10 @@ var/list/slot_equipment_priority = list( \ O.screen_loc = null if(istype(O, /obj/item)) var/obj/item/I = O - I.forceMove(src.loc) + if(target) + I.forceMove(target) + else + I.dropInto(loc) I.dropped(src) return 1 diff --git a/code/modules/mob/language/generic.dm b/code/modules/mob/language/generic.dm index d93edf3ac2d..1b07e4ed8c7 100644 --- a/code/modules/mob/language/generic.dm +++ b/code/modules/mob/language/generic.dm @@ -57,8 +57,59 @@ // Criminal language. /datum/language/gutter name = "Gutter" - desc = "Much like Standard, this crude pidgin tongue descended from numerous languages and serves as Tradeband for criminal elements." + desc = "There is no true language named Gutter. 'Gutter' is a catchall term for a collection of unofficial SolCom dialects that has somehow managed to spread across the stars." speech_verb = "growls" colour = "rough" key = "3" - syllables = list ("gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra") + space_chance = 45 + syllables = list ( +"gra","ba","ba","breh","bra","rah","dur","ra","ro","gro","go","ber","bar","geh","heh", "gra", +"a", "ai", "an", "ang", "ao", "ba", "bai", "ban", "bang", "bao", "bei", "ben", "beng", "bi", "bian", "biao", +"bie", "bin", "bing", "bo", "bu", "ca", "cai", "can", "cang", "cao", "ce", "cei", "cen", "ceng", "cha", "chai", +"chan", "chang", "chao", "che", "chen", "cheng", "chi", "chong", "chou", "chu", "chua", "chuai", "chuan", "chuang", "chui", "chun", +"chuo", "ci", "cong", "cou", "cu", "cuan", "cui", "cun", "cuo", "da", "dai", "dan", "dang", "dao", "de", "dei", +"den", "deng", "di", "dian", "diao", "die", "ding", "diu", "dong", "dou", "du", "duan", "dui", "dun", "duo", "e", +"ei", "en", "er", "fa", "fan", "fang", "fei", "fen", "feng", "fo", "fou", "fu", "ga", "gai", "gan", "gang", +"gao", "ge", "gei", "gen", "geng", "gong", "gou", "gu", "gua", "guai", "guan", "guang", "gui", "gun", "guo", "ha", +"hai", "han", "hang", "hao", "he", "hei", "hen", "heng", "hm", "hng", "hong", "hou", "hu", "hua", "huai", "huan", +"huang", "hui", "hun", "huo", "ji", "jia", "jian", "jiang", "jiao", "jie", "jin", "jing", "jiong", "jiu", "ju", "juan", +"jue", "jun", "ka", "kai", "kan", "kang", "kao", "ke", "kei", "ken", "keng", "kong", "kou", "ku", "kua", "kuai", +"kuan", "kuang", "kui", "kun", "kuo", "la", "lai", "lan", "lang", "lao", "le", "lei", "leng", "li", "lia", "lian", +"liang", "liao", "lie", "lin", "ling", "liu", "long", "lou", "lu", "luan", "lun", "luo", "ma", "mai", "man", "mang", +"mao", "me", "mei", "men", "meng", "mi", "mian", "miao", "mie", "min", "ming", "miu", "mo", "mou", "mu", "na", +"nai", "nan", "nang", "nao", "ne", "nei", "nen", "neng", "ng", "ni", "nian", "niang", "niao", "nie", "nin", "ning", +"niu", "nong", "nou", "nu", "nuan", "nuo", "o", "ou", "pa", "pai", "pan", "pang", "pao", "pei", "pen", "peng", +"pi", "pian", "piao", "pie", "pin", "ping", "po", "pou", "pu", "qi", "qia", "qian", "qiang", "qiao", "qie", "qin", +"qing", "qiong", "qiu", "qu", "quan", "que", "qun", "ran", "rang", "rao", "re", "ren", "reng", "ri", "rong", "rou", +"ru", "rua", "ruan", "rui", "run", "ruo", "sa", "sai", "san", "sang", "sao", "se", "sei", "sen", "seng", "sha", +"shai", "shan", "shang", "shao", "she", "shei", "shen", "sheng", "shi", "shou", "shu", "shua", "shuai", "shuan", "shuang", "shui", +"shun", "shuo", "si", "song", "sou", "su", "suan", "sui", "sun", "suo", "ta", "tai", "tan", "tang", "tao", "te", +"teng", "ti", "tian", "tiao", "tie", "ting", "tong", "tou", "tu", "tuan", "tui", "tun", "tuo", "wa", "wai", "wan", +"wang", "wei", "wen", "weng", "wo", "wu", "xi", "xia", "xian", "xiang", "xiao", "xie", "xin", "xing", "xiong", "xiu", +"xu", "xuan", "xue", "xun", "ya", "yan", "yang", "yao", "ye", "yi", "yin", "ying", "yong", "you", "yu", "yuan", +"yue", "yun", "za", "zai", "zan", "zang", "zao", "ze", "zei", "zen", "zeng", "zha", "zhai", "zhan", "zhang", "zhao", +"zhe", "zhei", "zhen", "zheng", "zhi", "zhong", "zhou", "zhu", "zhua", "zhuai", "zhuan", "zhuang", "zhui", "zhun", "zhuo", "zi", +"zong", "zou", "zuan", "zui", "zun", "zuo", "zu", "al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi", +"al", "an", "ar", "as", "at", "ea", "ed", "en", "er", "es", "ha", "he", "hi", "in", "is", "it", +"le", "me", "nd", "ne", "ng", "nt", "on", "or", "ou", "re", "se", "st", "te", "th", "ti", "to", +"ve", "wa", "all", "and", "are", "but", "ent", "era", "ere", "eve", "for", "had", "hat", "hen", "her", "hin", +"his", "ing", "ion", "ith", "not", "ome", "oul", "our", "sho", "ted", "ter", "tha", "the", "thi") diff --git a/code/modules/mob/living/bot/cleanbot.dm b/code/modules/mob/living/bot/cleanbot.dm index 6cb5908f6fb..779d912cf3e 100644 --- a/code/modules/mob/living/bot/cleanbot.dm +++ b/code/modules/mob/living/bot/cleanbot.dm @@ -177,14 +177,14 @@ throwforce = 10.0 throw_speed = 2 throw_range = 5 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL var/created_name = "Cleanbot" -/obj/item/weapon/bucket_sensor/attackby(var/obj/item/O, var/mob/user) +/obj/item/weapon/bucket_sensor/attackby(var/obj/item/W, var/mob/user) ..() - if(istype(O, /obj/item/robot_parts/l_arm) || istype(O, /obj/item/robot_parts/r_arm)) + if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm) || (istype(W, /obj/item/organ/external/arm) && ((W.name == "robotic left arm") || (W.name == "robotic right arm")))) user.drop_item() - qdel(O) + qdel(W) var/turf/T = get_turf(loc) var/mob/living/bot/cleanbot/A = new /mob/living/bot/cleanbot(T) A.name = created_name @@ -192,10 +192,10 @@ user.drop_from_inventory(src) qdel(src) - else if(istype(O, /obj/item/weapon/pen)) + else if(istype(W, /obj/item/weapon/pen)) var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) if(!t) return if(!in_range(src, usr) && src.loc != usr) return - created_name = t + created_name = t \ No newline at end of file diff --git a/code/modules/mob/living/bot/ed209bot.dm b/code/modules/mob/living/bot/ed209bot.dm index ec4278c967e..80279a4538b 100644 --- a/code/modules/mob/living/bot/ed209bot.dm +++ b/code/modules/mob/living/bot/ed209bot.dm @@ -94,7 +94,7 @@ switch(build_step) if(0, 1) - if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg)) + if(istype(W, /obj/item/robot_parts/l_leg) || istype(W, /obj/item/robot_parts/r_leg) || (istype(W, /obj/item/organ/external/leg) && ((W.name == "robotic right leg") || (W.name == "robotic left leg")))) user.drop_item() qdel(W) build_step++ diff --git a/code/modules/mob/living/bot/farmbot.dm b/code/modules/mob/living/bot/farmbot.dm index 42452c49fa5..5f49794d8be 100644 --- a/code/modules/mob/living/bot/farmbot.dm +++ b/code/modules/mob/living/bot/farmbot.dm @@ -313,7 +313,7 @@ var/build_step = 0 var/created_name = "Farmbot" var/obj/tank - w_class = 3.0 + w_class = ITEMSIZE_NORMAL /obj/item/weapon/farmbot_arm_assembly/New(var/newloc, var/theTank) @@ -337,6 +337,18 @@ new /obj/item/weapon/farmbot_arm_assembly(loc, src) +/obj/structure/reagent_dispensers/watertank/attackby(var/obj/item/organ/external/S, mob/user as mob) + if ((!istype(S, /obj/item/organ/external/arm)) && (!S.robotic == ORGAN_ROBOT)) + ..() + return + + user << "You add the robot arm to [src]." + + user.drop_from_inventory(S) + qdel(S) + + new /obj/item/weapon/farmbot_arm_assembly(loc, src) + /obj/item/weapon/farmbot_arm_assembly/attackby(obj/item/weapon/W as obj, mob/user as mob) ..() if((istype(W, /obj/item/device/analyzer/plant_analyzer)) && (build_step == 0)) diff --git a/code/modules/mob/living/bot/floorbot.dm b/code/modules/mob/living/bot/floorbot.dm index 0072d9a444a..22595159411 100644 --- a/code/modules/mob/living/bot/floorbot.dm +++ b/code/modules/mob/living/bot/floorbot.dm @@ -304,7 +304,7 @@ throwforce = 10.0 throw_speed = 2 throw_range = 5 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL var/created_name = "Floorbot" /obj/item/weapon/toolbox_tiles/attackby(var/obj/item/W, mob/user as mob) @@ -334,12 +334,12 @@ throwforce = 10.0 throw_speed = 2 throw_range = 5 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL var/created_name = "Floorbot" /obj/item/weapon/toolbox_tiles_sensor/attackby(var/obj/item/W, mob/user as mob) ..() - if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm)) + if(istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm) || (istype(W, /obj/item/organ/external/arm) && ((W.name == "robotic right arm") || (W.name == "robotic left arm")))) qdel(W) var/turf/T = get_turf(user.loc) var/mob/living/bot/floorbot/A = new /mob/living/bot/floorbot(T) diff --git a/code/modules/mob/living/bot/medbot.dm b/code/modules/mob/living/bot/medbot.dm index 8a0c7564d12..baf6af9eba9 100644 --- a/code/modules/mob/living/bot/medbot.dm +++ b/code/modules/mob/living/bot/medbot.dm @@ -286,6 +286,29 @@ user.drop_from_inventory(src) qdel(src) +/obj/item/weapon/storage/firstaid/attackby(var/obj/item/organ/external/S, mob/user as mob) + if (!istype(S, /obj/item/organ/external/arm) || !(S.robotic == ORGAN_ROBOT)) + ..() + return + + if(contents.len >= 1) + user << "You need to empty [src] out first." + return + + var/obj/item/weapon/firstaid_arm_assembly/A = new /obj/item/weapon/firstaid_arm_assembly + if(istype(src, /obj/item/weapon/storage/firstaid/fire)) + A.skin = "ointment" + else if(istype(src, /obj/item/weapon/storage/firstaid/toxin)) + A.skin = "tox" + else if(istype(src, /obj/item/weapon/storage/firstaid/o2)) + A.skin = "o2" + + qdel(S) + user.put_in_hands(A) + user << "You add the robot arm to the first aid kit." + user.drop_from_inventory(src) + qdel(src) + /obj/item/weapon/firstaid_arm_assembly name = "first aid/robot arm assembly" desc = "A first aid kit with a robot arm permanently grafted to it." @@ -294,7 +317,7 @@ var/build_step = 0 var/created_name = "Medibot" //To preserve the name if it's a unique medbot I guess var/skin = null //Same as medbot, set to tox or ointment for the respective kits. - w_class = 3.0 + w_class = ITEMSIZE_NORMAL /obj/item/weapon/firstaid_arm_assembly/New() ..() diff --git a/code/modules/mob/living/bot/secbot.dm b/code/modules/mob/living/bot/secbot.dm index b07202572e9..f7556e0ece6 100644 --- a/code/modules/mob/living/bot/secbot.dm +++ b/code/modules/mob/living/bot/secbot.dm @@ -258,40 +258,40 @@ var/build_step = 0 var/created_name = "Securitron" -/obj/item/weapon/secbot_assembly/attackby(var/obj/item/O, var/mob/user) +/obj/item/weapon/secbot_assembly/attackby(var/obj/item/W, var/mob/user) ..() - if(istype(O, /obj/item/weapon/weldingtool) && !build_step) - var/obj/item/weapon/weldingtool/WT = O + if(istype(W, /obj/item/weapon/weldingtool) && !build_step) + var/obj/item/weapon/weldingtool/WT = W if(WT.remove_fuel(0, user)) build_step = 1 overlays += image('icons/obj/aibots.dmi', "hs_hole") user << "You weld a hole in \the [src]." - else if(isprox(O) && (build_step == 1)) + else if(isprox(W) && (build_step == 1)) user.drop_item() build_step = 2 - user << "You add \the [O] to [src]." + user << "You add \the [W] to [src]." overlays += image('icons/obj/aibots.dmi', "hs_eye") name = "helmet/signaler/prox sensor assembly" - qdel(O) + qdel(W) - else if((istype(O, /obj/item/robot_parts/l_arm) || istype(O, /obj/item/robot_parts/r_arm)) && build_step == 2) + else if((istype(W, /obj/item/robot_parts/l_arm) || istype(W, /obj/item/robot_parts/r_arm) || (istype(W, /obj/item/organ/external/arm) && ((W.name == "robotic right arm") || (W.name == "robotic left arm")))) && build_step == 2) user.drop_item() build_step = 3 - user << "You add \the [O] to [src]." + user << "You add \the [W] to [src]." name = "helmet/signaler/prox sensor/robot arm assembly" overlays += image('icons/obj/aibots.dmi', "hs_arm") - qdel(O) + qdel(W) - else if(istype(O, /obj/item/weapon/melee/baton) && build_step == 3) + else if(istype(W, /obj/item/weapon/melee/baton) && build_step == 3) user.drop_item() user << "You complete the Securitron! Beep boop." var/mob/living/bot/secbot/S = new /mob/living/bot/secbot(get_turf(src)) S.name = created_name - qdel(O) + qdel(W) qdel(src) - else if(istype(O, /obj/item/weapon/pen)) + else if(istype(W, /obj/item/weapon/pen)) var/t = sanitizeSafe(input(user, "Enter new robot name", name, created_name), MAX_NAME_LEN) if(!t) return diff --git a/code/modules/mob/living/carbon/alien/diona/diona.dm b/code/modules/mob/living/carbon/alien/diona/diona.dm index 8a487d57b35..74923ae59a4 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona.dm @@ -10,7 +10,7 @@ universal_understand = 1 universal_speak = 0 // Dionaea do not need to speak to people other than other dionaea. - can_pull_size = 2 + can_pull_size = ITEMSIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER holder_type = /obj/item/weapon/holder/diona diff --git a/code/modules/mob/living/carbon/brain/MMI.dm b/code/modules/mob/living/carbon/brain/MMI.dm index 5fe22558038..3f0fa31708a 100644 --- a/code/modules/mob/living/carbon/brain/MMI.dm +++ b/code/modules/mob/living/carbon/brain/MMI.dm @@ -22,7 +22,7 @@ desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity." icon = 'icons/obj/assemblies.dmi' icon_state = "mmi_empty" - w_class = 3 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_BIO = 3) req_access = list(access_robotics) diff --git a/code/modules/mob/living/carbon/brain/brain_item.dm b/code/modules/mob/living/carbon/brain/brain_item.dm index 11e3b1197ae..973e55a48b7 100644 --- a/code/modules/mob/living/carbon/brain/brain_item.dm +++ b/code/modules/mob/living/carbon/brain/brain_item.dm @@ -7,7 +7,7 @@ vital = 1 icon_state = "brain2" force = 1.0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throwforce = 1.0 throw_speed = 3 throw_range = 5 diff --git a/code/modules/mob/living/carbon/brain/posibrain.dm b/code/modules/mob/living/carbon/brain/posibrain.dm index c61659261de..057c24bdcc9 100644 --- a/code/modules/mob/living/carbon/brain/posibrain.dm +++ b/code/modules/mob/living/carbon/brain/posibrain.dm @@ -3,7 +3,7 @@ desc = "A cube of shining metal, four inches to a side and covered in shallow grooves." icon = 'icons/obj/assemblies.dmi' icon_state = "posibrain" - w_class = 3 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 4, TECH_BLUESPACE = 2, TECH_DATA = 4) var/searching = 0 diff --git a/code/modules/mob/living/carbon/brain/robot.dm b/code/modules/mob/living/carbon/brain/robot.dm index d44779c5204..d870751dc1d 100644 --- a/code/modules/mob/living/carbon/brain/robot.dm +++ b/code/modules/mob/living/carbon/brain/robot.dm @@ -3,7 +3,7 @@ desc = "The pinnacle of artifical intelligence which can be achieved using classical computer science." icon = 'icons/obj/module.dmi' icon_state = "mainboard" - w_class = 3 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_ENGINEERING = 4, TECH_MATERIAL = 3, TECH_DATA = 4) /obj/item/device/mmi/digital/robot/New() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index dd9e4f28b9b..aa4e6ced11f 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -1,12 +1,11 @@ - //Called when the mob is hit with an item in combat. /mob/living/carbon/resolve_item_attack(obj/item/I, mob/living/user, var/effective_force, var/hit_zone) - if(check_attack_throat(I, user)) + if(check_neckgrab_attack(I, user, hit_zone)) return null ..() /mob/living/carbon/standard_weapon_hit_effects(obj/item/I, mob/living/user, var/effective_force, var/blocked, var/hit_zone) - if(!effective_force || blocked >= 100) + if(!effective_force || blocked >= 100) return 0 //Hulk modifier @@ -39,18 +38,23 @@ return 1 // Attacking someone with a weapon while they are neck-grabbed -/mob/living/carbon/proc/check_attack_throat(obj/item/W, mob/user) +/mob/living/carbon/proc/check_neckgrab_attack(obj/item/W, mob/user, var/hit_zone) if(user.a_intent == I_HURT) for(var/obj/item/weapon/grab/G in src.grabbed_by) - if(G.assailant == user && G.state >= GRAB_NECK) - if(attack_throat(W, G, user)) - return 1 + if(G.assailant == user) + if(G.state >= GRAB_AGGRESSIVE) + if(hit_zone == BP_TORSO && shank_attack(W, G, user)) + return 1 + if(G.state >= GRAB_NECK) + if(hit_zone == BP_HEAD && attack_throat(W, G, user, hit_zone)) + return 1 return 0 + // Knifing /mob/living/carbon/proc/attack_throat(obj/item/W, obj/item/weapon/grab/G, mob/user) - if(!W.edge || !W.force || W.damtype != BRUTE) + if(!W.edge || !W.force || W.damtype != BRUTE) return 0 //unsuitable weapon user.visible_message("\The [user] begins to slit [src]'s throat with \the [W]!") @@ -95,4 +99,59 @@ user.attack_log += "\[[time_stamp()]\] Knifed [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" src.attack_log += "\[[time_stamp()]\] Got knifed by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" msg_admin_attack("[key_name(user)] knifed [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) - return 1 \ No newline at end of file + return 1 + +/mob/living/carbon/proc/shank_attack(obj/item/W, obj/item/weapon/grab/G, mob/user, hit_zone) + + if(!W.sharp || !W.force || W.damtype != BRUTE) + return 0 //unsuitable weapon + + user.visible_message("\The [user] plunges \the [W] into \the [src]!") + + var/damage = shank_armor_helper(W, G, user) + apply_damage(damage, W.damtype, "torso", 0, sharp=W.sharp, edge=W.edge) + + if(W.hitsound) + playsound(loc, W.hitsound, 50, 1, -1) + + user.attack_log += "\[[time_stamp()]\] Shanked [name] ([ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + src.attack_log += "\[[time_stamp()]\] Got shanked by [user.name] ([user.ckey]) with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" + msg_admin_attack("[key_name(user)] shanked [key_name(src)] with [W.name] (INTENT: [uppertext(user.a_intent)]) (DAMTYE: [uppertext(W.damtype)])" ) + + return 1 + +/mob/living/carbon/proc/shank_armor_helper(obj/item/W, obj/item/weapon/grab/G, mob/user) + var/damage = W.force + var/damage_mod = 1 + if(W.edge) + damage = damage * 1.25 //small damage bonus for having sharp and edge + + var/obj/item/clothing/suit/worn_suit + var/obj/item/clothing/under/worn_under + var/worn_suit_armor + var/worn_under_armor + + //if(slot_wear_suit) + if(get_equipped_item(slot_wear_suit)) + worn_suit = get_equipped_item(slot_wear_suit) + //worn_suit = get_equipped_item(slot_wear_suit) + worn_suit_armor = worn_suit.armor["melee"] + else + worn_suit_armor = 0 + + //if(slot_w_uniform) + if(get_equipped_item(slot_w_uniform)) + worn_under = get_equipped_item(slot_w_uniform) + //worn_under_armor = slot_w_uniform.armor["melee"] + worn_under_armor = worn_under.armor["melee"] + else + worn_under_armor = 0 + + if(worn_under_armor > worn_suit_armor) + damage_mod = 1 - (worn_under_armor/100) + else + damage_mod = 1 - (worn_suit_armor/100) + + damage = damage * damage_mod + + return damage \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/death.dm b/code/modules/mob/living/carbon/human/death.dm index 8cb9cca614f..ee0c867ffb6 100644 --- a/code/modules/mob/living/carbon/human/death.dm +++ b/code/modules/mob/living/carbon/human/death.dm @@ -23,6 +23,12 @@ else ..() +/mob/living/carbon/human/ash() + if(species) + ..(species.dusted_anim) + else + ..() + /mob/living/carbon/human/death(gibbed) if(stat == DEAD) return diff --git a/code/modules/mob/living/carbon/human/emote.dm b/code/modules/mob/living/carbon/human/emote.dm index 6a9952ef07c..f1a84d6d9d0 100644 --- a/code/modules/mob/living/carbon/human/emote.dm +++ b/code/modules/mob/living/carbon/human/emote.dm @@ -589,12 +589,15 @@ if("swag", "stopsway") src.animate_tail_stop() + if("vomit") + vomit() + return + if ("help") - src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, -cry, custom, deathgasp, drool, eyebrow, frown, gasp, giggle, groan, grumble, handshake, hug-(none)/mob, glare-(none)/mob, -grin, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, raise, salute, shake, shiver, shrug, -sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, tremble, twitch, twitch_s, whimper, -wink, yawn, swish, sway/wag, fastsway/qwag, stopsway/swag"} + src << {"blink, blink_r, blush, bow-(none)/mob, burp, choke, chuckle, clap, collapse, cough, cry, custom, deathgasp, drool, eyebrow, fastsway/qwag, +frown, gasp, giggle, glare-(none)/mob, grin, groan, grumble, handshake, hug-(none)/mob, laugh, look-(none)/mob, moan, mumble, nod, pale, point-atom, +raise, salute, shake, shiver, shrug, sigh, signal-#1-10, smile, sneeze, sniff, snore, stare-(none)/mob, stopsway/swag, sway/wag, swish, tremble, twitch, +twitch_s, vomit, whimper, wink, yawn"} else src << "\blue Unusable emote '[act]'. Say *help for a list." diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 89db40f75d6..1d94367c57f 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -67,7 +67,7 @@ BP_L_LEG = skiplegs, BP_R_LEG = skiplegs) - var/msg = "*---------*\nThis is " + var/list/msg = list("*---------*\nThis is ") var/datum/gender/T = gender_datums[get_gender()] if(skipjumpsuit && skipface) //big suits/masks/helmets make it hard to tell their gender @@ -124,10 +124,16 @@ //suit/armour if(wear_suit) + var/tie_msg + if(istype(wear_suit,/obj/item/clothing/suit)) + var/obj/item/clothing/suit/U = wear_suit + if(U.accessories.len) + tie_msg += ". Attached to it is [lowertext(english_list(U.accessories))]" + if(wear_suit.blood_DNA) msg += "[T.He] [T.is] wearing \icon[wear_suit] [wear_suit.gender==PLURAL?"some":"a"] [(wear_suit.blood_color != SYNTH_BLOOD_COLOUR) ? "blood" : "oil"]-stained [wear_suit.name]!\n" else - msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit].\n" + msg += "[T.He] [T.is] wearing \icon[wear_suit] \a [wear_suit][tie_msg].\n" //suit/armour storage if(s_store && !skipsuitstorage) @@ -245,8 +251,8 @@ //splints for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) var/obj/item/organ/external/o = get_organ(organ) - if(o && o.status & ORGAN_SPLINTED) - msg += "[T.He] [T.has] a splint on [T.his] [o.name]!\n" + if(o && o.splinted && o.splinted.loc == o) + msg += "[T.He] [T.has] \a [o.splinted] on [T.his] [o.name]!\n" if(suiciding) msg += "[T.He] appears to have commited suicide... there is no hope of recovery.\n" @@ -297,6 +303,7 @@ var/list/wound_flavor_text = list() var/list/is_bleeding = list() + var/applying_pressure = "" for(var/organ_tag in species.has_limbs) @@ -330,8 +337,6 @@ wound_flavor_text["[temp.name]"] = "[T.He] has [temp.get_wounds_desc()] on [T.his] [parent.name].
    " else wound_flavor_text["[temp.name]"] = "[T.He] has [temp.get_wounds_desc()] on [T.his] [temp.name].
    " - if(temp.status & ORGAN_BLEEDING) - is_bleeding["[temp.name]"] = "[T.His] [temp.name] is bleeding!
    " else wound_flavor_text["[temp.name]"] = "" if(temp.dislocated == 2) @@ -339,9 +344,14 @@ if(((temp.status & ORGAN_BROKEN) && temp.brute_dam > temp.min_broken_damage) || (temp.status & ORGAN_MUTATED)) wound_flavor_text["[temp.name]"] += "[T.His] [temp.name] is dented and swollen!
    " + if(!wound_flavor_text["[temp.name]"] && (temp.status & ORGAN_BLEEDING)) + is_bleeding["[temp.name]"] = "[T.His] [temp.name] is bleeding!
    " + + if(temp.applied_pressure == src) + applying_pressure = "[T.He] is applying pressure to [T.his] [temp.name].
    " + for(var/limb in wound_flavor_text) msg += wound_flavor_text[limb] - is_bleeding[limb] = null for(var/limb in is_bleeding) msg += is_bleeding[limb] for(var/implant in get_visible_implants(0)) @@ -397,13 +407,14 @@ if(print_flavor_text()) msg += "[print_flavor_text()]\n" - msg += "*---------*
    " + msg += "*---------*

    " + msg += applying_pressure if (pose) if( findtext(pose,".",lentext(pose)) == 0 && findtext(pose,"!",lentext(pose)) == 0 && findtext(pose,"?",lentext(pose)) == 0 ) pose = addtext(pose,".") //Makes sure all emotes end with a period. - msg += "\n[T.He] [pose]" + msg += "[T.He] [pose]" - user << msg + user << jointext(msg, null) //Helper procedure. Called by /mob/living/carbon/human/examine() and /mob/living/carbon/human/Topic() to determine HUD access to security and medical records. /proc/hasHUD(mob/M as mob, hudtype) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index d7c7de37ee0..f459052a43d 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1013,7 +1013,7 @@ /mob/living/carbon/human/proc/handle_embedded_objects() for(var/obj/item/organ/external/organ in src.organs) - if(organ.status & ORGAN_SPLINTED) //Splints prevent movement. + if(organ.splinted) //Splints prevent movement. continue for(var/obj/item/O in organ.implants) if(!istype(O,/obj/item/weapon/implant) && prob(5)) //Moving with things stuck in you could be bad. diff --git a/code/modules/mob/living/carbon/human/human_attackhand.dm b/code/modules/mob/living/carbon/human/human_attackhand.dm index 62d469cb0e7..6eb6b35a95d 100644 --- a/code/modules/mob/living/carbon/human/human_attackhand.dm +++ b/code/modules/mob/living/carbon/human/human_attackhand.dm @@ -87,7 +87,7 @@ src << "You feel a breath of fresh air enter your lungs. It feels good." H << "Repeat at least every 7 seconds." - else + else if(!(M == src && apply_pressure(M, M.zone_sel.selecting))) help_shake_act(M) return 1 @@ -358,3 +358,38 @@ spawn(1) qdel(rgrab) return success + +/* + We want to ensure that a mob may only apply pressure to one organ of one mob at any given time. Currently this is done mostly implicitly through + the behaviour of do_after() and the fact that applying pressure to someone else requires a grab: + If you are applying pressure to yourself and attempt to grab someone else, you'll change what you are holding in your active hand which will stop do_mob() + If you are applying pressure to another and attempt to apply pressure to yourself, you'll have to switch to an empty hand which will also stop do_mob() + Changing targeted zones should also stop do_mob(), preventing you from applying pressure to more than one body part at once. +*/ +/mob/living/carbon/human/proc/apply_pressure(mob/living/user, var/target_zone) + var/obj/item/organ/external/organ = get_organ(target_zone) + if(!organ || !(organ.status & ORGAN_BLEEDING) || (organ.robotic >= ORGAN_ROBOT)) + return 0 + + if(organ.applied_pressure) + user << "Someone is already applying pressure to [user == src? "your [organ.name]" : "[src]'s [organ.name]"]." + return 0 + + if(user == src) + user.visible_message("\The [user] starts applying pressure to \his [organ.name]!", "You start applying pressure to your [organ.name]!") + else + user.visible_message("\The [user] starts applying pressure to [src]'s [organ.name]!", "You start applying pressure to [src]'s [organ.name]!") + spawn(0) + organ.applied_pressure = user + + //apply pressure as long as they stay still and keep grabbing + do_mob(user, src, INFINITY, target_zone, progress = 0) + + organ.applied_pressure = null + + if(user == src) + user.visible_message("\The [user] stops applying pressure to \his [organ.name]!", "You stop applying pressure to your [organ]!") + else + user.visible_message("\The [user] stops applying pressure to [src]'s [organ.name]!", "You stop applying pressure to [src]'s [organ.name]!") + + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 1d716b519df..2adb24665b0 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -147,7 +147,7 @@ emp_act ..() /mob/living/carbon/human/resolve_item_attack(obj/item/I, mob/living/user, var/target_zone) - if(check_attack_throat(I, user)) + if(check_neckgrab_attack(I, user, target_zone)) return null if(user == src) // Attacking yourself can't miss @@ -464,3 +464,30 @@ emp_act return perm +/mob/living/carbon/human/shank_attack(obj/item/W, obj/item/weapon/grab/G, mob/user, hit_zone) + + if(!..()) + return 0 + + var/organ_chance = 50 + var/damage = shank_armor_helper(W, G, user) + var/obj/item/organ/external/chest = get_organ(hit_zone) + + if(W.edge) + organ_chance = 75 + user.next_move = world.time + 20 + user.visible_message("\The [user] begins to twist \the [W] around inside [src]'s [chest]!") + if(!do_after(user, 20)) + return 0 + if(!(G && G.assailant == user && G.affecting == src)) //check that we still have a grab + return 0 + + user.visible_message("\The [user] twists \the [W] around inside [src]'s [chest]!") + + if(prob(organ_chance)) + var/obj/item/organ/internal/selected_organ = pick(chest.internal_organs) + selected_organ.damage = max(selected_organ.damage, damage * 0.5) + G.last_action = world.time + flick(G.hud.icon_state, G.hud) + + return 1 \ No newline at end of file diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index fef4752a2a8..f265e3febbd 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -85,7 +85,8 @@ var/list/flavor_texts = list() var/gunshot_residue var/pulling_punches // Are you trying not to hurt your opponent? - var/robolimb_count = 0 // Number of robot limbs. + var/robolimb_count = 0 // Total number of external robot parts. + var/robobody_count = 0 // Counts torso, groin, and head, if they're robotic mob_bump_flag = HUMAN mob_push_flags = ~HEAVY diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index ae9dd9a5061..de4b36dcebd 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -45,7 +45,7 @@ var/obj/item/organ/external/E = get_organ(organ_name) if(!E || E.is_stump()) tally += 4 - if(E.status & ORGAN_SPLINTED) + if(E.splinted) tally += 0.5 else if(E.status & ORGAN_BROKEN) tally += 1.5 @@ -57,7 +57,7 @@ var/obj/item/organ/external/E = get_organ(organ_name) if(!E || E.is_stump()) tally += 4 - else if(E.status & ORGAN_SPLINTED) + else if(E.splinted) tally += 0.5 else if(E.status & ORGAN_BROKEN) tally += 1.5 diff --git a/code/modules/mob/living/carbon/human/human_organs.dm b/code/modules/mob/living/carbon/human/human_organs.dm index 8db85ef5fec..873a9e1220c 100644 --- a/code/modules/mob/living/carbon/human/human_organs.dm +++ b/code/modules/mob/living/carbon/human/human_organs.dm @@ -142,10 +142,10 @@ return for (var/obj/item/organ/external/E in organs) - if(!E || !E.can_grasp || (E.status & ORGAN_SPLINTED)) + if(!E || !E.can_grasp) continue - if(E.is_broken() || E.is_dislocated()) + if((E.is_broken() || E.is_dislocated()) && !E.splinted) switch(E.body_part) if(HAND_LEFT, ARM_LEFT) if(!l_hand) diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index cfc61cef5cf..e98568c1fa6 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -345,7 +345,7 @@ if(should_have_organ(O_LUNGS)) var/obj/item/organ/internal/lungs/L = internal_organs_by_name[O_LUNGS] - if(!L.is_bruised() && prob(5)) + if(!L.is_bruised() && prob(8)) if(breath.total_moles) if(breath.total_moles < BREATH_MOLES / 5 || breath.total_moles > BREATH_MOLES * 5) rupture_lung() @@ -694,9 +694,9 @@ if (species.body_temperature == null) return //this species doesn't have metabolic thermoregulation - // Robolimbs cause overheating too. - if(robolimb_count) - bodytemperature += round(robolimb_count/2) + // FBPs will overheat, prosthetic limbs are fine. + if(robobody_count) + bodytemperature += round(robobody_count*1.75) var/body_temperature_difference = species.body_temperature - bodytemperature diff --git a/code/modules/mob/living/carbon/human/species/station/seromi.dm b/code/modules/mob/living/carbon/human/species/station/seromi.dm index 93dfcb6244d..5fa81a04d91 100644 --- a/code/modules/mob/living/carbon/human/species/station/seromi.dm +++ b/code/modules/mob/living/carbon/human/species/station/seromi.dm @@ -49,7 +49,7 @@ heat_level_1 = 320 heat_level_2 = 370 heat_level_3 = 600 - heat_discomfort_level = 292 + heat_discomfort_level = 295 heat_discomfort_strings = list( "Your feathers prickle in the heat.", "You feel uncomfortably warm.", @@ -120,4 +120,4 @@ /datum/species/teshari/equip_survival_gear(var/mob/living/carbon/human/H) ..() - H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) \ No newline at end of file + H.equip_to_slot_or_del(new /obj/item/clothing/shoes/sandal(H),slot_shoes) diff --git a/code/modules/mob/living/carbon/human/species/station/station.dm b/code/modules/mob/living/carbon/human/species/station/station.dm index 7c13fc239ce..8a2311bc8cc 100644 --- a/code/modules/mob/living/carbon/human/species/station/station.dm +++ b/code/modules/mob/living/carbon/human/species/station/station.dm @@ -190,7 +190,7 @@ language = "Rootspeak" unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/diona) //primitive_form = "Nymph" - slowdown = 7 + slowdown = 5 rarity_value = 3 hud_type = /datum/hud_data/diona siemens_coefficient = 0.3 diff --git a/code/modules/mob/living/carbon/human/stripping.dm b/code/modules/mob/living/carbon/human/stripping.dm index 19d7a799dd9..d67eaf76a99 100644 --- a/code/modules/mob/living/carbon/human/stripping.dm +++ b/code/modules/mob/living/carbon/human/stripping.dm @@ -124,13 +124,14 @@ if(can_reach_splints) var/removed_splint - for(var/organ in list(BP_L_LEG, BP_R_LEG, BP_L_ARM, BP_R_ARM)) - var/obj/item/organ/external/o = get_organ(organ) - if (o && o.status & ORGAN_SPLINTED) - var/obj/item/W = new /obj/item/stack/medical/splint(get_turf(src), 1) - o.status &= ~ORGAN_SPLINTED - W.add_fingerprint(user) - removed_splint = 1 + for(var/obj/item/organ/external/o in organs) + if (o && o.splinted) + var/obj/item/S = o.splinted + if(istype(S) && S.loc == o) //can only remove splints that are actually worn on the organ (deals with hardsuit splints) + S.add_fingerprint(user) + if(o.remove_splint()) + user.put_in_active_hand(S) + removed_splint = 1 if(removed_splint) visible_message("\The [user] removes \the [src]'s splints!") else diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm index 6607d166bf7..11eaf182daf 100644 --- a/code/modules/mob/living/carbon/human/update_icons.dm +++ b/code/modules/mob/living/carbon/human/update_icons.dm @@ -226,6 +226,7 @@ var/global/list/damage_icon_parts = list() var/skeleton = (SKELETON in src.mutations) robolimb_count = 0 + robobody_count = 0 //CACHING: Generate an index key from visible bodyparts. //0 = destroyed, 1 = normal, 2 = robotic, 3 = necrotic. @@ -257,6 +258,8 @@ var/global/list/damage_icon_parts = list() else if(part.robotic >= ORGAN_ROBOT) icon_key += "2[part.model ? "-[part.model]": ""]" robolimb_count++ + if(part.organ_tag == BP_HEAD || part.organ_tag == BP_TORSO || part.organ_tag == BP_GROIN) + robobody_count ++ else if(part.status & ORGAN_DEAD) icon_key += "3" else diff --git a/code/modules/mob/living/carbon/metroid/items.dm b/code/modules/mob/living/carbon/metroid/items.dm index 15455f375e8..c59c6826d5f 100644 --- a/code/modules/mob/living/carbon/metroid/items.dm +++ b/code/modules/mob/living/carbon/metroid/items.dm @@ -4,7 +4,7 @@ icon = 'icons/mob/slimes.dmi' icon_state = "grey slime extract" force = 1.0 - w_class = 1.0 + w_class = ITEMSIZE_TINY throwforce = 0 throw_speed = 3 throw_range = 6 @@ -292,7 +292,7 @@ icon = 'icons/mob/slimes.dmi' icon_state = "slime extract" force = 1.0 - w_class = 1.0 + w_class = ITEMSIZE_TINY throwforce = 1.0 throw_speed = 2 throw_range = 6 diff --git a/code/modules/mob/living/carbon/metroid/metroid.dm b/code/modules/mob/living/carbon/metroid/metroid.dm index b7a66b68420..3c0bfbdbadd 100644 --- a/code/modules/mob/living/carbon/metroid/metroid.dm +++ b/code/modules/mob/living/carbon/metroid/metroid.dm @@ -381,8 +381,3 @@ powerlevel = 10 adjustToxLoss(-10) nutrition = max(nutrition, get_max_nutrition()) - -/mob/living/carbon/slime/cannot_use_vents() - if(Victim) - return "You cannot ventcrawl while feeding." - ..() diff --git a/code/modules/mob/living/carbon/shock.dm b/code/modules/mob/living/carbon/shock.dm index 370d3f89d24..16085b05af5 100644 --- a/code/modules/mob/living/carbon/shock.dm +++ b/code/modules/mob/living/carbon/shock.dm @@ -10,7 +10,7 @@ src.traumatic_shock = \ 1 * src.getOxyLoss() + \ 0.7 * src.getToxLoss() + \ - 1.5 * src.getFireLoss() + \ + 1.2 * src.getFireLoss() + \ 1.2 * src.getBruteLoss() + \ 1.7 * src.getCloneLoss() + \ 2 * src.halloss + \ diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index ba5b8fd24cf..02de9188901 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -636,126 +636,10 @@ default behaviour is: resting = !resting src << "You are now [resting ? "resting" : "getting up"]" -/mob/living/proc/is_allowed_vent_crawl_item(var/obj/item/carried_item) - return (get_inventory_slot(carried_item) == 0) - -/mob/living/simple_animal/spiderbot/is_allowed_vent_crawl_item(var/obj/item/carried_item) - if(carried_item == held_item) - return 0 - return ..() - -//called when the mob receives a bright flash -/mob/living/flash_eyes(intensity = FLASH_PROTECTION_MODERATE, override_blindness_check = FALSE, affect_silicon = FALSE, visual = FALSE, type = /obj/screen/fullscreen/flash) - if(override_blindness_check || !(disabilities & BLIND)) - overlay_fullscreen("flash", type) - spawn(25) - if(src) - clear_fullscreen("flash", 25) - return 1 - -/mob/living/proc/handle_ventcrawl(var/obj/machinery/atmospherics/unary/vent_pump/vent_found = null, var/ignore_items = 0) // -- TLE -- Merged by Carn - if(stat) - src << "You must be conscious to do this!" - return - if(lying) - src << "You can't vent crawl while you're stunned!" - return - var/special_fail_msg = cannot_use_vents() - if(special_fail_msg) - src << "[special_fail_msg]" - return - - if(vent_found) // one was passed in, probably from vent/AltClick() - if(vent_found.welded) - src << "That vent is welded shut." - return - if(!vent_found.Adjacent(src)) - return // don't even acknowledge that - else - for(var/obj/machinery/atmospherics/unary/vent_pump/v in range(1,src)) - if(!v.welded) - if(v.Adjacent(src)) - vent_found = v - if(!vent_found) - src << "You'll need a non-welded vent to crawl into!" - return - - if(!vent_found.network || !vent_found.network.normal_members.len) - src << "This vent is not connected to anything." - return - - var/list/vents = list() - for(var/obj/machinery/atmospherics/unary/vent_pump/temp_vent in vent_found.network.normal_members) - if(temp_vent.welded) - continue - if(temp_vent in loc) - continue - var/turf/T = get_turf(temp_vent) - - if(!T || T.z != loc.z) - continue - - var/i = 1 - var/index = "[T.loc.name]\[[i]\]" - while(index in vents) - i++ - index = "[T.loc.name]\[[i]\]" - vents[index] = temp_vent - if(!vents.len) - src << "\red There are no available vents to travel to, they could be welded." - return - - var/obj/selection = input("Select a destination.", "Duct System") as null|anything in sortAssoc(vents) - if(!selection) return - - if(!vent_found.Adjacent(src)) - src << "Never mind, you left." - return - - if(!ignore_items) - var/list/badItems = list() - for(var/obj/item/carried_item in contents)//If the monkey got on objects. - if(!is_allowed_vent_crawl_item(carried_item)) - badItems += carried_item.name - if(badItems.len) - src << "Your [english_list(badItems)] prevent[badItems.len == 1 ? "s" : ""] you from ventcrawling." - return - - if(isslime(src)) - var/mob/living/carbon/slime/S = src - if(S.Victim) - src << "\red You'll have to let [S.Victim] go or finish eating \him first." - return - - var/obj/machinery/atmospherics/unary/vent_pump/target_vent = vents[selection] - if(!target_vent) - return - - for(var/mob/O in viewers(src, null)) - O.show_message(text("[src] scrambles into the ventillation ducts!"), 1) - loc = target_vent - - var/travel_time = round(get_dist(loc, target_vent.loc) / 2) - - spawn(travel_time) - - if(!target_vent) return - for(var/mob/O in hearers(target_vent,null)) - O.show_message("You hear something squeezing through the ventilation ducts.",2) - - sleep(travel_time) - - if(!target_vent) return - if(target_vent.welded) //the vent can be welded while alien scrolled through the list or travelled. - target_vent = vent_found //travel back. No additional time required. - src << "\red The vent you were heading to appears to be welded." - loc = target_vent.loc - var/area/new_area = get_area(loc) - if(new_area) - new_area.Entered(src) - /mob/living/proc/cannot_use_vents() - return "You can't fit into that vent." + if(mob_size > MOB_SMALL) + return "You can't fit into that vent." + return null /mob/living/proc/has_brain() return 1 diff --git a/code/modules/mob/living/living_powers.dm b/code/modules/mob/living/living_powers.dm index b4310d77b5e..4fb4c1bcbdb 100644 --- a/code/modules/mob/living/living_powers.dm +++ b/code/modules/mob/living/living_powers.dm @@ -1,13 +1,3 @@ -/mob/living/proc/ventcrawl() - set name = "Crawl through Vent" - set desc = "Enter an air vent and crawl through the pipe system." - set category = "Abilities" - - if(stat == DEAD || paralysis || weakened || stunned || restrained()) - return - - handle_ventcrawl() - /mob/living/proc/hide() set name = "Hide" set desc = "Allows to hide beneath tables or certain items. Toggled on or off." diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3c6f8585f67..fd38776dd53 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -400,7 +400,7 @@ var/list/ai_verbs_hidden = list( // For why this exists, refer to https://xkcd.c var/input = sanitize(input(usr, "Please choose a message to transmit to [boss_short] via quantum entanglement. Please be aware that this process is very expensive, and abuse will lead to... termination. Transmission does not guarantee a response. There is a 30 second delay before you may send another message, be clear, full and concise.", "To abort, send an empty message.", "")) if(!input) return - Centcomm_announce(input, usr) + CentCom_announce(input, usr) usr << "Message transmitted." log_say("[key_name(usr)] has made an IA [boss_short] announcement: [input]") emergency_message_cooldown = 1 diff --git a/code/modules/mob/living/silicon/ai/icons.dm b/code/modules/mob/living/silicon/ai/icons.dm index 83689c9dd4d..ebd47cc02d7 100644 --- a/code/modules/mob/living/silicon/ai/icons.dm +++ b/code/modules/mob/living/silicon/ai/icons.dm @@ -112,7 +112,7 @@ var/list/datum/ai_icon/ai_icons alive_light = "#585858" /datum/ai_icon/nanotrasen - name = "Nanotrasen" + name = "NanoTrasen" alive_icon = "ai-nanotrasen" alive_light = "#000029" diff --git a/code/modules/mob/living/silicon/death.dm b/code/modules/mob/living/silicon/death.dm index a8fd898ffff..f6bb92cb40b 100644 --- a/code/modules/mob/living/silicon/death.dm +++ b/code/modules/mob/living/silicon/death.dm @@ -5,6 +5,9 @@ /mob/living/silicon/dust() ..("dust-r", /obj/effect/decal/remains/robot) +/mob/living/silicon/ash() + ..("dust-r") + /mob/living/silicon/death(gibbed,deathmessage) if(in_contents_of(/obj/machinery/recharge_station))//exit the recharge station var/obj/machinery/recharge_station/RC = loc diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index bd757f9ab69..57a9dd837bd 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -7,7 +7,7 @@ pass_flags = 1 mob_size = MOB_SMALL - can_pull_size = 2 + can_pull_size = ITEMSIZE_SMALL can_pull_mobs = MOB_PULL_SMALLER idcard_type = /obj/item/weapon/card/id diff --git a/code/modules/mob/living/silicon/robot/analyzer.dm b/code/modules/mob/living/silicon/robot/analyzer.dm index 9881948b1b2..671f61e29c2 100644 --- a/code/modules/mob/living/silicon/robot/analyzer.dm +++ b/code/modules/mob/living/silicon/robot/analyzer.dm @@ -9,7 +9,7 @@ flags = CONDUCT slot_flags = SLOT_BELT throwforce = 3 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 5 throw_range = 10 origin_tech = list(TECH_MAGNET = 2, TECH_BIO = 1, TECH_ENGINEERING = 2) diff --git a/code/modules/mob/living/silicon/robot/death.dm b/code/modules/mob/living/silicon/robot/death.dm index 3dd2afd216f..8de8e405a4d 100644 --- a/code/modules/mob/living/silicon/robot/death.dm +++ b/code/modules/mob/living/silicon/robot/death.dm @@ -4,6 +4,11 @@ qdel(mmi) ..() +/mob/living/silicon/robot/ash() + if(mmi) + qdel(mmi) + ..() + /mob/living/silicon/robot/death(gibbed) if(camera) camera.status = 0 diff --git a/code/modules/mob/living/silicon/robot/drone/drone.dm b/code/modules/mob/living/silicon/robot/drone/drone.dm index 89f7942cc45..dbe09db217c 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone.dm @@ -37,7 +37,7 @@ var/list/mob_hat_cache = list() integrated_light_power = 3 local_transmit = 1 - can_pull_size = 3 + can_pull_size = ITEMSIZE_NORMAL can_pull_mobs = MOB_PULL_SMALLER mob_bump_flag = SIMPLE_ANIMAL @@ -69,7 +69,7 @@ var/list/mob_hat_cache = list() module_type = /obj/item/weapon/robot_module/drone/construction hat_x_offset = 1 hat_y_offset = -12 - can_pull_size = 5 + can_pull_size = ITEMSIZE_HUGE can_pull_mobs = MOB_PULL_SAME /mob/living/silicon/robot/drone/New() diff --git a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm index 9039801006e..737841d4cef 100644 --- a/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm +++ b/code/modules/mob/living/silicon/robot/drone/drone_manufacturer.dm @@ -8,6 +8,7 @@ /obj/machinery/drone_fabricator name = "drone fabricator" desc = "A large automated factory for producing maintenance drones." + appearance_flags = 0 density = 1 anchored = 1 diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 5350ba68c0c..2e666cff995 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -465,6 +465,7 @@ return var/obj/item/weapon/weldingtool/WT = W if (WT.remove_fuel(0)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustBruteLoss(-30) updatehealth() add_fingerprint(user) @@ -480,6 +481,7 @@ return var/obj/item/stack/cable_coil/coil = W if (coil.use(1)) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) adjustFireLoss(-30) updatehealth() for(var/mob/O in viewers(user, null)) @@ -547,8 +549,8 @@ user << "Close the panel first." else if(cell) user << "There is a power cell already installed." - else if(W.w_class != 3) - user << "\The [W] is too [W.w_class < 3? "small" : "large"] to fit here." + else if(W.w_class != ITEMSIZE_NORMAL) + user << "\The [W] is too [W.w_class < ITEMSIZE_NORMAL ? "small" : "large"] to fit here." else user.drop_item() W.loc = src diff --git a/code/modules/mob/living/silicon/robot/robot_items.dm b/code/modules/mob/living/silicon/robot/robot_items.dm index e5b8ff3de27..6e5616e7b48 100644 --- a/code/modules/mob/living/silicon/robot/robot_items.dm +++ b/code/modules/mob/living/silicon/robot/robot_items.dm @@ -152,9 +152,9 @@ if( I != src && !I.anchored && !istype(I, /obj/item/clothing/under) && !istype(I, /obj/item/clothing/suit) && !istype(I, /obj/item/projectile) ) var/add = 0 - if(I.w_class == 1.0) + if(I.w_class == ITEMSIZE_TINY) add = 1 - else if(I.w_class == 2.0) + else if(I.w_class == ITEMSIZE_SMALL) add = 3 else add = 5 diff --git a/code/modules/mob/living/silicon/robot/robot_modules.dm b/code/modules/mob/living/silicon/robot/robot_modules.dm index c1ca5732b5f..879f3f4cc5c 100644 --- a/code/modules/mob/living/silicon/robot/robot_modules.dm +++ b/code/modules/mob/living/silicon/robot/robot_modules.dm @@ -17,7 +17,7 @@ var/global/list/robot_modules = list( name = "robot module" icon = 'icons/obj/module.dmi' icon_state = "std_module" - w_class = 100.0 + w_class = ITEMSIZE_NO_CONTAINER item_state = "electronic" flags = CONDUCT var/hide_on_manifest = 0 diff --git a/code/modules/mob/living/simple_animal/constructs/soulstone.dm b/code/modules/mob/living/simple_animal/constructs/soulstone.dm index 54fd7382791..08160f257f7 100644 --- a/code/modules/mob/living/simple_animal/constructs/soulstone.dm +++ b/code/modules/mob/living/simple_animal/constructs/soulstone.dm @@ -7,7 +7,7 @@ icon_state = "soulstone" item_state = "electronic" desc = "A fragment of the legendary treasure known simply as the 'Soul Stone'. The shard still flickers with a fraction of the full artefacts power." - w_class = 2 + w_class = ITEMSIZE_SMALL slot_flags = SLOT_BELT origin_tech = list(TECH_BLUESPACE = 4, TECH_MATERIAL = 4) var/imprinted = "empty" diff --git a/code/modules/mob/living/simple_animal/friendly/mouse.dm b/code/modules/mob/living/simple_animal/friendly/mouse.dm index fa2d85d5bb4..cd545e0a87d 100644 --- a/code/modules/mob/living/simple_animal/friendly/mouse.dm +++ b/code/modules/mob/living/simple_animal/friendly/mouse.dm @@ -31,7 +31,7 @@ holder_type = /obj/item/weapon/holder/mouse mob_size = MOB_MINISCULE - can_pull_size = 1 + can_pull_size = ITEMSIZE_TINY can_pull_mobs = MOB_PULL_NONE /mob/living/simple_animal/mouse/Life() diff --git a/code/modules/mob/living/simple_animal/friendly/penguin.dm b/code/modules/mob/living/simple_animal/friendly/penguin.dm new file mode 100644 index 00000000000..b843013c396 --- /dev/null +++ b/code/modules/mob/living/simple_animal/friendly/penguin.dm @@ -0,0 +1,19 @@ +/mob/living/simple_animal/penguin + name = "space penguin" + desc = "An ungainly, waddling, cute, and VERY well-dressed bird." + icon_state = "penguin" + icon_living = "penguin" + icon_dead = "penguin_dead" + icon_gib = "generic_gib" + speak_chance = 0 + turns_per_move = 5 + maxHealth = 20 + health = 20 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + response_help = "pets" + response_disarm = "pushes aside" + response_harm = "hits" + harm_intent_damage = 5 + melee_damage_upper = 15 + melee_damage_lower = 10 + attacktext = "pecked" \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm index cffa215a002..fadfafc4585 100644 --- a/code/modules/mob/living/simple_animal/friendly/spiderbot.dm +++ b/code/modules/mob/living/simple_animal/friendly/spiderbot.dm @@ -255,7 +255,7 @@ var/list/items = list() for(var/obj/item/I in view(1,src)) - if(I.loc != src && I.w_class <= 2 && I.Adjacent(src) ) + if(I.loc != src && I.w_class <= ITEMSIZE_SMALL && I.Adjacent(src) ) items.Add(I) var/obj/selection = input("Select an item.", "Pickup") in items diff --git a/code/modules/mob/living/simple_animal/head.dm b/code/modules/mob/living/simple_animal/head.dm index 227d2bcf04a..0ce662d613e 100644 --- a/code/modules/mob/living/simple_animal/head.dm +++ b/code/modules/mob/living/simple_animal/head.dm @@ -28,7 +28,7 @@ "Crab say what?", "Man they say we have space lizards now, man this shit is getting more wack every minute", "The so called \"improved\" station AI is just bullshit, that thing aint fun for noone", - "The Captain is a traitor, he took my power core.", + "The Station Administrator is a traitor, he took my power core.", "Say \"what\" again. Say \"what\" again. I dare you. I double-dare you, motherfucker. Say \"what\" one more goddamn time.", "Ezekiel 25:17 ,The path of the righteous man is beset on all sides by the iniquities of the selfish and the tyranny of evil men. Blessed is he who in the name of charity and good will shepherds the weak through the valley of darkness, for he is truly his brother's keeper and the finder of lost children. And I will strike down upon thee with great vengeance and furious anger those who attempt to poison and destroy my brothers. And you will know my name is the Lord... when I lay my vengeance upon thee.", "Did you notice a sign out in front of my house that said \"Dead Nigger Storage\"?") diff --git a/code/modules/mob/living/simple_animal/hostile/goose.dm b/code/modules/mob/living/simple_animal/hostile/goose.dm new file mode 100644 index 00000000000..0f2c4af6117 --- /dev/null +++ b/code/modules/mob/living/simple_animal/hostile/goose.dm @@ -0,0 +1,34 @@ + + +/mob/living/simple_animal/hostile/goose + name = "space goose" + desc = "That's no duck. That's a space goose. You have a bad feeling about this." + icon_state = "goose" + icon_living = "goose" + icon_dead = "goose_dead" + icon_gib = "generic_gib" + speak_chance = 0 + turns_per_move = 5 + meat_type = /obj/item/weapon/reagent_containers/food/snacks/meat + response_help = "pets the" + response_disarm = "gently pushes aside the" + response_harm = "hits the" + speed = 4 + maxHealth = 15 //nothing an unarmed crewmember shouldn't be able to stomp into the dirt, if they're alone. + health = 15 + + harm_intent_damage = 5 + melee_damage_lower = 5 //they're meant to be annoying, not threatening. + melee_damage_upper = 5 //unless there's like a dozen of them, then you're screwed. + attacktext = "pecked" + attack_sound = 'sound/weapons/bite.ogg' + + break_stuff_probability = 5 + + faction = "geese" + + +/mob/living/simple_animal/hostile/goose/FindTarget() + . = ..() + if(.) + custom_emote(1,"flaps and honks at [.]!") \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/parrot.dm b/code/modules/mob/living/simple_animal/parrot.dm index 1e6752ab77b..36a1ac186ab 100644 --- a/code/modules/mob/living/simple_animal/parrot.dm +++ b/code/modules/mob/living/simple_animal/parrot.dm @@ -515,12 +515,12 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.w_class < 2) + if(I.w_class < ITEMSIZE_SMALL) return I if(iscarbon(AM)) var/mob/living/carbon/C = AM - if((C.l_hand && C.l_hand.w_class <= 2) || (C.r_hand && C.r_hand.w_class <= 2)) + if((C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL) || (C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL)) return C return null @@ -544,12 +544,12 @@ if(istype(AM, /obj/item)) var/obj/item/I = AM - if(I.w_class <= 2) + if(I.w_class <= ITEMSIZE_SMALL) return I if(iscarbon(AM)) var/mob/living/carbon/C = AM - if(C.l_hand && C.l_hand.w_class <= 2 || C.r_hand && C.r_hand.w_class <= 2) + if(C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL || C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL) return C return null @@ -571,7 +571,7 @@ for(var/obj/item/I in view(1,src)) //Make sure we're not already holding it and it's small enough - if(I.loc != src && I.w_class <= 2) + if(I.loc != src && I.w_class <= ITEMSIZE_SMALL) //If we have a perch and the item is sitting on it, continue if(!client && parrot_perch && I.loc == parrot_perch.loc) @@ -600,10 +600,10 @@ var/obj/item/stolen_item = null for(var/mob/living/carbon/C in view(1,src)) - if(C.l_hand && C.l_hand.w_class <= 2) + if(C.l_hand && C.l_hand.w_class <= ITEMSIZE_SMALL) stolen_item = C.l_hand - if(C.r_hand && C.r_hand.w_class <= 2) + if(C.r_hand && C.r_hand.w_class <= ITEMSIZE_SMALL) stolen_item = C.r_hand if(stolen_item) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 9d7ba1bc633..04058f2fe21 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -519,7 +519,7 @@ for(var/name in H.organs_by_name) var/obj/item/organ/external/e = H.organs_by_name[name] if(e && H.lying) - if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100)) + if(((e.status & ORGAN_BROKEN && !(e.splinted)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100)) return 1 break return 0 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index ce79b499042..47bbdcd3a63 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -139,7 +139,7 @@ var/const/deafness = 2//Carbon var/const/muteness = 4//Carbon - var/can_pull_size = 10 // Maximum w_class the mob can pull. + var/can_pull_size = ITEMSIZE_NO_CONTAINER // Maximum w_class the mob can pull. var/can_pull_mobs = MOB_PULL_LARGER // Whether or not the mob can pull other mobs. var/datum/dna/dna = null//Carbon diff --git a/code/modules/mob/mob_grab.dm b/code/modules/mob/mob_grab.dm index e40b14dffd6..bbddd4c07bd 100644 --- a/code/modules/mob/mob_grab.dm +++ b/code/modules/mob/mob_grab.dm @@ -34,7 +34,7 @@ layer = 21 abstract = 1 item_state = "nothing" - w_class = 5.0 + w_class = ITEMSIZE_HUGE /obj/item/weapon/grab/New(mob/user, mob/victim) @@ -301,6 +301,7 @@ //clicking on the victim while grabbing them if(M == affecting) if(ishuman(affecting)) + var/mob/living/carbon/human/H = affecting var/hit_zone = assailant.zone_sel.selecting flick(hud.icon_state, hud) switch(assailant.a_intent) @@ -309,7 +310,10 @@ assailant << "You are no longer pinning [affecting] to the ground." force_down = 0 return - inspect_organ(affecting, assailant, hit_zone) + if(state >= GRAB_AGGRESSIVE) + H.apply_pressure(assailant, hit_zone) + else + inspect_organ(affecting, assailant, hit_zone) if(I_GRAB) jointlock(affecting, assailant, hit_zone) diff --git a/code/modules/mob/new_player/new_player.dm b/code/modules/mob/new_player/new_player.dm index 060bd2b651e..80a9769f4ec 100644 --- a/code/modules/mob/new_player/new_player.dm +++ b/code/modules/mob/new_player/new_player.dm @@ -364,7 +364,7 @@ dat += "Welcome, [name].
    " dat += "Round Duration: [roundduration2text()]
    " - if(emergency_shuttle) //In case Nanotrasen decides reposess CentComm's shuttles. + if(emergency_shuttle) //In case NanoTrasen decides reposess CentCom's shuttles. if(emergency_shuttle.going_to_centcom()) //Shuttle is going to centcomm, not recalled dat += "The station has been evacuated.
    " if(emergency_shuttle.online()) diff --git a/code/modules/mob/new_player/preferences_setup.dm b/code/modules/mob/new_player/preferences_setup.dm index a10049a6447..92f0f512bda 100644 --- a/code/modules/mob/new_player/preferences_setup.dm +++ b/code/modules/mob/new_player/preferences_setup.dm @@ -29,7 +29,7 @@ all_underwear[WRC.name] = WRI.name - backbag = rand(1,4) + backbag = rand(1,5) pdachoice = rand(1,3) age = rand(current_species.min_age, current_species.max_age) b_type = RANDOM_BLOOD_TYPE diff --git a/code/modules/mob/new_player/skill.dm b/code/modules/mob/new_player/skill.dm index 1f713292029..e1e1025bae1 100644 --- a/code/modules/mob/new_player/skill.dm +++ b/code/modules/mob/new_player/skill.dm @@ -62,7 +62,7 @@ var/global/list/SKILL_PRE = list("Engineer" = SKILL_ENGINEER, "Roboticist" = SKI /datum/skill/knowledge/law ID = "law" name = "Corporate Law" - desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for captains." + desc = "Your knowledge of corporate law and procedures. This includes Corporate Regulations, as well as general station rulings and procedures. A low level in this skill is typical for security officers, a high level in this skill is typical for Station Administrators." field = "Security" secondary = 1 diff --git a/code/modules/mob/new_player/sprite_accessories.dm b/code/modules/mob/new_player/sprite_accessories.dm index 7c68dc59721..3f873c7a79b 100644 --- a/code/modules/mob/new_player/sprite_accessories.dm +++ b/code/modules/mob/new_player/sprite_accessories.dm @@ -193,6 +193,10 @@ spikyponytail name = "Spiky Ponytail" icon_state = "hair_spikyponytail" + + zieglertail + name = "Zieglertail" + icon_state = "hair_ziegler" wisp name = "Wisp" icon_state = "hair_wisp" @@ -435,6 +439,9 @@ name = "Poofy" icon_state = "hair_poofy" + poofy2 + name = "Poofy2" + icon_state = "hair_poofy2" crono name = "Chrono" icon_state = "hair_toriyama" @@ -507,6 +514,10 @@ name = "Double-Bun" icon_state = "hair_doublebun" + oxton + name = "Oxton" + icon_state = "hair_oxton" + /* /////////////////////////////////// @@ -614,6 +625,28 @@ name = "Dwarf Beard" icon_state = "facial_dwarf" +//unathi horn beards and the like + + una_chinhorn + name = "Unathi Chin Horn" + icon_state = "facial_chinhorns" + species_allowed = list("Unathi") + + una_hornadorns + name = "Unathi Horn Adorns" + icon_state = "facial_hornadorns" + species_allowed = list("Unathi") + + una_spinespikes + name = "Unathi Spine Spikes" + icon_state = "facial_spikes" + species_allowed = list("Unathi") + + una_dorsalfrill + name = "Unathi Dorsal Frill" + icon_state = "facial_dorsalfrill" + species_allowed = list("Unathi") + /* /////////////////////////////////// / =---------------------------= / @@ -648,6 +681,26 @@ icon_state = "soghun_horns" species_allowed = list("Unathi") + una_bighorns + name = "Unathi Big Horns" + icon_state = "unathi_bighorn" + species_allowed = list("Unathi") + + una_smallhorns + name = "Unathi Small Horns" + icon_state = "unathi_smallhorn" + species_allowed = list("Unathi") + + una_ramhorns + name = "Unathi Ram Horns" + icon_state = "unathi_ramhorn" + species_allowed = list("Unathi") + + una_sidefrills + name = "Unathi Side Frills" + icon_state = "unathi_sidefrills" + species_allowed = list("Unathi") + skr_tentacle_m name = "Skrell Male Tentacles" icon_state = "skrell_hair_m" diff --git a/code/modules/multiz/pipes.dm b/code/modules/multiz/pipes.dm index 85e23b6797f..1cb5b9b4da7 100644 --- a/code/modules/multiz/pipes.dm +++ b/code/modules/multiz/pipes.dm @@ -13,9 +13,6 @@ obj/machinery/atmospherics/pipe/zpipe dir = SOUTH initialize_directions = SOUTH - var/obj/machinery/atmospherics/node1 //connection on the same Z - var/obj/machinery/atmospherics/node2 //connection on the other Z - var/minimum_temperature_difference = 300 var/thermal_conductivity = 0 //WALL_HEAT_TRANSFER_COEFFICIENT No diff --git a/code/modules/organs/blood.dm b/code/modules/organs/blood.dm index 105a547e08e..7637264bac4 100644 --- a/code/modules/organs/blood.dm +++ b/code/modules/organs/blood.dm @@ -128,8 +128,18 @@ var/const/BLOOD_VOLUME_SURVIVE = 40 for(var/obj/item/organ/external/temp in organs) if(!(temp.status & ORGAN_BLEEDING) || (temp.robotic >= ORGAN_ROBOT)) continue - for(var/datum/wound/W in temp.wounds) if(W.bleeding()) - blood_max += W.damage / 40 + for(var/datum/wound/W in temp.wounds) + if(W.bleeding()) + if(temp.applied_pressure) + if(ishuman(temp.applied_pressure)) + var/mob/living/carbon/human/H = temp.applied_pressure + H.bloody_hands(src, 0) + //somehow you can apply pressure to every wound on the organ at the same time + //you're basically forced to do nothing at all, so let's make it pretty effective + var/min_eff_damage = max(0, W.damage - 10) / 6 //still want a little bit to drip out, for effect + blood_max += max(min_eff_damage, W.damage - 30) / 30 + else + blood_max += W.damage / 30 if (temp.open) blood_max += 2 //Yer stomach is cut open drip(blood_max) diff --git a/code/modules/organs/internal/appendix.dm b/code/modules/organs/internal/appendix.dm index b3fdc28bc2d..f756b71efa4 100644 --- a/code/modules/organs/internal/appendix.dm +++ b/code/modules/organs/internal/appendix.dm @@ -46,7 +46,7 @@ var/datum/wound/W = new /datum/wound/internal_bleeding(20) owner.adjustToxLoss(25) groin.wounds += W - inflamed = 0 + inflamed = 1 /obj/item/organ/internal/appendix/removed() if(inflamed) diff --git a/code/modules/organs/organ.dm b/code/modules/organs/organ.dm index fad60cc0d78..c3a349df173 100644 --- a/code/modules/organs/organ.dm +++ b/code/modules/organs/organ.dm @@ -254,7 +254,6 @@ var/list/organ_cache = list() robotic = ORGAN_ROBOT src.status &= ~ORGAN_BROKEN src.status &= ~ORGAN_BLEEDING - src.status &= ~ORGAN_SPLINTED src.status &= ~ORGAN_CUT_AWAY /obj/item/organ/proc/mechassist() //Used to add things like pacemakers, etc diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 612cda4a985..d7a695baf44 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -38,6 +38,7 @@ var/list/s_col // skin colour var/list/h_col // hair colour var/body_hair // Icon blend for body hair if any. + var/mob/living/applied_pressure // Wound and structural data. var/wound_update_accuracy = 1 // how often wounds should be updated, a higher number means less often @@ -50,6 +51,7 @@ var/list/implants = list() // Currently implanted objects. var/organ_rel_size = 25 // Relative size of the organ. var/base_miss_chance = 20 // Chance of missing. + var/atom/movable/splinted // Joint/state stuff. var/can_grasp // It would be more appropriate if these two were named "affects_grasp" and "affects_stand" at this point @@ -84,6 +86,10 @@ for(var/obj/item/organ/O in internal_organs) qdel(O) + if(splinted && splinted.loc == src) + qdel(splinted) + splinted = null + if(owner) owner.organs -= src owner.organs_by_name[organ_tag] = null @@ -524,11 +530,11 @@ This function completely restores a damaged organ to perfect condition. //external organs handle brokenness a bit differently when it comes to damage. Instead brute_dam is checked inside process() //this also ensures that an external organ cannot be "broken" without broken_description being set. /obj/item/organ/external/is_broken() - return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(status & ORGAN_SPLINTED))) + return ((status & ORGAN_CUT_AWAY) || ((status & ORGAN_BROKEN) && !(splinted))) //Determines if we even need to process this organ. /obj/item/organ/external/proc/need_process() - if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_SPLINTED|ORGAN_DEAD|ORGAN_MUTATED)) + if(status & (ORGAN_CUT_AWAY|ORGAN_BLEEDING|ORGAN_BROKEN|ORGAN_DESTROYED|ORGAN_DEAD|ORGAN_MUTATED)) return 1 if((brute_dam || burn_dam) && (robotic < ORGAN_ROBOT)) //Robot limbs don't autoheal and thus don't need to process when damaged return 1 @@ -871,7 +877,7 @@ Note that amputating the affected organ does in fact remove the infection from t if(DROPLIMB_BURN) new /obj/effect/decal/cleanable/ash(get_turf(victim)) for(var/obj/item/I in src) - if(I.w_class > 2 && !istype(I,/obj/item/organ)) + if(I.w_class > ITEMSIZE_SMALL && !istype(I,/obj/item/organ)) I.loc = get_turf(src) qdel(src) if(DROPLIMB_BLUNT) @@ -893,7 +899,7 @@ Note that amputating the affected organ does in fact remove the infection from t I.throw_at(get_edge_target_turf(src,pick(alldirs)),rand(1,3),30) for(var/obj/item/I in src) - if(I.w_class <= 2) + if(I.w_class <= ITEMSIZE_SMALL) qdel(I) continue I.loc = get_turf(src) @@ -1006,21 +1012,10 @@ Note that amputating the affected organ does in fact remove the infection from t // This is mostly for the ninja suit to stop ninja being so crippled by breaks. // TODO: consider moving this to a suit proc or process() or something during // hardsuit rewrite. - if(owner && !(status & ORGAN_SPLINTED) && istype(owner,/mob/living/carbon/human)) - var/mob/living/carbon/human/H = owner - - if(H.wear_suit && istype(H.wear_suit,/obj/item/clothing/suit/space)) - - var/obj/item/clothing/suit/space/suit = H.wear_suit - - if(isnull(suit.supporting_limbs)) - return - - owner << "You feel \the [suit] constrict about your [name], supporting it." - status |= ORGAN_SPLINTED - suit.supporting_limbs |= src - return + if(!(splinted) && owner && istype(owner.wear_suit, /obj/item/clothing/suit/space)) + var/obj/item/clothing/suit/space/suit = owner.wear_suit + suit.handle_fracture(owner, src) /obj/item/organ/external/proc/mend_fracture() if(robotic >= ORGAN_ROBOT) @@ -1031,6 +1026,24 @@ Note that amputating the affected organ does in fact remove the infection from t status &= ~ORGAN_BROKEN return 1 +/obj/item/organ/external/proc/apply_splint(var/atom/movable/splint) + if(!splinted) + splinted = splint + if(!applied_pressure) + applied_pressure = splint + return 1 + return 0 + +/obj/item/organ/external/proc/remove_splint() + if(splinted) + if(splinted.loc == src) + splinted.dropInto(owner? owner.loc : src.loc) + if(applied_pressure == splinted) + applied_pressure = null + splinted = null + return 1 + return 0 + /obj/item/organ/external/robotize(var/company, var/skip_prosthetics = 0, var/keep_organs = 0) if(robotic >= ORGAN_ROBOT) @@ -1054,6 +1067,7 @@ Note that amputating the affected organ does in fact remove the infection from t dislocated = -1 cannot_break = 1 + remove_splint() get_icon() unmutate() @@ -1130,7 +1144,7 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/atom/movable/implant in implants) //large items and non-item objs fall to the floor, everything else stays var/obj/item/I = implant - if(istype(I) && I.w_class < 3) + if(istype(I) && I.w_class < ITEMSIZE_NORMAL) implant.loc = get_turf(victim.loc) else implant.loc = src @@ -1235,11 +1249,20 @@ Note that amputating the affected organ does in fact remove the infection from t for(var/datum/wound/W in wounds) if(W.internal && !open) continue // can't see internal wounds var/this_wound_desc = W.desc - if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]" - if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]" - else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]" - if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]" - else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]" + + if(W.damage_type == BURN && W.salved) + this_wound_desc = "salved [this_wound_desc]" + + if(W.bleeding()) + this_wound_desc = "bleeding [this_wound_desc]" + else if(W.bandaged) + this_wound_desc = "bandaged [this_wound_desc]" + + if(W.germ_level > 600) + this_wound_desc = "badly infected [this_wound_desc]" + else if(W.germ_level > 330) + this_wound_desc = "lightly infected [this_wound_desc]" + if(wound_descriptors[this_wound_desc]) wound_descriptors[this_wound_desc] += W.amount else diff --git a/code/modules/organs/subtypes/diona.dm b/code/modules/organs/subtypes/diona.dm index 7f371066bbd..4ae5e964ac9 100644 --- a/code/modules/organs/subtypes/diona.dm +++ b/code/modules/organs/subtypes/diona.dm @@ -30,7 +30,7 @@ icon_name = "torso" max_damage = 200 min_broken_damage = 50 - w_class = 5 + w_class = ITEMSIZE_HUGE body_part = UPPER_TORSO vital = 1 cannot_amputate = 1 @@ -43,7 +43,7 @@ icon_name = "groin" max_damage = 100 min_broken_damage = 50 - w_class = 4 + w_class = ITEMSIZE_LARGE body_part = LOWER_TORSO parent_organ = BP_TORSO gendered_icon = 1 @@ -54,7 +54,7 @@ icon_name = "l_arm" max_damage = 50 min_broken_damage = 20 - w_class = 3 + w_class = ITEMSIZE_NORMAL body_part = ARM_LEFT parent_organ = BP_TORSO can_grasp = 1 @@ -71,7 +71,7 @@ icon_name = "l_leg" max_damage = 50 min_broken_damage = 20 - w_class = 3 + w_class = ITEMSIZE_NORMAL body_part = LEG_LEFT icon_position = LEFT parent_organ = BP_GROIN @@ -90,7 +90,7 @@ icon_name = "l_foot" max_damage = 35 min_broken_damage = 10 - w_class = 2 + w_class = ITEMSIZE_SMALL body_part = FOOT_LEFT icon_position = LEFT parent_organ = "l_leg" @@ -112,7 +112,7 @@ icon_name = "l_hand" max_damage = 40 min_broken_damage = 15 - w_class = 2 + w_class = ITEMSIZE_SMALL body_part = HAND_LEFT parent_organ = "l_arm" can_grasp = 1 diff --git a/code/modules/organs/subtypes/standard.dm b/code/modules/organs/subtypes/standard.dm index f54945b51d3..e0409fb16e0 100644 --- a/code/modules/organs/subtypes/standard.dm +++ b/code/modules/organs/subtypes/standard.dm @@ -10,7 +10,7 @@ icon_name = "torso" max_damage = 100 min_broken_damage = 35 - w_class = 5 + w_class = ITEMSIZE_HUGE body_part = UPPER_TORSO vital = 1 amputation_point = "spine" @@ -34,7 +34,7 @@ icon_name = "groin" max_damage = 100 min_broken_damage = 35 - w_class = 4 + w_class = ITEMSIZE_LARGE body_part = LOWER_TORSO vital = 1 parent_organ = BP_TORSO @@ -42,6 +42,7 @@ joint = "hip" dislocated = -1 gendered_icon = 1 + cannot_amputate = 1 organ_rel_size = 30 /obj/item/organ/external/arm @@ -50,7 +51,7 @@ icon_name = "l_arm" max_damage = 80 min_broken_damage = 30 - w_class = 3 + w_class = ITEMSIZE_NORMAL body_part = ARM_LEFT parent_organ = BP_TORSO joint = "left elbow" @@ -71,7 +72,7 @@ icon_name = "l_leg" max_damage = 80 min_broken_damage = 30 - w_class = 3 + w_class = ITEMSIZE_NORMAL body_part = LEG_LEFT icon_position = LEFT parent_organ = BP_GROIN @@ -94,7 +95,7 @@ icon_name = "l_foot" max_damage = 50 min_broken_damage = 15 - w_class = 2 + w_class = ITEMSIZE_SMALL body_part = FOOT_LEFT icon_position = LEFT parent_organ = "l_leg" @@ -123,7 +124,7 @@ icon_name = "l_hand" max_damage = 50 min_broken_damage = 15 - w_class = 2 + w_class = ITEMSIZE_SMALL body_part = HAND_LEFT parent_organ = "l_arm" joint = "left wrist" @@ -153,7 +154,7 @@ slot_flags = SLOT_BELT max_damage = 75 min_broken_damage = 35 - w_class = 3 + w_class = ITEMSIZE_NORMAL body_part = HEAD vital = 1 parent_organ = BP_TORSO diff --git a/code/modules/paperwork/adminpaper.dm b/code/modules/paperwork/adminpaper.dm index 7843552f8c1..230d8984e8f 100644 --- a/code/modules/paperwork/adminpaper.dm +++ b/code/modules/paperwork/adminpaper.dm @@ -40,7 +40,7 @@ var/originhash = md5("[origin]") var/timehash = copytext(md5("[world.time]"),1,10) var/text = null - var/logo = alert(usr, "Do you want the header of your fax to have a Nanotrasen or SolGov logo?","Fax Logo","Nanotrasen","SolGov") + var/logo = alert(usr, "Do you want the header of your fax to have a NanoTrasen or SolGov logo?","Fax Logo","NanoTrasen","SolGov") if(logo == "SolGov") logo = "sglogo.png" else diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 891fd809fe4..ccb527986ff 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -4,7 +4,7 @@ icon_state = "clipboard" item_state = "clipboard" throwforce = 0 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 3 throw_range = 10 var/obj/item/weapon/pen/haspen //The stored pen. @@ -43,7 +43,7 @@ return /obj/item/weapon/clipboard/attackby(obj/item/weapon/W as obj, mob/user as mob) - + if(istype(W, /obj/item/weapon/paper) || istype(W, /obj/item/weapon/photo)) user.drop_item() W.loc = src @@ -106,20 +106,20 @@ else if(href_list["write"]) var/obj/item/weapon/P = locate(href_list["write"]) - + if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) && (P == toppaper) ) - + var/obj/item/I = usr.get_active_hand() - + if(istype(I, /obj/item/weapon/pen)) - + P.attackby(I, usr) else if(href_list["remove"]) var/obj/item/P = locate(href_list["remove"]) - + if(P && (P.loc == src) && (istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/photo)) ) - + P.loc = usr.loc usr.put_in_hands(P) if(P == toppaper) @@ -129,24 +129,24 @@ toppaper = newtop else toppaper = null - + else if(href_list["rename"]) var/obj/item/weapon/O = locate(href_list["rename"]) - + if(O && (O.loc == src)) if(istype(O, /obj/item/weapon/paper)) var/obj/item/weapon/paper/to_rename = O to_rename.rename() - + else if(istype(O, /obj/item/weapon/photo)) var/obj/item/weapon/photo/to_rename = O to_rename.rename() else if(href_list["read"]) var/obj/item/weapon/paper/P = locate(href_list["read"]) - + if(P && (P.loc == src) && istype(P, /obj/item/weapon/paper) ) - + if(!(istype(usr, /mob/living/carbon/human) || istype(usr, /mob/observer/dead) || istype(usr, /mob/living/silicon))) usr << browse("[P.name][stars(P.info)][P.stamps]", "window=[P.name]") onclose(usr, "[P.name]") diff --git a/code/modules/paperwork/faxmachine.dm b/code/modules/paperwork/faxmachine.dm index cf1da677f09..f2c309ff039 100644 --- a/code/modules/paperwork/faxmachine.dm +++ b/code/modules/paperwork/faxmachine.dm @@ -181,11 +181,11 @@ var/list/adminfaxes = list() //cache for faxes that have been sent to admins //message badmins that a fax has arrived if (destination == boss_name) - message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentcommFaxReply", "#006100") + message_admins(sender, "[uppertext(boss_short)] FAX", rcvdcopy, "CentComFaxReply", "#006100") else if ("Sif Governmental Authority") - message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentcommFaxReply", "#1F66A0") + message_admins(sender, "SIF GOVERNMENT FAX", rcvdcopy, "CentComFaxReply", "#1F66A0") else if ("Supply") - message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentcommFaxReply", "#5F4519") + message_admins(sender, "[uppertext(boss_short)] SUPPLY FAX", rcvdcopy, "CentComFaxReply", "#5F4519") else message_admins(sender, "[uppertext(destination)] FAX", rcvdcopy, "UNKNOWN") diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 57691fed9ba..a8e0c6eacb8 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -30,7 +30,6 @@ if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle)) I.loc = src - /obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle)) user << "You put [P] in [src]." @@ -57,7 +56,6 @@ else user << "You can't put [P] in [src]!" - /obj/structure/filingcabinet/attack_hand(mob/user as mob) if(contents.len <= 0) user << "\The [src] is empty." @@ -103,7 +101,6 @@ sleep(5) icon_state = initial(icon_state) - /* * Security Record Cabinets */ diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index cfb662a3409..2c967ba62c7 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -3,7 +3,7 @@ desc = "A folder." icon = 'icons/obj/bureaucracy.dmi' icon_state = "folder" - w_class = 2 + w_class = ITEMSIZE_SMALL pressure_resistance = 2 /obj/item/weapon/folder/blue @@ -23,7 +23,7 @@ icon_state = "folder_white" /obj/item/weapon/folder/blue_captain - desc = "A blue folder with Captain markings." + desc = "A blue folder with Station Administrator markings." icon_state = "folder_captain" /obj/item/weapon/folder/blue_hop diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index ba80dbb6147..f78ab086878 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -10,7 +10,7 @@ icon_state = "paper" item_state = "paper" throwforce = 0 - w_class = 1 + w_class = ITEMSIZE_TINY throw_range = 1 throw_speed = 1 layer = 4 @@ -521,7 +521,7 @@ /obj/item/weapon/paper/courtroom name = "A Crash Course in Legal SOP on SS13" - info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Captain/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" + info = "Roles:
    \nThe Detective is basically the investigator and prosecutor.
    \nThe Staff Assistant can perform these functions with written authority from the Detective.
    \nThe Station Administrator/HoP/Warden is ct as the judicial authority.
    \nThe Security Officers are responsible for executing warrants, security during trial, and prisoner transport.
    \n
    \nInvestigative Phase:
    \nAfter the crime has been committed the Detective's job is to gather evidence and try to ascertain not only who did it but what happened. He must take special care to catalogue everything and don't leave anything out. Write out all the evidence on paper. Make sure you take an appropriate number of fingerprints. IF he must ask someone questions he has permission to confront them. If the person refuses he can ask a judicial authority to write a subpoena for questioning. If again he fails to respond then that person is to be jailed as insubordinate and obstructing justice. Said person will be released after he cooperates.
    \n
    \nONCE the FT has a clear idea as to who the criminal is he is to write an arrest warrant on the piece of paper. IT MUST LIST THE CHARGES. The FT is to then go to the judicial authority and explain a small version of his case. If the case is moderately acceptable the authority should sign it. Security must then execute said warrant.
    \n
    \nPre-Pre-Trial Phase:
    \nNow a legal representative must be presented to the defendant if said defendant requests one. That person and the defendant are then to be given time to meet (in the jail IS ACCEPTABLE). The defendant and his lawyer are then to be given a copy of all the evidence that will be presented at trial (rewriting it all on paper is fine). THIS IS CALLED THE DISCOVERY PACK. With a few exceptions, THIS IS THE ONLY EVIDENCE BOTH SIDES MAY USE AT TRIAL. IF the prosecution will be seeking the death penalty it MUST be stated at this time. ALSO if the defense will be seeking not guilty by mental defect it must state this at this time to allow ample time for examination.
    \nNow at this time each side is to compile a list of witnesses. By default, the defendant is on both lists regardless of anything else. Also the defense and prosecution can compile more evidence beforehand BUT in order for it to be used the evidence MUST also be given to the other side.\nThe defense has time to compile motions against some evidence here.
    \nPossible Motions:
    \n1. Invalidate Evidence- Something with the evidence is wrong and the evidence is to be thrown out. This includes irrelevance or corrupt security.
    \n2. Free Movement- Basically the defendant is to be kept uncuffed before and during the trial.
    \n3. Subpoena Witness- If the defense presents god reasons for needing a witness but said person fails to cooperate then a subpoena is issued.
    \n4. Drop the Charges- Not enough evidence is there for a trial so the charges are to be dropped. The FT CAN RETRY but the judicial authority must carefully reexamine the new evidence.
    \n5. Declare Incompetent- Basically the defendant is insane. Once this is granted a medical official is to examine the patient. If he is indeed insane he is to be placed under care of the medical staff until he is deemed competent to stand trial.
    \n
    \nALL SIDES MOVE TO A COURTROOM
    \nPre-Trial Hearings:
    \nA judicial authority and the 2 sides are to meet in the trial room. NO ONE ELSE BESIDES A SECURITY DETAIL IS TO BE PRESENT. The defense submits a plea. If the plea is guilty then proceed directly to sentencing phase. Now the sides each present their motions to the judicial authority. He rules on them. Each side can debate each motion. Then the judicial authority gets a list of crew members. He first gets a chance to look at them all and pick out acceptable and available jurors. Those jurors are then called over. Each side can ask a few questions and dismiss jurors they find too biased. HOWEVER before dismissal the judicial authority MUST agree to the reasoning.
    \n
    \nThe Trial:
    \nThe trial has three phases.
    \n1. Opening Arguments- Each side can give a short speech. They may not present ANY evidence.
    \n2. Witness Calling/Evidence Presentation- The prosecution goes first and is able to call the witnesses on his approved list in any order. He can recall them if necessary. During the questioning the lawyer may use the evidence in the questions to help prove a point. After every witness the other side has a chance to cross-examine. After both sides are done questioning a witness the prosecution can present another or recall one (even the EXACT same one again!). After prosecution is done the defense can call witnesses. After the initial cases are presented both sides are free to call witnesses on either list.
    \nFINALLY once both sides are done calling witnesses we move onto the next phase.
    \n3. Closing Arguments- Same as opening.
    \nThe jury then deliberates IN PRIVATE. THEY MUST ALL AGREE on a verdict. REMEMBER: They mix between some charges being guilty and others not guilty (IE if you supposedly killed someone with a gun and you unfortunately picked up a gun without authorization then you CAN be found not guilty of murder BUT guilty of possession of illegal weaponry.). Once they have agreed they present their verdict. If unable to reach a verdict and feel they will never they call a deadlocked jury and we restart at Pre-Trial phase with an entirely new set of jurors.
    \n
    \nSentencing Phase:
    \nIf the death penalty was sought (you MUST have gone through a trial for death penalty) then skip to the second part.
    \nI. Each side can present more evidence/witnesses in any order. There is NO ban on emotional aspects or anything. The prosecution is to submit a suggested penalty. After all the sides are done then the judicial authority is to give a sentence.
    \nII. The jury stays and does the same thing as I. Their sole job is to determine if the death penalty is applicable. If NOT then the judge selects a sentence.
    \n
    \nTADA you're done. Security then executes the sentence and adds the applicable convictions to the person's record.
    \n" /obj/item/weapon/paper/hydroponics name = "Greetings from Billy Bob" @@ -538,7 +538,7 @@ /obj/item/weapon/paper/jobs name = "Job Information" - info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nCaptain 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" + info = "Information on all formal jobs that can be assigned on Space Station 13 can be found on this document.
    \nThe data will be in the following form.
    \nGenerally lower ranking positions come first in this list.
    \n
    \nJob Name general access>lab access-engine access-systems access (atmosphere control)
    \n\tJob Description
    \nJob Duties (in no particular order)
    \nTips (where applicable)
    \n
    \nResearch Assistant 1>1-0-0
    \n\tThis is probably the lowest level position. Anyone who enters the space station after the initial job\nassignment will automatically receive this position. Access with this is restricted. Head of Personnel should\nappropriate the correct level of assistance.
    \n1. Assist the researchers.
    \n2. Clean up the labs.
    \n3. Prepare materials.
    \n
    \nStaff Assistant 2>0-0-0
    \n\tThis position assists the security officer in his duties. The staff assisstants should primarily br\npatrolling the ship waiting until they are needed to maintain ship safety.\n(Addendum: Updated/Elevated Security Protocols admit issuing of low level weapons to security personnel)
    \n1. Patrol ship/Guard key areas
    \n2. Assist security officer
    \n3. Perform other security duties.
    \n
    \nTechnical Assistant 1>0-0-1
    \n\tThis is yet another low level position. The technical assistant helps the engineer and the statian\ntechnician with the upkeep and maintenance of the station. This job is very important because it usually\ngets to be a heavy workload on station technician and these helpers will alleviate that.
    \n1. Assist Station technician and Engineers.
    \n2. Perform general maintenance of station.
    \n3. Prepare materials.
    \n
    \nMedical Assistant 1>1-0-0
    \n\tThis is the fourth position yet it is slightly less common. This position doesn't have much power\noutside of the med bay. Consider this position like a nurse who helps to upkeep medical records and the\nmaterials (filling syringes and checking vitals)
    \n1. Assist the medical personnel.
    \n2. Update medical files.
    \n3. Prepare materials for medical operations.
    \n
    \nResearch Technician 2>3-0-0
    \n\tThis job is primarily a step up from research assistant. These people generally do not get their own lab\nbut are more hands on in the experimentation process. At this level they are permitted to work as consultants to\nthe others formally.
    \n1. Inform superiors of research.
    \n2. Perform research alongside of official researchers.
    \n
    \nDetective 3>2-0-0
    \n\tThis job is in most cases slightly boring at best. Their sole duty is to\nperform investigations of crine scenes and analysis of the crime scene. This\nalleviates SOME of the burden from the security officer. This person's duty\nis to draw conclusions as to what happened and testify in court. Said person\nalso should stroe the evidence ly.
    \n1. Perform crime-scene investigations/draw conclusions.
    \n2. Store and catalogue evidence properly.
    \n3. Testify to superiors/inquieries on findings.
    \n
    \nStation Technician 2>0-2-3
    \n\tPeople assigned to this position must work to make sure all the systems aboard Space Station 13 are operable.\nThey should primarily work in the computer lab and repairing faulty equipment. They should work with the\natmospheric technician.
    \n1. Maintain SS13 systems.
    \n2. Repair equipment.
    \n
    \nAtmospheric Technician 3>0-0-4
    \n\tThese people should primarily work in the atmospheric control center and lab. They have the very important\njob of maintaining the delicate atmosphere on SS13.
    \n1. Maintain atmosphere on SS13
    \n2. Research atmospheres on the space station. (safely please!)
    \n
    \nEngineer 2>1-3-0
    \n\tPeople working as this should generally have detailed knowledge as to how the propulsion systems on SS13\nwork. They are one of the few classes that have unrestricted access to the engine area.
    \n1. Upkeep the engine.
    \n2. Prevent fires in the engine.
    \n3. Maintain a safe orbit.
    \n
    \nMedical Researcher 2>5-0-0
    \n\tThis position may need a little clarification. Their duty is to make sure that all experiments are safe and\nto conduct experiments that may help to improve the station. They will be generally idle until a new laboratory\nis constructed.
    \n1. Make sure the station is kept safe.
    \n2. Research medical properties of materials studied of Space Station 13.
    \n
    \nScientist 2>5-0-0
    \n\tThese people study the properties, particularly the toxic properties, of materials handled on SS13.\nTechnically they can also be called Phoron Technicians as phoron is the material they routinly handle.
    \n1. Research phoron
    \n2. Make sure all phoron is properly handled.
    \n
    \nMedical Doctor (Officer) 2>0-0-0
    \n\tPeople working this job should primarily stay in the medical area. They should make sure everyone goes to\nthe medical bay for treatment and examination. Also they should make sure that medical supplies are kept in\norder.
    \n1. Heal wounded people.
    \n2. Perform examinations of all personnel.
    \n3. Moniter usage of medical equipment.
    \n
    \nSecurity Officer 3>0-0-0
    \n\tThese people should attempt to keep the peace inside the station and make sure the station is kept safe. One\nside duty is to assist in repairing the station. They also work like general maintenance personnel. They are not\ngiven a weapon and must use their own resources.
    \n(Addendum: Updated/Elevated Security Protocols admit issuing of weapons to security personnel)
    \n1. Maintain order.
    \n2. Assist others.
    \n3. Repair structural problems.
    \n
    \nHead of Security 4>5-2-2
    \n\tPeople assigned as Head of Security should issue orders to the security staff. They should\nalso carefully moderate the usage of all security equipment. All security matters should be reported to this person.
    \n1. Oversee security.
    \n2. Assign patrol duties.
    \n3. Protect the station and staff.
    \n
    \nHead of Personnel 4>4-2-2
    \n\tPeople assigned as head of personnel will find themselves moderating all actions done by personnel. \nAlso they have the ability to assign jobs and access levels.
    \n1. Assign duties.
    \n2. Moderate personnel.
    \n3. Moderate research.
    \n
    \nStation Administrator 5>5-5-5 (unrestricted station wide access)
    \n\tThis is the highest position youi can aquire on Space Station 13. They are allowed anywhere inside the\nspace station and therefore should protect their ID card. They also have the ability to assign positions\nand access levels. They should not abuse their power.
    \n1. Assign all positions on SS13
    \n2. Inspect the station for any problems.
    \n3. Perform administrative duties.
    \n" /obj/item/weapon/paper/photograph name = "photo" diff --git a/code/modules/paperwork/paper_bundle.dm b/code/modules/paperwork/paper_bundle.dm index 53110bed0fa..350aab34145 100644 --- a/code/modules/paperwork/paper_bundle.dm +++ b/code/modules/paperwork/paper_bundle.dm @@ -5,7 +5,7 @@ icon_state = "paper" item_state = "paper" throwforce = 0 - w_class = 2 + w_class = ITEMSIZE_SMALL throw_range = 2 throw_speed = 1 layer = 4 diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index a2a1273ced5..f6d192276f1 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -8,7 +8,7 @@ ) item_state = "sheet-metal" throwforce = 1 - w_class = 3 + w_class = ITEMSIZE_NORMAL throw_speed = 3 throw_range = 7 pressure_resistance = 10 diff --git a/code/modules/paperwork/papershredder.dm b/code/modules/paperwork/papershredder.dm index 37cfdaa86b1..48e95071c51 100644 --- a/code/modules/paperwork/papershredder.dm +++ b/code/modules/paperwork/papershredder.dm @@ -128,7 +128,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "shredp" throwforce = 0 - w_class = 1 + w_class = ITEMSIZE_TINY throw_range = 3 throw_speed = 1 diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index 7ee79cb923e..c36ec736ae6 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -17,7 +17,7 @@ item_state = "pen" slot_flags = SLOT_BELT | SLOT_EARS throwforce = 0 - w_class = 1.0 + w_class = ITEMSIZE_TINY throw_speed = 7 throw_range = 15 matter = list(DEFAULT_WALL_MATERIAL = 10) @@ -184,7 +184,7 @@ desc = "A colourful crayon. Please refrain from eating it or putting it in your nose." icon = 'icons/obj/crayons.dmi' icon_state = "crayonred" - w_class = 1.0 + w_class = ITEMSIZE_TINY attack_verb = list("attacked", "coloured") colour = "#FF0000" //RGB var/shadeColour = "#220000" //RGB diff --git a/code/modules/paperwork/photocopier.dm b/code/modules/paperwork/photocopier.dm index 4d0e22f1860..57d10ed227e 100644 --- a/code/modules/paperwork/photocopier.dm +++ b/code/modules/paperwork/photocopier.dm @@ -16,7 +16,6 @@ var/maxcopies = 10 //how many copies can be copied at once- idea shamelessly stolen from bs12's copier! /obj/machinery/photocopier/New() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0df6b304328..bbaec173188 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -15,7 +15,7 @@ desc = "A camera film cartridge. Insert it into a camera to reload it." icon_state = "film" item_state = "camera" - w_class = 1.0 + w_class = ITEMSIZE_TINY /******** @@ -28,7 +28,7 @@ var/global/photo_count = 0 icon = 'icons/obj/items.dmi' icon_state = "photo" item_state = "paper" - w_class = 2.0 + w_class = ITEMSIZE_SMALL var/id var/icon/img //Big photo image var/scribble //Scribble on the back. @@ -121,7 +121,7 @@ var/global/photo_count = 0 desc = "A polaroid camera. 10 photos left." icon_state = "camera" item_state = "camera" - w_class = 2.0 + w_class = ITEMSIZE_SMALL flags = CONDUCT slot_flags = SLOT_BELT matter = list(DEFAULT_WALL_MATERIAL = 2000) diff --git a/code/modules/paperwork/stamps.dm b/code/modules/paperwork/stamps.dm index feb740ba735..e64bb7b13fe 100644 --- a/code/modules/paperwork/stamps.dm +++ b/code/modules/paperwork/stamps.dm @@ -5,7 +5,7 @@ icon_state = "stamp-qm" item_state = "stamp" throwforce = 0 - w_class = 1.0 + w_class = ITEMSIZE_TINY throw_speed = 7 throw_range = 15 matter = list(DEFAULT_WALL_MATERIAL = 60) @@ -13,7 +13,7 @@ attack_verb = list("stamped") /obj/item/weapon/stamp/captain - name = "captain's rubber stamp" + name = "station administrator's rubber stamp" icon_state = "stamp-cap" /obj/item/weapon/stamp/hop diff --git a/code/modules/power/antimatter/shielding.dm b/code/modules/power/antimatter/shielding.dm index 4f89687fb4e..809a0750b0d 100644 --- a/code/modules/power/antimatter/shielding.dm +++ b/code/modules/power/antimatter/shielding.dm @@ -191,7 +191,7 @@ proc/cardinalrange(var/center) icon = 'icons/obj/machines/antimatter.dmi' icon_state = "box" item_state = "electronic" - w_class = 4.0 + w_class = ITEMSIZE_LARGE flags = CONDUCT throwforce = 5 throw_speed = 1 diff --git a/code/modules/power/apc.dm b/code/modules/power/apc.dm index 49b72f4944a..8096e1f20ee 100644 --- a/code/modules/power/apc.dm +++ b/code/modules/power/apc.dm @@ -461,7 +461,7 @@ if (stat & MAINT) user << "There is no connector for your power cell." return - if(W.w_class != 3) + if(W.w_class != ITEMSIZE_NORMAL) user << "\The [W] is too [W.w_class < 3? "small" : "large"] to fit here." return @@ -631,7 +631,7 @@ if (((stat & BROKEN) || hacker) \ && !opened \ && W.force >= 5 \ - && W.w_class >= 3.0 \ + && W.w_class >= ITEMSIZE_NORMAL \ && prob(20) ) opened = 2 user.visible_message("The APC cover was knocked down with the [W.name] by [user.name]!", \ diff --git a/code/modules/power/cable.dm b/code/modules/power/cable.dm index 4d75a99cf73..c837f502ddc 100644 --- a/code/modules/power/cable.dm +++ b/code/modules/power/cable.dm @@ -488,7 +488,7 @@ obj/structure/cable/proc/cableColor(var/colorC) color = COLOR_RED desc = "A coil of power cable." throwforce = 10 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 2 throw_range = 5 matter = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 20) @@ -570,9 +570,9 @@ obj/structure/cable/proc/cableColor(var/colorC) /obj/item/stack/cable_coil/proc/update_wclass() if(amount == 1) - w_class = 1.0 + w_class = ITEMSIZE_TINY else - w_class = 2.0 + w_class = ITEMSIZE_SMALL /obj/item/stack/cable_coil/examine(mob/user) if(get_dist(src, user) > 1) diff --git a/code/modules/power/lighting.dm b/code/modules/power/lighting.dm index 2d736804d5b..e36f00c0277 100644 --- a/code/modules/power/lighting.dm +++ b/code/modules/power/lighting.dm @@ -702,7 +702,7 @@ icon = 'icons/obj/lighting.dmi' force = 2 throwforce = 5 - w_class = 1 + w_class = ITEMSIZE_TINY var/status = 0 // LIGHT_OK, LIGHT_BURNED or LIGHT_BROKEN var/base_state var/switchcount = 0 // number of times switched @@ -723,7 +723,7 @@ brightness_power = 3 /obj/item/weapon/light/tube/large - w_class = 2 + w_class = ITEMSIZE_SMALL name = "large light tube" brightness_range = 15 brightness_power = 4 @@ -827,4 +827,4 @@ desc = "A lamp shade for a lamp." icon = 'icons/obj/lighting.dmi' icon_state = "lampshade" - w_class = 1 \ No newline at end of file + w_class = ITEMSIZE_TINY \ No newline at end of file diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index b2277c74cf2..d17b69f93f7 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -200,6 +200,25 @@ user << "You need more welding fuel to complete this task." return + if(istype(W, /obj/item/stack/material) && W.get_material_name() == DEFAULT_WALL_MATERIAL) + var/amt = Ceiling(( initial(integrity) - integrity)/10) + if(!amt) + user << "\The [src] is already fully repaired." + return + var/obj/item/stack/P = W + if(P.amount < amt) + user << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + user << "You begin repairing \the [src]..." + if(do_after(user, 30)) + if(P.use(amt)) + user << "You have repaired \the [src]." + integrity = initial(integrity) + return + else + user << "You don't have enough sheets to repair this! You need at least [amt] sheets." + return + if(istype(W, /obj/item/weapon/card/id) || istype(W, /obj/item/device/pda)) if(emagged) user << "The lock seems to be broken." @@ -225,10 +244,25 @@ return 1 /obj/machinery/power/emitter/bullet_act(var/obj/item/projectile/P) - if(!P || !P.damage || (!P.damage_type == BRUTE || !P.damage_type == BURN) ) + if(!P || !P.damage || P.get_structure_damage() <= 0 ) return integrity = integrity - P.damage - if(integrity >= 0) - explosion(get_turf(src), 1, 2, 4) + if(integrity <= 0) + if(powernet && avail(active_power_usage)) // If it's powered, it goes boom if killed. + visible_message(src, "\The [src] explodes violently!", "You hear an explosion!") + explosion(get_turf(src), 1, 2, 4) + else + src.visible_message("\The [src] crumples apart!", "You hear metal collapsing.") qdel(src) + +/obj/machinery/power/emitter/examine(mob/user) + ..() + var/integrity_percentage = round((integrity / initial(integrity)) * 100) + switch(integrity_percentage) + if(0 to 30) + user << "\The [src] is close to falling apart!" + if(31 to 70) + user << "\The [src] is damaged." + if(77 to 99) + user << "\The [src] is slightly damaged." diff --git a/code/modules/power/smes_construction.dm b/code/modules/power/smes_construction.dm index 0ce32da396e..2f0fe9419d9 100644 --- a/code/modules/power/smes_construction.dm +++ b/code/modules/power/smes_construction.dm @@ -11,7 +11,7 @@ desc = "Standard superconductive magnetic coil with average capacity and I/O rating." icon = 'icons/obj/stock_parts.dmi' icon_state = "smes_coil" // Just few icons patched together. If someone wants to make better icon, feel free to do so! - w_class = 4.0 // It's LARGE (backpack size) + w_class = ITEMSIZE_LARGE // It's LARGE (backpack size) var/ChargeCapacity = 6000000 // 100 kWh var/IOCapacity = 250000 // 250 kW diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index cbb974e2e68..f5804578358 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -207,7 +207,7 @@ var/list/solars_list = list() icon = 'icons/obj/power.dmi' icon_state = "sp_base" item_state = "camera" - w_class = 4 // Pretty big! + w_class = ITEMSIZE_LARGE // Pretty big! anchored = 0 var/tracker = 0 var/glass_type = null diff --git a/code/modules/power/tracker.dm b/code/modules/power/tracker.dm index 34e20d499c3..b06ed2aaf19 100644 --- a/code/modules/power/tracker.dm +++ b/code/modules/power/tracker.dm @@ -80,4 +80,4 @@ name = "tracker electronics" icon = 'icons/obj/doors/door_assembly.dmi' icon_state = "door_electronics" - w_class = 2.0 + w_class = ITEMSIZE_SMALL diff --git a/code/modules/projectiles/ammunition.dm b/code/modules/projectiles/ammunition.dm index 930cc54d828..e142f31ca07 100644 --- a/code/modules/projectiles/ammunition.dm +++ b/code/modules/projectiles/ammunition.dm @@ -6,7 +6,7 @@ flags = CONDUCT slot_flags = SLOT_BELT | SLOT_EARS throwforce = 1 - w_class = 1 + w_class = ITEMSIZE_TINY var/leaves_residue = 1 var/caliber = "" //Which kind of guns it can be loaded into @@ -72,7 +72,7 @@ item_state = "syringe_kit" matter = list(DEFAULT_WALL_MATERIAL = 500) throwforce = 5 - w_class = 2 + w_class = ITEMSIZE_SMALL throw_speed = 4 throw_range = 10 diff --git a/code/modules/projectiles/ammunition/boxes.dm b/code/modules/projectiles/ammunition/boxes.dm index 993db0f27c9..b1cb0964d18 100644 --- a/code/modules/projectiles/ammunition/boxes.dm +++ b/code/modules/projectiles/ammunition/boxes.dm @@ -81,7 +81,7 @@ /obj/item/ammo_magazine/tommydrum name = "tommygun drum magazine (.45)" icon_state = "tommy-drum" - w_class = 3 // Bulky ammo doesn't fit in your pockets! + w_class = ITEMSIZE_NORMAL // Bulky ammo doesn't fit in your pockets! mag_type = MAGAZINE ammo_type = /obj/item/ammo_casing/c45 matter = list(DEFAULT_WALL_MATERIAL = 3750) @@ -359,7 +359,7 @@ caliber = "a762" matter = list(DEFAULT_WALL_MATERIAL = 10000) ammo_type = /obj/item/ammo_casing/a762 - w_class = 3 // This should NOT fit in your pocket!! + w_class = ITEMSIZE_NORMAL // This should NOT fit in your pocket!! max_ammo = 50 multiple_sprites = 1 diff --git a/code/modules/projectiles/ammunition/bullets.dm b/code/modules/projectiles/ammunition/bullets.dm index d10280854fd..51652c4ccfc 100644 --- a/code/modules/projectiles/ammunition/bullets.dm +++ b/code/modules/projectiles/ammunition/bullets.dm @@ -144,6 +144,14 @@ projectile_type = /obj/item/projectile/energy/flash/flare matter = list(DEFAULT_WALL_MATERIAL = 90, "glass" = 90) + +/obj/item/ammo_casing/shotgun/emp + name = "ion shell" + desc = "An advanced shotgun round that creates a small EMP when it strikes a target." + icon_state = "empshell" + projectile_type = /obj/item/projectile/bullet/shotgun/ion + matter = list(DEFAULT_WALL_MATERIAL = 360, "glass" = 720) + /obj/item/ammo_casing/a762 desc = "A 7.62mm bullet casing." caliber = "a762" diff --git a/code/modules/projectiles/dnalocking.dm b/code/modules/projectiles/dnalocking.dm new file mode 100644 index 00000000000..e4ff374fc45 --- /dev/null +++ b/code/modules/projectiles/dnalocking.dm @@ -0,0 +1,88 @@ +/obj/item/dnalockingchip + name = "DNA Chip Lock" + icon = 'icons/obj/ammo.dmi' + icon_state = "dnalockchip" + desc = "A state of the art technological chip that can be installed in a firearm. It allows the user to store their DNA and lock the gun's use from unwanted users." + w_class = ITEMSIZE_TINY + origin_tech = list(TECH_COMBAT = 4, TECH_DATA = 4, TECH_BIO = 4) + + var/list/stored_dna = list() //list of the dna stored in the gun, used to allow users to use it or not + var/safety_level = 0 //either 0 or 1, at 0 the game buzzes and tells the user they can't use it, at 1 it self destructs after 10 seconds + var/controller_dna = null //The dna of the person who is the primary controller of the gun + var/controller_lock = 0 //whether or not the gun is locked by the primar controller, 0 or 1, at 1 it is locked and does not allow + var/exploding = 0 + + +/obj/item/weapon/gun/proc/get_dna(mob/user) + var/mob/living/M = user + if(!attached_lock.controller_lock) + + if(!attached_lock.stored_dna && !(M.dna in attached_lock.stored_dna)) + M << "\The [src] buzzes and displays a symbol showing the gun already contains your DNA." + return 0 + else + attached_lock.stored_dna += M.dna + M << "\The [src] pings and a needle flicks out from the grip, taking a DNA sample from you." + if(!attached_lock.controller_dna) + attached_lock.controller_dna = M.dna + M << "\The [src] processes the dna sample and pings, acknowledging you as the primary controller." + return 1 + else + M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA samples at this time." + return 0 + +/obj/item/weapon/gun/verb/give_dna() + set name = "Give DNA" + set category = "Object" + set src in usr + get_dna(usr) + +/obj/item/weapon/gun/proc/clear_dna(mob/user) + var/mob/living/M = user + if(!attached_lock.controller_lock) + if(!authorized_user(M)) + M << "\The [src] buzzes and displays an invalid user symbol." + return 0 + else + attached_lock.stored_dna -= user.dna + M << "\The [src] beeps and clears the DNA it has stored." + if(M.dna == attached_lock.controller_dna) + attached_lock.controller_dna = null + M << "\The [src] beeps and removes you as the primary controller." + if(attached_lock.controller_lock) + attached_lock.controller_lock = 0 + return 1 + else + M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA modifcation at this time." + return 0 + +/obj/item/weapon/gun/verb/remove_dna() + set name = "Remove DNA" + set category = "Object" + set src in usr + clear_dna(usr) + +/obj/item/weapon/gun/proc/toggledna(mob/user) + var/mob/living/M = user + if(authorized_user(M) && user.dna == attached_lock.controller_dna) + if(!attached_lock.controller_lock) + attached_lock.controller_lock = 1 + M << "\The [src] beeps and displays a locked symbol, informing you it will no longer allow DNA samples." + else + attached_lock.controller_lock = 0 + M << "\The [src] beeps and displays an unlocked symbol, informing you it will now allow DNA samples." + else + M << "\The [src] buzzes and displays an invalid user symbol." + +/obj/item/weapon/gun/verb/allow_dna() + set name = "Toggle DNA Samples Allowance" + set category = "Object" + set src in usr + toggledna(usr) + +/obj/item/weapon/gun/proc/authorized_user(mob/user) + if(!attached_lock.stored_dna || !attached_lock.stored_dna.len) + return 1 + if(!(user.dna in attached_lock.stored_dna)) + return 0 + return 1 \ No newline at end of file diff --git a/code/modules/projectiles/effects.dm b/code/modules/projectiles/effects.dm index 2235f188e7b..8089893b5eb 100644 --- a/code/modules/projectiles/effects.dm +++ b/code/modules/projectiles/effects.dm @@ -11,7 +11,8 @@ if(istype(M)) transform = M -/obj/effect/projectile/proc/activate(var/kill_delay = 3) +/obj/effect/projectile/proc/activate(var/kill_delay = 5) + update_light() spawn(kill_delay) qdel(src) //see effect_system.dm - sets loc to null and lets GC handle removing these effects @@ -22,117 +23,204 @@ //---------------------------- /obj/effect/projectile/laser/tracer icon_state = "beam" + light_range = 2 + light_power = 0.5 + light_color = "#FF0D00" /obj/effect/projectile/laser/muzzle icon_state = "muzzle_laser" + light_range = 2 + light_power = 0.5 + light_color = "#FF0D00" /obj/effect/projectile/laser/impact icon_state = "impact_laser" + light_range = 2 + light_power = 0.5 + light_color = "#FF0D00" //---------------------------- // Blue laser beam //---------------------------- /obj/effect/projectile/laser_blue/tracer icon_state = "beam_blue" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" /obj/effect/projectile/laser_blue/muzzle icon_state = "muzzle_blue" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" /obj/effect/projectile/laser_blue/impact icon_state = "impact_blue" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" //---------------------------- // Omni laser beam //---------------------------- /obj/effect/projectile/laser_omni/tracer icon_state = "beam_omni" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" /obj/effect/projectile/laser_omni/muzzle icon_state = "muzzle_omni" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" /obj/effect/projectile/laser_omni/impact icon_state = "impact_omni" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" //---------------------------- // Xray laser beam //---------------------------- /obj/effect/projectile/xray/tracer icon_state = "xray" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" /obj/effect/projectile/xray/muzzle icon_state = "muzzle_xray" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" /obj/effect/projectile/xray/impact icon_state = "impact_xray" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" //---------------------------- // Heavy laser beam //---------------------------- /obj/effect/projectile/laser_heavy/tracer icon_state = "beam_heavy" + light_range = 3 + light_power = 1 + light_color = "#FF0D00" /obj/effect/projectile/laser_heavy/muzzle icon_state = "muzzle_beam_heavy" + light_range = 3 + light_power = 1 + light_color = "#FF0D00" /obj/effect/projectile/laser_heavy/impact icon_state = "impact_beam_heavy" + light_range = 3 + light_power = 1 + light_color = "#FF0D00" //---------------------------- // Pulse laser beam //---------------------------- /obj/effect/projectile/laser_pulse/tracer icon_state = "u_laser" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" /obj/effect/projectile/laser_pulse/muzzle icon_state = "muzzle_u_laser" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" /obj/effect/projectile/laser_pulse/impact icon_state = "impact_u_laser" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" //---------------------------- // Pulse muzzle effect only //---------------------------- /obj/effect/projectile/pulse/muzzle icon_state = "muzzle_pulse" + light_range = 2 + light_power = 0.5 + light_color = "#0066FF" //---------------------------- // Emitter beam //---------------------------- /obj/effect/projectile/emitter/tracer icon_state = "emitter" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" /obj/effect/projectile/emitter/muzzle icon_state = "muzzle_emitter" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" /obj/effect/projectile/emitter/impact icon_state = "impact_emitter" + light_range = 2 + light_power = 0.5 + light_color = "#00CC33" //---------------------------- // Stun beam //---------------------------- /obj/effect/projectile/stun/tracer icon_state = "stun" + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" /obj/effect/projectile/stun/muzzle icon_state = "muzzle_stun" + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" /obj/effect/projectile/stun/impact icon_state = "impact_stun" + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" //---------------------------- // Bullet //---------------------------- /obj/effect/projectile/bullet/muzzle icon_state = "muzzle_bullet" + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" //---------------------------- // Lightning beam //---------------------------- /obj/effect/projectile/lightning/tracer icon_state = "lightning" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" /obj/effect/projectile/lightning/muzzle icon_state = "muzzle_lightning" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" /obj/effect/projectile/lightning/impact - icon_state = "impact_lightning" \ No newline at end of file + icon_state = "impact_lightning" + light_range = 2 + light_power = 0.5 + light_color = "#00C6FF" \ No newline at end of file diff --git a/code/modules/projectiles/gun.dm b/code/modules/projectiles/gun.dm index 8c3169b682d..81c2f9fbf26 100644 --- a/code/modules/projectiles/gun.dm +++ b/code/modules/projectiles/gun.dm @@ -41,7 +41,7 @@ flags = CONDUCT slot_flags = SLOT_BELT|SLOT_HOLSTER matter = list(DEFAULT_WALL_MATERIAL = 2000) - w_class = 3 + w_class = ITEMSIZE_NORMAL throwforce = 5 throw_speed = 4 throw_range = 5 @@ -83,11 +83,7 @@ var/tmp/lock_time = -100 var/dna_lock = 0 //whether or not the gun is locked to dna - var/list/stored_dna = list() //list of the dna stored in the gun, used to allow users to use it or not - var/safety_level = 0 //either 0 or 1, at 0 the game buzzes and tells the user they can't use it, at 1 it self destructs after 10 seconds - var/controller_dna = null //The dna of the person who is the primary controller of the gun - var/controller_lock = 0 //whether or not the gun is locked by the primar controller, 0 or 1, at 1 it is locked and does not allow - var/exploding = 0 + var/obj/item/dnalockingchip/attached_lock /obj/item/weapon/gun/New() ..() @@ -97,6 +93,8 @@ if(isnull(scoped_accuracy)) scoped_accuracy = accuracy + if(dna_lock) + attached_lock = new /obj/item/dnalockingchip(src) if(!dna_lock) verbs -= /obj/item/weapon/gun/verb/remove_dna verbs -= /obj/item/weapon/gun/verb/give_dna @@ -126,19 +124,20 @@ return 0 var/mob/living/M = user - if(dna_lock && stored_dna) + if(dna_lock && attached_lock.stored_dna) if(!authorized_user(user)) - if(safety_level == 0) + if(attached_lock.safety_level == 0) M << "\The [src] buzzes in dissapoint and displays an invalid DNA symbol." return 0 - if(!exploding) - if(safety_level == 1) + if(!attached_lock.exploding) + if(attached_lock.safety_level == 1) M << "\The [src] hisses in dissapointment." visible_message("\The [src] announces, \"Self-destruct occurring in ten seconds.\"", "\The [src] announces, \"Self-destruct occurring in ten seconds.\"") - sleep(100) - explosion(src, -1, 0, 2, 3, 0) - exploding = 1 - qdel(src) + spawn(100) + explosion(src, 0, 0, 3, 4) + attached_lock.exploding = 1 + sleep(1) + qdel(src) return 0 if(HULK in M.mutations) M << "Your fingers are much too large for the trigger guard!" @@ -185,6 +184,43 @@ else return ..() //Pistolwhippin' +/obj/item/weapon/gun/attackby(var/obj/item/A as obj, mob/user as mob) + if(istype(A, /obj/item/dnalockingchip)) + if(dna_lock) + user << "\The [src] already has a [attached_lock]." + return + user << "You insert \the [A] into \the [src]." + user.drop_item() + A.loc = src + attached_lock = A + dna_lock = 1 + verbs += /obj/item/weapon/gun/verb/remove_dna + verbs += /obj/item/weapon/gun/verb/give_dna + verbs += /obj/item/weapon/gun/verb/allow_dna + return + + if(istype(A, /obj/item/weapon/screwdriver)) + if(dna_lock && attached_lock && !attached_lock.controller_lock) + user << "You begin removing \the [attached_lock] from \the [src]." + if(do_after(user, 25)) + user << "You remove \the [attached_lock] from \the [src]." + user.put_in_hands(attached_lock) + dna_lock = 0 + attached_lock = null + verbs -= /obj/item/weapon/gun/verb/remove_dna + verbs -= /obj/item/weapon/gun/verb/give_dna + verbs -= /obj/item/weapon/gun/verb/allow_dna + else + user << "\The [src] is not accepting modifications at this time." + +/obj/item/weapon/gun/emag_act(var/remaining_charges, var/mob/user) + if(dna_lock && attached_lock.controller_lock) + user << "You short circuit the internal locking mechanisms of \the [src]!" + attached_lock.controller_dna = null + attached_lock.controller_lock = 0 + attached_lock.stored_dna = list() + return 1 + /obj/item/weapon/gun/proc/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0) if(!user || !target) return @@ -254,6 +290,76 @@ if(muzzle_flash) set_light(0) +// Similar to the above proc, but does not require a user, which is ideal for things like turrets. +/obj/item/weapon/gun/proc/Fire_userless(atom/target) + if(!target) + return + + if(world.time < next_fire_time) + return + + var/shoot_time = (burst - 1)* burst_delay + next_fire_time = world.time + shoot_time + + var/turf/targloc = get_turf(target) //cache this in case target gets deleted during shooting, e.g. if it was a securitron that got destroyed. + for(var/i in 1 to burst) + var/obj/projectile = consume_next_projectile() + if(!projectile) + handle_click_empty() + break + + if(istype(projectile, /obj/item/projectile)) + var/obj/item/projectile/P = projectile + + var/acc = burst_accuracy[min(i, burst_accuracy.len)] + var/disp = dispersion[min(i, dispersion.len)] + + P.accuracy = accuracy + acc + P.dispersion = disp + + P.shot_from = src.name + P.silenced = silenced + + P.launch(target) + + if(silenced) + playsound(src, fire_sound, 10, 1) + else + playsound(src, fire_sound, 50, 1) + + if(muzzle_flash) + set_light(muzzle_flash) + update_icon() + + //process_accuracy(projectile, user, target, acc, disp) + + // if(pointblank) + // process_point_blank(projectile, user, target) + + // if(process_projectile(projectile, null, target, user.zone_sel.selecting, clickparams)) + // handle_post_fire(null, target, pointblank, reflex) + + // update_icon() + + if(i < burst) + sleep(burst_delay) + + if(!(target && target.loc)) + target = targloc + //pointblank = 0 + + log_and_message_admins("Fired [src].") + + //admin_attack_log(usr, attacker_message="Fired [src]", admin_message="fired a gun ([src]) (MODE: [src.mode_name]) [reflex ? "by reflex" : "manually"].") + + //update timing + next_fire_time = world.time + fire_delay + + if(muzzle_flash) + set_light(0) + + + //obtains the next projectile to fire /obj/item/weapon/gun/proc/consume_next_projectile() return null @@ -460,77 +566,3 @@ /obj/item/weapon/gun/attack_self(mob/user) switch_firemodes(user) - -/obj/item/weapon/gun/proc/get_dna(mob/user) - var/mob/living/M = user - if(!controller_lock) - - if(!stored_dna && !(M.dna in stored_dna)) - M << "\The [src] buzzes and displays a symbol showing the gun already contains your DNA." - return 0 - else - stored_dna += M.dna - M << "\The [src] pings and a needle flicks out from the grip, taking a DNA sample from you." - if(!controller_dna) - controller_dna = M.dna - M << "\The [src] processes the dna sample and pings, acknowledging you as the primary controller." - return 1 - else - M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA samples at this time." - return 0 - -/obj/item/weapon/gun/verb/give_dna() - set name = "Give DNA" - set category = "Object" - set src in usr - get_dna(usr) - -/obj/item/weapon/gun/proc/clear_dna(mob/user) - var/mob/living/M = user - if(!controller_lock) - if(!authorized_user(M)) - M << "\The [src] buzzes and displays an invalid user symbol." - return 0 - else - stored_dna -= user.dna - M << "\The [src] beeps and clears the DNA it has stored." - if(M.dna == controller_dna) - controller_dna = null - M << "\The [src] beeps and removes you as the primary controller." - if(controller_lock) - controller_lock = 0 - return 1 - else - M << "\The [src] buzzes and displays a locked symbol. It is not allowing DNA modifcation at this time." - return 0 - -/obj/item/weapon/gun/verb/remove_dna() - set name = "Remove DNA" - set category = "Object" - set src in usr - clear_dna(usr) - -/obj/item/weapon/gun/proc/toggledna(mob/user) - var/mob/living/M = user - if(authorized_user(M) && user.dna == controller_dna) - if(!controller_lock) - controller_lock = 1 - M << "\The [src] beeps and displays a locked symbol, informing you it will no longer allow DNA samples." - else - controller_lock = 0 - M << "\The [src] beeps and displays an unlocked symbol, informing you it will now allow DNA samples." - else - M << "\The [src] buzzes and displays an invalid user symbol." - -/obj/item/weapon/gun/verb/allow_dna() - set name = "Toggle DNA Samples Allowance" - set category = "Object" - set src in usr - toggledna(usr) - -/obj/item/weapon/gun/proc/authorized_user(mob/user) - if(!stored_dna || !stored_dna.len) - return 1 - if(!(user.dna in stored_dna)) - return 0 - return 1 diff --git a/code/modules/projectiles/guns/energy.dm b/code/modules/projectiles/guns/energy.dm index d602fb13a6b..f05e453cfb2 100644 --- a/code/modules/projectiles/guns/energy.dm +++ b/code/modules/projectiles/guns/energy.dm @@ -19,6 +19,9 @@ var/recharge_time = 4 var/charge_tick = 0 +/obj/item/weapon/gun/energy/attackby(var/obj/item/A as obj, mob/user as mob) + ..() + /obj/item/weapon/gun/energy/switch_firemodes(mob/user) if(..()) update_icon() diff --git a/code/modules/projectiles/guns/energy/laser.dm b/code/modules/projectiles/guns/energy/laser.dm index 5d2fe06fa48..86bd1e5661c 100644 --- a/code/modules/projectiles/guns/energy/laser.dm +++ b/code/modules/projectiles/guns/energy/laser.dm @@ -6,7 +6,7 @@ item_state = "laser" fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT|SLOT_BACK - w_class = 3 + w_class = ITEMSIZE_LARGE force = 10 origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 2) matter = list(DEFAULT_WALL_MATERIAL = 2000) @@ -41,7 +41,7 @@ obj/item/weapon/gun/energy/retro desc = "An older model of the basic lasergun. Nevertheless, it is still quite deadly and easy to maintain, making it a favorite amongst pirates and other outlaws." fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT - w_class = 3 + w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/beam fire_delay = 10 //old technology @@ -53,7 +53,7 @@ obj/item/weapon/gun/energy/retro force = 5 fire_sound = 'sound/weapons/Laser.ogg' slot_flags = SLOT_BELT - w_class = 3 + w_class = ITEMSIZE_NORMAL projectile_type = /obj/item/projectile/beam origin_tech = null max_shots = 5 //to compensate a bit for self-recharging @@ -69,8 +69,9 @@ obj/item/weapon/gun/energy/retro origin_tech = list(TECH_COMBAT = 4, TECH_MATERIAL = 3, TECH_POWER = 3) slot_flags = SLOT_BELT|SLOT_BACK projectile_type = /obj/item/projectile/beam/heavylaser/cannon - max_shots = 1 - fire_delay = 30 + max_shots = 4 + fire_delay = 20 + w_class = ITEMSIZE_LARGE // requires_two_hands = 1 one_handed_penalty = 6 // The thing's heavy and huge. accuracy = 3 @@ -115,7 +116,7 @@ obj/item/weapon/gun/energy/retro max_shots = 4 fire_delay = 35 force = 10 - w_class = 5 // So it can't fit in a backpack. + w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. accuracy = -3 //shooting at the hip scoped_accuracy = 0 // requires_two_hands = 1 diff --git a/code/modules/projectiles/guns/energy/nuclear.dm b/code/modules/projectiles/guns/energy/nuclear.dm index 2352cdce28d..dca895e931e 100644 --- a/code/modules/projectiles/guns/energy/nuclear.dm +++ b/code/modules/projectiles/guns/energy/nuclear.dm @@ -24,11 +24,14 @@ /obj/item/weapon/gun/energy/gun/burst name = "burst laser" - desc = "The FM-2t is a versatile energy based small arm, capable of switching between stun or kill with a three round burst option for both settings." - icon_state = "fm-2tstun100" + desc = "The FM-2t is a versatile energy based weapon, capable of switching between stun or kill with a three round burst option for both settings." + icon_state = "fm-2tstun100" //May resprite this to be more rifley item_state = null //so the human update icon uses the icon_state instead. fire_sound = 'sound/weapons/Taser.ogg' - max_shots = 21 //7 trigger pulls + max_shots = 18 + force = 8 + w_class = ITEMSIZE_LARGE //Probably gonna make it a rifle sooner or later + fire_delay = 6 projectile_type = /obj/item/projectile/beam/stun/weak origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 2, TECH_ILLEGAL = 3) @@ -39,9 +42,9 @@ firemodes = list( list(mode_name="stun", burst=1, projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'), - list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/weaklaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), - list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,-1,-1), dispersion=list(0.0, 0.6, 1.0), projectile_type=/obj/item/projectile/beam/weaklaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), + list(mode_name="stun burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/stun/weak, modifystate="fm-2tstun", fire_sound='sound/weapons/Taser.ogg'), + list(mode_name="lethal", burst=1, projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), + list(mode_name="lethal burst", burst=3, fire_delay=null, move_delay=4, burst_accuracy=list(0,0,0), dispersion=list(0.0, 0.2, 0.5), projectile_type=/obj/item/projectile/beam/burstlaser, modifystate="fm-2tkill", fire_sound='sound/weapons/Laser.ogg'), ) /obj/item/weapon/gun/energy/gun/nuclear @@ -51,6 +54,8 @@ origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 5, TECH_POWER = 3) slot_flags = SLOT_BELT force = 8 //looks heavier than a pistol + w_class = ITEMSIZE_LARGE //Looks bigger than a pistol, too. + fire_delay = 6 //This one's not a handgun, it should have the same fire delay as everything else self_recharge = 1 modifystate = null diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 0c3822cced0..9d0e664d2dc 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -5,7 +5,7 @@ item_state = "ionrifle" fire_sound = 'sound/weapons/Laser.ogg' origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 4) - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 flags = CONDUCT slot_flags = SLOT_BACK @@ -65,7 +65,7 @@ icon_state = "riotgun" item_state = "c20r" slot_flags = SLOT_BELT|SLOT_BACK - w_class = 4 + w_class = ITEMSIZE_LARGE projectile_type = /obj/item/projectile/meteor cell_type = /obj/item/weapon/cell/potato self_recharge = 1 @@ -78,7 +78,7 @@ icon = 'icons/obj/bureaucracy.dmi' icon_state = "pen" item_state = "pen" - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_BELT @@ -94,7 +94,7 @@ desc = "A specialized firearm designed to fire lethal bolts of phoron." icon_state = "toxgun" fire_sound = 'sound/effects/stealthoff.ogg' - w_class = 3.0 + w_class = ITEMSIZE_NORMAL origin_tech = list(TECH_COMBAT = 5, TECH_PHORON = 4) projectile_type = /obj/item/projectile/energy/phoron @@ -109,7 +109,7 @@ fire_sound = 'sound/weapons/emitter.ogg' flags = CONDUCT slot_flags = SLOT_BACK - w_class = 4.0 + w_class = ITEMSIZE_LARGE max_shots = 5 projectile_type = /obj/item/projectile/change origin_tech = null diff --git a/code/modules/projectiles/guns/energy/stun.dm b/code/modules/projectiles/guns/energy/stun.dm index 20fa18b09e6..97558d8e6ab 100644 --- a/code/modules/projectiles/guns/energy/stun.dm +++ b/code/modules/projectiles/guns/energy/stun.dm @@ -33,7 +33,7 @@ name = "mini energy-crossbow" desc = "A weapon favored by many mercenary stealth specialists." icon_state = "crossbow" - w_class = 2.0 + w_class = ITEMSIZE_SMALL item_state = "crossbow" origin_tech = list(TECH_COMBAT = 2, TECH_MAGNET = 2, TECH_ILLEGAL = 5) matter = list(DEFAULT_WALL_MATERIAL = 2000) @@ -52,7 +52,7 @@ /obj/item/weapon/gun/energy/crossbow/largecrossbow name = "energy crossbow" desc = "A weapon favored by mercenary infiltration teams." - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 matter = list(DEFAULT_WALL_MATERIAL = 200000) projectile_type = /obj/item/projectile/energy/bolt/large diff --git a/code/modules/projectiles/guns/launcher.dm b/code/modules/projectiles/guns/launcher.dm index 8d5a9748f15..1c9a09e4e3e 100644 --- a/code/modules/projectiles/guns/launcher.dm +++ b/code/modules/projectiles/guns/launcher.dm @@ -1,7 +1,7 @@ /obj/item/weapon/gun/launcher name = "launcher" desc = "A device that launches things." - w_class = 5.0 + w_class = ITEMSIZE_HUGE flags = CONDUCT slot_flags = SLOT_BACK diff --git a/code/modules/projectiles/guns/launcher/crossbow.dm b/code/modules/projectiles/guns/launcher/crossbow.dm index 407b70d20a1..0fdad192381 100644 --- a/code/modules/projectiles/guns/launcher/crossbow.dm +++ b/code/modules/projectiles/guns/launcher/crossbow.dm @@ -7,7 +7,7 @@ icon_state = "bolt" item_state = "bolt" throwforce = 8 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL sharp = 1 edge = 0 @@ -20,7 +20,7 @@ sharp = 1 edge = 0 throwforce = 5 - w_class = 2 + w_class = ITEMSIZE_SMALL icon = 'icons/obj/weapons.dmi' icon_state = "metal-rod" item_state = "bolt" diff --git a/code/modules/projectiles/guns/launcher/grenade_launcher.dm b/code/modules/projectiles/guns/launcher/grenade_launcher.dm index 107330c13d2..207572a8c6b 100644 --- a/code/modules/projectiles/guns/launcher/grenade_launcher.dm +++ b/code/modules/projectiles/guns/launcher/grenade_launcher.dm @@ -3,7 +3,7 @@ desc = "A bulky pump-action grenade launcher. Holds up to 6 grenades in a revolving magazine." icon_state = "riotgun" item_state = "riotgun" - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 fire_sound = 'sound/weapons/empty.ogg' @@ -94,7 +94,7 @@ /obj/item/weapon/gun/launcher/grenade/underslung name = "underslung grenade launcher" desc = "Not much more than a tube and a firing mechanism, this grenade launcher is designed to be fitted to a rifle." - w_class = 3 + w_class = ITEMSIZE_NORMAL force = 5 max_grenades = 0 diff --git a/code/modules/projectiles/guns/launcher/pneumatic.dm b/code/modules/projectiles/guns/launcher/pneumatic.dm index 5463fe26f02..422515de14b 100644 --- a/code/modules/projectiles/guns/launcher/pneumatic.dm +++ b/code/modules/projectiles/guns/launcher/pneumatic.dm @@ -4,15 +4,15 @@ icon_state = "pneumatic" item_state = "pneumatic" slot_flags = SLOT_BELT - w_class = 5.0 + w_class = ITEMSIZE_HUGE flags = CONDUCT fire_sound_text = "a loud whoosh of moving air" fire_delay = 50 fire_sound = 'sound/weapons/tablehit1.ogg' var/fire_pressure // Used in fire checks/pressure checks. - var/max_w_class = 3 // Hopper intake size. - var/max_storage_space = 20 // Total internal storage size. + var/max_w_class = ITEMSIZE_NORMAL // Hopper intake size. + var/max_storage_space = ITEMSIZE_COST_NORMAL * 5 // Total internal storage size. var/obj/item/weapon/tank/tank = null // Tank of gas for use in firing the cannon. var/obj/item/weapon/storage/item_storage diff --git a/code/modules/projectiles/guns/launcher/rocket.dm b/code/modules/projectiles/guns/launcher/rocket.dm index 300121aef7d..438485320e4 100644 --- a/code/modules/projectiles/guns/launcher/rocket.dm +++ b/code/modules/projectiles/guns/launcher/rocket.dm @@ -3,7 +3,7 @@ desc = "MAGGOT." icon_state = "rocket" item_state = "rocket" - w_class = 4.0 + w_class = ITEMSIZE_LARGE throw_speed = 2 throw_range = 10 force = 5.0 diff --git a/code/modules/projectiles/guns/launcher/syringe_gun.dm b/code/modules/projectiles/guns/launcher/syringe_gun.dm index 3cbbd40f343..6b2c52a3041 100644 --- a/code/modules/projectiles/guns/launcher/syringe_gun.dm +++ b/code/modules/projectiles/guns/launcher/syringe_gun.dm @@ -9,7 +9,7 @@ slot_flags = SLOT_BELT | SLOT_EARS throwforce = 3 force = 3 - w_class = 1 + w_class = ITEMSIZE_TINY var/obj/item/weapon/reagent_containers/syringe/syringe /obj/item/weapon/syringe_cartridge/update_icon() @@ -67,7 +67,7 @@ desc = "A spring loaded rifle designed to fit syringes, designed to incapacitate unruly patients from a distance." icon_state = "syringegun" item_state = "syringegun" - w_class = 3 + w_class = ITEMSIZE_NORMAL force = 7 matter = list(DEFAULT_WALL_MATERIAL = 2000) slot_flags = SLOT_BELT diff --git a/code/modules/projectiles/guns/projectile.dm b/code/modules/projectiles/guns/projectile.dm index bb5168169ef..2d3d034bf95 100644 --- a/code/modules/projectiles/guns/projectile.dm +++ b/code/modules/projectiles/guns/projectile.dm @@ -7,7 +7,7 @@ desc = "A gun that fires bullets." icon_state = "revolver" origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2) - w_class = 3 + w_class = ITEMSIZE_NORMAL matter = list(DEFAULT_WALL_MATERIAL = 1000) recoil = 1 @@ -141,6 +141,24 @@ user.visible_message("[user] inserts \a [C] into [src].", "You insert \a [C] into [src].") playsound(src.loc, 'sound/weapons/empty.ogg', 50, 1) + else if(istype(A, /obj/item/weapon/storage)) + var/obj/item/weapon/storage/storage = A + if(!(load_method & SINGLE_CASING)) + return //incompatible + + user << "You start loading \the [src]." + sleep(1 SECOND) + for(var/obj/item/ammo_casing/ammo in storage.contents) + if(caliber != ammo.caliber) + continue + + load_ammo(ammo, user) + + if(loaded.len >= max_shells) + user << "[src] is full." + break + sleep(1 SECOND) + update_icon() //attempts to unload src. If allow_dump is set to 0, the speedloader unloading method will be disabled @@ -174,6 +192,7 @@ update_icon() /obj/item/weapon/gun/projectile/attackby(var/obj/item/A as obj, mob/user as mob) + ..() load_ammo(A, user) /obj/item/weapon/gun/projectile/attack_self(mob/user as mob) diff --git a/code/modules/projectiles/guns/projectile/automatic.dm b/code/modules/projectiles/guns/projectile/automatic.dm index 2ed89336a9a..6c00f9431a1 100644 --- a/code/modules/projectiles/guns/projectile/automatic.dm +++ b/code/modules/projectiles/guns/projectile/automatic.dm @@ -2,7 +2,7 @@ name = "prototype SMG" desc = "A protoype lightweight, fast firing gun. Uses 9mm rounds." icon_state = "saber" //ugly - w_class = 3 + w_class = ITEMSIZE_NORMAL load_method = SPEEDLOADER //yup. until someone sprites a magazine for it. max_shells = 22 caliber = "9mm" @@ -26,7 +26,7 @@ desc = "The C-20r is a lightweight and rapid firing SMG, for when you REALLY need someone dead. Uses 10mm rounds. Has a 'Scarborough Arms - Per falcis, per pravitas' buttstamp." icon_state = "c20r" item_state = "c20r" - w_class = 3 + w_class = ITEMSIZE_NORMAL force = 10 caliber = "10mm" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) @@ -54,7 +54,7 @@ desc = "The rugged STS-35 is a durable automatic weapon of a make popular on the frontier worlds. Uses 7.62mm rounds. This one is unmarked." icon_state = "arifle" item_state = null - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 caliber = "a762" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) @@ -84,7 +84,7 @@ desc = "The WT550 Saber is a cheap self-defense weapon mass-produced by Ward-Takahashi for paramilitary and private use. Uses 9mm rounds." icon_state = "wt550" item_state = "wt550" - w_class = 3 + w_class = ITEMSIZE_NORMAL caliber = "9mm" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT @@ -107,7 +107,7 @@ desc = "The Z8 Bulldog is an older model designated marksman rifle, made by the now defunct Zendai Foundries. Makes you feel like a space marine when you hold it, even though it can only hold 10 round magazines. Uses 5.56mm rounds and has an under barrel grenade launcher." icon_state = "carbine" // This isn't a carbine. :T item_state = "z8carbine" - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 caliber = "a556" origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 3) @@ -177,7 +177,7 @@ desc = "A rather traditionally made L6 SAW with a pleasantly lacquered wooden pistol grip. Has 'Aussec Armoury- 2531' engraved on the reciever" icon_state = "l6closed100" item_state = "l6closed" - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 slot_flags = 0 max_shells = 50 @@ -250,7 +250,7 @@ desc = "The AS-24 is a durable, rugged looking automatic weapon of a make popular on the frontier worlds. Uses 12 gauge shells. It is unmarked." icon_state = "ashot" item_state = null - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 caliber = "shotgun" fire_sound = 'sound/weapons/shotgun.ogg' @@ -280,7 +280,7 @@ name = "\improper Uzi" desc = "A lightweight, compact, fast firing gun, for when you want someone really dead. Uses .45 rounds." icon_state = "mini-uzi" - w_class = 3 + w_class = ITEMSIZE_NORMAL load_method = MAGAZINE caliber = ".45" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) @@ -304,7 +304,7 @@ desc = "The H90K is a compact, high capacity submachine gun produced by Hephaistos Industries. Despite its fierce reputation, it still manages to feel like a toy. Uses 9mm rounds." icon_state = "p90smg" item_state = "p90" - w_class = 3 + w_class = ITEMSIZE_NORMAL caliber = "9mm" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2) slot_flags = SLOT_BELT // ToDo: Belt sprite. @@ -325,7 +325,7 @@ name = "\improper Tommygun" desc = "This weapon was made famous by gangsters in the 20th century. Cybersun Industries is currently reproducing these for a target market of historic gun collectors and classy criminals. Uses .45 rounds." icon_state = "tommygun" - w_class = 3 + w_class = ITEMSIZE_NORMAL caliber = ".45" origin_tech = list(TECH_COMBAT = 5, TECH_MATERIAL = 2, TECH_ILLEGAL = 5) slot_flags = SLOT_BELT // ToDo: Belt sprite. @@ -348,7 +348,7 @@ desc = "The bullpup configured GP3000 is a lightweight, compact, military-grade assault rifle produced by Gurov Projectile Weapons LLC. It is sold almost exclusively to standing armies. The serial number on this one has been scratched off. Uses 5.56mm rounds." icon_state = "bullpupm" item_state = "bullpup" - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 caliber = "a556" origin_tech = list(TECH_COMBAT = 6, TECH_MATERIAL = 1, TECH_ILLEGAL = 4) diff --git a/code/modules/projectiles/guns/projectile/boltaction.dm b/code/modules/projectiles/guns/projectile/boltaction.dm index 28da9997d27..c6e25ca7676 100644 --- a/code/modules/projectiles/guns/projectile/boltaction.dm +++ b/code/modules/projectiles/guns/projectile/boltaction.dm @@ -30,7 +30,7 @@ // Stole hacky terrible code from doublebarrel shotgun. -Spades /obj/item/weapon/gun/projectile/shotgun/pump/rifle/mosin/attackby(var/obj/item/A as obj, mob/user as mob) - if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != 3) + if(istype(A, /obj/item/weapon/circular_saw) || istype(A, /obj/item/weapon/melee/energy) || istype(A, /obj/item/weapon/pickaxe/plasmacutter) && w_class != ITEMSIZE_NORMAL) user << "You begin to shorten the barrel and stock of \the [src]." if(loaded.len) afterattack(user, user) //will this work? //it will. we call it twice, for twice the FUN @@ -39,7 +39,7 @@ return if(do_after(user, 30)) icon_state = "obrez" - w_class = 3 + w_class = ITEMSIZE_NORMAL recoil = 2 // Owch accuracy = -1 // You know damn well why. item_state = "gun" diff --git a/code/modules/projectiles/guns/projectile/pistol.dm b/code/modules/projectiles/guns/projectile/pistol.dm index 08442fcb8c1..fd46803c68a 100644 --- a/code/modules/projectiles/guns/projectile/pistol.dm +++ b/code/modules/projectiles/guns/projectile/pistol.dm @@ -104,7 +104,7 @@ name = "silenced pistol" desc = "A small, quiet, easily concealable gun. Uses .45 rounds." icon_state = "silenced_pistol" - w_class = 3 + w_class = ITEMSIZE_NORMAL caliber = ".45" silenced = 1 fire_delay = 1 @@ -190,7 +190,7 @@ desc = "The Lumoco Arms P3 Whisper. A small, easily concealable gun. Uses 9mm rounds." icon_state = "pistol" item_state = null - w_class = 2 + w_class = ITEMSIZE_SMALL caliber = "9mm" silenced = 0 origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 2) @@ -212,7 +212,7 @@ user << "You unscrew [silenced] from [src]." user.put_in_hands(silenced) silenced = 0 - w_class = 2 + w_class = ITEMSIZE_SMALL update_icon() return ..() @@ -225,7 +225,7 @@ user.drop_item() user << "You screw [I] onto [src]." silenced = I //dodgy? - w_class = 3 + w_class = ITEMSIZE_NORMAL I.loc = src //put the silencer into the gun update_icon() return @@ -243,7 +243,7 @@ desc = "a silencer" icon = 'icons/obj/gun.dmi' icon_state = "silencer" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/gun/projectile/pirate name = "zip gun" @@ -284,7 +284,7 @@ desc = "It's not size of your gun that matters, just the size of your load. Uses .357 rounds." //OHHH MYYY~ icon_state = "derringer" item_state = "concealed" - w_class = 2 + w_class = ITEMSIZE_SMALL origin_tech = list(TECH_COMBAT = 2, TECH_MATERIAL = 2, TECH_ILLEGAL = 3) handle_casings = CYCLE_CASINGS //player has to take the old casing out manually before reloading load_method = SINGLE_CASING diff --git a/code/modules/projectiles/guns/projectile/shotgun.dm b/code/modules/projectiles/guns/projectile/shotgun.dm index 025aac20d9b..90da6cac49a 100644 --- a/code/modules/projectiles/guns/projectile/shotgun.dm +++ b/code/modules/projectiles/guns/projectile/shotgun.dm @@ -4,7 +4,7 @@ icon_state = "shotgun" item_state = "shotgun" max_shells = 4 - w_class = 4.0 + w_class = ITEMSIZE_LARGE force = 10 flags = CONDUCT slot_flags = SLOT_BACK @@ -60,7 +60,7 @@ load_method = SINGLE_CASING|SPEEDLOADER handle_casings = CYCLE_CASINGS max_shells = 2 - w_class = 4 + w_class = ITEMSIZE_LARGE force = 10 flags = CONDUCT slot_flags = SLOT_BACK @@ -98,7 +98,7 @@ if(do_after(user, 30)) //SHIT IS STEALTHY EYYYYY icon_state = "sawnshotgun" item_state = "sawnshotgun" - w_class = 3 + w_class = ITEMSIZE_NORMAL force = 5 slot_flags &= ~SLOT_BACK //you can't sling it on your back slot_flags |= (SLOT_BELT|SLOT_HOLSTER) //but you can wear it on your belt (poorly concealed under a trenchcoat, ideally) - or in a holster, why not. @@ -115,5 +115,5 @@ item_state = "sawnshotgun" slot_flags = SLOT_BELT|SLOT_HOLSTER ammo_type = /obj/item/ammo_casing/shotgun/pellet - w_class = 3 + w_class = ITEMSIZE_NORMAL force = 5 diff --git a/code/modules/projectiles/guns/projectile/sniper.dm b/code/modules/projectiles/guns/projectile/sniper.dm index f91054b2c7a..be280c2f643 100644 --- a/code/modules/projectiles/guns/projectile/sniper.dm +++ b/code/modules/projectiles/guns/projectile/sniper.dm @@ -6,7 +6,7 @@ icon_state = "heavysniper" item_state = "l6closed-empty" // placeholder item_state_slots = list(slot_r_hand_str = "heavysniper", slot_l_hand_str = "heavysniper") - w_class = 5 // So it can't fit in a backpack. + w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. force = 10 slot_flags = SLOT_BACK origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) @@ -75,7 +75,7 @@ desc = "The SVD, also known as the Dragunov, was mass produced with an Optical Sniper Sight so simple that even Ivan can figure out how it works. Too bad for you that it's written in Russian. Uses 7.62mm rounds." icon_state = "SVD" item_state = "SVD" - w_class = 5 // So it can't fit in a backpack. + w_class = ITEMSIZE_HUGE // So it can't fit in a backpack. force = 10 slot_flags = SLOT_BACK // Needs a sprite. origin_tech = list(TECH_COMBAT = 8, TECH_MATERIAL = 2, TECH_ILLEGAL = 8) diff --git a/code/modules/projectiles/projectile.dm b/code/modules/projectiles/projectile.dm index ee46b5f42ed..81149cf2cb0 100644 --- a/code/modules/projectiles/projectile.dm +++ b/code/modules/projectiles/projectile.dm @@ -293,6 +293,7 @@ trajectory.increment() // increment the current location location = trajectory.return_location(location) // update the locally stored location data + update_light() //energy projectiles will look glowy and fun if(!location) qdel(src) // if it's left the world... kill it @@ -354,6 +355,7 @@ M.set_transform(T) M.pixel_x = location.pixel_x M.pixel_y = location.pixel_y + M.update_light() M.activate() /obj/item/projectile/proc/tracer_effect(var/matrix/M) @@ -364,6 +366,7 @@ P.set_transform(M) P.pixel_x = location.pixel_x P.pixel_y = location.pixel_y + P.update_light() if(!hitscan) P.activate(step_delay) //if not a hitscan projectile, remove after a single delay else @@ -377,6 +380,7 @@ P.set_transform(M) P.pixel_x = location.pixel_x P.pixel_y = location.pixel_y + P.update_light() P.activate() //"Tracing" projectile diff --git a/code/modules/projectiles/projectile/animate.dm b/code/modules/projectiles/projectile/animate.dm index 0f92729ad4e..c09b98a32b0 100644 --- a/code/modules/projectiles/projectile/animate.dm +++ b/code/modules/projectiles/projectile/animate.dm @@ -5,6 +5,9 @@ damage_type = BURN nodamage = 1 check_armour = "energy" + light_range = 2 + light_power = 0.5 + light_color = "#55AAFF" /obj/item/projectile/animate/Bump(var/atom/change) if((istype(change, /obj/item) || istype(change, /obj/structure)) && !is_type_in_list(change, protected_objects)) diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index 1049f5f70d4..1f0dd03854f 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -9,6 +9,9 @@ var/frequency = 1 hitscan = 1 invisibility = 101 //beam projectiles are invisible as they are rendered by the effect engine + light_range = 2 + light_power = 0.5 + light_color = "#FF0D00" muzzle_type = /obj/effect/projectile/laser/muzzle tracer_type = /obj/effect/projectile/laser/tracer @@ -28,6 +31,11 @@ icon_state = "laser" damage = 15 +/obj/item/projectile/beam/burstlaser + damage = 30 + armor_penetration = 10 + + /obj/item/projectile/beam/midlaser damage = 40 armor_penetration = 10 @@ -37,20 +45,25 @@ icon_state = "heavylaser" damage = 60 armor_penetration = 30 + light_range = 3 + light_power = 1 + light_color = "#FF0D00" muzzle_type = /obj/effect/projectile/laser_heavy/muzzle tracer_type = /obj/effect/projectile/laser_heavy/tracer impact_type = /obj/effect/projectile/laser_heavy/impact /obj/item/projectile/beam/heavylaser/cannon - damage = 90 - armor_penetration = 100 + damage = 80 + armor_penetration = 50 + light_color = "#FF0D00" /obj/item/projectile/beam/xray name = "xray beam" icon_state = "xray" damage = 25 armor_penetration = 50 + light_color = "#00CC33" muzzle_type = /obj/effect/projectile/xray/muzzle tracer_type = /obj/effect/projectile/xray/tracer @@ -61,6 +74,7 @@ icon_state = "u_laser" damage = 50 armor_penetration = 30 + light_color = "#0066FF" muzzle_type = /obj/effect/projectile/laser_pulse/muzzle tracer_type = /obj/effect/projectile/laser_pulse/tracer @@ -75,6 +89,7 @@ name = "emitter beam" icon_state = "emitter" damage = 0 // The actual damage is computed in /code/modules/power/singularity/emitter.dm + light_color = "#00CC33" muzzle_type = /obj/effect/projectile/emitter/muzzle tracer_type = /obj/effect/projectile/emitter/tracer @@ -88,6 +103,7 @@ no_attack_log = 1 damage_type = BURN check_armour = "laser" + light_color = "#0066FF" muzzle_type = /obj/effect/projectile/laser_blue/muzzle tracer_type = /obj/effect/projectile/laser_blue/tracer @@ -108,6 +124,7 @@ no_attack_log = 1 damage_type = BURN check_armour = "laser" + light_color = "#FF0D00" /obj/item/projectile/beam/lastertag/red/on_hit(var/atom/target, var/blocked = 0) if(istype(target, /mob/living/carbon/human)) @@ -123,6 +140,7 @@ damage = 0 damage_type = BURN check_armour = "laser" + light_color = "#00C6FF" muzzle_type = /obj/effect/projectile/laser_omni/muzzle tracer_type = /obj/effect/projectile/laser_omni/tracer @@ -140,6 +158,7 @@ icon_state = "xray" damage = 50 armor_penetration = 10 + light_color = "#00CC33" muzzle_type = /obj/effect/projectile/xray/muzzle tracer_type = /obj/effect/projectile/xray/tracer @@ -152,6 +171,7 @@ taser_effect = 1 agony = 40 damage_type = HALLOSS + light_color = "#FFFFFF" muzzle_type = /obj/effect/projectile/stun/muzzle tracer_type = /obj/effect/projectile/stun/tracer diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 8bbd31aed04..835a0972678 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -168,6 +168,19 @@ range_step = 1 spread_step = 10 +//EMP shotgun 'slug', it's basically a beanbag that pops a tiny emp when it hits. +/obj/item/projectile/bullet/shotgun/ion + name = "ion slug" + damage = 15 + embed = 0 + sharp = 0 + check_armour = "melee" + +/obj/item/projectile/bullet/shotgun/ion/on_hit(var/atom/target, var/blocked = 0) + ..() + empulse(target, 0, 0) //Only affects what it hits + return 1 + /* "Rifle" rounds */ /obj/item/projectile/bullet/rifle diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index 80112690b3e..3eb848c7333 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -4,6 +4,7 @@ damage = 0 damage_type = BURN check_armour = "energy" + var/flash_strength = 10 //releases a burst of light on impact or after travelling a distance @@ -24,6 +25,15 @@ for (var/mob/living/carbon/M in viewers(T, flash_range)) if(M.eyecheck() < 1) M.flash_eyes() + if(ishuman(M)) + var/mob/living/carbon/human/H = M + flash_strength *= H.species.flash_mod + + if(flash_strength > 0) + H.confused = max(H.confused, flash_strength + 5) + H.eye_blind = max(H.eye_blind, flash_strength) + H.eye_blurry = max(H.eye_blurry, flash_strength + 5) + //snap pop playsound(src, 'sound/effects/snap.ogg', 50, 1) @@ -35,11 +45,13 @@ new /obj/effect/decal/cleanable/ash(src.loc) //always use src.loc so that ash doesn't end up inside windows new /obj/effect/effect/smoke/illumination(T, 5, brightness, brightness, light_colour) + //blinds people like the flash round, but can also be used for temporary illumination /obj/item/projectile/energy/flash/flare damage = 10 flash_range = 1 brightness = 15 + flash_strength = 20 /obj/item/projectile/energy/flash/flare/on_impact(var/atom/A) light_colour = pick("#e58775", "#ffffff", "#90ff90", "#a09030") @@ -56,6 +68,9 @@ taser_effect = 1 agony = 40 damage_type = HALLOSS + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" //Damage will be handled on the MOB side, to prevent window shattering. /obj/item/projectile/energy/electrode/strong @@ -73,6 +88,9 @@ nodamage = 1 damage_type = CLONE irradiate = 40 + light_range = 2 + light_power = 0.5 + light_color = "#33CC00" /obj/item/projectile/energy/dart @@ -112,3 +130,6 @@ damage = 20 damage_type = TOX irradiate = 20 + light_range = 2 + light_power = 0.5 + light_color = "#33CC00" diff --git a/code/modules/projectiles/projectile/special.dm b/code/modules/projectiles/projectile/special.dm index 788886af305..8ce0360c10f 100644 --- a/code/modules/projectiles/projectile/special.dm +++ b/code/modules/projectiles/projectile/special.dm @@ -5,13 +5,15 @@ damage_type = BURN nodamage = 1 check_armour = "energy" + light_range = 2 + light_power = 0.5 + light_color = "#55AAFF" on_hit(var/atom/target, var/blocked = 0) empulse(target, 1, 1) return 1 - /obj/item/projectile/bullet/gyro name ="explosive bolt" icon_state= "bolter" @@ -32,6 +34,9 @@ nodamage = 1 check_armour = "energy" var/temperature = 300 + light_range = 2 + light_power = 0.5 + light_color = "#55AAFF" on_hit(var/atom/target, var/blocked = 0)//These two could likely check temp protection on the mob @@ -77,6 +82,9 @@ damage_type = TOX nodamage = 1 check_armour = "energy" + light_range = 2 + light_power = 0.5 + light_color = "#33CC00" on_hit(var/atom/target, var/blocked = 0) var/mob/living/M = target @@ -116,6 +124,9 @@ damage_type = TOX nodamage = 1 check_armour = "energy" + light_range = 2 + light_power = 0.5 + light_color = "#FFFFFF" on_hit(var/atom/target, var/blocked = 0) var/mob/M = target @@ -136,6 +147,7 @@ if(ishuman(target)) var/mob/living/carbon/human/M = target M.confused += rand(5,8) + /obj/item/projectile/chameleon name = "bullet" icon_state = "bullet" diff --git a/code/modules/reagents/Chemistry-Reagents-Helpers.dm b/code/modules/reagents/Chemistry-Reagents-Helpers.dm new file mode 100644 index 00000000000..a072e4402b8 --- /dev/null +++ b/code/modules/reagents/Chemistry-Reagents-Helpers.dm @@ -0,0 +1,14 @@ +/atom/movable/proc/can_be_injected_by(var/atom/injector) + if(!Adjacent(get_turf(injector))) + return FALSE + if(!reagents) + return FALSE + if(!reagents.get_free_space()) + return FALSE + return TRUE + +/obj/can_be_injected_by(var/atom/injector) + return is_open_container() && ..() + +/mob/living/can_be_injected_by(var/atom/injector) + return ..() && (can_inject(null, 0, BP_TORSO) || can_inject(null, 0, BP_GROIN)) \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm index f051e8307fe..fcabfa811cc 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Core.dm @@ -125,10 +125,10 @@ /datum/reagent/water/touch_mob(var/mob/living/L, var/amount) if(istype(L)) - var/needed = L.fire_stacks * 10 + var/needed = L.fire_stacks * 5 if(amount > needed) L.ExtinguishMob() - L.adjust_fire_stacks(-(amount / 10)) + L.adjust_fire_stacks(-(amount / 5)) remove_self(needed) /datum/reagent/water/affect_touch(var/mob/living/carbon/M, var/alien, var/removed) diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm index 5d400776357..525309f93b5 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Food-Drinks.dm @@ -587,7 +587,7 @@ name = "Tea" id = "tea" description = "Tasty black tea, it has antioxidants, it's good for you!" - color = "#101000" + color = "#832700" adj_dizzy = -2 adj_drowsy = -1 adj_sleepy = -3 @@ -596,6 +596,10 @@ glass_name = "cup of tea" glass_desc = "Tasty black tea, it has antioxidants, it's good for you!" + cup_icon_state = "cup_tea" + cup_name = "cup of tea" + cup_desc = "Tasty black tea, it has antioxidants, it's good for you!" + /datum/reagent/drink/tea/affect_ingest(var/mob/living/carbon/M, var/alien, var/removed) ..() if(alien == IS_DIONA) @@ -606,13 +610,17 @@ name = "Iced Tea" id = "icetea" description = "No relation to a certain rap artist/ actor." - color = "#104038" // rgb: 16, 64, 56 + color = "#AC7F24" // rgb: 16, 64, 56 adj_temp = -5 glass_name = "iced tea" glass_desc = "No relation to a certain rap artist/ actor." glass_special = list(DRINK_ICE) + cup_icon_state = "cup_tea" + cup_name = "cup of iced tea" + cup_desc = "No relation to a certain rap artist/ actor." + /datum/reagent/drink/coffee name = "Coffee" id = "coffee" diff --git a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm index db573995b66..2cb1bcaa5ba 100644 --- a/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm +++ b/code/modules/reagents/Chemistry-Reagents/Chemistry-Reagents-Medicine.dm @@ -310,7 +310,7 @@ description = "Hyperzine is a highly effective, long lasting, muscle stimulant." reagent_state = LIQUID color = "#FF3300" - metabolism = REM * 0.15 + metabolism = REM * 0.3 overdose = REAGENTS_OVERDOSE * 0.5 /datum/reagent/hyperzine/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) diff --git a/code/modules/reagents/dispenser/cartridge.dm b/code/modules/reagents/dispenser/cartridge.dm index 2f7369cba0d..3a129d48725 100644 --- a/code/modules/reagents/dispenser/cartridge.dm +++ b/code/modules/reagents/dispenser/cartridge.dm @@ -3,7 +3,7 @@ desc = "This goes in a chemical dispenser." icon_state = "cartridge" - w_class = 3 + w_class = ITEMSIZE_NORMAL volume = CARTRIDGE_VOLUME_LARGE amount_per_transfer_from_this = 50 diff --git a/code/modules/reagents/reagent_containers.dm b/code/modules/reagents/reagent_containers.dm index 2c8c853ebcb..6721cbd3bbc 100644 --- a/code/modules/reagents/reagent_containers.dm +++ b/code/modules/reagents/reagent_containers.dm @@ -3,7 +3,7 @@ desc = "..." icon = 'icons/obj/chemical.dmi' icon_state = null - w_class = 2 + w_class = ITEMSIZE_SMALL var/amount_per_transfer_from_this = 5 var/possible_transfer_amounts = list(5,10,15,25,30) var/volume = 30 diff --git a/code/modules/reagents/reagent_containers/drinkingglass/extras.dm b/code/modules/reagents/reagent_containers/drinkingglass/extras.dm index 5a92b61c889..284d4ecfa93 100644 --- a/code/modules/reagents/reagent_containers/drinkingglass/extras.dm +++ b/code/modules/reagents/reagent_containers/drinkingglass/extras.dm @@ -52,7 +52,7 @@ var/glass_addition var/glass_desc var/glass_color - w_class = 1 + w_class = ITEMSIZE_TINY icon = DRINK_ICON_FILE /obj/item/weapon/glass_extra/stick diff --git a/code/modules/reagents/reagent_containers/dropper.dm b/code/modules/reagents/reagent_containers/dropper.dm index ba671cdb502..7ee525fc0b0 100644 --- a/code/modules/reagents/reagent_containers/dropper.dm +++ b/code/modules/reagents/reagent_containers/dropper.dm @@ -8,7 +8,7 @@ icon_state = "dropper0" amount_per_transfer_from_this = 5 possible_transfer_amounts = list(1,2,3,4,5) - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS volume = 5 diff --git a/code/modules/reagents/reagent_containers/food/drinks.dm b/code/modules/reagents/reagent_containers/food/drinks.dm index c1a585cbaad..945bbbc8e02 100644 --- a/code/modules/reagents/reagent_containers/food/drinks.dm +++ b/code/modules/reagents/reagent_containers/food/drinks.dm @@ -94,7 +94,7 @@ name = "golden cup" icon_state = "golden_cup" item_state = "" //nope :( - w_class = 4 + w_class = ITEMSIZE_LARGE force = 14 throwforce = 10 amount_per_transfer_from_this = 20 @@ -256,8 +256,8 @@ ..() /obj/item/weapon/reagent_containers/food/drinks/flask - name = "\improper Captain's flask" - desc = "A metal flask belonging to the captain" + name = "\improper Station Administrator's flask" + desc = "A metal flask belonging to the Station Administrator" icon_state = "flask" volume = 60 center_of_mass = list("x"=17, "y"=7) diff --git a/code/modules/reagents/reagent_containers/food/snacks.dm b/code/modules/reagents/reagent_containers/food/snacks.dm index a5dff3868da..f0bda3a3cc0 100644 --- a/code/modules/reagents/reagent_containers/food/snacks.dm +++ b/code/modules/reagents/reagent_containers/food/snacks.dm @@ -13,7 +13,7 @@ var/dry = 0 var/nutriment_amt = 0 center_of_mass = list("x"=16, "y"=16) - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/reagent_containers/food/snacks/New() ..() @@ -2214,7 +2214,7 @@ // sliceable is just an organization type path, it doesn't have any additional code or variables tied to it. /obj/item/weapon/reagent_containers/food/snacks/sliceable - w_class = 3 //Whole pizzas and cakes shouldn't fit in a pocket, you can slice them if you want to do that. + w_class = ITEMSIZE_NORMAL //Whole pizzas and cakes shouldn't fit in a pocket, you can slice them if you want to do that. /obj/item/weapon/reagent_containers/food/snacks/sliceable/meatbread name = "meatbread loaf" diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index 1347a182fc3..b041aa13e70 100644 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -12,7 +12,7 @@ amount_per_transfer_from_this = 10 possible_transfer_amounts = list(5,10,15,25,30,60) volume = 60 - w_class = 2 + w_class = ITEMSIZE_SMALL flags = OPENCONTAINER unacidable = 1 //glass doesn't dissolve in acid @@ -218,7 +218,7 @@ icon_state = "bucket" item_state = "bucket" matter = list(DEFAULT_WALL_MATERIAL = 200) - w_class = 3.0 + w_class = ITEMSIZE_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = list(10,20,30,60,120) volume = 120 @@ -256,7 +256,7 @@ icon = 'icons/obj/vending.dmi' icon_state = "water_cooler_bottle" matter = list("glass" = 2000) - w_class = 3.0 + w_class = ITEMSIZE_NORMAL amount_per_transfer_from_this = 20 possible_transfer_amounts = list(10,20,30,60,120) volume = 120 diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index 150a7743096..464e066264c 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -8,7 +8,7 @@ icon_state = null item_state = "pill" possible_transfer_amounts = null - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS volume = 60 diff --git a/code/modules/reagents/reagent_containers/spray.dm b/code/modules/reagents/reagent_containers/spray.dm index c3b48691c05..c1c2597daf8 100644 --- a/code/modules/reagents/reagent_containers/spray.dm +++ b/code/modules/reagents/reagent_containers/spray.dm @@ -7,7 +7,7 @@ flags = OPENCONTAINER|NOBLUDGEON slot_flags = SLOT_BELT throwforce = 3 - w_class = 2.0 + w_class = ITEMSIZE_SMALL throw_speed = 2 throw_range = 10 amount_per_transfer_from_this = 10 @@ -163,7 +163,7 @@ icon_state = "chemsprayer" item_state = "chemsprayer" throwforce = 3 - w_class = 3.0 + w_class = ITEMSIZE_NORMAL possible_transfer_amounts = null volume = 600 origin_tech = list(TECH_COMBAT = 3, TECH_MATERIAL = 3, TECH_ENGINEERING = 3) diff --git a/code/modules/reagents/reagent_containers/syringes.dm b/code/modules/reagents/reagent_containers/syringes.dm index 87b5311be2f..4bf97175d1f 100644 --- a/code/modules/reagents/reagent_containers/syringes.dm +++ b/code/modules/reagents/reagent_containers/syringes.dm @@ -15,7 +15,7 @@ amount_per_transfer_from_this = 5 possible_transfer_amounts = null volume = 15 - w_class = 1 + w_class = ITEMSIZE_TINY slot_flags = SLOT_EARS sharp = 1 unacidable = 1 //glass diff --git a/code/modules/recycling/conveyor2.dm b/code/modules/recycling/conveyor2.dm index 6296a8b9516..8a5c8cc7b41 100644 --- a/code/modules/recycling/conveyor2.dm +++ b/code/modules/recycling/conveyor2.dm @@ -38,7 +38,6 @@ operating = 1 setmove() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/gear(src) component_parts += new /obj/item/weapon/stock_parts/motor(src) diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index 70ac20ae87d..be3cfa72a85 100755 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -218,7 +218,7 @@ name = "package wrapper" icon = 'icons/obj/items.dmi' icon_state = "deliveryPaper" - w_class = 3.0 + w_class = ITEMSIZE_NORMAL var/amount = 25.0 @@ -327,7 +327,7 @@ icon_state = "dest_tagger" var/currTag = 0 - w_class = 2 + w_class = ITEMSIZE_SMALL item_state = "electronic" flags = CONDUCT slot_flags = SLOT_BELT diff --git a/code/modules/research/circuitprinter.dm b/code/modules/research/circuitprinter.dm index e444bcb8c15..6831034edf1 100644 --- a/code/modules/research/circuitprinter.dm +++ b/code/modules/research/circuitprinter.dm @@ -24,7 +24,6 @@ using metal and glass, it uses glass and reagents (usually sulphuric acid). /obj/machinery/r_n_d/circuit_imprinter/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index c0ecdbfc3d5..bbb54d7f7ef 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -1486,6 +1486,466 @@ CIRCUITS BELOW build_path = /obj/item/weapon/cartridge/captain sort_string = "VBAAO" + + +/datum/design/item/wirer + name = "Custom wirer tool" + id = "wirer" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/wirer + sort_string = "VBVAA" + +/datum/design/item/debugger + name = "Custom circuit debugger tool" + id = "debugger" + req_tech = list(TECH_MATERIAL = 2, TECH_ENGINEERING = 2) + materials = list(DEFAULT_WALL_MATERIAL = 5000, "glass" = 2500) + build_path = /obj/item/device/integrated_electronics/debugger + sort_string = "VBVAB" + + + +/datum/design/item/custom_circuit_assembly + name = "Small custom assembly" + desc = "An customizable assembly for simple, small devices." + id = "assembly-small" + req_tech = list(TECH_MATERIAL = 3, TECH_ENGINEERING = 2, TECH_POWER = 2) + materials = list(DEFAULT_WALL_MATERIAL = 10000) + build_path = /obj/item/device/electronic_assembly + sort_string = "VCAAA" + +/datum/design/item/custom_circuit_assembly/medium + name = "Medium custom assembly" + desc = "An customizable assembly suited for more ambitious mechanisms." + id = "assembly-medium" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 3, TECH_POWER = 3) + materials = list(DEFAULT_WALL_MATERIAL = 20000) + build_path = /obj/item/device/electronic_assembly/medium + +/datum/design/item/custom_circuit_assembly/drone + name = "Drone custom assembly" + desc = "An customizable assembly optimized for autonomous devices." + id = "assembly-drone" + req_tech = list(TECH_MATERIAL = 4, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 30000) + build_path = /obj/item/device/electronic_assembly/drone + +/datum/design/item/custom_circuit_assembly/large + name = "Large custom assembly" + desc = "An customizable assembly for large machines." + id = "assembly-large" + req_tech = list(TECH_MATERIAL = 5, TECH_ENGINEERING = 4, TECH_POWER = 4) + materials = list(DEFAULT_WALL_MATERIAL = 40000) + build_path = /obj/item/device/electronic_assembly/large + +/datum/design/circuit/integrated_circuit + req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2) + +/datum/design/circuit/integrated_circuit/AssembleDesignName() + ..() + name = "Custom circuitry ([item_name])" + +/datum/design/circuit/integrated_circuit/AssembleDesignDesc() + if(!desc) + desc = "Allows for the construction of \a [name] custom circuit." + +/datum/design/circuit/integrated_circuit/arithmetic/AssembleDesignName() + ..() + name = "Custom circuitry \[Arithmetic\] ([item_name])" + +/datum/design/circuit/integrated_circuit/arithmetic/addition + id = "cc-addition" + build_path = /obj/item/integrated_circuit/arithmetic/addition + sort_string = "WAAAA" + +/datum/design/circuit/integrated_circuit/arithmetic/subtraction + id = "cc-subtraction" + build_path = /obj/item/integrated_circuit/arithmetic/subtraction + sort_string = "WAAAB" + +/datum/design/circuit/integrated_circuit/arithmetic/multiplication + id = "cc-multiplication" + build_path = /obj/item/integrated_circuit/arithmetic/multiplication + sort_string = "WAAAC" + +/datum/design/circuit/integrated_circuit/arithmetic/division + id = "cc-division" + build_path = /obj/item/integrated_circuit/arithmetic/division + sort_string = "WAAAD" + +/datum/design/circuit/integrated_circuit/arithmetic/absolute + id = "cc-absolute" + build_path = /obj/item/integrated_circuit/arithmetic/absolute + sort_string = "WAAAE" + +/datum/design/circuit/integrated_circuit/arithmetic/average + id = "cc-average" + build_path = /obj/item/integrated_circuit/arithmetic/average + sort_string = "WAAAF" + +/datum/design/circuit/integrated_circuit/arithmetic/pi + id = "cc-pi" + build_path = /obj/item/integrated_circuit/arithmetic/pi + sort_string = "WAAAG" + +/datum/design/circuit/integrated_circuit/arithmetic/random + id = "cc-random" + build_path = /obj/item/integrated_circuit/arithmetic/random + sort_string = "WAAAH" + + + +/datum/design/circuit/integrated_circuit/converter/AssembleDesignName() + ..() + name = "Custom circuitry \[Conversion\] ([item_name])" + +/datum/design/circuit/integrated_circuit/converter/num2text + id = "cc-num2text" + build_path = /obj/item/integrated_circuit/converter/num2text + sort_string = "WAABA" + +/datum/design/circuit/integrated_circuit/converter/text2num + id = "cc-text2num" + build_path = /obj/item/integrated_circuit/converter/text2num + sort_string = "WAABB" + +/datum/design/circuit/integrated_circuit/converter/ref2text + id = "cc-ref2text" + build_path = /obj/item/integrated_circuit/converter/ref2text + sort_string = "WAABC" + +/datum/design/circuit/integrated_circuit/converter/lowercase + id = "cc-lowercase" + build_path = /obj/item/integrated_circuit/converter/lowercase + sort_string = "WAABD" + +/datum/design/circuit/integrated_circuit/converter/uppercase + id = "cc-uppercase" + build_path = /obj/item/integrated_circuit/converter/uppercase + sort_string = "WAABD" + +/datum/design/circuit/integrated_circuit/converter/concatenatior + id = "cc-concatenatior" + build_path = /obj/item/integrated_circuit/converter/concatenatior + sort_string = "WAABC" + + + +/datum/design/circuit/integrated_circuit/coordinate/AssembleDesignName() + ..() + name = "Custom circuitry \[Coordinate\] ([item_name])" + +/datum/design/circuit/integrated_circuit/coordinate/gps + id = "cc-gps" + build_path = /obj/item/integrated_circuit/gps + sort_string = "WAACA" + +/datum/design/circuit/integrated_circuit/coordinate/abs_to_rel_coords + id = "cc-abs_to_rel_coords" + build_path = /obj/item/integrated_circuit/abs_to_rel_coords + sort_string = "WAACB" + + + +/datum/design/circuit/integrated_circuit/transfer/AssembleDesignName() + ..() + name = "Custom circuitry \[Transfer\] ([item_name])" + +/datum/design/circuit/integrated_circuit/transfer/splitter + id = "cc-splitter" + build_path = /obj/item/integrated_circuit/transfer/splitter + sort_string = "WAADA" + +/datum/design/circuit/integrated_circuit/transfer/splitter4 + id = "cc-splitter4" + build_path = /obj/item/integrated_circuit/transfer/splitter/medium + sort_string = "WAADB" + +/datum/design/circuit/integrated_circuit/transfer/splitter8 + id = "cc-splitter8" + build_path = /obj/item/integrated_circuit/transfer/splitter/large + sort_string = "WAADC" + +/datum/design/circuit/integrated_circuit/transfer/activator_splitter + id = "cc-activator_splitter" + build_path = /obj/item/integrated_circuit/transfer/activator_splitter + sort_string = "WAADD" + +/datum/design/circuit/integrated_circuit/transfer/activator_splitter4 + id = "cc-activator_splitter4" + build_path = /obj/item/integrated_circuit/transfer/activator_splitter/medium + sort_string = "WAADE" + +/datum/design/circuit/integrated_circuit/transfer/activator_splitter8 + id = "cc-activator_splitter8" + build_path = /obj/item/integrated_circuit/transfer/activator_splitter/large + sort_string = "WAADF" + + + +/datum/design/circuit/integrated_circuit/input_output/AssembleDesignName() + ..() + name = "Custom circuitry \[Input/Output\] ([item_name])" + +/datum/design/circuit/integrated_circuit/input_output/button + id = "cc-button" + build_path = /obj/item/integrated_circuit/input/button + sort_string = "WAAEA" + +/datum/design/circuit/integrated_circuit/input_output/numberpad + id = "cc-numberpad" + build_path = /obj/item/integrated_circuit/input/numberpad + sort_string = "WAAEB" + +/datum/design/circuit/integrated_circuit/input_output/textpad + id = "cc-textpad" + build_path = /obj/item/integrated_circuit/input/textpad + sort_string = "WAAEC" + +/datum/design/circuit/integrated_circuit/input_output/screen + id = "cc-screen" + build_path = /obj/item/integrated_circuit/output/screen + sort_string = "WAAED" + +/datum/design/circuit/integrated_circuit/input_output/med_scanner + id = "cc-medscanner" + build_path = /obj/item/integrated_circuit/input/med_scanner + req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 2, TECH_BIOMED = 2) + sort_string = "WAAEE" + +/datum/design/circuit/integrated_circuit/input_output/adv_med_scanner + id = "cc-advmedscanner" + build_path = /obj/item/integrated_circuit/input/adv_med_scanner + req_tech = list(TECH_MATERIAL = 2, TECH_MAGNETS = 3, TECH_BIOMED = 4) + sort_string = "WAAEF" + +/datum/design/circuit/integrated_circuit/input_output/local_locator + id = "cc-locallocator" + build_path = /obj/item/integrated_circuit/input/local_locator + sort_string = "WAAEG" + +/datum/design/circuit/integrated_circuit/input_output/adjacent_locator + id = "cc-adjacentlocator" + build_path = /obj/item/integrated_circuit/input/adjacent_locator + sort_string = "WAAEH" + +/datum/design/circuit/integrated_circuit/input_output/signaler + id = "cc-signaler" + build_path = /obj/item/integrated_circuit/input/signaler + sort_string = "WAAEJ" + +/datum/design/circuit/integrated_circuit/input_output/light + id = "cc-light" + build_path = /obj/item/integrated_circuit/output/light + sort_string = "WAAEH" + +/datum/design/circuit/integrated_circuit/input_output/adv_light + id = "cc-adv_light" + build_path = /obj/item/integrated_circuit/output/light/advanced + sort_string = "WAAEI" + +/datum/design/circuit/integrated_circuit/input_output/beeper + id = "cc-sound_beeper" + build_path = /obj/item/integrated_circuit/output/sound/beeper + sort_string = "WAAEJ" + +/datum/design/circuit/integrated_circuit/input_output/beepsky_sound + id = "cc-sound_beepsky" + build_path = /obj/item/integrated_circuit/output/sound/beepsky + sort_string = "WAAEK" + req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_ILLEGAL = 1) + +/datum/design/circuit/integrated_circuit/input_output/EPv2 + id = "cc-epv2" + build_path = /obj/item/integrated_circuit/input/EPv2 + sort_string = "WAAEL" + req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_MAGNETS = 2, TECH_BLUESPACE = 2) + + +/datum/design/circuit/integrated_circuit/logic/AssembleDesignName() + ..() + name = "Custom circuitry \[Logic\] ([item_name])" + +/datum/design/circuit/integrated_circuit/logic/binary/equals + id = "cc-equals" + build_path = /obj/item/integrated_circuit/logic/binary/equals + sort_string = "WAAFA" + +/datum/design/circuit/integrated_circuit/logic/unary/not + id = "cc-not" + build_path = /obj/item/integrated_circuit/logic/unary/not + sort_string = "WAAFB" + +/datum/design/circuit/integrated_circuit/logic/binary/and + id = "cc-and" + build_path = /obj/item/integrated_circuit/logic/binary/and + sort_string = "WAAFC" + +/datum/design/circuit/integrated_circuit/logic/binary/or + id = "cc-or" + build_path = /obj/item/integrated_circuit/logic/binary/or + sort_string = "WAAFD" + +/datum/design/circuit/integrated_circuit/logic/binary/less_than + id = "cc-less_than" + build_path = /obj/item/integrated_circuit/logic/binary/less_than + sort_string = "WAAFE" + +/datum/design/circuit/integrated_circuit/logic/binary/less_than_or_equal + id = "cc-less_than_or_equal" + build_path = /obj/item/integrated_circuit/logic/binary/less_than_or_equal + sort_string = "WAAFF" + +/datum/design/circuit/integrated_circuit/logic/binary/greater_than + id = "cc-greater_than" + build_path = /obj/item/integrated_circuit/logic/binary/greater_than + sort_string = "WAAFG" + +/datum/design/circuit/integrated_circuit/logic/binary/greater_than_or_equal + id = "cc-greater_than_or_equal" + build_path = /obj/item/integrated_circuit/logic/binary/greater_than_or_equal + sort_string = "WAAFH" + + + +/datum/design/circuit/integrated_circuit/manipulation/AssembleDesignName() + ..() + name = "Custom circuitry \[Manipulation\] ([item_name])" + +/datum/design/circuit/integrated_circuit/manipulation/weapon_firing + name = "weapon firing mechanism" + id = "cc-weapon_firing" + build_path = /obj/item/integrated_circuit/manipulation/weapon_firing + sort_string = "WAAGA" + req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_COMBAT = 4) + +/datum/design/circuit/integrated_circuit/manipulation/smoke + name = "smoke generator" + id = "cc-smoke" + build_path = /obj/item/integrated_circuit/manipulation/smoke + sort_string = "WAAGB" + req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3, TECH_BIO = 4) + +/datum/design/circuit/integrated_circuit/manipulation/locomotion + name = "locomotion" + id = "cc-locomotion" + build_path = /obj/item/integrated_circuit/manipulation/locomotion + sort_string = "WAAGB" + req_tech = list(TECH_ENGINEERING = 3, TECH_DATA = 3) + +/datum/design/circuit/integrated_circuit/manipulation/injector + name = "injector" + id = "cc-injector" + build_path = /obj/item/integrated_circuit/manipulation/injector + sort_string = "WAAGC" + req_tech = list(TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 3) + +/datum/design/circuit/integrated_circuit/manipulation/reagent_pump + name = "reagent pump" + id = "cc-reagent_pump" + build_path = /obj/item/integrated_circuit/manipulation/reagent_pump + sort_string = "WAAGD" + req_tech = list(TECH_ENGINEERING = 1, TECH_DATA = 1, TECH_BIO = 2) + +/datum/design/circuit/integrated_circuit/manipulation/reagent_storage + name = "reagent storage" + id = "cc-reagent_storage" + build_path = /obj/item/integrated_circuit/manipulation/reagent_storage + sort_string = "WAAGE" + req_tech = list(TECH_ENGINEERING = 1, TECH_DATA = 1, TECH_BIO = 1) + +/datum/design/circuit/integrated_circuit/manipulation/reagent_storage_cryo + name = "cryo reagent storage" + id = "cc-reagent_storage_cryo" + build_path = /obj/item/integrated_circuit/manipulation/reagent_storage/cryo + sort_string = "WAAGF" + req_tech = list(TECH_MATERIALS = 3, TECH_ENGINEERING = 2, TECH_DATA = 2, TECH_BIO = 2) + +/datum/design/circuit/integrated_circuit/memory/AssembleDesignName() + ..() + name = "Custom circuitry \[Memory\] ([item_name])" + +/datum/design/circuit/integrated_circuit/memory + id = "cc-memory" + build_path = /obj/item/integrated_circuit/memory + sort_string = "WAAHA" + +/datum/design/circuit/integrated_circuit/memory/medium + id = "cc-memory4" + build_path = /obj/item/integrated_circuit/memory/medium + sort_string = "WAAHB" + +/datum/design/circuit/integrated_circuit/memory/large + id = "cc-memory8" + build_path = /obj/item/integrated_circuit/memory/large + sort_string = "WAAHC" + +/datum/design/circuit/integrated_circuit/memory/huge + id = "cc-memory16" + build_path = /obj/item/integrated_circuit/memory/huge + sort_string = "WAAHD" + +/datum/design/circuit/integrated_circuit/memory/constant + id = "cc-constant" + build_path = /obj/item/integrated_circuit/memory/constant + sort_string = "WAAHH" + +/datum/design/circuit/integrated_circuit/time/AssembleDesignName() + ..() + name = "Custom circuitry \[Time\] ([item_name])" + +/datum/design/circuit/integrated_circuit/time/delay + id = "cc-delay" + build_path = /obj/item/integrated_circuit/time/delay + sort_string = "WAAIA" + +/datum/design/circuit/integrated_circuit/time/delay/five_sec + id = "cc-five_sec_delay" + build_path = /obj/item/integrated_circuit/time/delay/five_sec + sort_string = "WAAIB" + +/datum/design/circuit/integrated_circuit/time/delay/one_sec + id = "cc-one_sec_delay" + build_path = /obj/item/integrated_circuit/time/delay/one_sec + sort_string = "WAAIC" + +/datum/design/circuit/integrated_circuit/time/delay/half_sec + id = "cc-half_sec_delay" + build_path = /obj/item/integrated_circuit/time/delay/half_sec + sort_string = "WAAID" + +/datum/design/circuit/integrated_circuit/time/delay/tenth_sec + id = "cc-tenth_sec_delay" + build_path = /obj/item/integrated_circuit/time/delay/tenth_sec + sort_string = "WAAIF" + +/datum/design/circuit/integrated_circuit/time/delay/custom + id = "cc-custom_delay" + build_path = /obj/item/integrated_circuit/time/delay/custom + sort_string = "WAAIG" + +/datum/design/circuit/integrated_circuit/time/ticker + id = "cc-ticker" + build_path = /obj/item/integrated_circuit/time/ticker + sort_string = "WAAIH" + +/datum/design/circuit/integrated_circuit/time/ticker/slow + id = "cc-ticker_slow" + build_path = /obj/item/integrated_circuit/time/ticker/slow + sort_string = "WAAII" + +/datum/design/circuit/integrated_circuit/time/ticker/fast + id = "cc-ticker_fast" + build_path = /obj/item/integrated_circuit/time/ticker/fast + sort_string = "WAAIJ" + req_tech = list(TECH_ENGINEERING = 4, TECH_DATA = 4) + +/datum/design/circuit/integrated_circuit/time/clock + id = "cc-clock" + build_path = /obj/item/integrated_circuit/time/clock + sort_string = "WAAIK" + /* Uncomment if someone makes these buildable /datum/design/circuit/general_alert name = "general alert console" diff --git a/code/modules/research/destructive_analyzer.dm b/code/modules/research/destructive_analyzer.dm index 686a2730238..3fbb141f7e8 100644 --- a/code/modules/research/destructive_analyzer.dm +++ b/code/modules/research/destructive_analyzer.dm @@ -18,7 +18,6 @@ Note: Must be placed within 3 tiles of the R&D Console /obj/machinery/r_n_d/destructive_analyzer/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) diff --git a/code/modules/research/protolathe.dm b/code/modules/research/protolathe.dm index 46b688929d3..d5237e5a818 100644 --- a/code/modules/research/protolathe.dm +++ b/code/modules/research/protolathe.dm @@ -19,7 +19,6 @@ /obj/machinery/r_n_d/protolathe/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) diff --git a/code/modules/research/research.dm b/code/modules/research/research.dm index 41c6f6978ce..ce5a9e151a5 100644 --- a/code/modules/research/research.dm +++ b/code/modules/research/research.dm @@ -203,7 +203,7 @@ research holder datum. icon = 'icons/obj/cloning.dmi' icon_state = "datadisk2" item_state = "card-id" - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) var/datum/tech/stored @@ -217,7 +217,7 @@ research holder datum. icon = 'icons/obj/cloning.dmi' icon_state = "datadisk2" item_state = "card-id" - w_class = 2.0 + w_class = ITEMSIZE_SMALL matter = list(DEFAULT_WALL_MATERIAL = 30, "glass" = 10) var/datum/design/blueprint diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index bf4cab0697e..abcfdd0fa0b 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -17,7 +17,6 @@ /obj/machinery/r_n_d/server/New() ..() - circuit = new circuit() component_parts = list() component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/stack/cable_coil(src) diff --git a/code/modules/scripting/Implementations/Telecomms.dm b/code/modules/scripting/Implementations/Telecomms.dm index 87c6fa5ea36..1277d2b5940 100644 --- a/code/modules/scripting/Implementations/Telecomms.dm +++ b/code/modules/scripting/Implementations/Telecomms.dm @@ -2,7 +2,7 @@ /* --- Traffic Control Scripting Language --- */ - // Nanotrasen TCS Language - Made by Doohl + // NanoTrasen TCS Language - Made by Doohl /n_Interpreter/TCS_Interpreter var/datum/TCS_Compiler/Compiler diff --git a/code/modules/security levels/keycard authentication.dm b/code/modules/security levels/keycard authentication.dm index b4301cf557a..7c9fea54da1 100644 --- a/code/modules/security levels/keycard authentication.dm +++ b/code/modules/security levels/keycard authentication.dm @@ -42,22 +42,25 @@ broadcast_request() //This is the device making the initial event request. It needs to broadcast to other devices if(istype(W, /obj/item/weapon/screwdriver)) - user << "You remove the faceplate from the [src]" - var/obj/structure/frame/A = new /obj/structure/frame( src.loc ) - var/obj/item/weapon/circuitboard/M = new circuit( A ) - A.frame_type = "keycard" - A.pixel_x = pixel_x - A.pixel_y = pixel_y - A.set_dir(dir) - A.circuit = M - A.anchored = 1 - for (var/obj/C in src) - C.forceMove(loc) - A.state = 3 - A.icon_state = "keycard_3" - M.deconstruct(src) - qdel(src) - return + user << "You begin removing the faceplate from the [src]" + if(do_after(user, 10)) + user << "You remove the faceplate from the [src]" + var/obj/structure/frame/A = new /obj/structure/frame(loc) + var/obj/item/weapon/circuitboard/M = new circuit(A) + A.frame_type = M.board_type + A.need_circuit = 0 + A.pixel_x = pixel_x + A.pixel_y = pixel_y + A.set_dir(dir) + A.circuit = M + A.anchored = 1 + for (var/obj/C in src) + C.forceMove(loc) + A.state = 3 + A.update_icon() + M.deconstruct(src) + qdel(src) + return /obj/machinery/keycard_auth/power_change() ..() @@ -195,4 +198,4 @@ var/global/maint_all_access = 0 /obj/machinery/door/airlock/allowed(mob/M) if(maint_all_access && src.check_access_list(list(access_maint_tunnels))) return 1 - return ..(M) + return ..(M) \ No newline at end of file diff --git a/code/modules/shuttles/shuttle_ferry.dm b/code/modules/shuttles/shuttle_ferry.dm index 5d6663f3b57..0a288a1ba9a 100644 --- a/code/modules/shuttles/shuttle_ferry.dm +++ b/code/modules/shuttles/shuttle_ferry.dm @@ -16,7 +16,7 @@ //TODO: change location to a string and use a mapping for area and dock targets. var/dock_target_station var/dock_target_offsite - + var/last_dock_attempt_time = 0 /datum/shuttle/ferry/short_jump(var/area/origin,var/area/destination) @@ -85,15 +85,15 @@ long_jump(interim=area_transition, travel_time=move_time, direction=transit_direction) else short_jump() - + process_state = WAIT_ARRIVE - + if (WAIT_ARRIVE) if (moving_status == SHUTTLE_IDLE) dock() in_use = null //release lock process_state = WAIT_FINISH - + if (WAIT_FINISH) if (skip_docking_checks() || docking_controller.docked() || world.time > last_dock_attempt_time + DOCK_ATTEMPT_TIMEOUT) process_state = IDLE_STATE diff --git a/code/modules/spells/spellbook.dm b/code/modules/spells/spellbook.dm index b54b243609a..34923745a46 100644 --- a/code/modules/spells/spellbook.dm +++ b/code/modules/spells/spellbook.dm @@ -5,7 +5,7 @@ icon_state ="spellbook" throw_speed = 1 throw_range = 5 - w_class = 2 + w_class = ITEMSIZE_SMALL var/uses = 5 var/temp = null var/max_uses = 5 diff --git a/code/modules/surgery/bones.dm b/code/modules/surgery/bones.dm index cc4428fcb61..818e208ff4a 100644 --- a/code/modules/surgery/bones.dm +++ b/code/modules/surgery/bones.dm @@ -140,7 +140,6 @@ user.visible_message("\blue [user] has mended the damaged bones in [target]'s [affected.name] with \the [tool]." , \ "\blue You have mended the damaged bones in [target]'s [affected.name] with \the [tool]." ) affected.status &= ~ORGAN_BROKEN - affected.status &= ~ORGAN_SPLINTED affected.stage = 0 fail_step(mob/living/user, mob/living/carbon/human/target, target_zone, obj/item/tool) diff --git a/code/modules/vehicles/cargo_train.dm b/code/modules/vehicles/cargo_train.dm index 5b1fc876b31..a8ff23a91fb 100644 --- a/code/modules/vehicles/cargo_train.dm +++ b/code/modules/vehicles/cargo_train.dm @@ -20,7 +20,7 @@ desc = "A keyring with a small steel key, and a yellow fob reading \"Choo Choo!\"." icon = 'icons/obj/vehicles.dmi' icon_state = "train_keys" - w_class = 1 + w_class = ITEMSIZE_TINY /obj/vehicle/train/cargo/trolley name = "cargo train trolley" diff --git a/code/modules/vehicles/vehicle.dm b/code/modules/vehicles/vehicle.dm index ddc56dad3f6..80eb2f1a447 100644 --- a/code/modules/vehicles/vehicle.dm +++ b/code/modules/vehicles/vehicle.dm @@ -93,6 +93,7 @@ if(health < maxhealth) if(open) health = min(maxhealth, health+10) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) user.visible_message("\red [user] repairs [src]!","\blue You repair [src]!") else user << "Unable to repair with the maintenance panel closed." @@ -101,6 +102,7 @@ else user << "Unable to repair while [src] is off." else if(hasvar(W,"force") && hasvar(W,"damtype")) + user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) switch(W.damtype) if("fire") health -= W.force * fire_dam_coeff diff --git a/code/modules/ventcrawl/ventcrawl.dm b/code/modules/ventcrawl/ventcrawl.dm new file mode 100644 index 00000000000..9b2b83d3e70 --- /dev/null +++ b/code/modules/ventcrawl/ventcrawl.dm @@ -0,0 +1,185 @@ +var/list/ventcrawl_machinery = list( + /obj/machinery/atmospherics/unary/vent_pump, + /obj/machinery/atmospherics/unary/vent_scrubber + ) + +// Vent crawling whitelisted items, whoo +/mob/living/var/list/can_enter_vent_with = list( + /obj/item/weapon/implant, + /obj/item/device/radio/borg, + /obj/item/weapon/holder, + /obj/machinery/camera, + /mob/living/simple_animal/borer, + ) + +/mob/living/var/list/icon/pipes_shown = list() +/mob/living/var/last_played_vent +/mob/living/var/is_ventcrawling = 0 +/mob/var/next_play_vent = 0 + +/mob/living/proc/can_ventcrawl() + if(!client) + return FALSE + if(!(/mob/living/proc/ventcrawl in verbs)) + to_chat(src, "You don't possess the ability to ventcrawl!") + return FALSE + if(incapacitated()) + to_chat(src, "You cannot ventcrawl in your current state!") + return FALSE + return ventcrawl_carry() + +/mob/living/Login() + . = ..() + //login during ventcrawl + if(is_ventcrawling && istype(loc, /obj/machinery/atmospherics)) //attach us back into the pipes + remove_ventcrawl() + add_ventcrawl(loc) + +/mob/living/carbon/slime/can_ventcrawl() + if(Victim) + to_chat(src, "You cannot ventcrawl while feeding.") + return FALSE + . = ..() + +/mob/living/proc/is_allowed_vent_crawl_item(var/obj/item/carried_item) + if(carried_item == ability_master) + return 1 + for(var/type in can_enter_vent_with) + if(istype(carried_item, can_enter_vent_with)) + return get_inventory_slot(carried_item) == 0 + return 0 + +/mob/living/carbon/is_allowed_vent_crawl_item(var/obj/item/carried_item) + if(carried_item in internal_organs) + return 1 + return ..() + +/mob/living/carbon/human/is_allowed_vent_crawl_item(var/obj/item/carried_item) + if(carried_item in organs) + return 1 + return ..() + +/mob/living/simple_animal/spiderbot/is_allowed_vent_crawl_item(var/obj/item/carried_item) + if(carried_item == held_item) + return 1 + return ..() + +/mob/living/proc/ventcrawl_carry() + for(var/atom/A in contents) + if(!is_allowed_vent_crawl_item(A)) + to_chat(src, "You can't carry \the [A] while ventcrawling!") + return FALSE + return TRUE + +/mob/living/AltClickOn(var/atom/A) + if(is_type_in_list(A,ventcrawl_machinery)) + handle_ventcrawl(A) + return 1 + return ..() + +/mob/proc/start_ventcrawl() + var/atom/pipe + var/list/pipes = list() + for(var/obj/machinery/atmospherics/unary/U in range(1)) + if(is_type_in_list(U,ventcrawl_machinery) && Adjacent(U)) + pipes |= U + if(!pipes || !pipes.len) + to_chat(src, "There are no pipes that you can ventcrawl into within range!") + return + if(pipes.len == 1) + pipe = pipes[1] + else + pipe = input("Crawl Through Vent", "Pick a pipe") as null|anything in pipes + if(canmove && pipe) + return pipe + +/mob/living/carbon/alien/ventcrawl_carry() + return 1 + +/mob/living/var/ventcrawl_layer = 3 + +/mob/living/proc/handle_ventcrawl(var/atom/clicked_on) + if(!can_ventcrawl()) + return + + var/obj/machinery/atmospherics/unary/vent_found + if(clicked_on && Adjacent(clicked_on)) + vent_found = clicked_on + if(!istype(vent_found) || !vent_found.can_crawl_through()) + vent_found = null + + if(!vent_found) + for(var/obj/machinery/atmospherics/machine in range(1,src)) + if(is_type_in_list(machine, ventcrawl_machinery)) + vent_found = machine + + if(!vent_found || !vent_found.can_crawl_through()) + vent_found = null + + if(vent_found) + break + + if(vent_found) + if(vent_found.network && (vent_found.network.normal_members.len || vent_found.network.line_members.len)) + + to_chat(src, "You begin climbing into the ventilation system...") + if(vent_found.air_contents && !issilicon(src)) + + switch(vent_found.air_contents.temperature) + if(0 to BODYTEMP_COLD_DAMAGE_LIMIT) + to_chat(src, "You feel a painful freeze coming from the vent!") + if(BODYTEMP_COLD_DAMAGE_LIMIT to T0C) + to_chat(src, "You feel an icy chill coming from the vent.") + if(T0C + 40 to BODYTEMP_HEAT_DAMAGE_LIMIT) + to_chat(src, "You feel a hot wash coming from the vent.") + if(BODYTEMP_HEAT_DAMAGE_LIMIT to INFINITY) + to_chat(src, "You feel a searing heat coming from the vent!") + + switch(vent_found.air_contents.return_pressure()) + if(0 to HAZARD_LOW_PRESSURE) + to_chat(src, "You feel a rushing draw pulling you into the vent!") + if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE) + to_chat(src, "You feel a strong drag pulling you into the vent.") + if(WARNING_HIGH_PRESSURE to HAZARD_HIGH_PRESSURE) + to_chat(src, "You feel a strong current pushing you away from the vent.") + if(HAZARD_HIGH_PRESSURE to INFINITY) + to_chat(src, "You feel a roaring wind pushing you away from the vent!") + + if(!do_after(src, 45, vent_found, 1, 1)) + return + if(!can_ventcrawl()) + return + + visible_message("[src] scrambles into the ventilation ducts!", "You climb into the ventilation system.") + + forceMove(vent_found) + add_ventcrawl(vent_found) + + else + to_chat(src, "This vent is not connected to anything.") + + else + to_chat(src, "You must be standing on or beside an air vent to enter it.") + +/mob/living/proc/add_ventcrawl(obj/machinery/atmospherics/starting_machine) + is_ventcrawling = 1 + //candrop = 0 + var/datum/pipe_network/network = starting_machine.return_network(starting_machine) + if(!network) + return + for(var/datum/pipeline/pipeline in network.line_members) + for(var/obj/machinery/atmospherics/A in (pipeline.members || pipeline.edges)) + if(!A.pipe_image) + A.pipe_image = image(A, A.loc, layer = 20, dir = A.dir) + pipes_shown += A.pipe_image + client.images += A.pipe_image + +/mob/living/proc/remove_ventcrawl() + is_ventcrawling = 0 + //candrop = 1 + if(client) + for(var/image/current_image in pipes_shown) + client.images -= current_image + client.eye = src + + pipes_shown.len = 0 \ No newline at end of file diff --git a/code/modules/ventcrawl/ventcrawl_atmospherics.dm b/code/modules/ventcrawl/ventcrawl_atmospherics.dm new file mode 100644 index 00000000000..bb2d1211254 --- /dev/null +++ b/code/modules/ventcrawl/ventcrawl_atmospherics.dm @@ -0,0 +1,86 @@ +/obj/machinery/atmospherics/var/image/pipe_image + +/obj/machinery/atmospherics/Destroy() + for(var/mob/living/M in src) //ventcrawling is serious business + M.remove_ventcrawl() + M.forceMove(get_turf(src)) + if(pipe_image) + for(var/mob/living/M in player_list) + if(M.client) + M.client.images -= pipe_image + M.pipes_shown -= pipe_image + pipe_image = null + . = ..() + +/obj/machinery/atmospherics/ex_act(severity) + for(var/atom/movable/A in src) //ventcrawling is serious business + A.ex_act(severity) + . = ..() + +/obj/machinery/atmospherics/Entered(atom/movable/Obj) + if(istype(Obj, /mob/living)) + var/mob/living/L = Obj + L.ventcrawl_layer = layer + . = ..() + +/obj/machinery/atmospherics/relaymove(mob/living/user, direction) + if(user.loc != src || !(direction & initialize_directions)) //can't go in a way we aren't connecting to + return + ventcrawl_to(user,findConnecting(direction, user.ventcrawl_layer),direction) + +/obj/machinery/atmospherics/proc/ventcrawl_to(var/mob/living/user, var/obj/machinery/atmospherics/target_move, var/direction) + if(target_move) + if(is_type_in_list(target_move, ventcrawl_machinery) && target_move.can_crawl_through()) + user.remove_ventcrawl() + user.forceMove(target_move.loc) //handles entering and so on + user.visible_message("You hear something squeezing through the ducts.", "You climb out the ventilation system.") + else if(target_move.can_crawl_through()) + if(target_move.return_network(target_move) != return_network(src)) + user.remove_ventcrawl() + user.add_ventcrawl(target_move) + user.forceMove(target_move) + user.client.eye = target_move //if we don't do this, Byond only updates the eye every tick - required for smooth movement + if(world.time > user.next_play_vent) + user.next_play_vent = world.time+30 + playsound(src, 'sound/machines/ventcrawl.ogg', 50, 1, -3) + else + if((direction & initialize_directions) || is_type_in_list(src, ventcrawl_machinery) && src.can_crawl_through()) //if we move in a way the pipe can connect, but doesn't - or we're in a vent + user.remove_ventcrawl() + user.forceMove(src.loc) + user.visible_message("You hear something squeezing through the pipes.", "You climb out the ventilation system.") + user.canmove = 0 + spawn(1) + user.canmove = 1 + +/obj/machinery/atmospherics/proc/can_crawl_through() + return 1 + +/obj/machinery/atmospherics/proc/findConnecting(var/direction) + for(var/obj/machinery/atmospherics/target in get_step(src,direction)) + if(target.initialize_directions & get_dir(target,src)) + if(isConnectable(target) && target.isConnectable(src)) + return target + +/obj/machinery/atmospherics/proc/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node1 || target == node2) + +/obj/machinery/atmospherics/pipe/manifold/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node3 || ..()) + +obj/machinery/atmospherics/trinary/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node3 || ..()) + +/obj/machinery/atmospherics/pipe/manifold4w/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node3 || target == node4 || ..()) + +/obj/machinery/atmospherics/tvalve/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node3 || ..()) + +/obj/machinery/atmospherics/pipe/cap/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node || ..()) + +/obj/machinery/atmospherics/portables_connector/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node || ..()) + +/obj/machinery/atmospherics/unary/isConnectable(var/obj/machinery/atmospherics/target) + return (target == node || ..()) diff --git a/code/modules/ventcrawl/ventcrawl_multiz.dm b/code/modules/ventcrawl/ventcrawl_multiz.dm new file mode 100644 index 00000000000..87ef8f9ba70 --- /dev/null +++ b/code/modules/ventcrawl/ventcrawl_multiz.dm @@ -0,0 +1,24 @@ +/obj/machinery/atmospherics/pipe/zpipe/up/verb/ventcrawl_move_up() + set name = "Ventcrawl Upwards" + set desc = "Climb up through a pipe." + set category = "Abilities" + set src = usr.loc + var/obj/machinery/atmospherics/target = check_ventcrawl(GetAbove(loc)) + if(target) ventcrawl_to(usr, target, UP) + +/obj/machinery/atmospherics/pipe/zpipe/down/verb/ventcrawl_move_down() + set name = "Ventcrawl Downwards" + set desc = "Climb down through a pipe." + set category = "Abilities" + set src = usr.loc + var/obj/machinery/atmospherics/target = check_ventcrawl(GetBelow(loc)) + if(target) ventcrawl_to(usr, target, DOWN) + +/obj/machinery/atmospherics/pipe/zpipe/proc/check_ventcrawl(var/turf/target) + if(!istype(target)) + return + if(node1 in target) + return node1 + if(node2 in target) + return node2 + return \ No newline at end of file diff --git a/code/modules/ventcrawl/ventcrawl_verb.dm b/code/modules/ventcrawl/ventcrawl_verb.dm new file mode 100644 index 00000000000..b49f22836dc --- /dev/null +++ b/code/modules/ventcrawl/ventcrawl_verb.dm @@ -0,0 +1,7 @@ +/mob/living/proc/ventcrawl() + set name = "Crawl through Vent" + set desc = "Enter an air vent and crawl through the pipe system." + set category = "Abilities" + var/pipe = start_ventcrawl() + if(pipe) + handle_ventcrawl() diff --git a/code/modules/virus2/items_devices.dm b/code/modules/virus2/items_devices.dm index 59e208f0342..887a547e0df 100644 --- a/code/modules/virus2/items_devices.dm +++ b/code/modules/virus2/items_devices.dm @@ -4,7 +4,7 @@ name = "antibody scanner" desc = "Scans living beings for antibodies in their blood." icon_state = "health" - w_class = 2.0 + w_class = ITEMSIZE_SMALL item_state = "electronic" flags = CONDUCT @@ -99,7 +99,7 @@ name = "blank GNA disk" icon = 'icons/obj/cloning.dmi' icon_state = "datadisk0" - w_class = 1 + w_class = ITEMSIZE_TINY var/datum/disease2/effectholder/effect = null var/list/species = null var/stage = 1 diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index fa0d54a9a77..e79957ba282 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -3,7 +3,7 @@ desc = "It looks extremely delicate." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "sliver1" - w_class = 1 + w_class = ITEMSIZE_TINY sharp = 1 var/datum/geosample/geological_data @@ -86,7 +86,7 @@ icon = 'icons/obj/device.dmi' icon_state = "sampler0" item_state = "screwdriver_brown" - w_class = 1 + w_class = ITEMSIZE_TINY var/sampled_turf = "" var/num_stored_bags = 10 @@ -144,7 +144,7 @@ var/image/I = image("icon"=R, "layer"=FLOAT_LAYER) filled_bag.overlays += I filled_bag.overlays += "evidence" - filled_bag.w_class = 1 + filled_bag.w_class = ITEMSIZE_TINY user << "You take a core sample of the [item_to_sample]." else diff --git a/code/modules/xenoarcheaology/tools/geosample_scanner.dm b/code/modules/xenoarcheaology/tools/geosample_scanner.dm index dde5a3058e8..9d6450a839b 100644 --- a/code/modules/xenoarcheaology/tools/geosample_scanner.dm +++ b/code/modules/xenoarcheaology/tools/geosample_scanner.dm @@ -75,19 +75,20 @@ scanner_seal_integrity = round(scanner_seal_integrity + amount_used * 10) return if(istype(I, /obj/item/weapon/reagent_containers/glass)) + var/obj/item/weapon/reagent_containers/glass/G = I + if(!G.is_open_container()) + return var/choice = alert("What do you want to do with the container?","Radiometric Scanner","Add coolant","Empty coolant","Scan container") if(choice == "Add coolant") - var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(src.reagents.maximum_volume - src.reagents.total_volume, G.reagents.total_volume) - G.reagents.trans_to(src, amount_transferred) - user << "You empty [amount_transferred]u of coolant into [src]." + var/trans = G.reagents.trans_to_obj(src, amount_transferred) + user << "You empty [trans ? trans : 0]u of coolant into [src]." update_coolant() return else if(choice == "Empty coolant") - var/obj/item/weapon/reagent_containers/glass/G = I var/amount_transferred = min(G.reagents.maximum_volume - G.reagents.total_volume, src.reagents.total_volume) - src.reagents.trans_to(G, amount_transferred) - user << "You remove [amount_transferred]u of coolant from [src]." + var/trans = src.reagents.trans_to(G, amount_transferred) + user << "You remove [trans ? trans : 0]u of coolant from [src]." update_coolant() return if(scanned_item) @@ -147,15 +148,15 @@ data["radiation"] = round(radiation) data["t_left_radspike"] = round(t_left_radspike) data["rad_shield_on"] = rad_shield - + // update the ui if it exists, returns null if no ui is passed/found - ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) + ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if (!ui) // the ui does not exist, so we'll create a new() one // for a list of parameters and their descriptions see the code docs in \code\modules\nano\nanoui.dm ui = new(user, src, ui_key, "geoscanner.tmpl", "High Res Radiocarbon Spectrometer", 900, 825) // when the ui is first opened this is the data it will use - ui.set_initial_data(data) + ui.set_initial_data(data) // open the new ui window ui.open() // auto update every Master Controller tick diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 42b8e692ec3..d5cab2ef6e0 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/device.dmi' icon_state = "locator" item_state = "locator" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/device/gps/attack_self(var/mob/user as mob) var/turf/T = get_turf(src) @@ -15,7 +15,7 @@ desc = "A coiled metallic tape used to check dimensions and lengths." icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "measuring" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/storage/bag/fossils name = "Fossil Satchel" @@ -23,10 +23,10 @@ icon = 'icons/obj/mining.dmi' icon_state = "satchel" slot_flags = SLOT_BELT | SLOT_POCKET - w_class = 3 + w_class = ITEMSIZE_NORMAL storage_slots = 50 - max_storage_space = 200 - max_w_class = 3 + max_storage_space = ITEMSIZE_COST_NORMAL * 50 + max_w_class = ITEMSIZE_NORMAL can_hold = list(/obj/item/weapon/fossil) /obj/item/weapon/storage/box/samplebags @@ -46,7 +46,7 @@ icon = 'icons/obj/xenoarchaeology.dmi' icon_state = "flashgun" item_state = "lampgreen" - w_class = 2.0 + w_class = ITEMSIZE_SMALL slot_flags = SLOT_BELT var/last_scan_time = 0 @@ -102,7 +102,7 @@ icon = 'icons/obj/pda.dmi' icon_state = "crap" item_state = "analyzer" - w_class = 2 + w_class = ITEMSIZE_SMALL slot_flags = SLOT_BELT var/list/positive_locations = list() var/datum/depth_scan/current diff --git a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm index a8bf853e82e..b954d5eb054 100644 --- a/code/modules/xenoarcheaology/tools/tools_pickaxe.dm +++ b/code/modules/xenoarcheaology/tools/tools_pickaxe.dm @@ -9,7 +9,7 @@ excavation_amount = 1 drill_sound = 'sound/weapons/thudswoosh.ogg' drill_verb = "brushing" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/one_pick name = "2cm pick" @@ -21,7 +21,7 @@ excavation_amount = 2 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/two_pick name = "4cm pick" @@ -33,7 +33,7 @@ excavation_amount = 4 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/three_pick name = "6cm pick" @@ -45,7 +45,7 @@ excavation_amount = 6 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/four_pick name = "8cm pick" @@ -57,7 +57,7 @@ excavation_amount = 8 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/five_pick name = "10cm pick" @@ -69,7 +69,7 @@ excavation_amount = 10 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/six_pick name = "12cm pick" @@ -81,7 +81,7 @@ excavation_amount = 12 drill_sound = 'sound/items/Screwdriver.ogg' drill_verb = "delicately picking" - w_class = 2 + w_class = ITEMSIZE_SMALL /obj/item/weapon/pickaxe/hand name = "hand pickaxe" @@ -93,7 +93,7 @@ excavation_amount = 30 drill_sound = 'sound/items/Crowbar.ogg' drill_verb = "clearing" - w_class = 2 + w_class = ITEMSIZE_SMALL //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// // Pack for holding pickaxes @@ -105,7 +105,7 @@ desc = "A set of picks for excavation." item_state = "syringe_kit" storage_slots = 7 - w_class = 2 + w_class = ITEMSIZE_SMALL can_hold = list(/obj/item/weapon/pickaxe/brush, /obj/item/weapon/pickaxe/one_pick, /obj/item/weapon/pickaxe/two_pick, @@ -114,8 +114,8 @@ /obj/item/weapon/pickaxe/five_pick, /obj/item/weapon/pickaxe/six_pick, /obj/item/weapon/pickaxe/hand) - max_storage_space = 18 - max_w_class = 2 + max_storage_space = ITEMSIZE_COST_SMALL * 9 + max_w_class = ITEMSIZE_SMALL use_to_pickup = 1 /obj/item/weapon/storage/excavation/New() diff --git a/code/modules/xenobio2/machinery/core_extractor.dm b/code/modules/xenobio2/machinery/core_extractor.dm index b50e42acd63..e772558fcc8 100644 --- a/code/modules/xenobio2/machinery/core_extractor.dm +++ b/code/modules/xenobio2/machinery/core_extractor.dm @@ -16,12 +16,11 @@ var/occupiedcolor = "#22FF22" var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" - - + + /obj/machinery/slime/extractor/New() ..() update_light_color() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -29,14 +28,14 @@ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) RefreshParts() - + /obj/machinery/slime/extractor/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. if(istype(W, /obj/item/weapon/screwdriver) && !inuse) default_deconstruction_screwdriver(user, W) return - + if(istype(W, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(user, W) return @@ -45,7 +44,7 @@ user << "Close the panel first!" var/obj/item/weapon/grab/G = W - + if(!istype(G)) return ..() @@ -54,12 +53,12 @@ return move_into_extractor(user,G.affecting) - + /obj/machinery/slime/extractor/MouseDrop_T(mob/target, mob/user) if(user.stat || user.restrained()) return move_into_extractor(user,target) - + /obj/machinery/slime/extractor/proc/move_into_extractor(var/mob/user,var/mob/living/victim) if(src.occupant) @@ -73,12 +72,12 @@ if(!(istype(victim, /mob/living/simple_animal/xeno/slime)) ) user << "This is not a suitable subject for the core extractor!" return - + var/mob/living/simple_animal/xeno/slime/S = victim if(S.is_child) user << "This subject is not developed enough for the core extractor!" return - + user.visible_message("[user] starts to put [victim] into the core extractor!") src.add_fingerprint(user) if(do_after(user, 30) && victim.Adjacent(src) && user.Adjacent(src) && victim.Adjacent(user) && !occupant) @@ -89,7 +88,7 @@ victim.forceMove(src) src.occupant = victim update_light_color() - + /obj/machinery/slime/extractor/proc/update_light_color() if(src.occupant && !(inuse)) set_light(2, 2, occupiedcolor) @@ -97,13 +96,13 @@ set_light(2, 2, operatingcolor) else set_light(2, 2, emptycolor) - + /obj/machinery/slime/extractor/proc/extract_cores() if(!src.occupant) src.visible_message("\icon[src] [src] pings unhappily.") else if(inuse) return - + inuse = 1 update_light_color() spawn(30) @@ -112,17 +111,17 @@ var/obj/item/xenoproduct/slime/core/C = new(src) C.traits = new() occupant.traitdat.copy_traits(C.traits) - + C.nameVar = occupant.nameVar - + C.create_reagents(C.traits.traits[TRAIT_XENO_CHEMVOL]) for(var/reagent in occupant.traitdat.chems) C.reagents.add_reagent(reagent, occupant.traitdat.chems[reagent]) - + C.color = C.traits.traits[TRAIT_XENO_COLOR] if(occupant.traitdat.get_trait(TRAIT_XENO_BIOLUMESCENT)) C.set_light(occupant.traitdat.get_trait(TRAIT_XENO_GLOW_STRENGTH),occupant.traitdat.get_trait(TRAIT_XENO_GLOW_RANGE), occupant.traitdat.get_trait(TRAIT_XENO_BIO_COLOR)) - + spawn(30) icon_state = "scanner_0old" qdel(occupant) @@ -131,20 +130,20 @@ eject_contents() update_light_color() src.updateUsrDialog() - -/obj/machinery/slime/extractor/proc/eject_slime() + +/obj/machinery/slime/extractor/proc/eject_slime() if(occupant) occupant.forceMove(loc) occupant = null - + /obj/machinery/slime/extractor/proc/eject_core() for(var/obj/thing in (contents - component_parts - circuit)) thing.forceMove(loc) - + /obj/machinery/slime/extractor/proc/eject_contents() eject_core() eject_slime() - + //Here lies the UI /obj/machinery/slime/extractor/attack_hand(mob/user as mob) user.set_machine(src) @@ -192,4 +191,3 @@ /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/micro_laser = 2 ) - \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/gene_manipulators.dm b/code/modules/xenobio2/machinery/gene_manipulators.dm index c8bd8d374c9..98c2fa8160e 100644 --- a/code/modules/xenobio2/machinery/gene_manipulators.dm +++ b/code/modules/xenobio2/machinery/gene_manipulators.dm @@ -1,12 +1,12 @@ /* This file contains: - + Xenobiological disk: Holds traits that can be taken from cores and transplanted into slimes. - + Biological Product Destructive Analyzer: Takes certain traits in gene grouping from a core and places them into a disk. - + Biological genetic bombarder: Takes traits from a disk and replaces/adds to the genes in a xenobiological creature. */ @@ -15,11 +15,11 @@ desc = "A small disk used for carrying data on genetics." icon = 'icons/obj/hydroponics_machines.dmi' icon_state = "disk" - w_class = 1.0 - + w_class = ITEMSIZE_TINY + var/list/genes = list() var/genesource = "unknown" - + /obj/item/weapon/disk/xenobio/attack_self(var/mob/user as mob) if(genes.len) var/choice = alert(user, "Are you sure you want to wipe the disk?", "Xenobiological Data", "No", "Yes") @@ -29,7 +29,7 @@ desc = initial(name) genes = list() genesource = "unknown" - + /obj/item/weapon/storage/box/xenobiodisk name = "biological disk box" desc = "A box of biological data disks, apparently." @@ -53,13 +53,13 @@ var/eject_disk = 0 var/failed_task = 0 var/disk_needs_genes = 0 - + /obj/machinery/xenobio/attack_ai(mob/user as mob) return attack_hand(user) /obj/machinery/xenobio/attack_hand(mob/user as mob) ui_interact(user) - + /obj/machinery/xenobio/attackby(obj/item/weapon/W as obj, mob/user as mob) if(default_deconstruction_screwdriver(user, W)) return @@ -96,7 +96,7 @@ if(world.time > last_action + action_time) finished_task() - + /obj/machinery/xenobio/proc/finished_task() active = 0 in_use = 0 @@ -112,7 +112,7 @@ loaded_disk.forceMove(get_turf(src)) visible_message("\icon[src] [src] beeps and spits out [loaded_disk].") loaded_disk = null - + /obj/machinery/xenobio/extractor name = "biological product destructive analyzer" icon = 'icons/obj/hydroponics_machines.dmi' @@ -122,10 +122,9 @@ var/obj/item/xenoproduct/product var/datum/xeno/traits/genetics // Currently scanned xeno genetic structure. var/degradation = 0 // Increments with each scan, stops allowing gene mods after a certain point. - + /obj/machinery/xenobio/extractor/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -134,7 +133,7 @@ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) RefreshParts() - + /obj/machinery/xenobio/extractor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/xenoproduct)) if(product) @@ -187,7 +186,7 @@ ui.set_initial_data(data) ui.open() ui.set_auto_update(1) - + /obj/machinery/xenobio/proc/eject_disk() if(!loaded_disk) return loaded_disk.forceMove(loc) @@ -201,7 +200,7 @@ if(href_list["eject_product"]) if(!product) return - + product.forceMove(get_turf(src)) visible_message("\icon[src] [src] beeps and spits out [product].") product = null @@ -253,22 +252,21 @@ usr.set_machine(src) src.add_fingerprint(usr) - + src.updateUsrDialog() return - + /obj/machinery/xenobio/editor name = "biological genetic bombarder" icon = 'icons/obj/cryogenics.dmi' icon_state = "cellold0" disk_needs_genes = 1 circuit = /obj/item/weapon/circuitboard/biobombarder - + var/mob/living/simple_animal/xeno/slime/occupant - + /obj/machinery/xenobio/editor/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -277,7 +275,7 @@ component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) component_parts += new /obj/item/weapon/stock_parts/scanning_module(src) RefreshParts() - + /obj/machinery/xenobio/editor/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W,/obj/item/weapon/grab)) var/obj/item/weapon/grab/G = W @@ -358,21 +356,21 @@ occupant.traitdat.apply_gene(gene) occupant.stability += rand(5,10) occupant.ProcessTraits() - + if(href_list["eject_disk"]) eject_disk() - + if(href_list["eject_xeno"]) eject_xeno() - + usr.set_machine(src) src.add_fingerprint(usr) - + /obj/machinery/xenobio/editor/MouseDrop_T(mob/target, mob/user) if(user.stat || user.restrained()) return move_into_editor(user,target) - + /obj/machinery/xenobio/editor/proc/move_into_editor(var/mob/user,var/mob/living/victim) if(src.occupant) @@ -396,16 +394,16 @@ victim.client.eye = src victim.forceMove(src) occupant = victim - + /obj/machinery/xenobio/editor/proc/eject_contents() eject_disk() eject_xeno() - + /obj/machinery/xenobio/editor/proc/eject_xeno() if(occupant) occupant.forceMove(loc) occupant = null - + /obj/item/weapon/circuitboard/bioproddestanalyzer name = T_BOARD("biological product destructive analyzer") build_path = "/obj/machinery/xenobio/extractor" @@ -416,7 +414,7 @@ /obj/item/weapon/stock_parts/matter_bin = 1, /obj/item/weapon/stock_parts/scanning_module = 3 ) - + /obj/item/weapon/circuitboard/biobombarder name = T_BOARD("biological genetic bombarder") build_path = "/obj/machinery/xenobio/editor" @@ -427,4 +425,3 @@ /obj/item/weapon/stock_parts/matter_bin = 2, /obj/item/weapon/stock_parts/scanning_module = 2 ) - \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/injector.dm b/code/modules/xenobio2/machinery/injector.dm index 7b482d5c1d6..dc9bad89f1b 100644 --- a/code/modules/xenobio2/machinery/injector.dm +++ b/code/modules/xenobio2/machinery/injector.dm @@ -25,7 +25,6 @@ reagents = R R.my_atom = src beaker = new /obj/item/weapon/reagent_containers/glass/beaker(src) - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) component_parts += new /obj/item/weapon/stock_parts/matter_bin(src) @@ -75,7 +74,7 @@ if(occupant) occupant.forceMove(loc) occupant = null - + /obj/machinery/xenobio2/manualinjector/proc/eject_beaker() if(beaker) var/obj/item/weapon/reagent_containers/glass/beaker/B = beaker @@ -140,7 +139,7 @@ /obj/item/weapon/circuitboard/xenobioinjectormachine name = T_BOARD("biological injector") - build_path = "/obj/machinery/xenobio2/manualinjector" - board_type = "machine" + build_path = /obj/machinery/xenobio2/manualinjector + board_type = /datum/frame/frame_types/machine origin_tech = list() //To be filled, req_components = list() //To be filled, \ No newline at end of file diff --git a/code/modules/xenobio2/machinery/injector_computer.dm b/code/modules/xenobio2/machinery/injector_computer.dm index 7bcccd55ca8..12887506c2f 100644 --- a/code/modules/xenobio2/machinery/injector_computer.dm +++ b/code/modules/xenobio2/machinery/injector_computer.dm @@ -61,7 +61,7 @@ if(isxeno(injector.occupant)) var/mob/living/simple_animal/xeno/X = injector.occupant data["compatible"] = 1 - data["instability"] = 100 * (X.mut_level / X.mut_max) + data["instability"] = 100 * (X.mut_level / X.mut_max) else data["compatible"] = null @@ -109,6 +109,5 @@ /obj/item/weapon/circuitboard/xenobio2computer name = T_BOARD("injector control console") - build_path = "/obj/item/weapon/circuitboard/xenobio2computer" - board_type = "computer" + build_path = /obj/item/weapon/circuitboard/xenobio2computer origin_tech = list() //To be filled, diff --git a/code/modules/xenobio2/machinery/slime_replicator.dm b/code/modules/xenobio2/machinery/slime_replicator.dm index 9faa4272b40..077e3300088 100644 --- a/code/modules/xenobio2/machinery/slime_replicator.dm +++ b/code/modules/xenobio2/machinery/slime_replicator.dm @@ -16,10 +16,9 @@ var/occupiedcolor = "#22FF22" var/emptycolor = "#FF2222" var/operatingcolor = "#FFFF22" - + /obj/machinery/slime/replicator/New() ..() - circuit = new circuit(src) component_parts = list() component_parts += new /obj/item/weapon/stock_parts/manipulator(src) component_parts += new /obj/item/weapon/stock_parts/manipulator(src) @@ -27,23 +26,23 @@ component_parts += new /obj/item/weapon/stock_parts/micro_laser(src) RefreshParts() update_light_color() - - + + /obj/machinery/slime/replicator/attackby(var/obj/item/W, var/mob/user) //Let's try to deconstruct first. if(istype(W, /obj/item/weapon/screwdriver) && !inuse) default_deconstruction_screwdriver(user, W) return - + if(istype(W, /obj/item/weapon/crowbar)) default_deconstruction_crowbar(user, W) return var/obj/item/xenoproduct/slime/core/G = W - + if(!istype(G)) return ..() - + if(core) user << "[src] is already filled!" return @@ -53,7 +52,7 @@ user.drop_from_inventory(G) G.forceMove(src) update_light_color() - + /obj/machinery/slime/replicator/proc/update_light_color() if(src.core && !(inuse)) set_light(2, 2, occupiedcolor) @@ -61,13 +60,13 @@ set_light(2, 2, operatingcolor) else set_light(2, 2, emptycolor) - + /obj/machinery/slime/replicator/proc/replicate_slime() if(!src.core) src.visible_message("\icon[src] [src] pings unhappily.") else if(inuse) return - + inuse = 1 update_light_color() icon_state = "restruct_1" @@ -86,20 +85,20 @@ icon_state = "restruct_0" update_light_color() src.updateUsrDialog() - + /obj/machinery/slime/replicator/proc/eject_slime() for(var/mob/thing in contents) thing.forceMove(loc) -/obj/machinery/slime/replicator/proc/eject_core() +/obj/machinery/slime/replicator/proc/eject_core() if(core) core.forceMove(loc) core = null /obj/machinery/slime/replicator/proc/eject_contents() eject_slime() - eject_core() - + eject_core() + //Here lies the UI /obj/machinery/slime/replicator/attack_hand(mob/user as mob) user.set_machine(src) @@ -135,7 +134,7 @@ eject_core() src.updateUsrDialog() return - + //Circuit board below, /obj/item/weapon/circuitboard/slimereplicator name = T_BOARD("Slime replicator") @@ -148,4 +147,3 @@ /obj/item/weapon/stock_parts/micro_laser = 1 ) - \ No newline at end of file diff --git a/code/unit_tests/zas_tests.dm b/code/unit_tests/zas_tests.dm index a28abaa8817..cbf26f061f3 100644 --- a/code/unit_tests/zas_tests.dm +++ b/code/unit_tests/zas_tests.dm @@ -44,7 +44,7 @@ return test_result if(expectation == UT_NORMAL) - + if(abs(temp - T20C) > 10) test_result["msg"] = "Temperature out of bounds: [temp] | [t_msg]" return test_result @@ -78,7 +78,7 @@ return 1 /datum/unit_test/zas_area_test/supply_centcomm - name = "ZAS: Supply Shuttle (CentComm)" + name = "ZAS: Supply Shuttle (CentCom)" area_path = /area/supply/dock /datum/unit_test/zas_area_test/emergency_shuttle @@ -95,7 +95,7 @@ /datum/unit_test/zas_area_test/cargo_maint name = "ZAS: Cargo Maintenance" - area_path = /area/maintenance/cargo + area_path = /area/maintenance/cargo /datum/unit_test/zas_area_test/eng_shuttle name = "ZAS: Construction Site Shuttle (Station)" diff --git a/code/world.dm b/code/world.dm index 672715baf52..c2280c0dea1 100644 --- a/code/world.dm +++ b/code/world.dm @@ -103,6 +103,8 @@ var/global/datum/global_init/init = new () for(var/turf/simulated/mineral/M in world) // Ugh. M.update_icon() + // Create frame types. + populate_frame_types() // Create robolimbs for chargen. populate_robolimb_list() diff --git a/html/changelog.html b/html/changelog.html index 094778be218..fda0a46275b 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -53,6 +53,143 @@ -->
    +

    19 September 2016

    +

    Anewbe updated:

    +
      +
    • Blood Drain now heals internal damage, including broken bones and internal bleeding.
    • +
    • Adds the Command Secretary job.
    • +
    • CE hardsuit now has proper magboots and insulated gauntlets.
    • +
    • Powersinks should actually explode again, after a while.
    • +
    +

    MagmaRam updated:

    +
      +
    • Lasers and energy projectiles in general now glow in the dark.
    • +
    • Robotic and prosthetic limbs can now be used in creation of simple robots, rather than just the robotic (lawed-chasis) limbs.
    • +
    +

    Zuhayr updated:

    +
      +
    • Added /vg/ direct-action ventcrawling. You will now crawl through the actual pipe network, a step at a time. Have fun.
    • +
    + +

    16 September 2016

    +

    Anewbe updated:

    +
      +
    • Explosive implants should no longer gib the target if the setting is Localized Limb.
    • +
    • Lasercannon has 4 shots and fires slightly faster.
    • +
    • Lasercannon shots are slightly weaker to compensate for increased sustain.
    • +
    • Changes Unathi sprites slightly.
    • +
    • The advanced egun, laser carbine, and lasercannon now take up a bit more space in bags.
    • +
    • Prosthetic limbs and extremities no longer increase body temperature.
    • +
    • Ninja and Technomancer now require 5 players to start in either secret or voted.
    • +
    • Split skirts into 'skirts', which are just a skirt, and 'skirt outfits', which cover the upper body. Check your loadouts, they should remain otherwise unchanged.
    • +
    • Splints are no longer reusable.
    • +
    • Water is now more effective at dousing burning people.
    • +
    • Ninjas now vanish in a cloud of smoke, rather than exploding.
    • +
    +

    Chinsky updated:

    +
      +
    • Added a hawaii shirt to loadout accessories. Can be attached to clothing like suit jackets etc. Can also be found in mixed wardrobes.
    • +
    +

    Yoshax updated:

    +
      +
    • People bleed faster and more.
    • +
    • Splints are once again reusable and have been improved behind the scenes.
    • +
    • Removing splints will now correctly give you the splint used to splint the organ.
    • +
    + +

    03 September 2016

    +

    Yosh updated:

    +
      +
    • Projectile flash rounds will now do the same as a flash when it hits the target. As such, it will blind, confuse and blur the eyes of thw target. Pistol and machine gun rounds last the same length as a flash, shotgun rounds last longer.
    • +
    • Changeling recursive enhancement is now a toggleable passive ability, instead of a one-time use active ability.
    • +
    • You can now vomit by using the vomit emote.
    • +
    +

    Yoshax updated:

    +
      +
    • Changeling armor and space armor can now be cast off regardless of your stored chemicals.
    • +
    + +

    02 September 2016

    +

    Yosh updated:

    +
      +
    • DNA Lockable guns have been finished. Any gun can be made into a DNA Lockable gun by inserting a DNA Chip Lock. These are not currently available, and are adminspawn only. Please refer to your nearest staffmember/developer to begin discussion for future implementations of this feature.
    • +
    • A new hairstyle has been added named poofy2.
    • +
    +

    Yoshax updated:

    +
      +
    • Autotraitor now needs 0 players to start in secret.
    • +
    • Diona are now slightly faster!
    • +
    + +

    01 September 2016

    +

    Alberyk updated:

    +
      +
    • Added more horns and horns related facial options for Unathi.
    • +
    +

    Anewbe updated:

    +
      +
    • Hyperzine metabolizes twice as quickly.
    • +
    • Changeling space suits now have magboots.
    • +
    • Armblade now has suicide_act text.
    • +
    +

    Techhead updated:

    +
      +
    • Medical splints can now also be applied to hands and feet (in addition to arms and legs).
    • +
    • For those that miss the old functionality, ghetto splints have been added. These can be crafted with a roll of tape and a metal rod and can only splint arms and legs.
    • +
    +

    Yosh updated:

    +
      +
    • The secure briefcase is now available in the loadout for anyone who wishes to use it.
    • +
    • Leaving a space area and entering a non-space area will no longer leave your sprite floating.
    • +
    • Ponchos can now be attached to your uniform as an accessory. In addition they can also be attached to suits!
    • +
    • Changeling regenerative stasis will now properly regrow limbs.
    • +
    • Changeling regenerative stasis will no longer runtime and refuse to work when you have a missing limb.
    • +
    • The shuttle during revolution will no longer take forever and a day to arrive and such.
    • +
    + +

    30 August 2016

    +

    Anewbe updated:

    +
      +
    • Arm and leg guards are now slightly less slowing.
    • +
    • Mining RIG is now faster
    • +
    • Tweaks security voidsuit armor values.
    • +
    • Hardsuits (RIGs) now have an inbuilt suit cooling system, toggled via HUD button. This only works when the hardsuit is fully deployed, and drains charge from its power cell.
    • +
    +

    Neerti updated:

    +
      +
    • Emitters can be examined to see if they are damaged. They can also be repaired by applying metal sheets to them.
    • +
    • Emitters now only explode on death if they are on a powered wire with significant power flowing through it.
    • +
    • Emitters don't explode in one hit, or by tasers or non-damaging projectiles anymore.
    • +
    + +

    29 August 2016

    +

    Haswell updated:

    +
      +
    • Modules installed within a hardsuit will now be listed when examining the hardsuit control module while being held or worn, if the maintenance panel is open.
    • +
    +

    Hubblenaut updated:

    +
      +
    • Bottles will now actually sell for their set prices.
    • +
    • Chief Medical Officer and Medical Doctors now spawn with a health analyzer instead of a penlight.
    • +
    +

    Sin4 updated:

    +
      +
    • Camera Console swaps to active camera upon clicking on.
    • +
    • Hugs gender correctly.
    • +
    • Prometheans gender correctly and have a gender identity.
    • +
    • Meatspike no longer takes you prisoner upon placing something on it.
    • +
    • Lighting someone on fire now tells the admins.
    • +
    • Wiping something down with a damp rag no longer wets the floor.
    • +
    • Captains gloves now appear when put on.
    • +
    • Fixes Station Administrator Spawn point and access/restrictions.
    • +
    • Renamed items from captain to station administrator.
    • +
    +

    Yoshax updated:

    +
      +
    • IDs can now actually be put onto your ears.
    • +
    • Lungs will now once again rupture when you are in an area where you cannot breathe. This has a relatively small chance to happen.
    • +
    +

    15 August 2016

    Anewbe updated:

      diff --git a/html/changelogs/.all_changelog.yml b/html/changelogs/.all_changelog.yml index 3934efa625c..7d2f40f6457 100644 --- a/html/changelogs/.all_changelog.yml +++ b/html/changelogs/.all_changelog.yml @@ -2741,3 +2741,128 @@ DO NOT EDIT THIS FILE BY HAND! AUTOMATICALLY GENERATED BY ss13_genchangelog.py. - bugfix: The change appearance window provided to antagoniss such as mercenaries, heisters or suchlike (including traders!) will now properly allow people to select species they are whitelisted for. +2016-08-29: + Haswell: + - rscadd: Modules installed within a hardsuit will now be listed when examining + the hardsuit control module while being held or worn, if the maintenance panel + is open. + Hubblenaut: + - bugfix: Bottles will now actually sell for their set prices. + - tweak: Chief Medical Officer and Medical Doctors now spawn with a health analyzer + instead of a penlight. + Sin4: + - bugfix: Camera Console swaps to active camera upon clicking on. + - bugfix: Hugs gender correctly. + - bugfix: Prometheans gender correctly and have a gender identity. + - bugfix: Meatspike no longer takes you prisoner upon placing something on it. + - rscadd: Lighting someone on fire now tells the admins. + - bugfix: Wiping something down with a damp rag no longer wets the floor. + - bugfix: Captains gloves now appear when put on. + - bugfix: Fixes Station Administrator Spawn point and access/restrictions. + - tweak: Renamed items from captain to station administrator. + Yoshax: + - bugfix: IDs can now actually be put onto your ears. + - bugfix: Lungs will now once again rupture when you are in an area where you cannot + breathe. This has a relatively small chance to happen. +2016-08-30: + Anewbe: + - tweak: Arm and leg guards are now slightly less slowing. + - tweak: Mining RIG is now faster + - tweak: Tweaks security voidsuit armor values. + - rscadd: Hardsuits (RIGs) now have an inbuilt suit cooling system, toggled via + HUD button. This only works when the hardsuit is fully deployed, and drains + charge from its power cell. + Neerti: + - rscadd: Emitters can be examined to see if they are damaged. They can also be + repaired by applying metal sheets to them. + - tweak: Emitters now only explode on death if they are on a powered wire with significant + power flowing through it. + - bugfix: Emitters don't explode in one hit, or by tasers or non-damaging projectiles + anymore. +2016-09-01: + Alberyk: + - rscadd: Added more horns and horns related facial options for Unathi. + Anewbe: + - tweak: Hyperzine metabolizes twice as quickly. + - rscadd: Changeling space suits now have magboots. + - rscadd: Armblade now has suicide_act text. + Techhead: + - rscadd: Medical splints can now also be applied to hands and feet (in addition + to arms and legs). + - rscadd: For those that miss the old functionality, ghetto splints have been added. + These can be crafted with a roll of tape and a metal rod and can only splint + arms and legs. + Yosh: + - rscadd: The secure briefcase is now available in the loadout for anyone who wishes + to use it. + - bugfix: Leaving a space area and entering a non-space area will no longer leave + your sprite floating. + - rscadd: Ponchos can now be attached to your uniform as an accessory. In addition + they can also be attached to suits! + - bugfix: Changeling regenerative stasis will now properly regrow limbs. + - bugfix: Changeling regenerative stasis will no longer runtime and refuse to work + when you have a missing limb. + - tweak: The shuttle during revolution will no longer take forever and a day to + arrive and such. +2016-09-02: + Yosh: + - rscadd: DNA Lockable guns have been finished. Any gun can be made into a DNA Lockable + gun by inserting a DNA Chip Lock. These are not currently available, and are + adminspawn only. Please refer to your nearest staffmember/developer to begin + discussion for future implementations of this feature. + - rscadd: A new hairstyle has been added named poofy2. + Yoshax: + - tweak: Autotraitor now needs 0 players to start in secret. + - tweak: Diona are now slightly faster! +2016-09-03: + Yosh: + - tweak: Projectile flash rounds will now do the same as a flash when it hits the + target. As such, it will blind, confuse and blur the eyes of thw target. Pistol + and machine gun rounds last the same length as a flash, shotgun rounds last + longer. + - tweak: Changeling recursive enhancement is now a toggleable passive ability, instead + of a one-time use active ability. + - rscadd: You can now vomit by using the vomit emote. + Yoshax: + - bugfix: Changeling armor and space armor can now be cast off regardless of your + stored chemicals. +2016-09-16: + Anewbe: + - tweak: Explosive implants should no longer gib the target if the setting is Localized + Limb. + - rscadd: Lasercannon has 4 shots and fires slightly faster. + - tweak: Lasercannon shots are slightly weaker to compensate for increased sustain. + - tweak: Changes Unathi sprites slightly. + - tweak: The advanced egun, laser carbine, and lasercannon now take up a bit more + space in bags. + - tweak: Prosthetic limbs and extremities no longer increase body temperature. + - tweak: Ninja and Technomancer now require 5 players to start in either secret + or voted. + - tweak: Split skirts into 'skirts', which are just a skirt, and 'skirt outfits', + which cover the upper body. Check your loadouts, they should remain otherwise + unchanged. + - rscdel: Splints are no longer reusable. + - tweak: Water is now more effective at dousing burning people. + - rscdel: Ninjas now vanish in a cloud of smoke, rather than exploding. + Chinsky: + - rscadd: Added a hawaii shirt to loadout accessories. Can be attached to clothing + like suit jackets etc. Can also be found in mixed wardrobes. + Yoshax: + - tweak: People bleed faster and more. + - bugfix: Splints are once again reusable and have been improved behind the scenes. + - bugfix: Removing splints will now correctly give you the splint used to splint + the organ. +2016-09-19: + Anewbe: + - rscadd: Blood Drain now heals internal damage, including broken bones and internal + bleeding. + - rscadd: Adds the Command Secretary job. + - rscadd: CE hardsuit now has proper magboots and insulated gauntlets. + - bugfix: Powersinks should actually explode again, after a while. + MagmaRam: + - rscadd: Lasers and energy projectiles in general now glow in the dark. + - tweak: Robotic and prosthetic limbs can now be used in creation of simple robots, + rather than just the robotic (lawed-chasis) limbs. + Zuhayr: + - rscadd: Added /vg/ direct-action ventcrawling. You will now crawl through the + actual pipe network, a step at a time. Have fun. diff --git a/html/changelogs/Hubblenaut - bottles.yml b/html/changelogs/Anewbe - BurnCrit.yml similarity index 93% rename from html/changelogs/Hubblenaut - bottles.yml rename to html/changelogs/Anewbe - BurnCrit.yml index b12e6cde371..9f470b34f18 100644 --- a/html/changelogs/Hubblenaut - bottles.yml +++ b/html/changelogs/Anewbe - BurnCrit.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Hubblenaut +author: Anewbe # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "Bottles will now actually sell for their set prices." \ No newline at end of file + - tweak: "Pain from burn damage is now equal to that of brute damage." \ No newline at end of file diff --git a/html/changelogs/Yoshax - rupturelungs.yml b/html/changelogs/Anewbe - Cargo.yml similarity index 89% rename from html/changelogs/Yoshax - rupturelungs.yml rename to html/changelogs/Anewbe - Cargo.yml index 1df064bd6fd..ecae40bdd0e 100644 --- a/html/changelogs/Yoshax - rupturelungs.yml +++ b/html/changelogs/Anewbe - Cargo.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Yoshax +author: Anewbe # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,5 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "Lungs will now once again rupture when you are in an area where you cannot breathe. This has a relatively small chance to happen." + - bugfix: "Removed the exploit by which you could gain cargo points by ordering plastic crates." + - rscadd: "Upped cargo point gain by 50%." diff --git a/html/changelogs/Yoshax - IDs.yml b/html/changelogs/Anewbe - SpecOps.yml similarity index 93% rename from html/changelogs/Yoshax - IDs.yml rename to html/changelogs/Anewbe - SpecOps.yml index e2b6ecf24d7..f29c8559741 100644 --- a/html/changelogs/Yoshax - IDs.yml +++ b/html/changelogs/Anewbe - SpecOps.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Yoshax +author: Anewbe # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - bugfix: "IDs can now actually be put onto your ears." + - rscdel: "Parapen in SpecOps crate replaced with a 4th smoke grenade." \ No newline at end of file diff --git a/html/changelogs/HarpyEagle-Bleeding.yml b/html/changelogs/HarpyEagle-Bleeding.yml new file mode 100644 index 00000000000..55db4c0d4e0 --- /dev/null +++ b/html/changelogs/HarpyEagle-Bleeding.yml @@ -0,0 +1,6 @@ +author: HarpyEagle + +delete-after: True + +changes: + - rscadd: "Adds applying pressure to body parts to reduce bleeding. With desired body part selected, help-intent click yourself or get an aggressive grab, then help-intent attack with the grab item. Each person should only be able to apply pressure to one body part on one person at a time, so choose wisely. Applying pressure will get blood on your hands." \ No newline at end of file diff --git a/html/changelogs/Kasuobes-ShowMeTheModules.yml b/html/changelogs/Kasuobes-ShowMeTheModules.yml deleted file mode 100644 index 8b65bfad529..00000000000 --- a/html/changelogs/Kasuobes-ShowMeTheModules.yml +++ /dev/null @@ -1,6 +0,0 @@ -author: Haswell - -delete-after: True - -changes: - - rscadd: "Modules installed within a hardsuit will now be listed when examining the hardsuit control module while being held or worn, if the maintenance panel is open." \ No newline at end of file diff --git a/html/changelogs/Sin4 - bugfixbugaloo.yml b/html/changelogs/Sin4 - bugfixbugaloo.yml deleted file mode 100644 index 188ec32683e..00000000000 --- a/html/changelogs/Sin4 - bugfixbugaloo.yml +++ /dev/null @@ -1,42 +0,0 @@ -################################ -# Example Changelog File -# -# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. -# -# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) -# When it is, any changes listed below will disappear. -# -# Valid Prefixes: -# bugfix -# wip (For works in progress) -# tweak -# soundadd -# sounddel -# rscadd (general adding of nice things) -# rscdel (general deleting of nice things) -# imageadd -# imagedel -# maptweak -# spellcheck (typo fixes) -# experiment -################################# - -# Your name. -author: Sin4 - -# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. -delete-after: True - -# Any changes you've made. See valid prefix list above. -# INDENT WITH TWO SPACES. NOT TABS. SPACES. -# SCREW THIS UP AND IT WON'T WORK. -# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. -# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. -changes: - - bugfix: "Camera Console swaps to active camera upon clicking on." - - bugfix: "Hugs gender correctly." - - bugfix: "Prometheans gender correctly and have a gender identity." - - bugfix: "Meatspike no longer takes you prisoner upon placing something on it." - - rscadd: "Lighting someone on fire now tells the admins." - - bugfix: "Wiping something down with a damp rag no longer wets the floor." - - bugfix: "Captains gloves now appear when put on." diff --git a/html/changelogs/Hubblenaut - penlight.yml b/html/changelogs/Yoshax-Armbands.yml similarity index 90% rename from html/changelogs/Hubblenaut - penlight.yml rename to html/changelogs/Yoshax-Armbands.yml index dd742e44c6a..388a5e1f689 100644 --- a/html/changelogs/Hubblenaut - penlight.yml +++ b/html/changelogs/Yoshax-Armbands.yml @@ -22,7 +22,7 @@ ################################# # Your name. -author: Hubblenaut +author: N3X15 # Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. delete-after: True @@ -33,4 +33,4 @@ delete-after: True # Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. # Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. changes: - - tweak: "Chief Medical Officer and Medical Doctors now spawn with a health analyzer instead of a penlight." + - rscadd: "Armbands can now be attached to things that go in the outer suit slot." diff --git a/html/changelogs/Yoshax-Shanking.yml b/html/changelogs/Yoshax-Shanking.yml new file mode 100644 index 00000000000..b587abda144 --- /dev/null +++ b/html/changelogs/Yoshax-Shanking.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Yoshax + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Shanking has been added. You can shank someone by getting an aggressive grab on them, targetting their chest and attacking them with a sharp item. This has a special attack that has greatly increased chance to do internal damage, also does bonus damage for weapons that are both sharp and have edge." diff --git a/html/changelogs/zuhayr-vent.yml b/html/changelogs/zuhayr-vent.yml new file mode 100644 index 00000000000..fec2fd7d996 --- /dev/null +++ b/html/changelogs/zuhayr-vent.yml @@ -0,0 +1,5 @@ +author: Zuhayr +delete-after: True +changes: + - rscadd: "Added /vg/ direct-action ventcrawling. You will now crawl through the actual pipe network, a step at a time. Have fun." + \ No newline at end of file diff --git a/icons/atmos/tank.dmi b/icons/atmos/tank.dmi index 322f43e8f09..17e08f49b9d 100644 Binary files a/icons/atmos/tank.dmi and b/icons/atmos/tank.dmi differ diff --git a/icons/mob/animal.dmi b/icons/mob/animal.dmi index 971ed98d1a3..738cea13717 100644 Binary files a/icons/mob/animal.dmi and b/icons/mob/animal.dmi differ diff --git a/icons/mob/back.dmi b/icons/mob/back.dmi index 0441606e95b..5bc77603818 100644 Binary files a/icons/mob/back.dmi and b/icons/mob/back.dmi differ diff --git a/icons/mob/feet.dmi b/icons/mob/feet.dmi index afc8a68ddd0..8dde62588c7 100644 Binary files a/icons/mob/feet.dmi and b/icons/mob/feet.dmi differ diff --git a/icons/mob/hands.dmi b/icons/mob/hands.dmi index 81316a066e1..dce4027b612 100644 Binary files a/icons/mob/hands.dmi and b/icons/mob/hands.dmi differ diff --git a/icons/mob/head.dmi b/icons/mob/head.dmi index 5a343aa2ae2..0d868ab939f 100644 Binary files a/icons/mob/head.dmi and b/icons/mob/head.dmi differ diff --git a/icons/mob/hud.dmi b/icons/mob/hud.dmi index 18238c0543c..6686ed3f64a 100644 Binary files a/icons/mob/hud.dmi and b/icons/mob/hud.dmi differ diff --git a/icons/mob/human.dmi b/icons/mob/human.dmi index 4f14b81e3e5..e5d5532c230 100644 Binary files a/icons/mob/human.dmi and b/icons/mob/human.dmi differ diff --git a/icons/mob/human_face.dmi b/icons/mob/human_face.dmi index 99f9bfd2e7f..df95a224bc3 100644 Binary files a/icons/mob/human_face.dmi and b/icons/mob/human_face.dmi differ diff --git a/icons/mob/human_races/r_lizard.dmi b/icons/mob/human_races/r_lizard.dmi index 85208cff785..5fb2c58be46 100644 Binary files a/icons/mob/human_races/r_lizard.dmi and b/icons/mob/human_races/r_lizard.dmi differ diff --git a/icons/mob/items/lefthand.dmi b/icons/mob/items/lefthand.dmi index 0188ec65f2a..55f131159d7 100644 Binary files a/icons/mob/items/lefthand.dmi and b/icons/mob/items/lefthand.dmi differ diff --git a/icons/mob/items/lefthand_hats.dmi b/icons/mob/items/lefthand_hats.dmi index 96c7bd9dc29..0e2d326e7f7 100644 Binary files a/icons/mob/items/lefthand_hats.dmi and b/icons/mob/items/lefthand_hats.dmi differ diff --git a/icons/mob/items/lefthand_shoes.dmi b/icons/mob/items/lefthand_shoes.dmi index cfdfddc8158..d177c3ce62c 100644 Binary files a/icons/mob/items/lefthand_shoes.dmi and b/icons/mob/items/lefthand_shoes.dmi differ diff --git a/icons/mob/items/lefthand_storage.dmi b/icons/mob/items/lefthand_storage.dmi index 98d3e697640..5cc6bfadd43 100644 Binary files a/icons/mob/items/lefthand_storage.dmi and b/icons/mob/items/lefthand_storage.dmi differ diff --git a/icons/mob/items/lefthand_suits.dmi b/icons/mob/items/lefthand_suits.dmi index 04f62b1266d..b91ad1f5712 100644 Binary files a/icons/mob/items/lefthand_suits.dmi and b/icons/mob/items/lefthand_suits.dmi differ diff --git a/icons/mob/items/righthand.dmi b/icons/mob/items/righthand.dmi index 2f0182a1dd8..158f56b45fb 100644 Binary files a/icons/mob/items/righthand.dmi and b/icons/mob/items/righthand.dmi differ diff --git a/icons/mob/items/righthand_hats.dmi b/icons/mob/items/righthand_hats.dmi index 727dcebfe94..95fc5601275 100644 Binary files a/icons/mob/items/righthand_hats.dmi and b/icons/mob/items/righthand_hats.dmi differ diff --git a/icons/mob/items/righthand_shoes.dmi b/icons/mob/items/righthand_shoes.dmi index 83600b934ad..59b85b78d96 100644 Binary files a/icons/mob/items/righthand_shoes.dmi and b/icons/mob/items/righthand_shoes.dmi differ diff --git a/icons/mob/items/righthand_storage.dmi b/icons/mob/items/righthand_storage.dmi index 9aede7781a4..ea73375a201 100644 Binary files a/icons/mob/items/righthand_storage.dmi and b/icons/mob/items/righthand_storage.dmi differ diff --git a/icons/mob/items/righthand_suits.dmi b/icons/mob/items/righthand_suits.dmi index 6b5e8a511b1..64bfc7b4900 100644 Binary files a/icons/mob/items/righthand_suits.dmi and b/icons/mob/items/righthand_suits.dmi differ diff --git a/icons/mob/species/seromi/head.dmi b/icons/mob/species/seromi/head.dmi index 57c4f117133..ff1a9ac6284 100644 Binary files a/icons/mob/species/seromi/head.dmi and b/icons/mob/species/seromi/head.dmi differ diff --git a/icons/mob/species/seromi/suit.dmi b/icons/mob/species/seromi/suit.dmi index f74326df984..d6ecfcfe4c3 100644 Binary files a/icons/mob/species/seromi/suit.dmi and b/icons/mob/species/seromi/suit.dmi differ diff --git a/icons/mob/species/skrell/helmet.dmi b/icons/mob/species/skrell/helmet.dmi index f5f7445c604..94716107545 100644 Binary files a/icons/mob/species/skrell/helmet.dmi and b/icons/mob/species/skrell/helmet.dmi differ diff --git a/icons/mob/species/skrell/suit.dmi b/icons/mob/species/skrell/suit.dmi index b3a44eea8b7..1215ba0e30c 100644 Binary files a/icons/mob/species/skrell/suit.dmi and b/icons/mob/species/skrell/suit.dmi differ diff --git a/icons/mob/species/tajaran/helmet.dmi b/icons/mob/species/tajaran/helmet.dmi index 95300157f29..c9b3e091639 100644 Binary files a/icons/mob/species/tajaran/helmet.dmi and b/icons/mob/species/tajaran/helmet.dmi differ diff --git a/icons/mob/species/tajaran/suit.dmi b/icons/mob/species/tajaran/suit.dmi index 8cdc5e46ced..bfc20867d93 100644 Binary files a/icons/mob/species/tajaran/suit.dmi and b/icons/mob/species/tajaran/suit.dmi differ diff --git a/icons/mob/species/unathi/helmet.dmi b/icons/mob/species/unathi/helmet.dmi index db43fd2f07e..ca1f99a3304 100644 Binary files a/icons/mob/species/unathi/helmet.dmi and b/icons/mob/species/unathi/helmet.dmi differ diff --git a/icons/mob/species/unathi/suit.dmi b/icons/mob/species/unathi/suit.dmi index 8dbf403c702..edddc05729e 100644 Binary files a/icons/mob/species/unathi/suit.dmi and b/icons/mob/species/unathi/suit.dmi differ diff --git a/icons/mob/suit.dmi b/icons/mob/suit.dmi index fff04a0c608..024c6e36f28 100644 Binary files a/icons/mob/suit.dmi and b/icons/mob/suit.dmi differ diff --git a/icons/mob/ties.dmi b/icons/mob/ties.dmi index 67898604e37..6a6c30524cb 100644 Binary files a/icons/mob/ties.dmi and b/icons/mob/ties.dmi differ diff --git a/icons/mob/uniform.dmi b/icons/mob/uniform.dmi index 17fe5b8ad90..c457dec21ee 100644 Binary files a/icons/mob/uniform.dmi and b/icons/mob/uniform.dmi differ diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 6e36b86b00d..a1290564041 100644 Binary files a/icons/obj/ammo.dmi and b/icons/obj/ammo.dmi differ diff --git a/icons/obj/clothing/gloves.dmi b/icons/obj/clothing/gloves.dmi index a5a4767b91c..36eddb54dcd 100644 Binary files a/icons/obj/clothing/gloves.dmi and b/icons/obj/clothing/gloves.dmi differ diff --git a/icons/obj/clothing/hats.dmi b/icons/obj/clothing/hats.dmi index 6d13ab616c3..82df436ec16 100644 Binary files a/icons/obj/clothing/hats.dmi and b/icons/obj/clothing/hats.dmi differ diff --git a/icons/obj/clothing/shoes.dmi b/icons/obj/clothing/shoes.dmi index 8bd1183df81..b8e4b7b1c71 100644 Binary files a/icons/obj/clothing/shoes.dmi and b/icons/obj/clothing/shoes.dmi differ diff --git a/icons/obj/clothing/species/seromi/hats.dmi b/icons/obj/clothing/species/seromi/hats.dmi index 9398f180181..1fa5ebefdea 100644 Binary files a/icons/obj/clothing/species/seromi/hats.dmi and b/icons/obj/clothing/species/seromi/hats.dmi differ diff --git a/icons/obj/clothing/species/seromi/suits.dmi b/icons/obj/clothing/species/seromi/suits.dmi index 2d56f7f787c..d25bfd8d84a 100644 Binary files a/icons/obj/clothing/species/seromi/suits.dmi and b/icons/obj/clothing/species/seromi/suits.dmi differ diff --git a/icons/obj/clothing/species/skrell/hats.dmi b/icons/obj/clothing/species/skrell/hats.dmi index f3916f564b7..1e56902163a 100644 Binary files a/icons/obj/clothing/species/skrell/hats.dmi and b/icons/obj/clothing/species/skrell/hats.dmi differ diff --git a/icons/obj/clothing/species/skrell/suits.dmi b/icons/obj/clothing/species/skrell/suits.dmi index 47af90a1212..1b9f1915b9d 100644 Binary files a/icons/obj/clothing/species/skrell/suits.dmi and b/icons/obj/clothing/species/skrell/suits.dmi differ diff --git a/icons/obj/clothing/species/tajaran/hats.dmi b/icons/obj/clothing/species/tajaran/hats.dmi index cad2ef62428..a8a9859935b 100644 Binary files a/icons/obj/clothing/species/tajaran/hats.dmi and b/icons/obj/clothing/species/tajaran/hats.dmi differ diff --git a/icons/obj/clothing/species/tajaran/suits.dmi b/icons/obj/clothing/species/tajaran/suits.dmi index a41048e94f5..6390c1d2ba8 100644 Binary files a/icons/obj/clothing/species/tajaran/suits.dmi and b/icons/obj/clothing/species/tajaran/suits.dmi differ diff --git a/icons/obj/clothing/species/unathi/hats.dmi b/icons/obj/clothing/species/unathi/hats.dmi index 4724c19bafe..5a5a7c407e8 100644 Binary files a/icons/obj/clothing/species/unathi/hats.dmi and b/icons/obj/clothing/species/unathi/hats.dmi differ diff --git a/icons/obj/clothing/species/unathi/suits.dmi b/icons/obj/clothing/species/unathi/suits.dmi index a84993521ed..2ede2b80526 100644 Binary files a/icons/obj/clothing/species/unathi/suits.dmi and b/icons/obj/clothing/species/unathi/suits.dmi differ diff --git a/icons/obj/clothing/suits.dmi b/icons/obj/clothing/suits.dmi index e11c97c709a..5d36d8283cc 100644 Binary files a/icons/obj/clothing/suits.dmi and b/icons/obj/clothing/suits.dmi differ diff --git a/icons/obj/clothing/ties.dmi b/icons/obj/clothing/ties.dmi index c97eff9aa41..78a2cf4e288 100644 Binary files a/icons/obj/clothing/ties.dmi and b/icons/obj/clothing/ties.dmi differ diff --git a/icons/obj/clothing/uniforms.dmi b/icons/obj/clothing/uniforms.dmi index 235d0b5193f..e812c05ecff 100644 Binary files a/icons/obj/clothing/uniforms.dmi and b/icons/obj/clothing/uniforms.dmi differ diff --git a/icons/obj/doors/Doorext.dmi b/icons/obj/doors/Doorext.dmi index 2660865175b..d912394ecef 100644 Binary files a/icons/obj/doors/Doorext.dmi and b/icons/obj/doors/Doorext.dmi differ diff --git a/icons/obj/drinks.dmi b/icons/obj/drinks.dmi index 5d61df9dff7..d2808954ab6 100644 Binary files a/icons/obj/drinks.dmi and b/icons/obj/drinks.dmi differ diff --git a/icons/obj/electronic_assemblies.dmi b/icons/obj/electronic_assemblies.dmi new file mode 100644 index 00000000000..ab83834d66d Binary files /dev/null and b/icons/obj/electronic_assemblies.dmi differ diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 81ad5fa3914..36c263f21c4 100644 Binary files a/icons/obj/gun.dmi and b/icons/obj/gun.dmi differ diff --git a/icons/obj/items.dmi b/icons/obj/items.dmi index b8ee96c1d9b..88457f09c2f 100644 Binary files a/icons/obj/items.dmi and b/icons/obj/items.dmi differ diff --git a/icons/obj/stock_parts.dmi b/icons/obj/stock_parts.dmi index 294f1f82f74..28ea28bde1d 100644 Binary files a/icons/obj/stock_parts.dmi and b/icons/obj/stock_parts.dmi differ diff --git a/icons/obj/storage.dmi b/icons/obj/storage.dmi index be5e694f228..d51f126865e 100644 Binary files a/icons/obj/storage.dmi and b/icons/obj/storage.dmi differ diff --git a/icons/obj/wallet.dmi b/icons/obj/wallet.dmi index 101a138156e..def1f7347f6 100644 Binary files a/icons/obj/wallet.dmi and b/icons/obj/wallet.dmi differ diff --git a/maps/RandomZLevels/stationCollision.dm b/maps/RandomZLevels/stationCollision.dm index 6d87f401864..fa20f440ec8 100644 --- a/maps/RandomZLevels/stationCollision.dm +++ b/maps/RandomZLevels/stationCollision.dm @@ -63,7 +63,7 @@ obj/item/weapon/gun/energy/laser/retro/sc_retro name ="retro laser" icon_state = "retro" - desc = "An older model of the basic lasergun, no longer used by Nanotrasen's security or military forces." + desc = "An older model of the basic lasergun, no longer used by NanoTrasen's security or military forces." projectile_type = "/obj/item/projectile/practice" clumsy_check = 0 //No sense in having a harmless gun blow up in the clowns face diff --git a/maps/polaris-1.dmm b/maps/polaris-1.dmm index 2e1be078c92..c894322ddef 100644 --- a/maps/polaris-1.dmm +++ b/maps/polaris-1.dmm @@ -158,7 +158,7 @@ "adb" = (/obj/machinery/photocopier,/turf/simulated/floor/lino,/area/chapel/office) "adc" = (/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/tiled/dark,/area/chapel/chapel_morgue) "add" = (/turf/simulated/wall,/area/maintenance/library) -"ade" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/security/main) +"ade" = (/obj/machinery/light,/turf/simulated/floor/wood,/area/library) "adf" = (/obj/structure/closet,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/obj/item/weapon/towel/random,/turf/simulated/floor,/area/maintenance/pool) "adg" = (/obj/structure/table/rack,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/plating,/area/maintenance/library) "adh" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/library) @@ -828,7 +828,7 @@ "apV" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/camera/network/civilian{c_tag = "CIV - Chapel EVA"; dir = 1},/turf/simulated/floor,/area/maintenance/chapel) "apW" = (/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1379; id_tag = "chapel_maint_pump"},/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/light/small,/turf/simulated/floor,/area/maintenance/chapel) "apX" = (/obj/machinery/door/airlock/vault/bolted{req_access = list(53)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/security/nuke_storage) -"apY" = (/obj/structure/closet/secure_closet/detective,/turf/simulated/floor/lino,/area/security/detectives_office) +"apY" = (/obj/structure/closet/secure_closet/detective,/obj/item/weapon/reagent_containers/spray/pepper,/turf/simulated/floor/lino,/area/security/detectives_office) "apZ" = (/turf/simulated/floor/carpet,/area/security/detectives_office) "aqa" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/clothing/glasses/sunglasses,/turf/simulated/floor/carpet,/area/security/detectives_office) "aqb" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/hologram/holopad,/turf/simulated/floor/carpet,/area/security/detectives_office) @@ -1229,7 +1229,7 @@ "axG" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/keycard_auth{pixel_x = 32},/obj/machinery/light_switch{pixel_x = 23; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/crew_quarters/heads/hos) "axH" = (/obj/structure/bed/chair/office/dark{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/security/main) "axI" = (/obj/structure/table/standard,/obj/item/weapon/book/manual/security_space_law{pixel_x = -3; pixel_y = 5},/turf/simulated/floor/tiled,/area/security/main) -"axJ" = (/obj/structure/noticeboard{pixel_x = 32; pixel_y = 0},/obj/effect/floor_decal/corner/red{dir = 6},/turf/simulated/floor/tiled,/area/security/main) +"axJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red{dir = 9},/obj/structure/noticeboard{pixel_x = -32},/turf/simulated/floor/tiled,/area/security/main) "axK" = (/turf/simulated/wall/r_wall,/area/security/security_lockerroom) "axL" = (/turf/simulated/wall/r_wall,/area/security/security_bathroom) "axM" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Civilian Aft Port 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/civilian_hallway_aft) @@ -2394,10 +2394,10 @@ "aUb" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/escape/fore_port_escape_pod_hallway) "aUc" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/escape/fore_port_escape_pod_hallway) "aUd" = (/obj/structure/sign/pods{dir = 8; pixel_x = -32; pixel_y = 0},/obj/structure/sign/directions/evac{pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/medical{dir = 4; pixel_y = 32},/obj/structure/sign/directions/science{dir = 2; pixel_y = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) -"aUe" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/structure/sign/directions/security{dir = 4; pixel_y = 32},/obj/structure/sign/directions/cargo{dir = 2; pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/engineering{dir = 2; pixel_y = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) +"aUe" = (/obj/machinery/recharge_station,/turf/simulated/floor/tiled,/area/security/prison) "aUf" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aUg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/hallway/primary/central_one) -"aUh" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/structure/sign/directions/security{dir = 1; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) +"aUh" = (/obj/structure/sign/directions/security{dir = 4; pixel_y = 32},/obj/structure/sign/directions/cargo{dir = 2; pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/engineering{dir = 2; pixel_y = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aUi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aUj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aUk" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) @@ -2408,7 +2408,7 @@ "aUp" = (/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aUq" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) "aUr" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_one) -"aUs" = (/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) +"aUs" = (/obj/structure/sign/directions/security{dir = 1; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aUt" = (/obj/machinery/firealarm{dir = 4; pixel_x = 26},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aUu" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/machinery/light{dir = 8},/obj/structure/sign/directions/evac{pixel_y = 32; pixel_z = 8},/obj/structure/sign/directions/medical{dir = 2; pixel_y = 32},/obj/structure/sign/directions/science{dir = 8; pixel_y = 32; pixel_z = -8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "aUv" = (/turf/simulated/floor/tiled,/area/hallway/primary/central_two) @@ -2444,8 +2444,8 @@ "aUZ" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Fore Mid 1"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVa" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) "aVb" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 4},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) -"aVc" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) -"aVd" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) +"aVc" = (/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_one) +"aVd" = (/obj/structure/disposalpipe/junction{icon_state = "pipe-j1"; dir = 4},/obj/machinery/newscaster{pixel_y = 32},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVe" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVf" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aVg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/extinguisher_cabinet{pixel_x = 5; pixel_y = 28},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) @@ -2632,7 +2632,7 @@ "aYF" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 2},/obj/machinery/seed_storage/garden,/turf/simulated/floor/grass,/area/hydroponics/garden) "aYG" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "aYH" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) -"aYI" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) +"aYI" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/machinery/newscaster{pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/primary/central_one) "aYJ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) "aYK" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) "aYL" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/recreation_area_hallway) @@ -3022,7 +3022,7 @@ "bgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bgg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) "bgh" = (/obj/structure/closet/secure_closet/medical2,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/freezer,/area/medical/surgery_storage) -"bgi" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(10,12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/atmos/storage) +"bgi" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_two) "bgj" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/vacant/vacant_shop) "bgk" = (/turf/simulated/wall,/area/crew_quarters/medbreak) "bgl" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/medbay_fore) @@ -3368,7 +3368,7 @@ "bmN" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/machinery/light{dir = 1},/obj/machinery/status_display{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/ai) "bmO" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/bluegrid,/area/ai) "bmP" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/ai) -"bmQ" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/ai) +"bmQ" = (/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bmR" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled/dark,/area/ai) "bmS" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/light{dir = 1},/obj/machinery/ai_status_display{pixel_y = 32},/turf/simulated/floor/tiled/dark,/area/ai) "bmT" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 4},/obj/structure/flora/ausbushes/sparsegrass,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/grass,/area/hydroponics/garden) @@ -3445,7 +3445,7 @@ "bom" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled/dark,/area/ai) "bon" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/ai) "boo" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/ai) -"bop" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/turf/simulated/floor/bluegrid,/area/ai) +"bop" = (/turf/simulated/floor/tiled/dark,/area/ai) "boq" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled/dark,/area/ai) "bor" = (/obj/structure/cable/cyan{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/ai_slipper{icon_state = "motion0"},/turf/simulated/floor/bluegrid,/area/ai) "bos" = (/obj/structure/bed/chair{dir = 4},/obj/effect/floor_decal/corner/paleblue{dir = 9},/turf/simulated/floor/tiled/white,/area/medical/reception) @@ -3515,14 +3515,14 @@ "bpE" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled/white,/area/rnd/lab) "bpF" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor/tiled/white,/area/rnd/lab) "bpG" = (/obj/structure/table/standard,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/micro_laser,/obj/item/weapon/stock_parts/micro_laser,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/lab) -"bpH" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{dir = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{broadcasting = 0; dir = 2; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -21},/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; listening = 1; name = "Common Channel"; pixel_x = -21; pixel_y = 0},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/ai) +"bpH" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/hologram/holopad,/turf/simulated/floor/bluegrid,/area/ai) "bpI" = (/turf/simulated/wall/durasteel,/area/ai) -"bpJ" = (/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{dir = 4; listening = 0; name = "Custom Channel"; pixel_x = 21; pixel_y = 10},/obj/item/device/radio/intercom{broadcasting = 0; dir = 8; frequency = 1343; name = "Private Channel"; pixel_x = -21; pixel_y = 10},/obj/item/device/radio/intercom{broadcasting = 1; dir = 1; listening = 1; name = "Common Channel"; pixel_y = 21},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = -30; pixel_y = 32},/obj/machinery/newscaster/security_unit{pixel_x = 32; pixel_y = 32},/turf/simulated/floor/bluegrid,/area/ai) +"bpJ" = (/obj/structure/table/standard,/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Steve"; pixel_y = 15; tag = "icon-plant-09"},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled/dark,/area/ai) "bpK" = (/obj/machinery/door/airlock/hatch{icon_state = "door_locked"; id_tag = null; locked = 1; name = "AI Core"; req_access = list(16)},/turf/simulated/floor/tiled/dark,/area/ai) -"bpL" = (/obj/machinery/flasher{id = "AI"; pixel_x = -22; pixel_y = 24},/obj/machinery/turretid/stun{check_synth = 1; name = "AI Chamber turret control"; pixel_x = 30; pixel_y = 24},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the AI core maintenance door."; id = "AICore"; name = "AI Maintenance Hatch"; pixel_x = -8; pixel_y = -25; req_access = list(16)},/obj/machinery/camera/xray/command{c_tag = "AI - Core"; dir = 1},/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/light/small,/turf/simulated/floor/tiled/dark,/area/ai) +"bpL" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/bluegrid,/area/ai) "bpM" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/turf/simulated/floor/tiled/dark,/area/ai) "bpN" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/turf/simulated/floor/tiled/dark,/area/ai) -"bpO" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{dir = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 21},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -21},/obj/item/device/radio/intercom{broadcasting = 1; dir = 4; listening = 1; name = "Common Channel"; pixel_x = 21; pixel_y = 0},/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/bluegrid,/area/ai) +"bpO" = (/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/hologram/holopad,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/bluegrid,/area/ai) "bpP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/primary/central_two) "bpQ" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/medical/surgeryobs) "bpR" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/bed/chair{dir = 4},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/surgeryobs) @@ -3609,9 +3609,9 @@ "bru" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "brv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_four) "brw" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/dark,/area/ai) -"brx" = (/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/ai) -"bry" = (/obj/structure/cable/cyan{d2 = 2; icon_state = "0-2"},/obj/structure/cable/cyan{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/power/apc/super/critical{dir = 1; is_critical = 1; name = "north bump"; pixel_y = 24},/turf/simulated/floor/bluegrid,/area/ai) -"brz" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/bluegrid,/area/ai) +"brx" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor/tiled/dark,/area/ai) +"bry" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled/dark,/area/ai) +"brz" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/dark,/area/ai) "brA" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/wood,/area/rnd/research) "brB" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/obj/structure/flora/ausbushes/sparsegrass,/obj/structure/flora/ausbushes/brflowers,/turf/simulated/floor/grass,/area/hydroponics/garden) "brC" = (/obj/effect/floor_decal/spline/fancy/wood{tag = "icon-spline_fancy (NORTHWEST)"; icon_state = "spline_fancy"; dir = 9},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden) @@ -3680,10 +3680,10 @@ "bsN" = (/obj/machinery/r_n_d/circuit_imprinter,/obj/item/weapon/reagent_containers/glass/beaker/sulphuric,/turf/simulated/floor/tiled,/area/rnd/lab) "bsO" = (/obj/effect/floor_decal/corner/purple{dir = 6},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled/white,/area/rnd/lab) "bsP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/blast/regular{density = 0; icon_state = "pdoor0"; id = "Biohazard"; name = "Biohazard Shutter"; opacity = 0},/turf/simulated/floor/plating,/area/rnd/lab) -"bsQ" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/light,/turf/simulated/floor/tiled/dark,/area/ai) -"bsR" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/table/standard,/obj/structure/flora/pottedplant{icon_state = "plant-09"; name = "Steve"; pixel_y = 15; tag = "icon-plant-09"},/turf/simulated/floor/bluegrid,/area/ai) -"bsS" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/structure/cable/cyan,/obj/machinery/power/sensor{name = "Powernet Sensor - AI Subgrid"; name_tag = "AI Subgrid"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/bluegrid,/area/ai) -"bsT" = (/obj/machinery/power/smes/buildable{charge = 5e+006; input_attempt = 1; input_level = 200000; output_level = 200000},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/ai) +"bsQ" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{dir = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 20},/obj/item/device/radio/intercom{broadcasting = 0; dir = 2; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -21},/obj/item/device/radio/intercom{broadcasting = 1; dir = 8; listening = 1; name = "Common Channel"; pixel_x = -21; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/ai) +"bsR" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled/dark,/area/ai) +"bsS" = (/obj/machinery/ai_slipper{icon_state = "motion0"},/obj/machinery/turretid/stun{check_synth = 1; name = "AI Chamber turret control"; pixel_x = 30; pixel_y = -24},/obj/machinery/flasher{id = "AI"; pixel_x = -24; pixel_y = -25},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the AI core maintenance door."; id = "AICore"; name = "AI Maintenance Hatch"; pixel_x = 8; pixel_y = 25; req_access = list(16)},/obj/machinery/light/small{dir = 1},/obj/machinery/camera/xray/command{c_tag = "AI - Core"; dir = 2},/turf/simulated/floor/tiled/dark,/area/ai) +"bsT" = (/obj/effect/landmark{name = "tripai"},/obj/item/device/radio/intercom{dir = 1; listening = 0; name = "Custom Channel"; pixel_x = 0; pixel_y = 21},/obj/item/device/radio/intercom{broadcasting = 0; frequency = 1343; name = "Private Channel"; pixel_x = 0; pixel_y = -21},/obj/item/device/radio/intercom{broadcasting = 1; dir = 4; listening = 1; name = "Common Channel"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/bluegrid,/area/ai) "bsU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/extinguisher_cabinet{pixel_x = 25; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "bsV" = (/obj/effect/floor_decal/spline/fancy/wood{dir = 5},/obj/structure/flora/ausbushes/sparsegrass,/turf/simulated/floor/grass,/area/hydroponics/garden) "bsW" = (/obj/machinery/door/airlock/medical{id_tag = "surgery_observation"; name = "Observation Room"; req_access = newlist()},/obj/machinery/holosign/surgery,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/surgeryobs) @@ -3899,7 +3899,7 @@ "bwY" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/shuttle/plating,/area/rnd/lab) "bwZ" = (/obj/structure/table/reinforced,/obj/machinery/door/window/northleft{name = "Research and Development Desk"; req_access = list(7)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/rnd/lab) "bxa" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/wall/r_wall,/area/maintenance/central) -"bxb" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio/intercom{broadcasting = 1; canhear_range = 5; dir = 4; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) +"bxb" = (/obj/machinery/porta_turret/ai_defense,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/dark,/area/ai) "bxc" = (/turf/simulated/wall,/area/medical/reception) "bxd" = (/obj/structure/bed/chair{dir = 4},/obj/structure/sign/nosmoking_1{pixel_x = -32},/obj/effect/floor_decal/corner/paleblue{dir = 9},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled/white,/area/medical/reception) "bxe" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/white,/area/medical/reception) @@ -4506,6 +4506,7 @@ "bIH" = (/obj/effect/floor_decal/corner/blue{dir = 5},/obj/machinery/requests_console{announcementConsole = 1; department = "Bridge"; departmentType = 5; name = "Bridge RC"; pixel_y = 28},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bII" = (/obj/structure/table/reinforced,/obj/item/weapon/packageWrap,/obj/item/weapon/hand_labeler,/obj/machinery/recharger/wallcharger{pixel_x = 4; pixel_y = 30},/obj/effect/floor_decal/corner/blue{dir = 5},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) "bIJ" = (/obj/structure/table/reinforced,/obj/machinery/photocopier/faxmachine{department = "Head of Personnel's Office"},/obj/effect/floor_decal/corner/blue/full{dir = 1},/obj/machinery/ai_status_display{pixel_x = 32; pixel_y = 0},/turf/simulated/floor/tiled,/area/crew_quarters/heads/hop) +"bIK" = (/obj/machinery/door/airlock/command{name = "Station Administrator's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bIL" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge_hallway) "bIM" = (/obj/effect/floor_decal/corner/blue{dir = 6},/obj/structure/table/standard,/obj/item/weapon/storage/box/cups,/turf/simulated/floor/tiled,/area/bridge_hallway) "bIN" = (/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/turf/simulated/floor/plating,/area/maintenance/substation/command) @@ -4651,6 +4652,7 @@ "bLx" = (/obj/effect/floor_decal/corner/purple{dir = 6},/turf/simulated/floor/tiled/white,/area/rnd/rdoffice) "bLy" = (/obj/structure/table/standard,/obj/item/weapon/cartridge/signal/science,/obj/item/weapon/cartridge/signal/science{pixel_x = -4; pixel_y = 2},/obj/item/weapon/cartridge/signal/science{pixel_x = 4; pixel_y = 6},/obj/item/clothing/glasses/welding/superior,/obj/machinery/requests_console{announcementConsole = 1; department = "Research Director's Desk"; departmentType = 5; name = "Research Director RC"; pixel_x = 30; pixel_y = -2},/turf/simulated/floor/tiled/dark,/area/rnd/rdoffice) "bLz" = (/obj/structure/closet{name = "robotics parts"},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/device/assembly/prox_sensor{pixel_x = -8; pixel_y = 4},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000; pixel_x = 5; pixel_y = -5},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/weapon/storage/firstaid/regular{empty = 1; name = "First-Aid (empty)"},/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/item/device/healthanalyzer,/obj/effect/floor_decal/corner/pink{dir = 6},/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/device/flash/synthetic,/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor/tiled/white,/area/assembly/robotics) +"bLA" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Station Administrator"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bLB" = (/obj/structure/disposalpipe/segment,/obj/item/weapon/stool/padded,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bLC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/pen,/obj/item/weapon/pen/red,/obj/item/weapon/pen/blue,/turf/simulated/floor/tiled/white,/area/assembly/robotics) "bLD" = (/obj/machinery/door/airlock/medical{autoclose = 0; frequency = 1379; icon_state = "door_locked"; id_tag = "virology_airlock_exterior"; locked = 1; name = "Virology Exterior Airlock"; req_access = list(39)},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "virology_airlock_control"; name = "Virology Access Button"; pixel_x = -24; pixel_y = 0; req_access = list(39)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/black,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virology) @@ -4759,6 +4761,7 @@ "bNC" = (/turf/simulated/wall/r_wall,/area/crew_quarters/captain) "bND" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 4},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bNE" = (/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) +"bNF" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 4; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Station Administrator's Office Door Control"; pixel_x = 4; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/captain) "bNG" = (/obj/structure/table/woodentable,/obj/machinery/light,/obj/item/weapon/reagent_containers/food/condiment/small/sugar,/obj/effect/floor_decal/corner/brown{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/coffee_shop) "bNH" = (/obj/structure/sink/kitchen{pixel_y = 28},/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/machinery/atmospherics/unary/vent_scrubber/on,/turf/simulated/floor/tiled/white,/area/crew_quarters/kitchen) "bNI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/engineering/atmos/storage) @@ -4911,7 +4914,7 @@ "bQz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/lime{dir = 6},/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQA" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/item/weapon/tank/oxygen/yellow,/obj/item/weapon/tank/oxygen/yellow,/turf/simulated/floor,/area/engineering/atmos/storage) "bQB" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled,/area/medical/virologyaccess) -"bQC" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor,/area/engineering/atmos/storage) +"bQC" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/security/main) "bQD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQE" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/medical/virologyaccess) "bQF" = (/turf/simulated/shuttle/floor{icon_state = "floor2"},/area/shuttle/mining/station) @@ -4982,7 +4985,7 @@ "bRS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/navbeacon{codes_txt = "patrol;next_patrol=CH7"; location = "CH6"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRT" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bRU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) -"bRV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Starboard Aft 1"; dir = 2},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bRV" = (/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/obj/structure/cable/cyan,/turf/simulated/floor/bluegrid,/area/ai) "bRW" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bRX" = (/obj/effect/floor_decal/corner/paleblue{dir = 5},/obj/machinery/alarm{pixel_y = 22},/obj/structure/table/glass,/obj/item/roller,/obj/item/roller{pixel_y = 8},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) "bRY" = (/obj/machinery/chem_master,/obj/effect/floor_decal/corner/beige{dir = 9},/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/white,/area/medical/chemistry) @@ -5068,7 +5071,7 @@ "bTA" = (/obj/effect/floor_decal/corner/pink{dir = 9},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bTB" = (/obj/effect/floor_decal/corner/pink{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bTC" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) -"bTD" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) +"bTD" = (/obj/effect/landmark/start{name = "AI"},/obj/item/device/radio/intercom{broadcasting = 1; dir = 2; listening = 1; name = "Common Channel"; pixel_y = -21},/obj/item/device/radio/intercom{dir = 8; listening = 0; name = "Custom Channel"; pixel_x = -21; pixel_y = -10},/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; frequency = 1343; name = "Private Channel"; pixel_x = 21; pixel_y = -10},/obj/machinery/requests_console{department = "AI"; departmentType = 5; pixel_x = 30; pixel_y = -32},/obj/machinery/newscaster/security_unit{pixel_x = -32; pixel_y = -32},/turf/simulated/floor/bluegrid,/area/ai) "bTE" = (/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/rack,/obj/machinery/door/window/westleft{name = "EVA Suit Storage"; req_access = list(5)},/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/medical,/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/medical,/obj/item/weapon/tank/oxygen,/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) "bTF" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/obj/item/toy/therapy_blue,/turf/simulated/floor/carpet/blue,/area/medical/psych) "bTG" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/carpet/blue,/area/medical/psych) @@ -5089,7 +5092,7 @@ "bTV" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bTW" = (/obj/machinery/iv_drip,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bTX" = (/obj/structure/closet/l3closet/medical,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) -"bTY" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; listening = 1; name = "Captain's Intercom"; pixel_x = 21; pixel_y = 0},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue_captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bTY" = (/obj/item/device/radio/intercom{broadcasting = 0; dir = 4; listening = 1; name = "Station Administrator's Intercom"; pixel_x = 21; pixel_y = 0},/obj/structure/table/woodentable,/obj/item/weapon/folder/blue_captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bTZ" = (/obj/structure/bedsheetbin,/obj/structure/table/steel,/turf/simulated/floor/tiled/dark,/area/medical/biostorage) "bUa" = (/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/obj/machinery/floodlight,/obj/effect/decal/cleanable/blood/oil,/turf/simulated/floor,/area/maintenance/medbay_aft) "bUb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -5133,7 +5136,7 @@ "bUN" = (/obj/effect/floor_decal/corner/blue{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway) "bUO" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 6},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/bridge_hallway) "bUP" = (/turf/simulated/wall/r_wall,/area/bridge_hallway) -"bUQ" = (/obj/machinery/door/airlock/command{name = "Captain's Quarters"; req_access = list(20)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor,/turf/simulated/floor/carpet,/area/crew_quarters/captain) +"bUQ" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Station Administrator's Desk"; departmentType = 5; name = "Station Administrator RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bUR" = (/turf/simulated/wall,/area/crew_quarters/cafeteria) "bUS" = (/obj/structure/plasticflaps{opacity = 1},/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; dir = 1; freq = 1400; location = "Medbay"},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/plating,/area/medical/patient_wing) "bUT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) @@ -5148,7 +5151,7 @@ "bVc" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "bVd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bVe" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) -"bVf" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/machinery/light,/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"bVf" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 4},/turf/simulated/floor/tiled/dark,/area/ai) "bVg" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) "bVh" = (/obj/structure/table/steel,/obj/item/device/multitool,/obj/machinery/light{dir = 8},/obj/item/weapon/deck/cards,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "bVi" = (/obj/structure/table/reinforced,/obj/item/weapon/reagent_containers/dropper,/obj/effect/floor_decal/corner/beige/full,/turf/simulated/floor/tiled/white,/area/medical/chemistry) @@ -5311,7 +5314,7 @@ "bYj" = (/obj/structure/bed/chair/comfy/brown,/turf/simulated/floor/carpet,/area/crew_quarters/captain) "bYk" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bYl" = (/obj/machinery/atmospherics/pipe/tank/air{dir = 1; start_pressure = 740},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor,/area/maintenance/cargo) -"bYm" = (/obj/structure/bed/chair/comfy/brown{dir = 1},/obj/effect/landmark/start{name = "Captain"},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bYm" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Station Administrator's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/captain) "bYn" = (/turf/simulated/floor/wood,/area/crew_quarters/captain) "bYo" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/reagent_containers/food/snacks/pie,/obj/machinery/light{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{pixel_y = 32},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria) "bYp" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/central) @@ -5370,7 +5373,7 @@ "bZq" = (/obj/structure/table/woodentable,/obj/item/weapon/stamp/captain,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZr" = (/obj/structure/table/woodentable,/obj/machinery/computer/skills,/obj/item/weapon/hand_tele,/turf/simulated/floor/wood,/area/crew_quarters/captain) "bZs" = (/obj/machinery/door/window/southright{name = "Captain's Desk Door"; req_access = list(20)},/turf/simulated/floor/wood,/area/crew_quarters/captain) -"bZt" = (/obj/structure/table/woodentable,/obj/item/weapon/paper_bin{pixel_x = -3; pixel_y = 7},/obj/item/weapon/folder/blue,/obj/item/weapon/pen,/obj/item/device/megaphone,/obj/machinery/requests_console{announcementConsole = 1; department = "Captain's Desk"; departmentType = 5; name = "Captain RC"; pixel_x = 30; pixel_y = 0},/obj/structure/window/reinforced,/turf/simulated/floor/wood,/area/crew_quarters/captain) +"bZt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/storage) "bZu" = (/obj/machinery/recharge_station,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/recreation_area_restroom) "bZv" = (/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "bZw" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) @@ -5430,7 +5433,7 @@ "cay" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/bed/chair{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "caz" = (/obj/structure/filingcabinet,/obj/machinery/light{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/captain) "caA" = (/obj/machinery/recharge_station,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) -"caB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/atmos/storage) +"caB" = (/obj/structure/disposalpipe/segment,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/storage) "caC" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) "caD" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/cafeteria) "caE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/neutral,/area/crew_quarters/cafeteria) @@ -5545,7 +5548,7 @@ "ccJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/bridge) "ccK" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/bridge) "ccL" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk,/obj/effect/floor_decal/corner/blue{dir = 6},/turf/simulated/floor/tiled,/area/bridge) -"ccM" = (/obj/machinery/door/airlock/command{id_tag = "captaindoor"; name = "Captain's Office"; req_access = list(20)},/obj/structure/disposalpipe/segment,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/crew_quarters/captain) +"ccM" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos/storage) "ccN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/captain) "ccO" = (/obj/structure/table/woodentable,/obj/machinery/photocopier/faxmachine{department = "Captain's Office"},/turf/simulated/floor/wood,/area/crew_quarters/captain) "ccP" = (/turf/simulated/wall,/area/crew_quarters/captain) @@ -5718,11 +5721,11 @@ "cga" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass{name = "Central Access"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgb" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgc" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) -"cgd" = (/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) +"cgd" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled/dark,/area/ai) "cge" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/medical_emergency_hallway) "cgg" = (/obj/structure/closet/emcloset,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/medical_emergency_hallway) -"cgh" = (/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/engineering/atmos/storage) +"cgh" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) "cgi" = (/obj/structure/closet,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cgj" = (/obj/machinery/space_heater,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cgk" = (/obj/machinery/portable_atmospherics/powered/scrubber,/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -5915,6 +5918,7 @@ "cjP" = (/obj/machinery/photocopier,/obj/effect/floor_decal/corner/brown/full{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/office) "cjQ" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/miningdock) "cjR" = (/obj/machinery/door/airlock/mining{id_tag = "cargodoor"; name = "Mining Dock"; req_access = list(50)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) +"cjS" = (/obj/effect/decal/warning_stripes,/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) "cjT" = (/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "cjU" = (/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "cjV" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/substation/cargo) @@ -5946,6 +5950,7 @@ "ckv" = (/obj/machinery/door/airlock/glass_mining{name = "Delivery Office"; req_access = list(50)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckw" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckx" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/quartermaster/delivery) +"cky" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ckz" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/firealarm{dir = 4; pixel_x = 26},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/delivery) "ckA" = (/obj/structure/plasticflaps{opacity = 0},/obj/machinery/conveyor{dir = 1; id = "packageSort1"},/turf/simulated/floor,/area/quartermaster/delivery) "ckB" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning/corner,/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/substation/cargo) @@ -5963,7 +5968,7 @@ "ckN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/sign/directions/security{dir = 8; pixel_y = 32},/obj/structure/sign/directions/engineering{dir = 8; pixel_y = 32; pixel_z = -8},/obj/structure/sign/directions/cargo{dir = 8; pixel_y = 32; pixel_z = 8},/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Aft Mid 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "ckO" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "ckP" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) -"ckQ" = (/obj/structure/sign/directions/medical{dir = 4; pixel_y = 32},/obj/structure/sign/directions/science{dir = 8; pixel_y = 32; pixel_z = -8},/obj/structure/sign/directions/evac{pixel_y = 32; pixel_z = 8},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) +"ckQ" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/bluegrid,/area/ai) "ckR" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) "ckS" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "ckT" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -6006,7 +6011,7 @@ "clE" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "clF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "clG" = (/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Aft Port 2"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) -"clH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"clH" = (/obj/structure/cable/cyan{d2 = 8; icon_state = "0-8"},/obj/machinery/power/sensor{name = "Powernet Sensor - AI Subgrid"; name_tag = "AI Subgrid"},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/ai) "clI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "clJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "clK" = (/obj/machinery/door/firedoor/glass,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) @@ -6026,6 +6031,7 @@ "clY" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/grille,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/storage/tech) "clZ" = (/obj/structure/table/marble,/obj/effect/floor_decal/corner/grey/diagonal{dir = 4},/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/tiled/white,/area/crew_quarters/cafeteria) "cma" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office) +"cmb" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/obj/structure/disposalpipe/segment{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cmc" = (/obj/structure/sign/poster{pixel_x = 0; pixel_y = 0},/turf/simulated/wall,/area/quartermaster/office) "cmd" = (/obj/machinery/door/airlock/glass_mining{id_tag = "cargodoor"; name = "Cargo Office"; req_access = list(50)},/obj/machinery/door/firedoor/glass,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/miningdock) "cme" = (/obj/structure/table/steel,/obj/item/weapon/storage/box,/obj/item/weapon/storage/box,/obj/effect/floor_decal/corner/brown{dir = 8},/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor/tiled,/area/quartermaster/delivery) @@ -6036,6 +6042,9 @@ "cmj" = (/turf/simulated/wall,/area/storage/emergency_storage/emergency6) "cmk" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/storage/tools) "cml" = (/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/storage/tools) +"cmm" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cmn" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cmo" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cmp" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/primary/central_three) "cmq" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/crew{pixel_x = -1; pixel_y = 1},/obj/item/weapon/circuitboard/card{pixel_x = 2; pixel_y = -2},/obj/item/weapon/circuitboard/communications{pixel_x = 5; pixel_y = -5},/obj/machinery/light/small{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/storage/tech) "cmr" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled/dark,/area/storage/tech) @@ -6084,11 +6093,14 @@ "cni" = (/obj/machinery/floodlight,/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "cnj" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cnk" = (/obj/machinery/portable_atmospherics/powered/pump/filled,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) +"cnl" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cnm" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cnn" = (/obj/machinery/atmospherics/valve/digital/open,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cno" = (/obj/structure/closet/wardrobe/grey,/obj/item/weapon/storage/backpack,/obj/item/weapon/storage/backpack,/turf/simulated/floor/plating,/area/maintenance/cargo) "cnp" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/robotics{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/mecha_control{pixel_x = 1; pixel_y = -1},/turf/simulated/floor/tiled/dark,/area/storage/tech) "cnq" = (/turf/simulated/floor/tiled/dark,/area/storage/tech) "cnr" = (/obj/structure/sign/securearea,/turf/simulated/wall/r_wall,/area/storage/tech) -"cns" = (/obj/item/weapon/screwdriver{pixel_y = 16},/obj/item/weapon/wirecutters,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) +"cns" = (/obj/structure/table/steel,/obj/item/device/integrated_electronics/debugger{pixel_x = -5; pixel_y = 0},/obj/item/device/integrated_electronics/wirer{pixel_x = 5; pixel_y = 0},/turf/simulated/floor/plating,/area/storage/tech) "cnt" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/powermonitor{pixel_x = -2; pixel_y = 2},/obj/item/weapon/circuitboard/stationalert_engineering{pixel_x = 1; pixel_y = -1},/obj/item/weapon/circuitboard/security/engineering,/obj/item/weapon/circuitboard/atmos_alert{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) "cnu" = (/obj/effect/landmark{name = "blobstart"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech) "cnv" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/circuitboard/arcade,/obj/item/weapon/circuitboard/message_monitor{pixel_x = 3; pixel_y = -3},/turf/simulated/floor/plating,/area/storage/tech) @@ -6131,11 +6143,14 @@ "cog" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "coh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) "coi" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/storage/emergency_storage/emergency6) +"coj" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cok" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"col" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) "com" = (/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/random/tech_supply,/obj/machinery/cell_charger,/obj/structure/table/steel,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/storage/tools) "con" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/cargo) "coo" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/delivery) "cop" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/plating,/area/storage/tech) -"coq" = (/obj/item/stack/cable_coil{pixel_x = -3; pixel_y = 3},/obj/item/stack/cable_coil,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) +"coq" = (/obj/structure/table/steel,/obj/item/weapon/storage/bag/circuits/basic,/turf/simulated/floor/plating,/area/storage/tech) "cor" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech) "cos" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/stock_parts/manipulator,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/matter_bin,/obj/item/weapon/stock_parts/capacitor,/obj/item/weapon/stock_parts/capacitor,/turf/simulated/floor/plating,/area/storage/tech) "cot" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/structure/sign/directions/engineering{dir = 2; pixel_x = -32; pixel_z = -8},/obj/structure/sign/directions/medical{dir = 4; pixel_x = -32; pixel_y = 0},/obj/structure/sign/directions/cargo{dir = 2; pixel_x = -32; pixel_z = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_four) @@ -6150,7 +6165,7 @@ "coC" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "coD" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "coE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/item/device/radio/intercom{dir = 4; name = "Station Intercom (General)"; pixel_x = 26},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) -"coF" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/light{dir = 8},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) +"coF" = (/obj/machinery/hologram/holopad,/obj/machinery/power/smes/buildable{charge = 5e+006; input_attempt = 1; input_level = 200000; output_level = 200000},/obj/structure/cable/cyan{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/bluegrid,/area/ai) "coG" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) "coH" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/weapon/tank/oxygen,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/breath,/obj/item/clothing/mask/breath,/obj/item/device/flashlight,/obj/item/device/flashlight,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/extinguisher,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "coI" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -6176,9 +6191,14 @@ "cpc" = (/obj/structure/disposalpipe/trunk,/obj/structure/disposaloutlet{dir = 1},/turf/simulated/floor/plating,/area/quartermaster/delivery) "cpd" = (/obj/structure/table/standard,/obj/item/device/t_scanner,/obj/item/weapon/storage/box/lights/mixed,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cpe" = (/obj/machinery/space_heater,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) +"cpf" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpg" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cph" = (/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cpi" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpj" = (/turf/simulated/wall,/area/hallway/primary/port) +"cpk" = (/obj/machinery/atmospherics/tvalve/mirrored/digital{name = "Waste to Space"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpl" = (/obj/machinery/cell_charger{pixel_y = 5},/obj/item/device/multitool,/obj/structure/table/steel,/turf/simulated/floor/plating,/area/storage/tech) -"cpm" = (/obj/machinery/light/small,/turf/simulated/floor,/area/storage/tech) +"cpm" = (/obj/machinery/light/small,/obj/structure/table/steel,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/stack/cable_coil,/obj/item/stack/cable_coil,/turf/simulated/floor,/area/storage/tech) "cpn" = (/obj/machinery/light_switch{pixel_x = 0; pixel_y = -26},/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor,/area/storage/tech) "cpo" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/storage/tech) "cpp" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/turf/simulated/floor,/area/storage/tech) @@ -6202,6 +6222,7 @@ "cpH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor,/area/maintenance/medbay_aft) "cpI" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/maintenance/medbay_aft) "cpJ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/light/small{dir = 1},/turf/simulated/floor,/area/maintenance/medbay_aft) +"cpK" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cpL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/office) "cpM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/turf/simulated/floor/tiled,/area/quartermaster/office) "cpN" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6217,6 +6238,7 @@ "cpX" = (/turf/simulated/wall,/area/hallway/secondary/cargo_hallway) "cpY" = (/obj/machinery/door/airlock{name = "Cargo Emergency Storage"},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/emergency_storage/emergency6) "cpZ" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/storage/tools) +"cqa" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqb" = (/obj/structure/bed/chair,/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 1; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 0; pixel_y = 21},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/shuttle/large_escape_pod1/station) "cqc" = (/obj/structure/table/rack,/obj/item/clothing/glasses/sunglasses,/obj/item/clothing/suit/storage/hazardvest,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/plating,/area/maintenance/medbay_aft) "cqd" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) @@ -6231,10 +6253,10 @@ "cqm" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "cqn" = (/obj/machinery/light{dir = 8},/obj/machinery/camera/network/civilian{c_tag = "CIV - Residential Elevator Port"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cqo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) -"cqp" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) +"cqp" = (/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 9},/obj/structure/cable/cyan{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled/dark,/area/ai) "cqq" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/effect/landmark{name = "JoinLateElevator"},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cqr" = (/obj/effect/landmark{name = "JoinLateElevator"},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) -"cqs" = (/obj/machinery/computer/cryopod/dorms{pixel_y = -30},/obj/effect/landmark{name = "JoinLateElevator"},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) +"cqs" = (/obj/effect/floor_decal/corner/paleblue{dir = 6},/obj/item/device/radio/intercom{broadcasting = 0; canhear_range = 5; dir = 4; frequency = 1487; icon_state = "intercom"; listening = 0; name = "Station Intercom (Medbay)"; pixel_x = 21; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/reception) "cqt" = (/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cqu" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cqv" = (/turf/simulated/wall,/area/hallway/secondary/docking_hallway) @@ -6246,7 +6268,7 @@ "cqB" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) "cqC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/maintenance/medbay_aft) "cqD" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/medbay_aft) -"cqE" = (/obj/structure/table/woodentable,/obj/item/weapon/melee/chainofcommand,/obj/machinery/button/remote/airlock{desc = "A remote control switch for the Starboard Bridge Doors."; id = "sbridgedoor"; name = "Starboard Bridge Door Control"; pixel_x = 4; pixel_y = -6},/obj/machinery/button/remote/airlock{desc = "A remote control switch for the captain's office."; id = "captaindoor"; name = "Captain's Office Door Control"; pixel_x = 4; pixel_y = 6},/turf/simulated/floor/wood,/area/crew_quarters/captain) +"cqE" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cqF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/quartermaster/office) "cqG" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/office) "cqH" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6269,7 +6291,10 @@ "cqY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "cqZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "cra" = (/obj/machinery/atmospherics/unary/vent_pump/on,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) +"crb" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"crc" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "crd" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) +"cre" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "crf" = (/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "crg" = (/obj/effect/floor_decal/corner/brown{dir = 5},/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = 32},/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) "crh" = (/obj/machinery/door/airlock/glass{name = "Cargo Access"},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/hallway/secondary/cargo_hallway) @@ -6376,14 +6401,18 @@ "cte" = (/obj/machinery/computer/arcade,/turf/simulated/floor/wood,/area/crew_quarters/bar) "ctf" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) "ctg" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) +"cth" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "cti" = (/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "ctj" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"ctk" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctl" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "ctm" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/crew_quarters/sleep/elevator) "ctn" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) "cto" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) +"ctp" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctq" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "ctr" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cts" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "ctt" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "ctu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/docking_hallway) "ctv" = (/obj/structure/table/standard,/obj/item/weapon/tape_roll,/obj/item/weapon/storage/firstaid/regular{pixel_x = 6; pixel_y = -5},/obj/effect/floor_decal/corner/brown/full,/turf/simulated/floor/tiled,/area/quartermaster/office) @@ -6438,6 +6467,8 @@ "cus" = (/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cut" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atm{pixel_y = 30},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuu" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) +"cuv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/bluegrid,/area/ai) +"cuw" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 4},/turf/simulated/floor/tiled/dark,/area/ai) "cux" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) "cuy" = (/obj/effect/floor_decal/corner/lime{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/smartfridge/drying_rack,/turf/simulated/floor/tiled,/area/hydroponics) "cuz" = (/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -6446,15 +6477,19 @@ "cuC" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuD" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuE" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cuF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cuG" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cuH" = (/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor/bluegrid,/area/ai) "cuI" = (/obj/item/frame/light,/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cuJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) +"cuK" = (/turf/simulated/wall/r_wall,/area/maintenance/atmos_control) "cuL" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuM" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cuN" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) "cuO" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuP" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuQ" = (/obj/structure/closet/secure_closet/personal,/obj/item/clothing/head/kitty,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) +"cuR" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/workshop) "cuS" = (/turf/simulated/wall,/area/quartermaster/storage) "cuT" = (/obj/structure/curtain/open/shower,/obj/machinery/door/window/southright{name = "Shower"},/obj/structure/window/reinforced{dir = 8},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) "cuU" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6472,7 +6507,7 @@ "cvg" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) "cvh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/primary/port) "cvi" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/primary/port) -"cvj" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) +"cvj" = (/obj/machinery/flasher{id = "AI"; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/bluegrid,/area/ai) "cvk" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue/diagonal,/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvl" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "cvm" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) @@ -6485,21 +6520,28 @@ "cvt" = (/obj/machinery/atm{pixel_x = 0; pixel_y = -32},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cvu" = (/obj/structure/bed/chair/wood/wings,/turf/simulated/floor/wood,/area/crew_quarters/bar) "cvv" = (/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Break Room"; req_one_access = list(10)},/turf/simulated/floor/tiled,/area/engineering/break_room) +"cvw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/atmos_control) "cvx" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cvy" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_5) +"cvz" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "cvA" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvB" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_6) +"cvC" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled/dark,/area/ai) "cvD" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cvE" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvF" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cvG" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_11) "cvH" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvI" = (/obj/effect/floor_decal/corner/white{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cvJ" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_12) +"cvK" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/obj/effect/floor_decal/industrial/warning/corner,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvL" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "cvM" = (/turf/space,/area/supply/station) "cvN" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Port Primary 1"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) "cvO" = (/obj/structure/closet/emcloset,/obj/machinery/status_display/supply_display{pixel_y = 32},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvP" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled,/area/quartermaster/storage) +"cvQ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) +"cvR" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cvS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvT" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/quartermaster/storage) "cvU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=8"; freq = 1400; location = "QM #3"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6596,6 +6638,7 @@ "cxH" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cxI" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) "cxJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled/dark,/area/crew_quarters/sleep/elevator) +"cxK" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cxL" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) "cxM" = (/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/docking_hallway) "cxN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6608,6 +6651,7 @@ "cxU" = (/obj/structure/table/reinforced,/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cxV" = (/obj/structure/bed/chair/comfy/beige{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cxW" = (/obj/machinery/door/airlock/glass_medical{name = "First-Aid Station"; req_one_access = list(5,10,63)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled/white,/area/medical/first_aid_station) +"cxX" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "cxY" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cxZ" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_5) "cya" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 4; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) @@ -6678,6 +6722,7 @@ "czn" = (/obj/structure/disposalpipe/segment{dir = 4},/obj/item/weapon/stool/padded,/turf/simulated/floor/wood,/area/crew_quarters/bar) "czo" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/bar) "czp" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"czq" = (/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_waste) "czr" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) "czs" = (/obj/machinery/conveyor{dir = 4; id = "QMLoad2"},/turf/simulated/floor,/area/quartermaster/storage) "czt" = (/obj/effect/floor_decal/industrial/loading{dir = 4},/turf/simulated/floor/tiled,/area/quartermaster/storage) @@ -6724,17 +6769,21 @@ "cAi" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_3) "cAj" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_3) "cAk" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_6) +"cAl" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/engineering/engine_waste) "cAm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAn" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAo" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_4) +"cAp" = (/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor,/area/engineering/engine_waste) "cAq" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) "cAr" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/quartermaster/qm) "cAs" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_9) "cAt" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) "cAu" = (/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/disposal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_11) +"cAv" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "cAw" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAx" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/junction{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cAy" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_10) +"cAz" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/turf/simulated/floor/tiled,/area/engineering/workshop) "cAA" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_10) "cAB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) "cAC" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "cargo_bay_door"; locked = 1; name = "Cargo Docking Hatch"; req_access = list(13)},/turf/simulated/floor/plating,/area/quartermaster/storage) @@ -6812,16 +6861,24 @@ "cBW" = (/obj/machinery/atmospherics/pipe/tank/air,/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor,/area/maintenance/bar) "cBX" = (/obj/structure/table/rack{dir = 4},/obj/item/clothing/mask/gas,/turf/simulated/floor/plating,/area/maintenance/bar) "cBY" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 4},/obj/effect/floor_decal/corner/lime{dir = 10},/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/turf/simulated/floor/tiled/white,/area/medical/virology) +"cBZ" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) +"cCa" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "cCb" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cCc" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_4) "cCd" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cCe" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_4) "cCf" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) +"cCg" = (/obj/structure/table/reinforced,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/tiled,/area/engineering/workshop) +"cCh" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/light/small{dir = 8},/turf/simulated/floor,/area/maintenance/atmos_control) +"cCi" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Starboard Aft 1"; dir = 2},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"cCj" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "cCk" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cCl" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) "cCm" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cCn" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_10) "cCo" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) +"cCp" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/hallway/primary/central_two) +"cCq" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 5},/turf/simulated/floor,/area/engineering/drone_fabrication) "cCr" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cCs" = (/obj/effect/floor_decal/industrial/outline/yellow,/obj/vehicle/train/cargo/trolley,/obj/machinery/camera/network/cargo{c_tag = "CRG - Cargo Bay Starboard"; dir = 8; name = "security camera"},/turf/simulated/floor/tiled,/area/quartermaster/storage) "cCt" = (/turf/simulated/wall,/area/quartermaster/warehouse) @@ -6843,7 +6900,7 @@ "cCJ" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/hallway/secondary/engineering_hallway) "cCK" = (/turf/simulated/wall,/area/construction) "cCL" = (/obj/machinery/door/airlock/maintenance{req_one_access = list(11,24)},/turf/simulated/floor,/area/construction) -"cCM" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/clothing/suit/space/void/engineering,/obj/item/clothing/head/helmet/space/void/engineering,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) +"cCM" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable/green,/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "cCN" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/suit/space/void/atmos,/obj/item/clothing/mask/breath,/obj/item/clothing/head/helmet/space/void/atmos,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) "cCO" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) "cCP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) @@ -6880,6 +6937,7 @@ "cDu" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDv" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDw" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) +"cDx" = (/obj/structure/table/rack,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/westright{name = "EVA Suit Storage"; req_access = newlist(); req_one_access = list(5,18)},/obj/item/weapon/rig/medical/equipped,/turf/simulated/floor/tiled/dark,/area/medical/medbay_emt_bay) "cDy" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_3) "cDz" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 3"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) "cDA" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) @@ -6895,6 +6953,7 @@ "cDK" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDL" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDM" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_9) +"cDN" = (/obj/item/weapon/stool/padded,/turf/simulated/floor,/area/maintenance/atmos_control) "cDO" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 9"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "cDP" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 10"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) "cDQ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) @@ -7005,7 +7064,7 @@ "cFR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cFS" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cFT" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/quartermaster/warehouse) -"cFU" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/turf/simulated/floor,/area/maintenance/apmaint) +"cFU" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/sign/directions/security{dir = 1; pixel_x = -32; pixel_y = 0},/obj/structure/sign/directions/science{dir = 1; pixel_x = -32; pixel_z = -8},/obj/structure/sign/directions/evac{dir = 4; pixel_x = -32; pixel_z = 8},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Port Aft 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_four) "cFV" = (/obj/structure/closet/secure_closet/bar{req_access = list(25)},/obj/machinery/atmospherics/unary/vent_scrubber/on,/obj/item/weapon/storage/secure/safe{pixel_z = 30},/turf/simulated/floor/wood,/area/crew_quarters/bar) "cFW" = (/obj/machinery/firealarm{dir = 8; pixel_x = -24; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cFX" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/security/checkpoint2) @@ -7049,6 +7108,8 @@ "cGJ" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cGK" = (/turf/simulated/floor/tiled,/area/quartermaster/warehouse) "cGL" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/structure/closet/crate,/turf/simulated/floor/tiled/steel,/area/quartermaster/warehouse) +"cGM" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/atmos_control) +"cGN" = (/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/atmos_control) "cGO" = (/obj/structure/closet/wardrobe/atmospherics_yellow,/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cGP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cGQ" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 28; pixel_y = 1},/obj/machinery/cell_charger,/turf/simulated/floor/tiled,/area/assembly/robotics) @@ -7088,6 +7149,7 @@ "cHy" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_1) "cHz" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_1) "cHA" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply,/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) +"cHB" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/drone_fabrication) "cHC" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHD" = (/obj/effect/floor_decal/corner/white{dir = 4},/obj/effect/floor_decal/corner/blue,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHE" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_2) @@ -7097,9 +7159,11 @@ "cHI" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_7) "cHJ" = (/obj/structure/curtain/open/shower,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/window/southright{name = "Shower"},/obj/machinery/shower{pixel_y = 3},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_7) "cHK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) +"cHL" = (/turf/simulated/floor,/area/maintenance/atmos_control) "cHM" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue{dir = 1},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHN" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cHO" = (/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_8) +"cHP" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cHQ" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_8) "cHR" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cHS" = (/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/structure/cable/green,/turf/simulated/floor/plating,/area/ai_monitored/storage/eva) @@ -7167,6 +7231,7 @@ "cJc" = (/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cJd" = (/obj/machinery/camera/network/engineering{c_tag = "Atmos Tank - Gas Mixing"; dir = 2},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cJe" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/storage) +"cJf" = (/obj/structure/sign/directions/medical{dir = 4; pixel_y = 32},/obj/structure/sign/directions/science{dir = 8; pixel_y = 32; pixel_z = -8},/obj/structure/sign/directions/evac{pixel_y = 32; pixel_z = 8},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "cJg" = (/turf/simulated/wall,/area/engineering/atmos/storage) "cJh" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 8},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cJi" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) @@ -7219,9 +7284,13 @@ "cKd" = (/obj/structure/closet/secure_closet/personal,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cKe" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/brown,/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) "cKf" = (/obj/structure/table/standard,/obj/machinery/newscaster{pixel_x = 0; pixel_y = 32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_8) +"cKg" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"cKh" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/hallway/primary/central_three) +"cKi" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_three) "cKj" = (/turf/simulated/wall/r_wall,/area/engineering/atmos/monitoring) "cKk" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) "cKl" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/firstaid/regular,/obj/item/bodybag/cryobag{pixel_x = 6},/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 0; pixel_y = -27},/turf/simulated/floor/tiled/yellow,/area/engineering/locker_room) +"cKm" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/computer/cryopod/dorms{pixel_y = -30},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cKn" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cKo" = (/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northleft{name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/engineering,/obj/structure/window/basic{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) "cKp" = (/obj/machinery/shower{dir = 1},/obj/machinery/door/window/northright{dir = 1; name = "Shower"; req_access = list()},/obj/structure/curtain/open/shower/engineering,/obj/structure/window/basic{dir = 8},/turf/simulated/floor/tiled/freezer,/area/crew_quarters/sleep/engi_wash) @@ -7258,6 +7327,7 @@ "cKU" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 1"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cKV" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock{name = "Room 2"},/obj/machinery/door/firedoor/border_only,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "cKW" = (/obj/structure/toilet,/obj/machinery/light{dir = 1},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_2) +"cKX" = (/obj/machinery/computer/cryopod/dorms{pixel_y = -30},/turf/simulated/floor/tiled,/area/crew_quarters/sleep/elevator) "cKY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "cKZ" = (/obj/machinery/alarm{pixel_y = 22},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) "cLa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_2) @@ -7279,6 +7349,8 @@ "cLq" = (/obj/machinery/atmospherics/unary/outlet_injector{dir = 2; frequency = 1441; icon_state = "map_injector"; id = "waste_in"; pixel_y = 1; use_power = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cLr" = (/obj/machinery/air_sensor{frequency = 1441; id_tag = "waste_sensor"; output = 63},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) "cLs" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 2; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "waste_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0; use_power = 1},/turf/simulated/floor/reinforced/airless,/area/engineering/atmos) +"cLt" = (/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor/tiled/dark,/area/hallway/primary/port) +"cLu" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/weapon/rig/eva/equipped,/turf/simulated/floor/tiled/dark,/area/ai_monitored/storage/eva) "cLv" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/vacant/vacant_shop) "cLw" = (/obj/machinery/computer/general_air_control{frequency = 1443; level = 3; name = "Distribution and Waste Monitor"; sensors = list("mair_in_meter" = "Mixed Air In", "air_sensor" = "Mixed Air Supply Tank", "mair_out_meter" = "Mixed Air Out", "dloop_atm_meter" = "Distribution Loop", "wloop_atm_meter" = "Engine Waste")},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cLx" = (/obj/machinery/firealarm{pixel_y = 24},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7324,9 +7396,11 @@ "cMl" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 3; pixel_y = 2},/obj/machinery/light,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cMm" = (/obj/structure/table/standard,/obj/machinery/microwave,/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) "cMn" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_1) +"cMo" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/meter,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/apmaint) "cMp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_1) "cMq" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_2) "cMr" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_7) +"cMs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/structure/disposalpipe/segment,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/maintenance/apmaint) "cMt" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/structure/mirror{pixel_x = -28},/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_8) "cMu" = (/obj/machinery/door/airlock{name = "Restroom"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled/white,/area/crew_quarters/sleep/vistor_room_1) "cMv" = (/obj/structure/disposalpipe/segment,/turf/simulated/wall,/area/crew_quarters/sleep/vistor_room_2) @@ -7349,7 +7423,7 @@ "cMM" = (/obj/structure/grille,/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/machinery/meter,/turf/simulated/wall/r_wall,/area/engineering/atmos) "cMN" = (/turf/simulated/wall/r_wall,/area/engineering/atmos) "cMO" = (/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/disposalpipe/segment,/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/engineering/atmos) -"cMP" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/atmos) +"cMP" = (/obj/effect/floor_decal/industrial/warning/corner{icon_state = "warningcorner"; dir = 8},/turf/simulated/floor,/area/maintenance/apmaint) "cMQ" = (/obj/machinery/computer/general_air_control{frequency = 1441; name = "Tank Monitor"; sensors = list("n2_sensor" = "Nitrogen", "o2_sensor" = "Oxygen", "co2_sensor" = "Carbon Dioxide", "tox_sensor" = "Toxins", "n2o_sensor" = "Nitrous Oxide", "waste_sensor" = "Gas Mix Tank")},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cMR" = (/obj/machinery/atmospherics/unary/vent_pump/on,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cMS" = (/obj/machinery/newscaster{pixel_x = 28; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7393,6 +7467,8 @@ "cNE" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cNF" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 10},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cNG" = (/obj/structure/extinguisher_cabinet{pixel_x = -5; pixel_y = 30},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) +"cNH" = (/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = list(10,12)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/disposalpipe/segment,/turf/simulated/floor,/area/engineering/atmos/storage) +"cNI" = (/obj/structure/table/glass,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) "cNJ" = (/obj/structure/table/reinforced,/obj/machinery/door/blast/shutters{dir = 1; id = "bar"; layer = 3.1; name = "Bar Shutters"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar) "cNK" = (/obj/machinery/door/firedoor/border_only,/obj/machinery/door/airlock/maintenance{name = "Bar Maintenance"; req_access = list(25)},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor,/area/crew_quarters/bar) "cNL" = (/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/wood,/area/crew_quarters/bar) @@ -7413,7 +7489,7 @@ "cOa" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 6},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 6},/obj/structure/table/standard,/obj/machinery/requests_console{department = "Atmospherics"; departmentType = 3; name = "Atmos RC"; pixel_x = 0; pixel_y = 28},/obj/item/device/t_scanner,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/radio/headset/headset_eng,/obj/item/weapon/cartridge/atmos,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/item/clothing/ears/earmuffs,/obj/item/clothing/ears/earmuffs,/obj/item/weapon/cartridge/atmos,/obj/item/device/pipe_painter,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOb" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/table/standard,/obj/structure/closet/fireaxecabinet{pixel_y = 32},/obj/machinery/cell_charger,/obj/item/weapon/wrench,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOc" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/table/standard,/obj/machinery/newscaster{pixel_y = 30},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/glass{amount = 50},/obj/item/clothing/gloves/black,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/belt/utility/atmostech,/obj/item/weapon/storage/belt/utility/atmostech,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Fore Starboard"; dir = 2},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cOd" = (/obj/effect/decal/warning_stripes,/obj/machinery/atmospherics/pipe/manifold4w/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/visible/supply,/turf/simulated/floor,/area/engineering/atmos) +"cOd" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "cOe" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable/cyan{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cOf" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/airlock/glass_atmos{name = "Atmospherics Monitoring Room"; req_access = list(24)},/obj/machinery/door/firedoor/border_only,/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) "cOg" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/cable/cyan{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7430,6 +7506,7 @@ "cOr" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/effect/floor_decal/corner/yellow,/turf/simulated/floor/tiled,/area/engineering/foyer) "cOs" = (/obj/machinery/atmospherics/pipe/simple/visible/green,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level) "cOt" = (/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"cOu" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cOv" = (/obj/machinery/computer/security/telescreen{desc = "Used to monitor the engine room."; layer = 3.3; name = "Engine Monitor"; network = list("Engine"); pixel_x = 0; pixel_y = 28},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cOw" = (/obj/machinery/keycard_auth{pixel_x = 0; pixel_y = 24},/obj/machinery/button/remote/airlock{desc = "A remote control-switch for the engine core airlock hatch bolts."; id = "engine_access_hatch"; name = "Engine Hatch Bolt Control"; pixel_x = -6; pixel_y = 32; req_access = newlist(); specialfunctions = 4},/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for engine core."; id = "EngineVent"; name = "Engine Ventillatory Control"; pixel_x = 6; pixel_y = 32; req_access = newlist()},/obj/structure/table/reinforced,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd_ammo,/obj/item/weapon/rcd,/obj/machinery/newscaster{layer = 3.3; pixel_x = 27; pixel_y = 0},/obj/effect/floor_decal/corner/blue/full{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cOx" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/meter,/obj/effect/decal/cleanable/dirt,/obj/machinery/light/small{dir = 8},/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/maintenance/engineering) @@ -7444,6 +7521,7 @@ "cOG" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/maintenance/evahallway) "cOH" = (/obj/structure/closet,/obj/item/clothing/glasses/welding,/obj/item/weapon/weldingtool,/obj/effect/decal/cleanable/dirt,/obj/item/clothing/shoes/workboots,/turf/simulated/floor/plating,/area/maintenance/apmaint) "cOI" = (/obj/structure/table/reinforced,/obj/item/stack/material/plasteel{amount = 10},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/item/stack/material/steel{amount = 50},/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/ai_monitored/storage/eva) +"cOJ" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cOK" = (/obj/machinery/newscaster{pixel_x = -30},/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cOL" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cOM" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow,/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level) @@ -7457,6 +7535,7 @@ "cOU" = (/obj/machinery/navbeacon{codes_txt = "delivery;dir=2"; freq = 1400; location = "Bar"},/obj/structure/plasticflaps{opacity = 1},/obj/machinery/door/firedoor/border_only,/obj/effect/floor_decal/industrial/loading{tag = "icon-loadingarea (WEST)"; icon_state = "loadingarea"; dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/bar) "cOV" = (/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 32; pixel_y = 0},/turf/simulated/floor/carpet,/area/crew_quarters/bar) "cOW" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/wood,/area/crew_quarters/bar) +"cOX" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/atmos{name = "Atmospherics Maintenance"; req_access = list(24)},/turf/simulated/floor,/area/maintenance/atmos_control) "cOY" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar) "cOZ" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/primary/port) "cPa" = (/obj/structure/table/woodentable,/obj/item/device/camera,/obj/machinery/newscaster{pixel_x = 31; pixel_y = 3},/turf/simulated/floor/carpet,/area/crew_quarters/bar) @@ -7498,7 +7577,7 @@ "cPK" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) "cPL" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/structure/table/standard,/obj/item/clothing/head/welding{pixel_x = -5; pixel_y = 3},/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled,/area/engineering/atmos) "cPM" = (/turf/simulated/floor/tiled,/area/engineering/atmos) -"cPN" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/simple/visible/supply,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cPN" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/maintenance/atmos_control) "cPO" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cPP" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "ceoffice"; name = "CE Office Privacy Shutters"; opacity = 0},/obj/structure/cable/green,/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/plating,/area/crew_quarters/heads/chief) "cPQ" = (/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7521,7 +7600,7 @@ "cQh" = (/obj/item/weapon/stool/padded,/obj/machinery/status_display{density = 0; layer = 4; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/bar) "cQi" = (/obj/structure/cable/green{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cQj" = (/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) -"cQk" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/shoes/magboots,/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce/equipped,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) +"cQk" = (/obj/structure/table/rack{dir = 8; layer = 2.9},/obj/item/clothing/mask/breath,/obj/item/weapon/rig/ce/equipped,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/heads/chief) "cQl" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/maintenance/engineering) "cQm" = (/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/cable,/turf/simulated/floor,/area/maintenance/evahallway) "cQn" = (/obj/effect/decal/cleanable/dirt,/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/vacant/vacant_shop) @@ -7563,6 +7642,7 @@ "cQX" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/table/reinforced,/obj/item/weapon/paper_bin,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQY" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cQZ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cRa" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/sign/nosmoking_1{pixel_x = -32},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/maintenance/atmos_control) "cRb" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/firealarm{dir = 2; pixel_y = 24},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cRc" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cRd" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) @@ -7580,7 +7660,7 @@ "cRp" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 9},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRq" = (/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRr" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 6},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cRs" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/atmospherics/pipe/manifold/visible/supply,/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cRs" = (/obj/structure/closet/crate,/obj/item/weapon/deck/tarot,/obj/item/weapon/coin/gold,/obj/item/weapon/storage/fancy/cigarettes/dromedaryco,/obj/item/weapon/flame/lighter/zippo,/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor,/area/maintenance/atmos_control) "cRt" = (/obj/machinery/atmospherics/pipe/simple/visible/supply{dir = 10},/obj/structure/disposalpipe/sortjunction/flipped{dir = 1; sortType = "Atmospherics"; name = "Atmospherics"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cRu" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/engineering/break_room) "cRv" = (/obj/machinery/computer/atmos_alert,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7607,14 +7687,14 @@ "cRQ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor,/area/maintenance/engineering) "cRR" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 6},/turf/simulated/floor,/area/maintenance/evahallway) "cRS" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/portables_connector{dir = 8},/turf/simulated/floor/plating,/area/maintenance/evahallway) -"cRT" = (/obj/structure/table/glass,/obj/machinery/light{dir = 8},/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) +"cRT" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 2},/obj/structure/bed/chair,/obj/machinery/light{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cRU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/vacant/vacant_shop) "cRV" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/lino,/area/hallway/secondary/entry/docking_lounge) "cRW" = (/obj/structure/table/glass,/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) -"cRX" = (/obj/structure/table/glass,/obj/item/weapon/storage/toolbox/mechanical{pixel_x = -2; pixel_y = -1},/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) +"cRX" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/drone_fabrication) "cRY" = (/obj/structure/table/glass,/obj/machinery/light{dir = 8},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/docking_lounge) "cRZ" = (/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/docking_lounge) -"cSa" = (/obj/structure/table/glass,/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/carpet,/area/hallway/secondary/entry/docking_lounge) +"cSa" = (/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cSb" = (/obj/machinery/portable_atmospherics/canister/air/airlock,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/atmospherics/portables_connector{dir = 4},/turf/simulated/floor/plating,/area/maintenance/bar) "cSc" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor,/area/maintenance/bar) "cSd" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/machinery/newscaster{pixel_x = -27; pixel_y = 1},/obj/effect/floor_decal/corner/white{dir = 8},/obj/effect/floor_decal/corner/blue/diagonal,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_dinning) @@ -7639,6 +7719,7 @@ "cSw" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cSx" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cSy" = (/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) +"cSz" = (/turf/simulated/floor,/area/engineering/drone_fabrication) "cSA" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) "cSB" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) "cSC" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7648,7 +7729,7 @@ "cSG" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "cSH" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/atmos) "cSI" = (/obj/machinery/atmospherics/pipe/simple/visible/universal,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cSJ" = (/obj/machinery/atmospherics/pipe/simple/visible/scrubbers,/obj/machinery/meter{frequency = 1443; id = "wloop_atm_meter"; name = "Waste Loop"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cSJ" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/firedoor,/obj/machinery/door/airlock/maintenance{name = "Atmospherics Maintenance Access"; req_access = newlist(); req_one_access = list(10)},/turf/simulated/floor,/area/maintenance/atmos_control) "cSK" = (/obj/machinery/meter{frequency = 1443; id = "dloop_atm_meter"; name = "Distribution Loop"},/obj/machinery/atmospherics/pipe/simple/visible/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) "cSL" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/atmos/monitoring) "cSM" = (/obj/machinery/computer/security/engineering,/turf/simulated/floor/tiled,/area/engineering/atmos/monitoring) @@ -7699,8 +7780,10 @@ "cTF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cTG" = (/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) "cTH" = (/obj/structure/bed/chair{dir = 1},/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_lodging) +"cTI" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/light,/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cTJ" = (/obj/structure/closet/wardrobe/suit,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cTK" = (/obj/structure/closet/wardrobe/xenos,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) +"cTL" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/computer/drone_control,/turf/simulated/floor,/area/engineering/drone_fabrication) "cTM" = (/obj/structure/closet/wardrobe/white,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/obj/machinery/light,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cTN" = (/obj/structure/closet/wardrobe/grey,/obj/effect/floor_decal/corner/blue,/obj/effect/floor_decal/corner/white{dir = 8},/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) "cTO" = (/obj/structure/closet/wardrobe/black,/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/blue,/turf/simulated/floor/tiled,/area/crew_quarters/visitor_laundry) @@ -7760,7 +7843,7 @@ "cUQ" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHEAST)"; icon_state = "intact"; dir = 6},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUR" = (/obj/machinery/atmospherics/binary/pump{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUS" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cUT" = (/obj/machinery/atmospherics/binary/pump/on{name = "Scrubber to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) +"cUT" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "cUU" = (/obj/machinery/atmospherics/binary/pump/on{dir = 1; name = "Air to Supply"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUV" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cUW" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment{dir = 2; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7804,7 +7887,7 @@ "cVI" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) "cVJ" = (/obj/machinery/atmospherics/pipe/manifold/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "cVK" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (NORTH)"; icon_state = "map"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"cVL" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold4w/visible/red,/turf/simulated/floor/tiled,/area/engineering/atmos) +"cVL" = (/obj/structure/bed/chair/comfy/black,/obj/effect/landmark/start{name = "Command Secretary"},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "cVM" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/cyan,/turf/simulated/floor/tiled,/area/engineering/atmos) "cVN" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/turf/simulated/floor/tiled,/area/engineering/atmos) "cVO" = (/obj/structure/cable/cyan{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7899,6 +7982,7 @@ "cXz" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/starboard) "cXA" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/starboard) "cXB" = (/obj/structure/closet/emcloset,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/starboard) +"cXC" = (/obj/structure/bed/chair/comfy/black{dir = 1},/obj/effect/landmark/start{name = "Command Secretary"},/turf/simulated/floor/carpet,/area/bridge/meeting_room) "cXD" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "cXE" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "cXF" = (/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) @@ -7910,7 +7994,6 @@ "cXL" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (NORTHWEST)"; icon_state = "intact"; dir = 9},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXM" = (/obj/machinery/space_heater,/turf/simulated/floor/tiled,/area/engineering/atmos) "cXN" = (/obj/structure/reagent_dispensers/watertank,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cXO" = (/obj/machinery/atmospherics/valve/digital/open,/turf/simulated/floor/tiled,/area/engineering/atmos) "cXP" = (/obj/machinery/atmospherics/pipe/simple/visible/cyan{tag = "icon-intact (NORTHEAST)"; icon_state = "intact"; dir = 5},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXQ" = (/obj/machinery/atmospherics/binary/pump/on{dir = 4; name = "Air to Ports"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cXR" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/cyan{dir = 4; icon_state = "intact"; tag = "icon-intact (EAST)"},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -7992,7 +8075,6 @@ "cZs" = (/obj/structure/dispenser,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZt" = (/turf/simulated/wall,/area/engineering/atmos) "cZu" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/obj/structure/reagent_dispensers/fueltank,/turf/simulated/floor/tiled,/area/engineering/atmos) -"cZv" = (/obj/machinery/atmospherics/pipe/manifold/visible/red{tag = "icon-map (WEST)"; icon_state = "map"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZw" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZx" = (/obj/machinery/atmospherics/binary/pump/on{dir = 8; name = "Ports to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) "cZy" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) @@ -8060,7 +8142,6 @@ "daN" = (/obj/machinery/atmospherics/unary/heater{dir = 2; icon_state = "heater"},/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "daP" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "daQ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "Port to Waste"},/turf/simulated/floor/tiled,/area/engineering/atmos) -"daR" = (/obj/machinery/alarm{dir = 8; icon_state = "alarm0"; pixel_x = 24},/turf/simulated/floor/tiled,/area/engineering/atmos) "daS" = (/turf/simulated/wall/r_wall,/area/engineering/workshop) "daT" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/engineering_monitoring) "daU" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/workshop) @@ -8095,7 +8176,6 @@ "dbx" = (/obj/machinery/atmospherics/pipe/manifold/hidden{dir = 8; icon_state = "map"; tag = "icon-manifold-f (WEST)"},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "dby" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "dbz" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) -"dbA" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/obj/machinery/light,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "dbB" = (/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "dbC" = (/obj/machinery/atmospherics/pipe/simple/hidden{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/port) "dbD" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/structure/lattice,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored/upper_level) @@ -8134,7 +8214,6 @@ "dcn" = (/obj/machinery/atmospherics/pipe/manifold/visible/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) "dco" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dcp" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dcq" = (/obj/machinery/atmospherics/pipe/simple/visible/yellow{dir = 4},/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dcr" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/starboard) "dcs" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/yellow{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop) "dct" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8193,11 +8272,9 @@ "ddv" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddw" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddx" = (/obj/machinery/atmospherics/pipe/manifold/visible/green{tag = "icon-map (EAST)"; icon_state = "map"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) -"ddy" = (/obj/machinery/atmospherics/tvalve/mirrored/digital{name = "Waste to Space"},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddz" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (SOUTHWEST)"; icon_state = "intact"; dir = 10},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "ddA" = (/obj/machinery/atmospherics/valve/digital,/turf/simulated/floor/tiled,/area/engineering/atmos) "ddB" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/turf/simulated/floor/tiled,/area/engineering/atmos) -"ddC" = (/obj/structure/window/reinforced,/obj/structure/closet/firecloset,/obj/machinery/camera/network/engineering{c_tag = "ENG - Atmospherics Starboard"; dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "ddD" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/turf/simulated/floor/plating,/area/hallway/secondary/entry/port) "ddE" = (/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/tiled,/area/engineering/workshop) "ddF" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8247,15 +8324,11 @@ "dex" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/effect/floor_decal/corner/red/full{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "dey" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/atmospherics/pipe/simple/visible/green,/turf/simulated/floor/tiled,/area/engineering/atmos) "dez" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 2; tag_south = 5; tag_west = 4; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"deA" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"deB" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/portable_atmospherics/canister/sleeping_agent,/turf/simulated/floor/tiled,/area/engineering/atmos) "deC" = (/obj/machinery/meter,/obj/machinery/atmospherics/pipe/manifold/hidden/red{dir = 1},/turf/simulated/wall/r_wall,/area/engineering/workshop) "deD" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/turf/simulated/floor/tiled,/area/engineering/workshop) "deE" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deF" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/workshop) "deG" = (/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/workshop) -"deH" = (/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; sortType = "Drone Fabrication"; name = "Drone Fabrication"},/turf/simulated/floor/tiled,/area/engineering/workshop) -"deI" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deJ" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/sortjunction/flipped{dir = 8; name = "Engineering"; sortType = "Engineering"},/turf/simulated/floor/tiled,/area/engineering/workshop) "deK" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/glass,/obj/machinery/door/airlock/glass_engineeringatmos{name = "Engineering Workshop"; req_one_access = list(11,24)},/obj/structure/disposalpipe/segment{dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "deL" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/junction{dir = 8; icon_state = "pipe-j2"},/turf/simulated/floor/tiled,/area/engineering) @@ -8294,15 +8367,11 @@ "dfs" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/computer/general_air_control/large_tank_control{frequency = 1441; input_tag = "n2_in"; name = "Nitrogen Supply Control"; output_tag = "n2_out"; sensors = list("n2_sensor" = "Tank")},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/atmos) "dft" = (/obj/machinery/atmospherics/pipe/simple/visible/red{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) "dfu" = (/obj/machinery/atmospherics/omni/filter{tag_east = 1; tag_north = 0; tag_south = 6; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dfv" = (/obj/machinery/atmospherics/omni/filter{tag_east = 0; tag_north = 1; tag_south = 7; tag_west = 2; use_power = 1},/turf/simulated/floor/tiled,/area/engineering/atmos) "dfw" = (/obj/machinery/portable_atmospherics/canister/oxygen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dfx" = (/obj/machinery/portable_atmospherics/canister/oxygen,/turf/simulated/floor/tiled,/area/engineering/atmos) "dfy" = (/obj/machinery/atmospherics/pipe/simple/hidden/red{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/wall/r_wall,/area/engineering/workshop) "dfz" = (/obj/machinery/atmospherics/portables_connector{dir = 8},/obj/effect/floor_decal/corner/red{dir = 9},/obj/machinery/camera/network/engineering{c_tag = "ENG - Workshop Port"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/workshop) "dfA" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/workshop) "dfB" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D2) -"dfC" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) -"dfD" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/engineering/workshop) "dfE" = (/obj/structure/reagent_dispensers/watertank,/obj/machinery/camera/network/engineering{c_tag = "ENG - Workshop Starboard"; dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dfF" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dfG" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 8},/turf/simulated/floor/tiled,/area/engineering) @@ -8342,13 +8411,10 @@ "dgo" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 5; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgp" = (/obj/machinery/atmospherics/pipe/simple/visible/red,/obj/machinery/atmospherics/pipe/simple/visible/green{tag = "icon-intact (EAST)"; icon_state = "intact"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgq" = (/obj/machinery/atmospherics/pipe/simple/visible/green{dir = 10; icon_state = "intact"; tag = "icon-intact (SOUTHEAST)"},/obj/machinery/meter,/turf/simulated/floor/tiled,/area/engineering/atmos) -"dgr" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"dgs" = (/obj/machinery/portable_atmospherics/canister/nitrogen,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/engineering/atmos) "dgt" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgu" = (/obj/machinery/hologram/holopad,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgv" = (/obj/structure/window/reinforced{dir = 4},/obj/structure/closet/secure_closet/engineering_electrical,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/engineering/workshop) "dgw" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/sign/securearea{desc = "A warning sign which reads 'EXTERNAL AIRLOCK'"; icon_state = "space"; layer = 4; name = "EXTERNAL AIRLOCK"; pixel_x = 0},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/hallway/secondary/entry/D1) -"dgx" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgy" = (/obj/structure/reagent_dispensers/fueltank,/obj/machinery/light_switch{pixel_x = 27},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) "dgz" = (/turf/simulated/wall,/area/engineering/workshop) "dgA" = (/obj/machinery/alarm{dir = 4; pixel_x = -23; pixel_y = 0},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) @@ -8378,13 +8444,11 @@ "dgY" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/binary/pump{dir = 4; name = "N2 to Connector"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/atmos) "dgZ" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "CO2 to Mixing"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dha" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor/tiled,/area/engineering/atmos) -"dhb" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Transit"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dhc" = (/obj/machinery/portable_atmospherics/canister/air,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) "dhd" = (/obj/machinery/portable_atmospherics/canister/air,/turf/simulated/floor/tiled,/area/engineering/atmos) "dhe" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/engineering/workshop) "dhf" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/disposalpipe/segment,/turf/simulated/floor/lino,/area/crew_quarters/bar) "dhg" = (/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc/super/critical{dir = 4; is_critical = 1; name = "east bump"; pixel_x = 24; pixel_y = 0},/turf/simulated/floor/tiled,/area/hallway/secondary/entry/D1) -"dhh" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/effect/decal/cleanable/blood/oil/streak{amount = 0},/turf/simulated/floor/tiled,/area/engineering/workshop) "dhi" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 1},/turf/simulated/floor/tiled,/area/engineering/workshop) "dhj" = (/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Fore"; dir = 4},/obj/structure/disposalpipe/segment,/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering) "dhk" = (/obj/structure/cable/green{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor/tiled,/area/engineering) @@ -8432,7 +8496,6 @@ "dia" = (/obj/machinery/atmospherics/valve/digital{name = "N2O Outlet Valve"},/obj/effect/floor_decal/corner/white/diagonal{tag = "icon-corner_white_diagonal (EAST)"; icon_state = "corner_white_diagonal"; dir = 4},/obj/effect/floor_decal/corner/red,/turf/simulated/floor/tiled,/area/engineering/atmos) "dib" = (/obj/machinery/atmospherics/binary/pump{dir = 1; name = "N2O to Connector"},/turf/simulated/floor/tiled,/area/engineering/atmos) "dic" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/tiled,/area/engineering/atmos) -"did" = (/obj/machinery/portable_atmospherics/canister/carbon_dioxide,/turf/simulated/floor/tiled,/area/engineering/atmos) "die" = (/obj/structure/closet/toolcloset,/obj/item/device/flashlight,/turf/simulated/floor/tiled,/area/engineering/workshop) "dif" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/hallway/secondary/entry/D3) "dig" = (/obj/structure/table/reinforced,/obj/item/device/radio/off{pixel_y = 6},/obj/item/device/radio/off{pixel_x = 6; pixel_y = 4},/obj/item/device/radio/off{pixel_x = -6; pixel_y = 4},/obj/item/device/radio/off,/obj/structure/extinguisher_cabinet{pixel_x = 25},/turf/simulated/floor/tiled,/area/engineering/workshop) @@ -8467,8 +8530,6 @@ "diJ" = (/obj/structure/table/reinforced,/obj/machinery/cell_charger,/obj/item/weapon/cell/high{charge = 100; maxcharge = 15000},/obj/item/device/flashlight,/obj/item/weapon/wrench,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/engineering/workshop) "diK" = (/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/mechanical{pixel_y = 5},/obj/item/weapon/storage/toolbox/electrical,/obj/structure/window/reinforced{dir = 4},/obj/structure/table/reinforced,/obj/machinery/newscaster{pixel_x = 0; pixel_y = -30},/turf/simulated/floor/tiled,/area/engineering/workshop) "diL" = (/obj/structure/window/reinforced{dir = 8},/obj/machinery/door/firedoor/border_only,/obj/structure/grille,/obj/structure/window/reinforced,/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "atmoslockdown"; name = "Atmospherics Lockdown"; opacity = 0},/turf/simulated/floor,/area/engineering/atmos) -"diM" = (/obj/structure/table/reinforced,/obj/item/device/floor_painter,/obj/item/device/multitool{pixel_x = 5},/obj/item/device/t_scanner,/obj/item/weapon/reagent_containers/spray/cleaner,/obj/machinery/requests_console{announcementConsole = 0; department = "Engineering"; departmentType = 3; name = "Engineering RC"; pixel_x = 0; pixel_y = -32},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/workshop) -"diN" = (/obj/structure/cable/green,/obj/machinery/power/apc{dir = 2; name = "south bump"; pixel_y = -24},/obj/structure/table/reinforced,/obj/item/weapon/crowbar,/obj/item/clothing/gloves/black,/obj/item/weapon/storage/box/lights/mixed,/turf/simulated/floor/tiled,/area/engineering/workshop) "diO" = (/obj/structure/table/reinforced,/obj/item/weapon/storage/belt/utility,/obj/item/weapon/storage/belt/utility,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/obj/machinery/light,/turf/simulated/floor/tiled,/area/engineering/workshop) "diP" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green,/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Engineering Subgrid"; name_tag = "Engineering Subgrid"},/obj/machinery/alarm{dir = 1; pixel_y = -22},/turf/simulated/floor,/area/maintenance/substation/engineering) "diQ" = (/obj/machinery/power/smes/buildable{charge = 0; RCon_tag = "Substation - Engineering"},/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/structure/cable/green{d2 = 8; icon_state = "0-8"},/turf/simulated/floor,/area/maintenance/substation/engineering) @@ -8516,11 +8577,6 @@ "djG" = (/obj/structure/grille,/obj/machinery/meter,/obj/machinery/atmospherics/pipe/simple/visible/red,/turf/simulated/wall/r_wall,/area/engineering/atmos) "djH" = (/turf/simulated/wall/r_wall,/area/engineering/drone_fabrication) "djI" = (/obj/effect/floor_decal/industrial/warning{dir = 9},/turf/simulated/floor,/area/engineering/drone_fabrication) -"djJ" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor,/area/engineering/drone_fabrication) -"djK" = (/obj/machinery/computer/cryopod/robot{pixel_y = 30},/obj/effect/floor_decal/industrial/warning{dir = 1},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djL" = (/obj/structure/bed/chair,/obj/effect/floor_decal/industrial/warning{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Drone Fabrication"; dir = 2},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djM" = (/obj/machinery/ai_status_display{layer = 4; pixel_y = 32},/obj/machinery/light{dir = 1},/obj/effect/floor_decal/industrial/warning{dir = 5},/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"djN" = (/obj/machinery/disposal,/obj/structure/disposalpipe/trunk{dir = 8},/turf/simulated/floor,/area/engineering/drone_fabrication) "djO" = (/obj/item/weapon/storage/toolbox/electrical,/obj/structure/table/steel,/turf/simulated/floor,/area/engineering/drone_fabrication) "djP" = (/turf/simulated/wall,/area/engineering/drone_fabrication) "djQ" = (/obj/structure/cable/green{d2 = 4; icon_state = "0-4"},/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) @@ -8549,7 +8605,6 @@ "dkn" = (/obj/machinery/atmospherics/unary/vent_pump{dir = 1; external_pressure_bound = 0; external_pressure_bound_default = 0; frequency = 1441; icon_state = "map_vent_in"; id_tag = "n2o_out"; initialize_directions = 1; internal_pressure_bound = 4000; internal_pressure_bound_default = 4000; use_power = 1; pressure_checks = 2; pressure_checks_default = 2; pump_direction = 0},/turf/simulated/floor/reinforced/n20,/area/engineering/atmos) "dko" = (/obj/machinery/cryopod/robot{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dkp" = (/obj/effect/landmark{name = "JoinLateCyborg"},/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dkq" = (/turf/simulated/floor,/area/engineering/drone_fabrication) "dkr" = (/obj/machinery/computer/drone_control,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dks" = (/obj/machinery/computer/security/engineering{name = "Drone Monitoring Cameras"; network = list("Engineering")},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dkt" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) @@ -8600,8 +8655,6 @@ "dlo" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dlp" = (/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dlq" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dlr" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor,/area/engineering/drone_fabrication) -"dls" = (/obj/structure/cable/green{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor,/area/engineering/drone_fabrication) "dlt" = (/obj/machinery/door/airlock/engineering{name = "Engineering Drone Fabrication"; req_one_access = list(11,24)},/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/drone_fabrication) "dlu" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dlv" = (/obj/structure/cable/green{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/turf/simulated/floor/tiled,/area/engineering) @@ -8650,7 +8703,6 @@ "dmq" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/turf/simulated/floor,/area/engineering/drone_fabrication) "dmr" = (/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/obj/effect/floor_decal/industrial/warning{dir = 4},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) "dms" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/drone_fabrication) -"dmt" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/turf/simulated/floor,/area/engineering/drone_fabrication) "dmu" = (/obj/machinery/door/airlock/engineering{name = "Engineering Drone Fabrication"; req_one_access = list(11,24)},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/engineering/drone_fabrication) "dmv" = (/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering) "dmw" = (/obj/machinery/atmospherics/pipe/manifold4w/hidden/scrubbers,/obj/machinery/atmospherics/pipe/manifold4w/hidden/supply,/turf/simulated/floor/tiled,/area/engineering) @@ -8714,11 +8766,6 @@ "dnF" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled/dark,/area/hallway/secondary/entry/D4) "dnG" = (/turf/simulated/wall/r_wall,/area/engineering/aft_hallway) "dnH" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/machinery/alarm{dir = 1; icon_state = "alarm0"; pixel_y = -22},/turf/simulated/floor,/area/engineering/drone_fabrication) -"dnI" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor,/area/engineering/drone_fabrication) -"dnJ" = (/obj/machinery/computer/drone_control,/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnK" = (/obj/structure/bed/chair{dir = 8},/obj/effect/floor_decal/industrial/warning,/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnL" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning{dir = 6},/turf/simulated/floor/plating,/area/engineering/drone_fabrication) -"dnM" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -29},/turf/simulated/floor,/area/engineering/drone_fabrication) "dnN" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dnO" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dnP" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8745,8 +8792,6 @@ "dol" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/engineering/aft_hallway) "dom" = (/obj/machinery/atmospherics/portables_connector,/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/portable_atmospherics/canister/air/airlock,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "don" = (/obj/machinery/computer/shuttle_control/engineering{name = "engineering elevator control console"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"doo" = (/obj/structure/table/rack{dir = 1},/obj/item/clothing/suit/fire/firefighter,/obj/item/weapon/tank/oxygen,/obj/item/clothing/mask/gas,/obj/item/weapon/extinguisher,/obj/item/clothing/head/hardhat/red,/obj/item/clothing/glasses/meson,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dop" = (/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/closet/crate,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doq" = (/obj/machinery/power/apc{dir = 1; name = "north bump"; pixel_x = 0; pixel_y = 24},/obj/structure/cable/green{d2 = 2; icon_state = "0-2"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dor" = (/obj/structure/disposalpipe/segment,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dos" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8773,7 +8818,6 @@ "doP" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/alarm{pixel_y = 23},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doQ" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doR" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"doS" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/scrubbers{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doT" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/machinery/atmospherics/pipe/manifold/hidden/supply{dir = 1},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "doU" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/engineering/aft_hallway) "doV" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 4},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8833,11 +8877,6 @@ "dpX" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 9; icon_state = "intact"; tag = "icon-intact-f (NORTHWEST)"},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpY" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 5; icon_state = "intact"; tag = "icon-intact-f (NORTHEAST)"},/obj/effect/floor_decal/industrial/warning/corner,/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dpZ" = (/obj/machinery/atmospherics/pipe/simple/hidden{dir = 10; icon_state = "intact"; tag = "icon-intact-f (SOUTHWEST)"},/obj/effect/floor_decal/industrial/warning,/obj/machinery/access_button{command = "cycle_interior"; frequency = 1380; master_tag = "engineering_dock_airlock"; name = "interior access button"; pixel_x = 30; pixel_y = -25; req_one_access = list(13,11,24)},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqa" = (/obj/machinery/light,/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqb" = (/obj/effect/floor_decal/industrial/warning{dir = 4},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqc" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/blast/regular{density = 0; dir = 1; icon_state = "pdoor0"; id = "englockdown"; name = "Engineering Lockdown"; opacity = 0},/turf/simulated/floor/tiled/dark,/area/engineering/aft_hallway) -"dqd" = (/obj/effect/floor_decal/industrial/warning{dir = 8},/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/machinery/door/airlock/glass_engineering{name = "Engineering Hallway"; req_one_access = list(10)},/obj/machinery/door/firedoor/glass,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) -"dqe" = (/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dqf" = (/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dqg" = (/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/camera/network/engineering{c_tag = "ENG - Hallway Aft Starboard"; dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dqh" = (/obj/structure/disposalpipe/segment{dir = 1; icon_state = "pipe-c"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) @@ -8874,7 +8913,6 @@ "dqM" = (/obj/machinery/atmospherics/pipe/simple/hidden,/obj/machinery/door/airlock/external{frequency = 1380; icon_state = "door_locked"; id_tag = "engineering_dock_inner"; locked = 1; name = "Engineering Dock Airlock"; req_access = list(13)},/turf/simulated/floor/plating,/area/engineering/aft_hallway) "dqN" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/airless,/area/maintenance/portsolar) "dqO" = (/turf/simulated/wall/r_wall,/area/engineering/engine_waste) -"dqP" = (/obj/machinery/door/airlock/maintenance{name = "Engine Waste Handling"; req_one_access = list(10,24)},/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_waste) "dqQ" = (/turf/simulated/wall/r_wall,/area/engineering/engine_smes) "dqR" = (/obj/machinery/door/airlock/maintenance_hatch{name = "SMES Access"; req_access = list(11)},/obj/structure/cable/green{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/engineering/engine_smes) "dqS" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'RADIOACTIVE AREA'"; icon_state = "radiation"; name = "RADIOACTIVE AREA"; pixel_x = 0; pixel_y = 0},/turf/simulated/wall/r_wall,/area/engineering/engine_monitoring) @@ -8914,7 +8952,6 @@ "drE" = (/obj/machinery/embedded_controller/radio/airlock/docking_port{frequency = 1380; id_tag = "engineering_dock_airlock"; pixel_x = 0; pixel_y = 25; req_one_access = list(13,11,24); tag_airpump = "engineering_dock_pump"; tag_chamber_sensor = "engineering_dock_sensor"; tag_exterior_door = "engineering_dock_outer"; tag_interior_door = "engineering_dock_inner"},/obj/effect/floor_decal/industrial/warning/corner{dir = 1},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "drF" = (/obj/effect/floor_decal/industrial/outline/yellow,/turf/simulated/floor,/area/engineering/aft_hallway) "drG" = (/obj/effect/floor_decal/industrial/warning,/obj/machinery/button/remote/blast_door{desc = "A remote control-switch for the engine control room blast doors."; id = "EngineEmitterPortWest"; name = "Engine Room Blast Doors"; pixel_x = 0; pixel_y = 25; req_access = null; req_one_access = list(11,24)},/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22; pixel_y = 0},/obj/machinery/atmospherics/unary/vent_pump/on{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_waste) -"drH" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/engineering/engine_waste) "drI" = (/obj/effect/floor_decal/industrial/warning,/obj/structure/closet/radiation,/obj/item/clothing/glasses/meson,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/camera/network/engine{c_tag = "ENG - Waste Handling"},/turf/simulated/floor/tiled,/area/engineering/engine_waste) "drJ" = (/obj/machinery/power/apc{dir = 8; name = "west bump"; pixel_x = -24},/obj/structure/cable/green,/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers,/obj/machinery/light_switch{pixel_x = -38; pixel_y = 0},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "drK" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/device/multitool{pixel_x = 5},/obj/item/clothing/gloves/yellow,/obj/structure/table/steel,/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/turf/simulated/floor/tiled,/area/engineering/engine_smes) @@ -8972,7 +9009,6 @@ "dsO" = (/obj/effect/floor_decal/industrial/warning/corner{dir = 8},/obj/machinery/atmospherics/unary/vent_pump/high_volume{dir = 8; frequency = 1380; id_tag = "engineering_dock_pump"},/turf/simulated/floor/tiled,/area/engineering/aft_hallway) "dsP" = (/obj/machinery/airlock_sensor{frequency = 1380; id_tag = "engineering_dock_sensor"; pixel_x = 25; pixel_y = 8},/obj/effect/floor_decal/industrial/outline/yellow,/obj/machinery/camera/network/engineering{c_tag = "ENG - Shuttle Access"; dir = 8},/obj/machinery/light/small{dir = 4},/turf/simulated/floor,/area/engineering/aft_hallway) "dsQ" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_waste) -"dsR" = (/obj/structure/cable,/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/power/sensor{name = "Powernet Sensor - Master Grid"; name_tag = "Master"},/turf/simulated/floor,/area/engineering/engine_waste) "dsS" = (/obj/structure/cable{d2 = 8; icon_state = "0-8"},/obj/machinery/power/apc{dir = 4; name = "east bump"; pixel_x = 24},/obj/machinery/light_switch{pixel_x = 38; pixel_y = 0},/turf/simulated/floor,/area/engineering/engine_waste) "dsT" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 5},/turf/simulated/floor/tiled,/area/engineering/engine_smes) "dsU" = (/obj/item/stack/cable_coil,/obj/item/stack/cable_coil{pixel_x = 3; pixel_y = 3},/obj/item/weapon/storage/box/lights/mixed,/obj/structure/table/steel,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 8},/obj/machinery/light{dir = 4},/turf/simulated/floor/tiled,/area/engineering/engine_smes) @@ -9558,7 +9594,6 @@ "dEQ" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_12) "dER" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp/green,/obj/item/weapon/material/ashtray/glass,/turf/simulated/floor/carpet,/area/crew_quarters/bar) "dES" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_3) -"dET" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/sign/directions/security{dir = 1; pixel_x = -32; pixel_y = 0},/obj/structure/sign/directions/science{dir = 1; pixel_x = -32; pixel_z = -8},/obj/structure/sign/directions/evac{dir = 4; pixel_x = -32; pixel_z = 8},/obj/machinery/light{dir = 8},/obj/machinery/camera/network/northern_star{c_tag = "Hall - Central Primary Port Aft 2"; dir = 4},/turf/simulated/floor/tiled/dark,/area/hallway/primary/central_four) "dEU" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_4) "dEV" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_9) "dEW" = (/obj/structure/table/standard,/obj/machinery/atmospherics/unary/vent_scrubber/on{dir = 1},/obj/machinery/computer/security/telescreen/entertainment{icon_state = "frame"; pixel_x = 0; pixel_y = -32},/turf/simulated/floor/wood,/area/crew_quarters/sleep/vistor_room_10) @@ -9638,7 +9673,6 @@ "dGP" = (/obj/machinery/atmospherics/pipe/simple/hidden/yellow,/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/virology) "dGQ" = (/obj/structure/table/standard,/obj/item/weapon/surgicaldrill,/obj/item/weapon/autopsy_scanner,/obj/item/weapon/reagent_containers/spray/cleaner{desc = "Someone has crossed out the Space from Space Cleaner and written in Surgery. 'Do not remove under punishment of death!!!' is scrawled on the back."; name = "Surgery Cleaner"; pixel_x = 2; pixel_y = 2},/obj/item/weapon/FixOVein,/turf/simulated/floor/tiled/white,/area/medical/surgery) "dGR" = (/obj/structure/cable/green{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/effect/floor_decal/corner/lime{dir = 6},/obj/structure/disposalpipe/segment{dir = 8; icon_state = "pipe-c"},/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/patient_wing) -"dGS" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/white,/area/medical/medbay_emt_bay) "dGT" = (/obj/effect/decal/cleanable/cobweb2{tag = "icon-cobweb1"; icon_state = "cobweb1"},/obj/effect/decal/cleanable/cobweb2{icon_state = "spiderling"; name = "dead spider"; tag = "icon-spiderling"},/turf/simulated/floor,/area/maintenance/medbay_aft) "dGU" = (/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor,/area/maintenance/medbay_aft) "dGW" = (/obj/effect/decal/cleanable/vomit,/obj/item/weapon/stool/padded,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor,/area/maintenance/medbay_aft) @@ -9762,11 +9796,11 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyahyahyahyahyahyahyahyamuarParQarRarSarTarUarVarWarXarYarZasaasbascasdamuayZagpagrayZayZagsayZayZauNayZanransansansansagIansansagOagJasrapwanraahagHagWahUagUagPagUagTagUagUaiyagUagUaiOaiNaiMaiMagHaahaahapzassagXasuapzagYabZagZaaNaahaahakzarEarFarGarHarIarJarKarLarMakzaahaahanZahiahhahhahhahhahhahkahjanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyasGasGasGasHasIasJasIasKasGasGamuasLasLasMasNasOasPasNasLasLamuamuamuamuamuamuasLasQasRasRasRasRasRatNayZauNatNanranraqkaqkanranranranransahlahmanranraahagHajiajiagUagPagUahnajeajeajfajeajeajdahpajbahuagHaahaahdEOdEOdEOdEOapzahvabSafwaaNaaNaahakzaqFaqFaqFaqIaqJaqKaqFaqFaqFakzaahaahanZaAJarOanZanZanZanZaAJarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiatiatiatjatkatlatmatnatoatpatqatratsattatuatvatwatxatyatzatAatBatCatDatEatFatGatHatIasQatJatKajYatMasRatNatNahwatNahxanranranranraahaahanrahzatQatRanraeAaahagHagUagUagUahBajzahCagUagUajwagUagUaiOajvajuahDagHaahdEOdEOahHahGahJahIagaabEahLahKaaNaahakzamfatganQaqIaqJaqKatganQathakzaahamXamXamXamXamXanyanxanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUagUajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyatiatiauiaujaukaulaumaunauoaupauqaurausautauuauvauwauxauyauzauAauBauCauBauDauEauFauGauHauGauIasQauJauKauLauMasRaahatNauNatNatNanraahaahaahaahaahanrasTauOasranraahaahagHajUahNahMahWahRahXagUadeajNajMajLagHajKajJagHagHaahdEOahYaibahZaigaicaikaihafwaimaaNaahakzaqFaufaugaqIaqJaqKauhaugaqFakzaahamXaoxanzanzaoyaozanzapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahyahyahyahyahyatiauXauYauZatiavaavbavcavdaveavdavfavfavgavhaviavjavkavfavlavmavnavoavpavqatDavravsavtavuavvavwavxavyavzavAasRaahatNavBatNaahaahaahaahaahaahaahanrasTauOasranraahaahagHagHakbakcagHainahXagUagHakbakcagHagHagHagHagHahyahydEOaioaOqaipairaiqabYafvafwaisaaNaahakzauSauTakzauUauVauWakzauSauTakzaahamXaitanzanzapBaiuapDapEanZaixanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaxsaxsaxsaxsaxsaxsaxsaxsaahatiavKavLavMatiavNavOavdavdavPavQavfavRavSavTavUavTavVavWavXavYavZawaawbawcawdaweaweawfaweawgasQawhawiasRawjasRaahatNauNatNaahaahaahaahaahaahanranrawkaiBawmanranrahyahyahyahyahyagHaiCaiDakfagHahyahyahyaahaahaahahyahyahydEOaiEaiGaiFdEOaaNaiIaiHaiJaaNaaNahyahyahyahyaiKavHavIavJaiKahyahyahyaahamXanwanzanzaquaquaquapEanZarNanZaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyaahaahaahaahaahaahaahaahaxsdFmdFnazHdFoaytayuaxsaahatiawAawBawCatiawDawEavdawFawGawHavfawIawJawKawLawMawNawOawPavmawQawQawRawSatDatEawTawUawVawWasQawXawYasRawZasRaahatNauNatNaahaahaahaahaahatNavCaxaaxbaxcaxdaxeavCavCaxfaxgaxhavCavCaxdavEawnavCavCavCavCavCavCavCaxfaxgaxhavCaiLaiQaiPavCaxkaxlaxmaxdaxnawsawsawsaxoaxpawsavHaxqavJawsaxoaxpawsawsamXaiRanwanwanwanwanwapEanZaiSanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfadeaxHaxIawQawRaxJaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaALaALaALaALaALaALaALaxsdFqdFqazHazHdFrdFraxsaahatiaxtaxuaxvaxwaxxaxyavdavQaxzaxAavfaxBaxCaxDaxEaxFaxGavfaxJaxHaxIawQawRbQCaxKaxKaxKaxKaxKaxKaxKaxLaxLaxLaxLaxLaahatNauNatNatNatNatNatNatNatNaxMawnaxNaxOaxPaxQaiTaxSaxTaxQaxQaxRaxVaiUaiWaiVaiVajaaiVaiVajgajcajhaiVajjaiVajkaiVaiVaiVajaaiVajmajlajnaydayeaygayfayfayhayiajpajoavJaymaymaymaymaypamXajqajtanzanzajxanwanZanZarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALaALaALaALaALaALaxsdFsdFsazHazHdFtdFuaxsaahatiayxayyayzatiayAavbavdayBayCayDavfaEqayFavTayGavTayHayIayJayKayLayMayNayOayPayQayRayPazXaySayPayTayUayVayWayXatNatNauNayYayZayZayZazaazbazcazdawnaxlazeazfazgazkaziazjazjazgazhaziazjazlazjazgazmaznaznaznazoaznaznazpaznazqaznaznaznazmazqazpazrazsaztazuazvazvazvazwazvazvajyajAazvazvazvazvavDavGavFawoawlawlawpajBanZarOarNanZaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaALaALaALdFwdFvdFxaALdFzdFyaxsayrayraBCazHazHazIaxsazJazJazJazJazJazJazKazLazMazMazNazMazMazMazMazOazPazQazRazSazTazUazVavqavqazWayPazYaBiayPaCdaCcayPazZaAaaAbaAcaGWaAeaAfauNaAgatNatNatNaAhazbatNaAiawnaxlaxmaxdaAjaAoaAlawnaAmaAnaAkaApawnaAqawnaAraAkawnawnawnaApawnawnaAsawnaAtawnaAuawnaAkaAvaxlaAwaAxaAyaAzaAAaAAaAAaAAaACaABajCajDayfayfayfajGajEajOajIasYaoAaoAanzajPanZarOajQanZaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaALaALaALdFAaDxaDxaDxdFBdFDdFCaALayrayrazHazHaAMaAMaANaAOaAPaAQaARaASaATaAUaAVaAWaAXaAYaAZaBaaBbazMavfavfavfavfavfaBcaBdaBeaBfaBgaBhayPaDdaDeayPaIoaDgayPaBjaBkaBlayXayXaBmaBnaBoatNatNaKlatNatNatNatNavCaBpaxlaxmaxdaBqavCavCaxfaxgaxhavCavCaBraBsaAiavCavCaBtaBuaBuaBuaBvavCavCavCavCavCavCavCavCaBwaxlaAwaxdaBxawsawsawsawsawsawsawsawsawsawsawsawsawsawsamXajRanzataanzanzataanZaByaBzanZaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9782,18 +9816,18 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGndGoaDxdFPbsdaALaJJaLUaKIaKIaKIaLVaLWaLXaLYaLZaMaaMbaMcaMdaKSaKSaMeaMfaMgaMhaFaaMiaMjaFaaMkaMlaMmaEAaMoaMpaLmaMqaMraMsaMtaLmaLmaMsaLmaLmaLmaLnaFhaahaahatNaMuaHNatNaFmaFmaFmaFmaFmaFmaFmaFmaMvaMwaMxaMyaMzaMAaMBaJkaMCaFoahyaCjaMDaMEaGDaMFaMGaMHaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaMJaEsaMKaMLaMMaMMaMMaMNaMOaMPaMMaMMaMMaMQaMRaJAaKBaKCaKCaMSaMTaMUaKCaKCaKDaGRaMVaDtaFJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGmaDxaDxdGqdGraDxdFPdGsaALaJJaNcaNdaNeaNeaNeaNfaNgaNhaNiaNjaNkaNlaNmaNnaNoaNpaNqaNraNsaFaaNtaNuaFaaNvaNwaFaaNxaNyaFaaLmaNzaNAaNBaNCaNDaNEaNFaNEaLmaNGaFhaFhaahaahatNaNHaNIatNaahaNJaNKaNLaNMaNNaNOaNPaxlaxmawnaFoaNQaNRaJkaJkaNSaFoahyaCjaNTaNUaNVaNWaNXaNYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaMIaLIaNZaOaaObaOcaOdaOdaOdaOeaOdaOfaOdaOgaOdaOhaOiaOjaKBaKCaKCaOkaOlaOmaKCaKCaKDaGRaOnaDtaOoaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALdGtaDxaJGaDxaDxaDxdGvdGuaALaJJaLUaOvaOwaOwaOxaOyaOzaOAaOBaOCaODaOEaOFaMdaOGaOHaKSaOIaOJaOKaOLaOMaFaaONaOOaOPaLmaLmaOQaLmaORaFhaOSaOTaOTaOUaFaaFaaOVaFaaFaaahaahaahatNatNaNIatNaahaNJaOWaOXaOYaOZaOXaPaaxlaxmawnaJjaJkaPbaPcaJkaKuaFoahyaCjaPdakraGDaPfaPgaLGaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaHZaPhaLIaIcaPiaPjaPlaPlaPlaPmaPnaPoaPlaPpaPlaPraPsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaJEaDtaPtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGwaDxaDxaDxaDxaDxaALaALaJJaKIaPxaKIaKIaKIaPyaPzaPAaPBaPCaPDaJQaKVaPEaPFaPFaPFaPGaPHaPIaPJaPKaPLaPMaPNaPOaPNaPPaPQaPNaPRaPSaKxaPUaPTaPWaFaaPXaPYdGLaFaaahaahaahaahatNaHNatNaahaNJaQaaOXaQbaQcaQdaQeaQfaQgaQhaKraJkaQiaJmaJnaQjaFoahyaCjaPdaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaLIaIcaQmaQlaLPaQnaQnaQoaQnaQnaQpaQqaPkaLQaQsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALdGwaDxaDxaDxaDxaDxaALaALaJJaKIaPxaKIaKIaKIaPyaPzaPAaPBaPCaPDaJQaKVaPEaPFaPFaPFaPGaPHaPIaPJaPKaPLaPMaPNaPOaPNaPPaPQaPNaPRaPSaUeaPUaPTaPWaFaaPXaPYdGLaFaaahaahaahaahatNaHNatNaahaNJaQaaOXaQbaQcaQdaQeaQfaQgaQhaKraJkaQiaJmaJnaQjaFoahyaCjaPdaCjaGDaGDaGDaGDaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaKvaLIaIcaQmaQlaLPaQnaQnaQoaQnaQnaQpaQqaPkaLQaQsaJAaKBaKCaKCaKCaKCaKCaKCaKCaKDaGRaKEaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaALaALaALbtpbtobtobtraALaALaahaJJaJJaPxaKIaQtaQuaQvaLXaQwaQxaQyaQzaJQaQAaQBaQCaKSaQCaQDaQEaFhaFhaFhaFhaQFboJaQGaQHaQHaMtaLmaQIaQJaPNaPPaQKaQLaFaaQMaPYaQNaFaaahaahaahaahatNaHNatNaahaNJaNJaQOaOXaQPaQQaNPawnaxmaQRaFoaJkaJkaHVaQSaFoaFoahyaCjaPdaCjaahaahaGDaxWaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaJqaQUaQVaDraQWaClaQnaQnaxYaxXaxZaQnaQnaRaaQnaQnaRbaJAaRcaRdaRdaRdaRdaRdaRdaRdaReaGRaJEaDtaFJaksaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahahyaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaRfaahaahaahaALaALaALaALaALaALaALaALaahaahaRgaRhaRgaRgaJJaJJaJJaJJaJJaJJaJJaRiaRiaRiaPqaRkaPqaRiaRiaRiaahaahaFhaFhaRlaRmaPVaRoaRpaRqaRraPSaKxaRsaRnaRuaFhaFaaFaaRvaFaaahaahaahatNatNaHNatNaahaahaNJaNJaRwaRxaRyaPaawnaxmaRzaFoaRAaRBaGCaFoaFoahyahyaCjaPdaCjaahaahaGDayaaHYaHYaHYaHYaHYaHYaHYaHYaHYaHYaLHaIaaLIaIcaRCaClbZuaREaRFaRGaYSaQnaRHaRGaRIaQnaRbaRJaRKaRKaRKaRKaRKaRKaRKaRKaRKaRLaGRaRMaFJdGJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaROaRPaRPaRPaRPaRPaRPaRPaRPaRPaRQaRfaahaahaahaahaALaALaALaALaALaALaahaahaahaRgaRRaRSaRTahyahyahyahyahyahyahyahyahyaRUaRVaRVaRVaRUahyahyaahaahaahaFhaFhaRWaRXaRXaRYaFhaFhaFhaFhaFhaFhaFhaFhaahaFaaRZaFaaahaahaahatNaSaaSbatNaahaahahyaNJaNJaNJaNJaNJaScaSdawnaFoaFoaFoaFoaFoahyahyahyaCjaPdaCjaCjaahaGDaGDaGEaGFaGFaGFaSeaGFaGFaGFaGFaGHaGDaGIaSfaGKaGLaClaQnaQnaSgaShaSiaSjaSkaSlaSmaSjaRbaSnaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaGRaDtaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaROaRPaSoaSpaSqaSraSsaStaSoaSuaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaSxaSxaSxaSxaSyaSzaRTahyahyahyahyahyahyahyahyahyaSAaSBaSCaSDaSAahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyahyahyaahaahaahaFaaFaaFaaahaahaahatNaSEaSFatNaahaahahyahyahyahyahyaSGawnaxmawnaSGahyahyahyahyahyahyahyaCjaSHaSIaCjaahaahahyahyahyahyahyahyahyahyahyahyahyaDoaFqaSJaFsaFtaClaRDaSKaSLaSMaSNaQnaRHaSOaRIaQnaSPaGRaFCaSQaSRaFFaSSaFFaSTaSQaFCaSUaEvaDtaOoaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaSVaSWaSXaSXaSXaSXaSXaSXaSXaSYaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaSZaTaaTbaTcaTdaTeaRTahyahyahyaTfaTgaThaTiaTfahyaTjaTkaTlaTkaTjahyahyaahaahaahaahaahahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahatNaHNaTmatNaahaahahyahyahyahyahyaTnawnaxmawnaTnahyaToaTpaTqaTraToahyaCjaPdaDnaCjaahaahahyahyahyahyahyahyahyahyahyahyahyaEpbdHaLIaIcaLJaClaQnaQnaQnaQnaQnaQnaQnaQnaQnaQnaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaEvaTtaOoaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaTvaTwaTwaSXaTxaTyaTzaTAaSvaSwaRfaahaahaahaahaahaahaahaahaahaSxaTBaTCaTDaTEaTFaTGaRTahyahyaTfaTfaQraTIaQraTfaTfaTfaTJaTKaTJaTfaTfahyahyaahaahaahaahahyahyahyahyahyahyahyahyahyaTfaTfaTfaTfaTfaahaahaahaahaTfatNaTLatNaTfaahaahaahahyahyahyavCavCaTMaTNaTMavCaToaToaTOaTPaTQaToaToaCjaTRaCjaCjaahaahaahaahahyahyahyahyahyahyahyahyahyaFpaDpaQVaDraQkaClaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaDtaTSaTTaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaRPaRPaTUaTUaRPaRPaRPaRPaTVaRfaahaahaahaahaahaTWaTWaTWaTWaSxaTXaTYaTZaSxaRTaUaaRTaUbaUcaTfaUdaTkaTkaTkaUeaTfaUfaTkaUgaTkaUhaTfaUiaUjaTfaTfaTfaTfaTgaThaThaThaThaThaThaThaTiaTfaUkaUlaUmaTfaTfaTfaTfaTfaTfaUnaUoaUpaTfaTfaTfaTfaTfaUqaUraTfaUsaTkaTlaTkaUtaToaUuaUvaUvaUwaUxaToaUyaUzaUAaClaClaClaClaClaClaUBaUCaUCaUCaUCaUCaUCaUDaClaGIaUEaCnaCoaClaClcllcllcllcllcllcllaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaTWaDtaDtaUFaUGaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaRfaRfaRfaRfaUHaUHaRfaRfaRfaRfaRfaRfaUIaUIaUIaUIaUIaUIaUJaUKaULaSxaTcaUMaSxaSxawqaUOaUPaUNaUNaUQaTkaURaUSaUTaUTaUUaUVaUTaUWaUTaUTaUUaUTaUTaUTaUXaUYaUTaUZaUTaUTaUTaUTaUSaUTaUTaUTaUUaUTaVaaUSaUUaUTaUTaVbaVcaVdaUTaVeaTkaTJaTkaVfaTkaVgaTkaTkaVhaTkaTkaTlaTkaTkaViaVjaUvaUvaVkaVlaVmaVnaVoaVnaVpaVqaVraZQaVsaVtaVnaVnaVuaVvaVnaVnaVwaVxaVyaVnaVnaVzaVAaLIaUAcpZcmkcmlakuaktaktaDtaVCaYcaYdaYeaDtaDtaDtaDtaDtaDtaDtaDtaDtaVBaVCaFJaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaTuaRPaRPaRPaTUaTUaRPaRPaRPaRPaTVaRfaahaahaahaahaahaTWaTWaTWaTWaSxaTXaTYaTZaSxaRTaUaaRTaUbaUcaTfaUdaTkaTkaTkaUhaTfaUfaTkaUgaTkaUsaTfaUiaUjaTfaTfaTfaTfaTgaThaThaThaThaThaThaThaTiaTfaUkaUlaUmaTfaTfaTfaTfaTfaTfaUnaUoaUpaTfaTfaTfaTfaTfaUqaUraTfaVcaTkaTlaTkaUtaToaUuaUvaUvaUwaUxaToaUyaUzaUAaClaClaClaClaClaClaUBaUCaUCaUCaUCaUCaUCaUDaClaGIaUEaCnaCoaClaClcllcllcllcllcllcllaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaTWaDtaDtaUFaUGaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaRfaRfaRfaRfaUHaUHaRfaRfaRfaRfaRfaRfaUIaUIaUIaUIaUIaUIaUJaUKaULaSxaTcaUMaSxaSxawqaUOaUPaUNaUNaUQaTkaURaUSaUTaUTaUUaUVaUTaUWaUTaUTaUUaUTaUTaUTaUXaUYaUTaUZaUTaUTaUTaUTaUSaUTaUTaUTaUUaUTaVaaUSaUUaUTaUTaVbaYIaVdaUTaVeaTkaTJaTkaVfaTkaVgaTkaTkaVhaTkaTkaTlaTkaTkaViaVjaUvaUvaVkaVlaVmaVnaVoaVnaVpaVqaVraZQaVsaVtaVnaVnaVuaVvaVnaVnaVwaVxaVyaVnaVnaVzaVAaLIaUAcpZcmkcmlakuaktaktaDtaVCaYcaYdaYeaDtaDtaDtaDtaDtaDtaDtaDtaDtaVBaVCaFJaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaVDaVEaVFaVGaVHaVIaVJaVKaVLaVMaVNaVOaVPaVQaVKaVKaVRaVSaVTaVKaVUaVKaVPaVVaVWaVVaVRaVKaVXaVYaVZaIxaVYaVYaWbaWcaWdaWeaWdaWfaWbaWdaWdaWdaWgaWhaWdaWdaWiaWdaWdaWfaWcaWdaWdaWaaWbaWdaWjaWcaWbaWqaWdaWgaWdaWkaWhaWlaWdaWbaWdaWiaWdaWcaWdaWdaWmaWdaWfaWnaTkaTkaViaWoaWpbhcaWraWsaWtaWuaWvaWuaWwaWuaWuaWuaWuaWxaWyaWuaObaWuaWuaWuaWzaWAaWAaWAaWBakvaWuaWuakxakwakyakyakLakBakMakDaWGakIaWGaWGaWGaWGaWGakSaWGaWGaWGaWGaWGaWGaWGaWJaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaWKaWLaWMaWNaWLaWOaWPaUNaWQaUNaWRaUNaWSaUNaWTaWUaWVaWWaWXaWYaWZaXaaXbaXcaXdaXeaXfaXgaXhaXiaXjaXkaXlaXmaXnaXmaXmaXmaXmaXoaXnaXmaXmaXpaXmaXqaXmaXmaXraXmaXmaXsaXtaXuaXmaXvaXnaXwaXxaXyaXzaXyaXyaXyaXAaXBaXCaXDaXEaXFaXGaXHaXmaXIaXtaXJaXKaTkaXLaTkaTkaTkaViaUvaXMaXNaXOaXPaXQaXRaXSaLIaLIaXTaLIaLIaXVaSfaXWaLIaLJaLIaXXaLIaXYaXZaXVaXUaYaaLIaLIaLIaUAcpZakTakKakPakUcomaDtaDtaDtaDtaDtaDtaDtaDtaFJaVCaDtaDtaDtaDtaDtaDtaDtaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwaYIaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaUAaUAaClaClcllaldakValCalsakWdEoakYakXalaakZalcalbdEoaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaazGazGazGazGazGaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaRfaRfaYfaYgaYhaYiaYjaRfaRfaRfaRfaYkaYlaYmaRfaUIaUIaUIaUIaUIaUIaUbaYnaYnaYnaUcaUIaUIaYhaTfaYoaYpaYqaYraYsaTfaYtaTkaTkaTkaYuaTfaTfaTfaTfaTfaTfaYvaYwaUgaYxaYvaTfaTfaTfaTfaTfaTfaYyaYzaYAaTfaUqaYBaUraTfaTfaUqaYBaUraTfaYCaYDaYEaTfaUqaYBaUraTfaTfaUqaYBaUraToaRjaYGaYHaUwbgiaToaClaYJaYKaYLaClaYJaYKaYLaClaClaClaYMaUAaClaClaClaClaClaClaUAaUAaUAaClaClcllaldakValCalsakWdEoakYakXalaakZalcalbdEoaFJaVCaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaazGazGazGazGazGaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaRfaRfaRfaRfaRfaRfaRfaahaahaRfaYOaYOaYOaRfaahaahaahaahaYPaYQaYRaYRaYRaYRaYRbewaYPahyaTfaTfaYTaYUaYVaTfaTfaTfaYWaYXaYYaTfaTfaahaahaahaahaahaYZaZaaZbaZcaYZaahaahaahaahaahaTfaZdaZeaZdaTfahyahyahyahyahyahyahyahyaZfaZgaZhaZiaZfahyahyahyahyahyahyahyahyaToaToaZjaZkaZlaToaToahyahyahyahyahyahyahyahyahyahyaClaYMaUAaClaahaahaahaahaZmaZmaZnaZmaZmaahcllclldEoamddEodEodEoakYalealgalfaloalbdEoaFJadfaDtaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpaZqaZraZoaahaahaahaahaYPaZsaZtaZuaZvaZwaZxaYRaYPahyahyaZyaZzaZAaZBaZyahyaTfaUiaThaTiaTfaahaahaZCaZCaZCaZCaZDaZDaZEaZDaZDaZFaZFaZFaZFaahaZdaZGaZHaZdahyahyahyahyaZIaZJaZKaZLaZIaZIaZMaZNaZOaZIaZIaZJaZKaZLaZIahyahyahyahyaZPaYGaYHaUwbaAaZRaZRaZSaZTaZUaZRaZSaZTaZUaZRaZRaZRaZVaZRaZRaahaahaahaahaahaZmbdOaZXaZmaahaahdEoalpamEalralualtalxalwalzalyalyalAdEoamFaDtaTWaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZYaZZbaaaZoaahaahaahaahaYPbabbacbadbaebafbagbahaYPahyahybaibajbakbalbamahyahyahyahyahyaahaahaahaZCbanbaobapaZDbaqbarbasaZDbatbaubavaZFaahaZdaZGbaxaZdahyahyahybayaZLbKzaYFaTHbaCbKMbaEbaFbaGbaHbaIbawbazbhAaZJbaMahyahyahybaNaYGaYHaUwbdwbaLbaBbaPbaObaRbaQbaPbaSbaRbaTbaWbaVbcPbaXaZRaZRaahaahaahaahaZmanbbbcaZmaahaahdEoalBaWCalyalLalDalyalPalZalyambamadEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9801,22 +9835,22 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdaaaaaabbdaaaaaaaaabbdaaaaaaaaaaaaaaabbdaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZobccbcdbceaZoaahaahaahaahaYPbcfbcgbchbchbchbcibfvbcjbckbclbclbcmbcnbcobamahyahyaahaahaahaahaahaahaZCbcpbcqbcraZDbcsbctbcuaZDbcvbcwbcxaZFaahaahaZdaZHaZdahyaZIbcybbEbbFbfMdCqbbGbbGbczbcAbcBbcCbcDbbGbbGbgHdCrbbLbbEbcyaZIahyaTobcEbcFbcGbcHbcLbcKbcNbcMbcNbcQbdzbdybdzdCsbdDbcObaZdCtbdEaZRbcRbcRbcRbcRaZmaWFbcTaZmaahaahdEodEBaYbalyamWamVanaamZdEodEodEodEodEoaZWaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaZoaZpbcUaZoaZoaahaahaahaahaYPbcVbcWbcXbcYbcZbdabdbbdcbddbdebdebdfbdgbdhbaiahyahyaahaahaahaahaahaahaZCbdibdjbdkbdlbdlbdmbdlbdlbdnbdobdpaZFaahaahaZdaZHaZdahybdqbaJbbFbfMdCqbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbgHdCrbdsbaKbdqahyaTobdubdvaUwbdwbaLbdFbfkbdGbLZbdIbWObNGbiVbYuaZRccRcsWdCucwuaZRbdJbdKbdLbcRbdMaYNbdOaZmaahaahaZmaZmaZmbcSaZmaZmaZmaZmaZmaahaahaahaZmaZWaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaabbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbdPbdPbdPbdPbdQbdRbdSbdTaahaahaahaahaYPaRtbdVbdWbdXbdYbdXbdZbeabebbecbecaZzbcnbedbeebefbefbefbefbefaahaahaahaZCaZCaZCaZCbdlbeibeUbeibdlaZFaZFaZFaZFaahaahaZdaZHaZdahybejbiHbfMdCqbbGbelbbGbembenbbGbbGbbGbeobepbbGbelbbGbgHdCvbiFbejahyaZPbesbetaUwaToaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRaZRbkjbevbuJbcRbdMaYNbdOaZmaahaZmaZmbexbeybdOantbdObezbeAaZmaZmaahaahaZmaZWbIUaZmaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNbbObetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMaYNbfmaZmaZmaZmbdObdObdObdObdObdObdObdObdOaZmaZmaZmaZmaZWbdObdNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetaUwaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbdObdObdObdObdObdObgkbgkbgkbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbeBbeCbeDbdPbeEbeFbeGbdTaahaahaahaahaYPaYPbeHbeIbeJbeKbeLaYPaYPbbmbbnbbobeMbcnbeNbeebeObePbeQbeRbefaahaahaahbegbegbdlbdlbehbeTbeUbeTbeSbdlbdlbegbegaahaahaZdaZHaZdahybcybiHdCwbeqbbGbbGbeVbeWbbGbbGbbGbbGbbGbeXbepbbGbbGbbGdCxbiFbcyahybaNaYGbetbeYaToaahaahbeZbeZbfaaFLbeZbfcbfdbfedGObfgbfhbfibfjbcRbkhbevbevbflbdMaYNbfmaZmaZmaZmbdObdObdObdObdObdObdObdObdOaZmaZmaZmaZmaZWbdObdNaZmaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbfqbfrbfsbdPbftbfucxEbdTaahaahaahaahaahaYPaYPbfwbfxbfyaYPaYPahyahyahybfzbfAbcnbfBbeebfCbfDbfEbfFbefbefaahaahbegbegbdlbfGbeTbfHbfIbfJbeTbfKbdlbegbegaahaahaZdaZHaZdahyaZIbfLdCybbJbbGbeVbfNbfObbGdCzdCzdCzbbGbjlbfPbfQbbGbbGdCAbfSaZIahybbNaYGbetbmQaToaahaahbeZbfTbfUbfVbfWbfXbfYbfZbfZbgabgbbgcbgdbgebgfbggbghbcRbdMbdObdObdObdObdObdObgkbgkbgkbgkbgkbgkbgkbdObdObdObdObdObglbfpbdOaZmaahaahaahaahaahaahbgmbgmbgmbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbgnbfrbgobdPbgpbgqbgrbdTaahaahaahaahahyahyahyahyahyahyahyahyahyahybbobbobgsbcnbgtbeebefbgubgvbgwbgxbefaahaahbegbegbdlbgybeTbeibgzbeibeTbgAbdlbegbegaahaZdaZdaZHaZdahyaZIbgBdCBbfRbbGbgCbbGbbGdCCbgDbgEbgFdCDbbGbbGbgCbbGbgGbgHdCEaZIaZfaTobgIbgJbgKaToaToaahbeZbgLbgMbgNbgObgPbgQbgRbgSbgTbgUbgVbgWbgXbgYbgYbgYbgYbgYbgYbgZbgZbgZbgZbgZbgkbhabhbbmzbhdbhebgkbhfbhfbhfbhfbhfbhfbglbfpaZmaahaahaahaahaahbgmbgmbhgbhhbhibhhbhjbgmbgmaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbdPbhkbhlbhkbdPbhmbfubhnbhobhobhobhoaahaahaahahyahyahyahyahyahyahyahyaZycrkbajbhqbhrbhsbefbhtbgvbgwbhubefaahaahbegbegbdlbhvbhybhxblrbhwbeTbhvbdlbegbegaahaZdaZGaZHaZdahybdqbaUdCFbbGbbGbbGbbGdCGbgDbhAbhAbhAbgFdCFbbGbbGbbGbhBbbGbhCbhDbhEbhFbhGbetaUwbhHaToaahbeZbhIbhJbgNbhKbhLbhLbhLbhLbhMbhNbgVbhObhPbgYbhQbhRbhSbhTbgYbhUbhVbhVbhWbgZbhXbhYbhYbhZbhZbhYbiabhfbibbicbidbiebhfbdOaZWaZmaahaahaahaahaahbgmbifbigbihbiibijbikbifbgmaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahbilbilbilbilbilbilbilbilbilbimbinbiobipbeEbfubinbhobiqbirbhobhobhoaahaahahyahyahyahyahyahyahybambisaZzbitbiubdebivbiwbixbgwbhubefaahaahbegbegbdlbiyblsbizbiAbiBbltbiCbdlbegbegaahaZdbiDaZHaZdahybejbdrdCFbbGbbGbbGbbGdCGbiFbhAbdtbhAbiHdCFbbGbbGbbGbiIbiJbiJbiKbiLbiMbiNbiObiPbiQaToaahbeZbfTbiRbiSbeZbiTbiUblObiWbxjbfhbzjbhObiYbgYbiZbjabjbbjcbgYbSjbjebjfbjgbgZbjhbjibjjbjkbpybjmbjnbhfbibbjobjpbjqbhfbjrbjsaZmaahaahaahaahaahbgmbjtbjubjvbjwbjvbjubjxbgmaahaahbgmbgmbgmbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahbilbjybjzbjAbjBbjCbjDbjEbilbjFbjGbjHbjIbjJbjKbjLbhobjMbjNbjObjPbhoaahaahaahahyahyahyahyahyahybaibjQbjRbjSbhrbecbjTbjUbjVbgwbhubefaahaahaahaahbjWbjWbjWbjWbjXbjWbjWbjWbjWaahaahaahaZdbjYaZHaZdahybcybaUdCFbbGbbGbbGbbGdCGbjZbhAbhAbhAbkadCFbbGbbGbbGbkbbbGbbGbkcaZibkdaYGbetaUwbkeaToaahbeZbkfbkgblRbeZbfhbfhbfhbfhbkibfhbALbkkbklbgYbkmbknbkobkpbgYbkqbkrbksbktbgZbkubkvbkwbkxbkybkzbkAbkBbkCbkDbkEbkFbhfbdObkGaZmaahaahbgmbgmbgmbgmbkHbkIbkHbkJbkHbkKbkHbgmbgmbgmbgmbkLbkMbkNbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahblubjWbjWbjWbjWblvbjWbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJdGQblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahblubjWblwbmNblxbmQbmObmSbmRbjWbjWaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkaybbobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahbjWbjWbjWbomboobukbopbmPborboqbjWbjWbjWaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIbTzboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahbjWbjWbjWbukbukbpIbpIbpIbonbukbjWbjWbjWaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZaycbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbMNbrfbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahbjWbjWbpHbukbukbpIbpJbpIbonbukbpObjWbjWaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahbjWbjWbjWbukbukbpKbpLbpKbonbukbjWbjWbjWaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkawrbtmboObtnaCsaCuaCtaCuaDwboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbyTbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbMKbtWbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahbjWbjWbjWbpMboobpIbpIbpIbqHbpNbjWbjWbjWaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNdCPdCOdCzdCzdCzdCNdCPdCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusbutbuubuvbsXbuwbuxbuybuzayjaykbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbmobmpbmqbmpbmobkRahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahbdTbvlbvmbvnbMNbvobvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbrxbukbrzbrybsQbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObosbuqbvQboNbvSbvTbxbbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWbjWbsRbsTbsSbjWbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyaahaahahyahyahyahyaahaahaahaahbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbyibyjbykbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaTobbObynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbySbIxbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkObkPbkRbkQbkSbkPbkPahyaahaahaahaahaahaahaahaahaahbilbkTbkUbkVbkWbkXbkYbkZblablbblcbldbleblfblgblhbhoblibljblkblkbhobllbllbllbllahyahyahyahyahybbobboblmblnblobeebefblpbjVbgwblqbefaahaahaahbjWbjWbjWbjWbopblvbopbjWbjWbjWbjWaahaahaZdaZdaZHaZdahyaZIblydCwbeqbbGblzbbGbbGdCrbjZblAbkabfMbbGbbGblzbbGblBdCHdCIaZIaZfaToaZjblDaZlaToaToaahbeZblEblFblGbeZblHblIblJdGQblLblMblNbhOblWbgYbgYblPblQbpabgYblSblTblUblVbgZbrKbhZbhYblXbhYbhYblYbhfblZbmabhfbmbbhfbmcaZWaZmaahbgmbgmbifbmdbkHbmebmfbmgbmhbmibmfbmgbmjbkJbmkbmlbmibmmbmgbmnbgmbgmaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkPbmobmpbmqbmpbmobkRahyahyaahbkPbkPbkPbkPaahaahaahbilbmrbmsbjAbmtbmubmvbmwbilbmxbfubmybdTbrebdTbrebhoblibmAbmBbmCblkbmDbmEbmFbllbmGbmHbmIbllahyahyaZyaZzbcnbhrbeebmJbmKbmLbmMbefbefaahaahaahbjWbjWblwbmNblxbpHbmObmSbmRbjWbjWaahaahaahaZdaZHaZdahyaZIbmTdCJbbJbbGbfPbfQbmUbbGbdCbdCbdCbbGbmUbeVbfNbbGbbGdCKbmVaZIahyaZPaYGaYHaUwaToaahaahbeZbmWbmXbmYbmZbnabnbbncbncbndbnebnfbngbnhbnibgYbnjbnkbnlbgYbnmbnnbnobnpbgZbnqbnrbhYbnsbhYbntbnubhfbnvbnwbhfbnxbhfbnyaZWaZmaahbgmbnzbnAbnBbnCbnDbnEbnDbnFbnDbnGbihbnHbkJbnIbnJbnKbnLbihbnMaFMbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabnObnPbnQbnRbnRbnPbnSbnTbkPbkPbkPbnUbnVbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbftbfubnWbdTbnXbnYbnZblkblkaybbobbocblkbodboeboebofbogbohboibllahyahybamaZzbcnbojbeebmKbmKbokbolbefaahaahaahbjWbjWbpJbombpLbmPbpObmPborboqbrxbjWbjWaahaahaZdaZHaZdahybdqbiHdCBbfRbbGbbGbfPbfQbbGbbGbbGbbGbbGbembeWbbGbbGbbGdCxbdxbdqahybaNbbObotbouaToaahaahbeZbgLbovbgNbowboxboybozboAboBboCbgVbhOboDboEbgYboFboGboFbgYboHboIbTzboKbgZbgkboLboMbdAboLboMboOboOboOboOboOboOboOboOaZWaZmaahbgmboPboQboRbkHboSbmfanuboUboVboWbmmbmgbkHbmibmmboXboYboSboZbuPbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQbmqbpbbpcbpcbmqbpdbpebpfbpgbphbpibpjbpkbplbpmbpnbpobppbpqbprbprbpsbprbptbpubpvbpwbpxbMKbpzbpzbpzbpAblkblkbpBblkblkbpCbpDbpEbpEbpEbpFbpGbllahyahybamaZzbcnbfBbeebefbefbefbefbefaahaahaahbjWbjWbrybukbonbpIbpIbpIbonbukbrzbjWbjWaahaahaZdaZHaZdahybejbiHdCDdCLbbGbelbbGbfPbenbbGbbGbbGbeobeWbbGbelbbGdCHdCMbdxbejahybbNaYGaYHaUwbpPahyaahbeZbpQbpRbgNbpSbpTbpUbpVbpVbpWbpXbpYbpZbqabqabqbbqcbqdbqcbqebqcbqfbqgbqhbqibqjbqkbqhbqlbqmbqnboObqoaCqbqqbqrbqsbqtboOaZWaZmaahbgmbqubqvbqwbkJbqxbqybqzbgmbqAbqBbqCbqCbqDbsnbqCbqEbqFbqGboZaycbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAacOacAacAacAacAacAacAacAacOacAacAacAacAaaaaaaacAacAacAaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabqIaadahybkQbnPbqJbpcbpcbqKbqLbqMbqNbqObqPbqQbqRbqSbqTbqUbqVbqTbqWbqXbqTbqYbqZbrabrbbrcbrdbgqbinbMNbrfbrgbpzbrhbrebribrjbrkbrlbrmbrnbrobrpbrqbrrbrsbllahyahybambrtbrubrvaZyahyahyahyahyahyahyaahaahbjWbsQbsRbukbonbpKbsSbpKbonbukbxbbsTbjWaahaahaZdaZHaZdahybcyaTsbrBdCDdCLbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGbbGdCHdCCbrCbdBbcyahyaTobrEaYHbrFbrGahyahybeZbfTblFbrHbeZbrIbrJbvUbrLbEEblMbrNbrObrPbrQbrRbrSbrTbrSbrSbrSbrUbrVbrWbrXbrYbrZbrYbsabrYbrYbsbbscaCrbsebsfbsgbsgboOaZWaZmaahbgmboPbshboRbkHbmibsibsjbskbslbmmbmmbsmbkHbuYbmmbsobspbmiboZbsqbgmaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaaaaadaadaaaaadaadaadaaaaadaadaadaaaacAaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabsrahyahybssbmqbstbpcbpcbmqbsubsvbswbsxbsybszbsAbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbkPbsBbfubsCbdTbekbsEbsFbsFbsGbsHbsIbsJbrlbsKbrnbsLbsMbsNbrrbsObsPahyahybamaZzbcnbhrbamahyahyahyahyahyahyaahaahbjWbjWbrybukbRVbpIbTDbpIbonbukbrzbjWbjWaahaahaZdaZHaZdahyaZIbdqbbEbsVdCDdCLbbIbbJbbKbbGbbGbbGbbIbbJbbKdCHdCCbrCbbEbdqaZIahyaZPaYGbetaUwbrGahyahybeZbeZbsWbeZbeZblMblMblMbsXbsXbsXbsXbsYbsZbsXbsXbtabtbbtcbtdbtdbtebtfbtbbtgbthbtibtjbtkawrbtmboObtnaCsaCuaCtaCuaDwboOaZWaZmaahbgmbtsbttbnBbtubnDbtvbnDbtwbmmbtxbmmbtybkJbyTbijbtzbtAbtBbtCbtDbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaacAaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaabtEbtFbtGaaaacAaadaadaaaaaaaaaaaaaaaaaabtHbtIbtJbtKaaaaaabtLbtMbtNbtLbtLbtObnPbnQbtPbtQbnPbtRbnTbkPbkPbkPbtSbnTbkPaahaahaahaahaahaahaahaahaahaahaahbdTbtTbtUbtVbMKbtWbtXbtYbpzbtZbeEbuabubbucbudbuebufbufbufbugbuhbuiahyahybamaZzbcnbhrbamahyahyahyahyahyaahaahaahbjWbjWbVfbpMboobpIbpIbpIbqHbpNcgdbjWbjWaahaahaZdaZHaZdahyahybbMbaMbbEbsVdCDdCNdCPdCOdCzdCzdCzdCNdCPdCOdCCbrCbbEbaybbDahyahybaNbdubdvbunbrGahyahybuoberbuqburbusbutbuubuvbsXbuwbuxbuybuzayjaykbuCbuDbuEbuFbuGbuHbuIbtfbHXbuKbuLbuMbuNbuObuLbuNboObwxbuQbuRbuSbuTbuUboOaZWaZmaahbgmbgmbifbuVbkHboSbuWbmmbmfbmmbmmbtCbuXbkJbCQbwubuZbvabsmbvbbgmbgmaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadbtEbvcbtGaadacOaaaaadaadaaaaaaaaaaaaaaabtHbtHbvdbvebtHbvfbvgbvhawxbvjbvkbkPbmobmpbmqbmpbmobkRahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahbdTbvlbvmbvnbMNbvobvpbvqbvrbMKbvsbvtbvubvvbvwbvxbvybvzbvAbvBbvCbllahyahybaiaZzbMObhrbaiahyahyahyaahaahaahaahaahaahbjWbjWbrwbpMckQcoFclHcqpbrMbjWbjWaahaahaahaZdaZHaZdahyahyahybbMaZLbaJbgEbgEbvGbvHbiEbhzbiEbvKbvLbgEbgEbiGaZJbbDahyahyahybbNaYGbRLaUwbvNahyahybvObosbuqbvQboNbvSbvTcqsbsXanvbvWbvXbvYbvYbvZbwabwbbwcbwdbwebwebwfbwgbQwbwibwjbwkbwlbwmbwnbwoboObwpbwqbwrbtqbwsbwtboOaZWaZmaahaahbgmbgmbgmbgmbAQbwvbwwbmfbyUbwybwzbkJbkJbGRbkJbwAbwBbwCbgmbgmaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabbdbbdbbdbbdbbdbbdbbdaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaadaadaaaaaaaaaaaabtHbwDbwEbwFbtHbwGbwHbwIbwJbwKbwLbkObkPbkRbkQbkSbkPbkPaahaahahyahyahyahyahyahyaahaahbwMbwMbwMbwMbwMbwMbwMbwMbwMbwNbwObwPbdTbrAbwRbwSbwTbMNbwUbuabsCbucbwVbwWbwXbllbwYbwZbwYbllahybeebeeblmblnblobboahyahyaahaahaahaahaahaahaahbjWbjWbjWcuwcuvcvjcuHcvCbjWbjWbjWaahaahaZdaZdaZHaZdaZdahyahyahyaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIaZIaZJaZKaZLaZIahyahyahyahyaToaZjblDaZlaToaToahybxcbxdbxebvSbxfbxgbxhbxibsXanAbxkbxlbxmbvYbvYbxnbqhbxpbxqbthbthbxrbtfbxsbxtbxubxvbxwbxxbADbvRboOboOboOboObxAboOboOboOaZWaZmaahaahaahaahaahbgmbxBbxCbkJbxDbkJbxBbxEbkJbxFbxGbkJbxHbxIbkJbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaadaadaaaaaaaaabtHbxJbxKbxLbtHdDfbxMbxNbxObxPbxQbtLaahaahaahahyahyaahaahahyahyahyahyaahaahaahaahbwMbwMbxRbxSbxTbxUbxVbxWbxXbwMbxYbxZbyabdTbybbycbydbyebdTbyfbuabygbyhbyhbyhbyhbyhbyibyjbykbyhbfzbeebylaZzbcnbymbboaZdaahaahaahaahaahaahaahaahaahbjWbjWbjWbvDbjWbjWbjWbjWbjWaahaahaZdaZdaZGaZHaZGaZdaZdahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZdaToaYGbynbiPbyoaTobypbyqbyrbysbytbyubyvbywbyxbyybyzbyAbyBbyCbvYbxobsXbyEbtbbyFbyGbyHbyIbyJbyKbyLbyMbyNbxybyPbyQbyRbySbIxbCLbyVbyWbyXbyYbySaZWaZmaahaahaahaahaahbgmbyZbzabzbbzcbzdbzebzfbzgbzhbzibkJdkQbzkbzlbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaabtEbvcbtGaaaaadaaaaaaaaaaaaaadbzmbznbznbznbznbzobtHbtHbtLbzpbzqbzrbzsawybtLaahaahaahaahahyahyahyahyahyahyaahaahaahaahaahbwMbzubzvbzwbzxbzybzzbzAbzBbzCbzDbzEbzFbzGbzHbzIbzJbzKbzLbzMbzNbzObzPbzQbzRbzSbzPbzTbzUbzVbzWbzXbzYbecbajbhqbhrbzZaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaahaahblubxablubluaZdaZdaZdaZdaZdaZdbAabAbbAcbAdaZGaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdaZdbAebAfbAgbAhaUvbAibAjbAkbvSbAlbvSbAmbxgbAnbAobuCbApbAqbArbAsbAtbAubuCbAvbAwbqmbAxbAxbAybtfbAzbwibAAbABbACbADbAEbAFbySbAGbAHbAIbyWbyWbAJbySbAKaZmaahaahaahaahaahbgmbgmdkRbAMbANbAObAPcBYbARbASbATbAUbAVbAWbAXbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaivaadaaaaadaaaaaaaaabAZbBabBbbBcbBdbBebBfbBgbBhbBibtLbBjbBkbBlbBmbztbtLaahaahaahaahaahahyahyahyahyaahaahaahaahaahaahbwMbBnbzwbBobBpbBqbBrbBsbBrbBtbBubBvbBwbBxbjJbBybjJbBzbjJbjJbBAbBBbBCbBDbBEbBFbBGbBHbBIbBJbBKbBLbBMbBNbBObBPbBQbBRbBSbBTbBUbBUbBUbBUbBVbBUbBWaZdaZdaZdaZdbBXaZdaZdaZdbBYbBZbBZbBZbBZbBZbCabCbbCcbCdbCdbCdbCdbCdbCdbCdbCebCdbCdbCdbCfbCgbCgbCgbCgbCgbCgbCgbCgbChbCgbCibCjbCkbClbCmbbRbCnbCobCpbCqbCrbvQbCsbvSbCtbCubwabCvbCwbCxbCzbyDbCybwabCBbCCbCDbCEbCEbCFbCGbwhbxtbCHbCIbCJbCKbIcbySbySbCMbCNbCObCPbyWbAJbySbAKaZmaahaahaahaahaahaahbgmbgmbgmbJJbCRbgmbgmbgmbgmbgmbgmbCSbCTbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbCUbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbAYbCVbCVbCVbCVbCVbCZbDabDbbDcbDdbDebDfbDgbDhbDibDjbtLbtLbDkbtLbtLbDlbtLaahaahaahaahaahaahaahahyahyaahaahaahaahaahaahbwMbDmbDnbDobDpbDqbDrbDsbDtbwMbDubDvbDwbDxbDybDzbDAbDBbDCbDDbDEbDFbyhbDGbDHbDIbDJbDKbDLbzVbzWbzXbzYbecbecbDMbDNbDOaZdbDPbDQbDRbDSbDTbDUbDVbDWbDXbDYbDZbEabEbbBUbBUbBUbEcaZdaZdaZdaZdaZGbEdbEebEfbEgbEgbEgbEgbEgbEgbEgbEhbEgbEgbEgbEibEjbEjbEjbEjbEjbEjbEjbEkbiDbjYaZdbElaYGbetbEmaVlbEnbEobEpbEqbErbEsbEtbEubEvbEwbsXbsYbsZbExbsYbEybsZbsXbEzbtbbyFbyGbyHbEAbtfbEBbuKbECbEDbuKbySbySbySdBabEFbEGbEHbEIbyWbAJbySbAKaZmaahaahaahaahaahaahaahbgmbEJbEKbELbgmaahaahaahaahbgmbgmbgmbgmaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -9827,80 +9861,80 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadbtEbGAbtGaadacAaaabLjaahbLkbLkbLlbkQbkQbkQbLmbLkbLkahyaahaahaahbtHbLnbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbwMbLobLpbLqbGJbLrbGJbLsbwMbwMbLtbfubImbFibLubLvbLwbLxbLybGYbLCbLBbIvbIubIubIubKbbIvbIubLEboTahyahybKdbLGbhqbecbKebHcbLHbLIbKhbLJbLKbLLbLMbLNbLObLPbLQbLRbLSbLTbLUbLVbHjaahaahaahaahaZdaZdaZHbEgbEgbLWbEgbEgbEgbLXbLYcAgbMabKxbMbcuBbMdbMebMfbMgbMhbKBbKBbMibKDahyahybvNbMjbgJaUvbvNahyahybMkbMlbMmbKJbOcbMkbMkbMkbMkaPubMqbMrbMsbMtbMsbKSbMubMvbMwbMxbKWbMybMzbMAbMBbMCbMDbMEbMFbMGbOdbMIbMJbRXbMLbMMdFecbabUSbMQbMRbMSbMTbMUbMVbMWbMXbMYbMZbNabNbbNabNcbLdaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaabtEbNdbtGaaaaadaadbLjaahbLkbNebNfbNgbNfbNgbNfbNebLkahyahyaahaahbtHbNhbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahbtHbtHbtHbwMbwMbwMbwMbwMbwMbwMbwMbwMbNibNjbfubyfbGMbNkbNlbNmbLxbNnbGYbPkbNsbRfbPnaxraxUbRibRfbRkbRjbLFahyahybKdbecbDMbDNbKebNtbFubNubKhbNvbNwbNxbKhbNybFubNzbNAaGUbNCbNCbNCbNCbNCbNCbNCbNCaahaahaZdaZHbEgbNDbNEaMYaMXbNHbFJbFJaMZbFJbNJbEgbNKbNLbNMbNNbNObKBbNPbNQbNRbNSahyahyaTobNTbetbNUaToahyahybMkbNVbNWbNXbNYbSkbUXbMnbMobNBbMqbMrbOebOfbOgbKSbOhbOibOjbOkbKWbOlbOmbOnbOobOpbOqbOrbOsbOtbOtbOubOvbOqbOtbOwbOtbOxbOybOzbOAbOBbOCbODbOEbOEbOFbOEbOGbOHbOIbOJbOKbLdaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaadaaaaadaadaahaahaahbOLbOMbONbOObOPbOQbOLbORahyahyaahaahbtHbOSbIibOTbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbOUbOVbOWbOXbOYbOZbzHbPabPbbPcbPdbPebPfbPgbImbInbIobPhbPibLxbPjbGYbSRbSQbSSbNqbNqbNrbNpbSSbRlbSTbGYahyahybKdbecbcnbecbPobHcbFubPpbKhbPqbPrbPsbKhbPtbFubPubPvbPwbNCbPxbPybPzbPAbNCbPBbNCbNCaahaZdaZHbEgbPCbPDbPEbPEbPFbPEbPEaNabFJbPHbEgbPIbPJbPKbPLbPMbPNbPIbPJbPKbEjbPObPPaToaZjblDbHCaToaToahybMkbPQbPRbPSbPTbPUbPVbPWbPXbPYbPZbQabQbbQcbQdbKSbQebQfbQgbQhbKWbQibQjbQkbMBbQlbQmbQnbQobQpbQqbQrbQsbQtbQpbQubQvdGRbMPbMQbQxbQybQzbMUbMVbWWbQBbOJanDbQDbQEbOJcAfbLdaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgaynbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUbRVbRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYbUDbPlbPmbNpbNpbSzcpCcpubRlbXTbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCbTDbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbUQbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvbVfbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsdGSbKNbKNbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpbWqbULbWrbWsbWsbWtbWubUGbWvbWwbUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbWFanEbWHbWIbWJclZbWLbWKbTwbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNaahaahaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhcccbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkcqEbYmbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbZtbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbUEbXObUBbUBbXPbXQbXRbXRbXRbXSdHwbUEahyahyanIbecbcnaZzdHyahycaocapbZecaqcarcarcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdbYpanJaZdcaAbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNbeubZMbZMbZMbZMbeuaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZbJTcbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaczaczacAaczaczacOacAaadaadaadaadaaaaaaaaaaadaadaadacOaadaaaaahaahaahbNgbQFbQGbQHbQHbQIbNgahyahyahyaahaahbtHbQJbQKbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQLbQMbQNbQObQPbQQbQRbQSbQTbQUbQVbQWbQXbQYbQZbyfbJRbRabRbbRcbRdbRebGYbNobNpbNpbNpbNpbNpbNpbNpbRlbSUbGYahyahybKdbecbcnbRmbRnbRobRpbRqbRrbRsbRtbRubRvbRwbFubRxbPvbRybNCbRzbRAbRBbRBbRCbRDbREbNCaahaZdaZHbEgaynbRGbFJbRHbRIbFJbFJbFJbFJbRJbEgbupbTlbTkbRNbRObRPbRObRPbvEbRTbRUbRUcCibRWbetaUvbvFaToahybMkbRYbRZbSabNWbSbbScbSdbSebSfbSgbShbSibMpbvIbKSbXibQfbSlbSmbKWbKWbKWbKWbKWbSnbSobSpbSpbSpbSpbSpbSqbSrbSqbSqbSqbSqbSqbSsbStbSubSvbSwbSwbSwbLdbLdbSxbSycNtbSxbLdbLdaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbOLbSAbQGbQHbQHbSBbOLbORahyahyaahaahbtHbSCbIibSDbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbtHbSEbSEbSFbSGbSEbSHbSIbSJbSKbSLbSMbSNbSObSPbSLbSLbSLbSLbSLbGYbUDbPlbPmbNpbNpbSzcpCcpubRlbXTbGYahyahybKdbecbcnbSVbbobbobFubFubFubFubFubFubSWbFubFubSXbSYbSZbNCbTabTbbTcbTdbNCbTebTfbNCaahaZdaZHbEgbFLbvJbEgbEgbThbTibTibTibTibEgbEgbTjbTkbTlbTmbTnbTkbTlbTkbTobTpaUvaUvaUvaUvbTqbTrbTsaToahybMkbGxbTubTvbTubTtbScbTxbTybVhbTAbTBbTCcCjbTEbKSbTFbTGbTHbTIbTJbTKbTLbTMbTNbTObTPbTQbTRbTSbTTbSpbTUbTVbTWbOabTXbTZbSqbUabUbbSubUcbUdbUebSuaahaahbSxbUfbUgbSxaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbNebNfbNgbUhbNgbNfbNebLkahyahyaahaahbtHbtHbIibtHbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbUibUjbUkbUlbSEbUmbUnbUnbUobUpbUqbUrbUsbUtbUubUvbUwbUxbGYbXUbRgbYYbNpbNpcbIbRgcGibRlcGQbGYahyahybKdbecbcnaZzbUFahybUGbUHbUIbUJbUKbULbULbUMbUGbUNbUObUPbNCbNCbIKbNCbNCbNCbNCbNCbNCaahaZdaZHaZdbvMbUTbUUbUVbUWbUWbUWbUWbUWbYobUYbTkbTlbUZbVabVbbVcbTkbTlbVdbVeaUvaUvcCpbVgbdvaUvbvPaToahybMkbVibVjbVkbVlbVmbVnbVobVpbVqbVrbVsbMpcCMcDxbKSbKSbKSbKSbKSbTJbVtbVubVvbVwbVxbVybVzbVAbVBbVCbSpbVDbVEbVFbVGbVGbVHbSqbVIbVJbSubVKbVLbVMbSuaahaahbSxbVNcAhbSxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbLkbLlbVPbVQbVRbVSbVTbLmbLkahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbVUbVVbVWbVXbVYbVZbWabWbbWcbWdbWebWfbWgbWhbWibWibWjbWkbUEcNkcIgcNkdHrdHrcNkdHscNkdHtcNkbUEahyahybKdbWobcnaZzbamahybWpbWqbULbWrcVLbWsbWtbWubUGbWvbWwbUPbWxbWybWzbWAbWBbWCbWDbWEbNCaahaZdbWFanEbWHbWIbWJclZbWLbWKbTwbWKbWLbWKbWJbTlbTkbWNdBObVabWPbTlbTkbWQbURbPObPPaTobHCblDbHCaToaToahybMkbWRbWSbMkbWRbWSbMkbMkbMkbYAbWUbWVbCAbKNbKNbKNaahaahaahaahbTJbWXbWYbWZbTNbXabXbbTQbXcbXdbXebSpbXfbXgbXhcccbXjbXkbSqbXlbXmbXnbXobXpbSubSuaahaahbSxbXqbXrbSxbSxaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsbXtbXubXvbXsahyahyahyaahaahaahaahbtHbIibtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbXwbXxbXybXzbXAbXBbXCbXDbXEbXFbXGbXHbXIbXJbXKbXLbXMbXNbUEbUybUzbUAbUBbUBbUybUzbUybUCanGbUEahyahybKdbXVbhqbXWbamahybXXbXYbXZbYabYbbYcbYdbYebYfbYgbYhbYibYjbYjbYkbNFbLAbYnbYnbTYbNCaahaZdbYpaZdbYqbTkbTlbWJbYrbWJbYrbWJbYrbWJbYsbTkbTlbUZbYtbVbbVcbTkbTlcgwbURahyahyaTobYvbetbYwaToahyahyahyahyahyahyahyahyahyahybKNbKNbYxbYybKNbKNaahaahaahaahaahaahbTJbTJbTJbTJbTJbYzciWbSpbSpbSpbSpbSpbSqbSqbSqbSqbSqbSqbSqbYBbYCbSubSubSubSuaahaahaahbSxbYDbVObYEbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybYFbYGbYHbYIbYFahyahyahyaahaahaahaahbtHbYJbtHaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbYKbYLbYMbYNbYObYPbXMbYQbYRbYSbYTbYUbYRbYQbXMbXMbXMbYVbUEbWlbWmbWlbWnbUBbWlbWmbWlbUCanGbUEahyahyanHbecbDMbZbbamahybZcbZdbZebZfbZgbZhbZibZjbUGbWvbZkbZlbZmbZnbZobZpbZqbZrbZsbUQbNCaahaZdbYpaZdaZdbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbZvbTjbZwbTlbTkbTjbZybZxahybJeaUvbetaUvbJeahyahyahyahyahyahyahyahyahyahyahybZzbZAbZBbZzbeubeubeubeubeubeuaahbZCbZDbZEbZFbZGbTObTPbZHbZIbZJbZKbZLaahaahaahaahaahaahbZMbZNbZObZPbZQbZMaahaahaahaahbSxbZRbZSbZTbSxaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahybZUbZVbZWbZUbZUahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbZZcaacabcacbSEcadcaecaecaecafcagcahcaicaecaecaecajcakbUEbXObUBbUBbXPbXQbXRbXRbXRbXSdHwbUEahyahyanIbecbcnaZzdHyahycaocapbZecaqcarcXCcasbULbUGbWvcatcaucavcavcawcaxcaybYnbYncazbNCaahaZdbYpanJaZdcaAbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkbTlbTkcaCcaDcaEcaFcaGcaHcaIahyahybrGaUvbetcaJbrGahyahyahyahyahyahyahyahyahyahyahycaKcaLcaMcaNbeubZMbZMbZMbZMbeuaahbZCcaOcaPcaQcaRcaScaTcaUcaVcaWcaXbZLaahaahaahaahaahaahbZMcaYcaZbJTcbbbZMaahaahaahaahcbccbdcbecbfcbcaahahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahahycbgcbhcbicbjcbgahyahyaahaahaahaahaahbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEcbkcblcbmcbnbSEbNZcbpcbqcbrcbscbtcbucbvcbwcbxcbycbzcbAbUEbWlbWmbWlbYWbUBbWlbWmbWlbYXdHzbUEbYZbZabeeccHdHAdHBbeeahybUGcbJcbKcbLcbMbULcbNbUGcbOcbPcbQcbObNCcbRcbScbTcbUcbVcbWcbXbNCaahaZdbYpaZGaZdanSbTkbTlbTmbTnbTkbTlbTkcbZbTmbTlbTkbTlccabTnccbbTlbTkdBQcaIahyahybrGccdbgJaUvbrGahyahyahyahyahyahyahyahyahyahyahyccBccfccgcaNbeudGTcgndGUbZMbeuaahbZCcchcciccjbZGcckcclbZHccmccnccobZLaahaahaahaahaahaahbZMbZNbZMbZMbZMbZMaahaahaahaahcbcccpaEGccrccscctccuaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCccMbNCbNCbNCccNccObNCccPaZdccQaZdaZdcDsbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybXsccvccwccxbXsahyahyaahaahaahbZXbZXbZXbZYbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEccycczbSEbSEbSLbSLbSLbSLbSLccAbSLbSLbSLccEccCccDbSLbUEbUybUybUybUBbUBbUybUybUybYXcalcamcanbecbecbecbcnaZzbeeahybUGbUGbUGbUGbUGbUGbUGbUGccIccJccKccLbNCbNCbYmbNCbNCbNCccNccObNCccPaZdccQaZdaZdcDsbTlbUZdBRbVbbVcccTccUbVbbVaccVccWbUZbVadBOccXbTkbTlcbYcaIahyahybrGaUvbetaUvbvNahyahyahyahyahyahyahyahyahyahyahyccBccYccZcaNbeucgncgndGWbZMbeuaahbZCbZCbZCbZCbZCcdacdbbZLbZLbZLbZLbZLaahaahaahaahaahaahbZMbZNbZMaahaahaahaahaahaahaahcbccdccddcdecdfcdgcdhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahahyahybYFcdiccwcdjbYFahyahyaahaahaahbZXcdkcdlcdmbZXbZXbZXbZXaahaahaahaahaahaahaahaahaahaahaahaahaahbSEbSEbSEbSEaahaahaahaahbZXcdncdobZXahyahyahyahyahyahybUEcbBcbCbUBbUBbUBbUBcbDbUBcbEcbFcamcancbGcbHbecbcnaZzcbOcbOcbOcbOcdpcdqcdrcdscdtbFpcdvcdwcdxcdycdzcdAcdBcdCcdDcbOcbOcbOcbOcbOcdEcdFcdGbURbURaouccUbVbbYtccVaovbUZbYtdBObVccdIccUcdJcdKcdLcdMcdNcdOcdSahyahybrGcdQbetcdRaTocaNahyahyahyahyahyahyahyahyahyahycelcdTcdUcaNbeudGYdGXdGZbZMbeuaahaahaahaahaahbZMcdVcdWbZMaahaahaahaahaahaahaahaahaahaahbZMbZNbZMaahaahcbccbccbccbccbccbccdXcdXcbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahbZUbVSbVQbZUcdYccwcdZbZUbVSbVQbZUbZUbZXbZXceacebceccedceecefbZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcegcehceiceiceiceiceiahyahybUEbUEbUEcdPccFccFccGbUEbUEbUEbUEbUEbYZbZabeecejbjSaZzcekceLcemcbOcenceocepceocencencenccJccKcencencencdBceqcercescbOcetceLceucevcewcexceycezceAceBceCceDceAceEceAceFceCceBceGceBceCceHceIbTkbTlceJbURahyahybvNaUvbetaUvceKcaNcgqceMceMceMceMceMceMceMceMceNcaNceOcePcaNbZMdHabZMbZMaTWbeuaahaahaahbZMbZMbZMceQceRbZMaahaahaahaahaahaahaahaahaahbZMbZMbZNbZMaahaahcbcceSceTceTceTceTceUceUceVceTceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbZUceXceYceXceZcfacfbcfccfdcfecffcfgcfhcficfjcfkcflcfmcfncfobZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcfpcfqcfrcfscftcfuceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybbocfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfFcfFcfFcfGcfHcfFcfFcfFcfIcfJcfDcfKcfLcfMcfNcfOcfPcfQcfRcfSbTpcfTbTlbTkbTlbTkcfUbTkbTlbTkbTlcfVbTlbTkcfWbTkbTlbTkcfXbZyahyahyaTocfYbyncfZaVlcgacgbcgbcgbcgccgbcgbcgdcgbcgbcgbcgbcgecgfcggbZMdGYcgicgnbZMbZMbZMbZMbZMbZMcgjcgkcglcgmbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMdHbbZNbZMaahaahcbccgocgpcgTcgrcgscgtcgucgvcqbcgxceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahbZUceXceYceXceZcfacfbcfccfdcfecffcfgcfhcficfjcfkcflcfmcfncfobZXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZXcfpcfqcfrcfscftcfuceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybbocfvcfwcfxcfycfzcfAcfBcfCcfDcfEcfFcfFcfFcfFcfGcfHcfFcfFcfFcfIcfJcfDcfKcfLcfMcfNcfOcfPcfQcfRcfSbTpcfTbTlbTkbTlbTkcfUbTkbTlbTkbTlcfVbTlbTkcfWbTkbTlbTkcfXbZyahyahyaTocfYbyncfZaVlcgacgbcgbcgbcgccgbcgbcgbcgbcgbcgbcgbcgecgfcggbZMdGYcgicgnbZMbZMbZMbZMbZMbZMcgjcgkcglcgmbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMdHbbZNbZMaahaahcbccgocgpcgTcgrcgscgtcgucgvcqbcgxceTceWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUcgycgzcgAccwcgBccwccwcgCccwcgDbZUcgEcgFcgEcgGcgHcgIcgJbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXbZXcgKcgLceicgMcgNcgOceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaZycgPcgQcgRcgSchucgUcbOcgVcgWcgXcgYcgZchacgWcgWchbcgWchcchdchechfcgWchgcbOcgUchuchhchichjcevcevchkaowcdNcdMcdNchlchmcdMchncdMcdNchochpcdMchqchrchschtchLchvahyahybJechwchxbbQbbRchychzchzchzchAchzaoBchBchzchzchzchzchCchDchEchFchGchHchGchGchGchGchGchGchGchGchGchIchJchJchJchJchJchJchJchJchJchJchJchJchJchKbZMaahaahcbccgocgpciscgucgucgucgucgucgucguchMchNaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahbZUchOchPchQchRchSchTchUccwchVchWbZUchXchYchZchYciacibciccidcidcidcidcidcidcidaoCcidcidcidcidcidcidcidcidcidcidcidcidciecifcidcidcigcihciicijcikcilceiahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybamcimbcnbeccbOcbOcbOcbOcinciocipciqcirciwcitciucivciAcixciycizciGciBciCcbOcbOcbOcbOciDcfQciEciFbURbURciXciHciHciHciHciHciHciHciHciHciHciHciHciIbURciXchvahyahyahybrGciJciKciLciKciMciNciNciOciNciNaoEciPciNciNciNciOciQciRciSbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMciTciUciVcqcbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahcbccgocgpcjAciYciZcjacjbcjccjdcjeceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgbZUbZUcjhcjicjjcgBcjkcjlcjlcjmbZUbZUcjnchYcjochYcjpcjqcjrcjsbZXbZXbZXaoFcjvcjvaoGcjvaoHapdbZXbZXbZXbZXbZXbZXbZXbZXbZXcjtcjucjvcjvcjwcjxcjyceiceiceiceiahyahycjzcjzcjzcjzcjzcjzcjzahyahyahyahyahyahyahybaicimbcnbeccjBahyahycbOcbOcbOcjHcjCcjDcjEcjDcjDcjFcjDcjEcjDcjCcjGcbOcbOcbOahyahyckhcjIcjJcjKciFaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahybvNaUvaUvcjLcjMcaNcgqceMceMceMapuapAapvceMceMceNcaNcaNcaNcaNbZMaahaahaahaahaahaahaahaahbZMbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccjNceTceTceTceTceTceTceVceTceTcjfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcjgcjOcjPcjgbVScjQbVQcjRbVScjQbVQbZUchYapCcjTchYcjUchYcjVcjWcjXcjqaahaahamYamYamYamYapFamYamYamYamYaahaahaahaahaahaahaahbZXbZXcjucjYbZXcjZbYlbZXaahahyahyahyahycjzcjzckbckcckdckeckfcjzcjzahyahyahyahyahybbobbockgblnccHbbobboahyahyahyckEahyahyahyahyahyahyahyahyahyahyahyahyckEahyahyahyciFciFckicfQcfRciFciFaahaahaahahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyciFciFckjckjckkciFciFahyahyahyahyapGapAapGahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcbccbccbccbccbccbccbccbccbccbccbccbcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxapHckzchYckAchYckBckCckDcjqaahaahamYaqwapIapRapQapSanCaqwamYaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbodETcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRckQciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahOahOahOapXahOahOahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhcjUchYclicljclkcjqaahaahamYaqwaoDaoDaqlaqnaqmaucamYaahaahaahaahaahaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZycrkbecclyclzclAclAclBclCclCclCclDclCclEclCclCclFcfRcfRcfRcfRclGclHclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclQclIclIclIclIclIclQclRclIclSclIclTclIclQclIclKclIclUclUclVclWbKGcmpahyahOaqoaieaqsaqpaqtahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgcjgcklckmcknckockpckqckrckscktckuckvckwckxapHckzchYckAchYckBckCckDcjqaahaahamYaqwapIapRapQapSanCaqwamYaahaahaahaahaahaahaahaahbZXcjubZXbZXbZXbZXbZXahyahyckKckFckFckGckHckIckIckIckIckIckIcjzahyahyahyahybbobbocFUcimbcnbecbDObboclmckLckMciFclmckLckLckLckLckLckLckLckLckLckLckMciFclmckLckMciFckNckOckPcfRcJfciFciFciFciFciFclmckLckLckLckLckLckLckLckLckLckLckRciFclmckLckRciFckScfRcfRckTckUciFciFahyahOahOahOapXahOahOahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahcjgckVckmcknckWckXckYckZclaclbchVclccldclecleclfclgclhcjUchYclicljclkcjqaahaahamYaqwaoDaoDaqlaqnaqmaucamYaahaahaahaahaahaahaahaahbZXcjubZXaahaahaahaahahyahyclYclncloclpclqclrclscltcluclvclwcjzahyahyahyahyaZycrkbecclyclzclAclAclBclCclCclCclDclCclCclCclEclFcfRcfRcfRcKgclGcKhclIclJclIclIclIclKclLclMclNclIclIclKclIclOclIclPclIclIclQclIclIclIclIclIclRclIclSclIclTclIclQclIclKclIclUclUclVclWbKGcmpahyahOaqoaieaqsaqpaqtahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMciVbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcsTcknckncmabFKcmcbZUbZUcmdbZUbZUchYcmeclecmfcmgcmhcmichYcjqcjqcjqcjqaahaahamYaqvaoDaqwaqxaqwaoDaqyamYcmjcmjcmjcmjaahaahaahbZXbZXcjubZXdEldEldEldElahyahycmRcmqcmrcmscmtcmtcmucmvcmwcmtcmxcjzahyahyahyahybambisbeccimcsUbecbeccmzcfRcfRcfRcfRcmAcmBcmBcmBcmCcmDcmDcmDcmEcmDcmFcmDcmGcmDcmDcsVcmHcmIcmJcmKcmDcmDcmHcsZcmDcmDcmLcmDcmDcmDcmMcmDcmDcmDcmDcmGcmDcmDcmDcmEcmDcmDcmDcmHcmNcmBctacmOcmPcmQcncahyahOaieaieaqzaieaqAahOaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahbZMbZMciVbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJccqdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcnxcfRcfRcnDcnxcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcnJcevcevcevcevcnJcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDaqwamYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcoFckickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoKcoLcoLcoLcoLcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahcjgcmScmTcmUcmVcmWcjgcmXbObcmZcnacnbcnScndcnecnfcngcnhcmichYaahaahaahaahaahaahamYartaoDaqwaqBaqwaoDanFamYcnicnjcnkcmjaahaahaahbZXcnocjubZXbWTckJccqdEldElahyclYcnpcnqcnrcnsckIcntcnucnvckIcnwcjzahyahyahyahybaibjQbeccimbDMbDNbeccmzcfRcnxcfRcnycnzcnAcnBcfRcnCcfRcfRcfRcnDcfRcnEcfRcnFcfRcnxcfRcjKcnGchicnHcevcevcnIcevcnJcevcnKcnMcevcnLcxCcevcevcevcevcnJcevcevcevcnNcevcevcevcnIcnOcnQcnPcnRcfRbKGcodahyahOaqDaqCaqZaqEaraahOaahaahaahaahaahaahaahaahaahaahbZMbZMbZMbZMbZMbZMcnTciVcgnbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjaahaahcjgcnUckXcnVcnWcnXcnYcnZcoacobcoacoccoocoecleclecofchYbRKchYaahaahaahaahaahaahamYanBarbardarcaoDaoDaqwamYcogcohcoicmjaahaahaahbZXconcjubZXclxcrlcmycrqdElahycowckFckFcopcoqckIckIcorckIckIcoscjzahyahyahyahybbobbocotcimbcnbeccoAbboclmckLckMciFclmckMciFcovcoGcoxcoycozcoScoxcoBcovciFclmckLckMciFcoCckicoDcmBcoEciFclmckLckMciFciFclmckLckMczAclmckLckMciFciFdCQckMciFclmckLckMciFcKickickicfRcoXciFciFaahahOareaiearfaieargahOaahaahaahaahaahaahaahaahaahbZMbZMcoHcoIcoJcoJcoJcoJcoKcoLcoLcoLcoLcoLcoLcoLcoMcoNcoObZMbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadbLjaahaahcjgcoPckncoQcmacoRcpqcoTcoUcoVcoacoWcpPcoYcoZcpacpbchYcpcchYaahaahaahaahaahaahamYariarharkarjarmarlarnamYcpdcohcpecmjaahaahaahcpjbZXarqbZXcpjcvVcrrcvWdElahyahyahyahycjzcplcpmcpncpocppcpTcprcjzahyahyahyahyahybbobbocpscptcmzbbobboahyahyahyahyahyahycovawtcpvcpwcpxcpycpzcpAcpBawucovahyahyahyciFciFcpDcpEckjciFciFahyahyahyczZcEVcEVcEVcEvcEvcEvcEVcEVcEWczZahyahyahyahyahyahyciFciFcjIcjIcjKciFciFaahaahahOahOaiaarraidahOahOaahaahaahaahaahaahaahaahaahbZMcpFcpGcpHbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMbZMcpIcoMcpJbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgbfncpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocqpcqqcqrcqscrJcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrLcrMcrLcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQctccsNctccrQcrQcrQcrQaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcsMcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFecrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcsMcupcsMcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahaahaahaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicvjcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahaahaahaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahcjgbfncpLcpMcpNcpOcqecpQcoacpRcoacpSchYcqzcpUcqzcpVcpWchZchYcpXcpXcpXcpXcpXcpXamYamYarsauQaruauRarvamYamYcmjcpYcmjcmjcpXcpXcpjcpjcFucFrcqdcpjdElcxWcyjdElcrIcqfcqfcqgcjzcjzcjzcjzcqhcjzcjzcjzcjzcrIcqfcqfcqfcqgcpjcqicqjcqkcqlcqmcpjcpjahyahyahyahyahycovcqncqocKmcqqcrJcqrcKXcpBcqucovahyahyahyahycqvcqwcqxcqycqvahyahyahyahyczZcuIarwcxUcEvcEvcEVcEVcEVcIFczZahyahyahyahyahyahyahycrNckicqAcqBciFaahaahaahaahahOahOahOahOahOaahaahaahaahaahaahaahaahaahaahbZMcqCcgnbZMbZMaahaahaahaahaahaahaahaahaahaahaahbZMbZMcgncqDbZMaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahcjgctxckncqFcqGcqHcqIcqJcqJcqKcqLcqMcqNcqOcqOcqPcqQcqRcqScqTcqUcqVcqWcqXcqYcqYcqZcqOarxcracqYcqYcqYcqYarycqOcrdarzcrfcrgcrhcricrjcMIcMjcrmcrncrocOZcrudBNcrscrtcrucrucrvcrucricrwcrxcrycrzcrAcrBcrAcrCcrAcrDcrAcrzcrAcrEcrFcrGcrucrHcrRahyahyahyahyahycrWcqtcrKcrLcrMcrLcrMcrLcpBcqtcrWahyahyahyahycsKcrOcrPcqycsKahyahyahyahycIHcEVcEVcEVcEVcEVcEVcEVcEVcJKcrQcrQcrQcsLcrScrTcrUcrQcrQctccsNctccrQcrQcrQcrQaahaahaahaahaahaahaahaahaahaahaahcrXcrXcrXcrXcrXbZMcrYcrZcrZcrZcrZcrZaahaahaahaahaahaahaahcsacsacsacsacsacsbbZMcsccsccsccsccscaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahcjgcsdcknckncsecsfcsgcshcshcsicshcsjcskcslcsmcsncsncsncsocspcsqcsrcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsqcsscsqcsqcsqcstcsqcsqcsucsvcswcsxcsycswcswcsvdBPcswcswcszcsAcsBcrucrucrucricrucsCcswcsDcswcsEcswcswcswcsFcswcsvcswcsGcsHcsIcrucsJcsRahyahyahyahyahyctmcqtcrKcrLcsMcrLcsMcrLcpBcqtctmahyahyahyctucsOcrOcsPcsQcumcsSahyahyahycMYcEVcEVcDncEVcEVcEVcEVcFecrQcrQcwtctdcsXcwtcwvcsXcsYcwwctbcsYctbctecxOcwxcrQcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXctfctgayocrXctictjcrZayqctlcurcrZcrZcrZcrZcrZcsacsacsacsactnctoayscsactqctrcscayvcttcuTcsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaabLjbLjcjgctvctwcALctycmacjgbRMctActBctCctDctEctFctGctHcrfcrfcrfctIctJctKcrfctLctMctNcrfctFctOcrfcrfctPctQctRctSctTctQctQctUctVctWcrocrpctXctYctZcuacubdCbcuadCfcuacuccudcuacuacuacubcuecufcuacubcuacugcuacuhcuicuacuacubcuacujcrucukcruculcuYahyahyahyahyahyctmcuncuocrLcupcrLcupcrLcuqcunctmahyahyahycvacqycrOcrPcqycqycvaahyahyahycMYcJacEVcLvcEVcQdcEVcEVcEVcrQcxScsYcwrcwscwscwscwscwscwsczmczlczoczncPbcPbcBjcrQaahaahaahaahaahaahcrXcuuazEcuucrXcNfcuxdGMcrXcuzcuAcrZcuNcuCcuDcrZcuEazFcuEcrZcuGaAdcuGcsacOScuJdHccsacuLcuMcsccwEcuOcuPcsccuQaADcuQcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaadaadaadcuScuScvgcuUcuScuVcuWcuScuScuScuXcvocuZcuXcvrcvbcuXcvccvdcvecvfcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpXcpjcvNcvhcrFcvicLtcpjcpjcpjcpjcrIcqfcqfcqfcqfcqgcpjbRRcvlcqdcpjcrIcqfcqgcpjcrIcqfcqgcpjcvmcrucrucrGcvncpjcpjahyahyahyahyahycwjcvpcuocrLcrLcrLcrLcrLcuqcvqcwjahyahyahycqvcwqcrOcrPcqycvscqvahyahyahycRUcWRcEVcEVcEVcEVcEVcEVcWRcrQcBkcsYcsYcsYcvucvucvucvucvuctbcDpcwzcsYcsYcsYcducrQaahaahaahaahaahaahcrXaAEcvxaAEcrXcrXcvycrXcrXcwFcwGcrZcrZcvBcrZcrZaAFcvDaAFcrZaAGcvFaAGcsacsacvGcsacsacvHcvIcsccsccvJcsccscaAHcvLaAHcscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxfcvOcvPbHqbIfcvScvTcvUdEKdEJcvXcvYcvZcwacwbcwccuXcpXcpXcpXcpXcpXaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahcpjcwdcwecwfcwgcwdcpjdELdELdELahyahyahyahyahyahycpjcwhcwicwhcpjahyahyahyahyahyahyahycxAcqicqicqicwkcqicxAahyahyahyahyahyahycovcuncwlcwmcwncwocuncuncuqcwpcovahyahyahycsKcqycrOcrPcqycqycsKahyahyahyczZcPicEVcEVcEvcPocEVcEVcEVcrQcvucvucsYcsYcBicDqdBUcxPbdUctbcxRcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcwBcwCcwDcPvcwDcwJcwHcwLcwKcwUcwTcwXcwVcwMcwNcwMcwOcwPcrZcwQcwRcwScPBcwScyacyecybcyqcyfcwYcwZcxacxbcxccxbcxdcxecscaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacxNcxgcxgcxgcxgcvScvTcxhcxhcxicuXcxjcxkcxlcxmcxncuXcxocxpcxqcxraahaahaahaahaahcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxrcxscxtcxucxvcxwcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcwhcxxcxycwhahyahyahyahyahyahyahyahycxzcyBcxBczkcxDcyBcxzahyahyahyahyahyahycovcovdHdcxFcxGcxHcxIcxJdHecovcovahyahyahycumcsScxLcxMcqyctucsOahyahyahyczZczZcEVcTdcQncUncEVcEVddacrQcEFcxPcsYcsYcxQcxQcxQcxQcxQctbcxRcsYcFdcFdcFdcFbcrQaahaahaahaahaahaahcrXcxVaAKaAIcxYcxZcytcyrcrXcyccydcrZcAkcyucygcyhcyidENcykcrZcyldEPcyncyocypcAqcAucsacyscAxcBocBncyvcywcyxcyydEQcyAcscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczTcyCcyDcyEcyFcxgcxgcvScyGcyHcyIcyJcyKcyLcyMaGXcyOcyPcuXcxqcxqcxqcxrcxrcxrcxrcxrcxrcxrcyQcyRcyScyScyScyScyScyScyScyScyScyScyScyTcyScyUcyVcyWcyXcyYcyVcyZczaczbczaczaczaczaczaczaczaczaczaczccwhahyahyahyahyahycxzcxzcxzcxzczdczebTgczgczhcxzcxzcxzcxzahyahyahyahycovcovcovcziczjczicovcovcovahyahyahyahyahycvacrOcrPcqycvaahyahyahyahyahyczZczZczZczZbgjczZczZczZcrQcxQcxQcDocwycwycwycFccHvcHrcJzcHxcsYcFdcFdcFdcFdcrQaahaahaahaahaahaahcrXcrXcrXcrXcrXcrXcBqcrXcrXczpcuAcrZcrZcBrcrZcrZcrZcrZcrZcrZcsacsacsacsacsacBucsacsacuLcBvcsccsccsccsccsccsccsccsccscaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMczrczsczrczscztczuczvczwczxczyczzcxgcArczBczCczDczEcuXcuXczFczGczGczGczGczGczGczGczGczGczGczHcxqcxrcxrcxrcxrcxrczIczIczJcxrcOHczKcxqcxrczLczMczNczOczPcwhczQczQddgddmddkczQczQcwhcwhcwhcwhczRcwhahyahyahyahyahycxzczSczScABczUczVczWczXczYcAIcAacAacxzaahahyahyahyahyaahaahczicAbcziaahaahaahahyahyahyahyahycqvcAccAdcAecqvahyahyahyahyahyahyahyahycBgcWQcBgahyaahcrQcJNcxTcKMcxTcxTcFacFacKNcxTcxTcMecDrcFdcFdcFdcmYcrQaahaahaahaahaahaahcAicCbaEJcCbcAicAjcBxaywcAicAmcAncAoayEcCccBbcAocCfaFxcCfcAocCkaFzcCkcAscAtcClazxcAscAwcCmcAyazycAAcBAcAycCoaFRcCocAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcAEcAFcxgcxgcvScvTcAGczzcAHcBTcAJcAKcMdbWMcuXcxqcANcxqcxqcxrcxrcxrcxrcxrcxrcxrcxrcAOcxrcxraahaahaahcxrcAPcAPcAPcxrcxrcxrcxrcwdcwdcAQcARcAScwdcwdcwhcwhcwhcwhcwhczQcwhcwhaahaahcwhczRcwhaahahyahyahyahycxzcATczecAUcAVczeczeczgcAWcAXczecAYcxzaahahyahyaahaahaahaahczicAZcziaahaahaahcBacCScBccBacqvcqvcBdcBecBfcqvcBgcBgcBgcBgcBgahyahyahycBgcWQcBgaahaahcrQcvucvucMXcGzcGAcGAcGAcNJcGAcGzcNMcsYcNVcNVcNWcNXcrQaahaahaahaahaahaahcAiaGxaHMaGxcAicBmcDydHfcAiczpcBpcAocDDcDCcBscAoaJaaHOaJacAoaKbaJIaKbcAscBtcDMdHgcAscBwcBvcAycFkcBycBzcAyaKnaKpaKncAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcEBcyCcBBcBCcxgcxgcxgcBDcvTcAGczzcBEcuXcvrcvbcuXcuXcuXcxrcANcBFcxrcxraahaahaahaahaahaahcxrcBGcBHcxraahaahaahcBIcBIcBJcBIcBIaahaahaahaahcwdcBKcxucxvcwdaahaahaahaahaahcwhczQcwhaahaahaahcwhczRcwhaahaahaahahyahycxzcxzcxzcxzcBLcBMcBNcBOcbocxzcxzcxzcxzaahaahaahaahaahaahaahczicAbczicziczicBacBacymcBRcBacBScEIcrOcrPcqycBUcBgcBVcBWcBXcBgcBgahyahycBgcWQcBgaTWaahcrQcNRcxPcMXcGzcHscHtcHucNUdFccGzcNMcsYcPccPccPccOVcrQaahaahaahaahaahaahcAiaKqaKFaHMcAicAicFlcAicAicCdcvAcAocFmcCecAocAoaHOaKGaKHcAoaLuaLtaJIcAscAscFncAscAscvHcFycAycAycCncAycAyaKpaLxaLvcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcCxcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxrcxraahaahcBIcBQcCEcCDcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcCMcCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcDicBgcDjcDkcDlcDmcBgcBgcBgcBgcWQcQzcBgcBgcrQclXcxQcMXcGzcHscHtcIGcOYcHwcGzcNMcsYcQHcQHdERcPacrQaahaahaahaahaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcACcADcACcCrcyFcxgcxgcvScvTcAGczzcCscCtcCucCvcCwcCxcCycCzcCAcxrcxraahaahaahaahaahaahaahcxrcCBcCCcxrcxraahaahcBIcBQcCEcCDcBIcCGcCGcCGaahcwdcCHcCIcCJcCKcCKcCKcCKcCKcCKcCKcCLcCKcCKaahahycwhczRcwhaahaahaahaahahycxzcLucCNcABcCOczVcCPcCQcCRcEKcCTcCUcxzaahaahaahaahaahaahaahczicCVcCWcCXcCXcCYcCZcDacDbcDccDdcDecDfcDgcDhcBScBgcDjcDkcDlcDmcBgcBgcBgcBgcWQcQzcBgcBgcrQclXcxQcMXcGzcHscHtcIGcOYcHwcGzcNMcsYcQHcQHdERcPacrQaahaahaahaahaahaahcAicDtcDucDvcDwcDvcFAcFzcDzcDAcwIcDBcHFcHAcDEcDFcDEcDGcDHcAocDIcDJcDKcDLcDKcHGcHKcDOcwWcHNcDPcDQcDRcDScDTcDScDUcDVcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcDWcDXcDWcDYcDZcEacEbcEccEdcEeczzcEfcCtcEgcEhcEicEjcEkcCtcxrcxraahaahaahaahaahaahaahaahcxrcElcEmcxqcxraahaahcBIcBQcCEcCDcBIcEncEocCGcCGcwdcEpcEqcErcCKcEscEtcEuddpcEwcEwcEwcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcATczecEycAVczecEzczgcEAcFHczeczecxzaahaahaahaahaahaahaahczicECcEDcEEcEDcBackacEGcEHcFXcEJcGfcELcEMcENcEOcEPcEQcERcERcEScETcEUcEUcQecZMcEXcQfcEYcEZcxTcxTcQgcQhcHscJLcJMcQFcHwcGzcNMcQIcQGcQGcQGcQGcQGaahaahaahaahaahaahcAicFfdEScFhcFicFjcIKcIJcAicyccydcAocIPcILcFocFpcFqdEUcFscAocFtdEVcFvcFwcFxcIQcIRcAscyscAxcKacJRcFBcFCcFDcFEdEWcFGcAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcElcFUcxqcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcXdcERcERddqcrQcrQcrQcrQcrQcKJcKKcKLdhfcHwcGzcNMcQGcQGdkBdkBdlCcQGaahaahaahaahaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMcGjcFIcFJcFKcDZcxgcxgcvScFLcyHcFMcFNcFOcFPcFQcFRcFScFTcCtaahaahaahaahaahaahaahaahaahaahcxrcMscMocMPcxraahaahcBIcCFcCEcCDcBIcFWcGpcFYcFZcwdcGacGbcGccCKcGdcGecEwcEwcEwcEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcxzcxzcxzcGqczecGgcGhcOIcGBczecGkcxzaahaahaahaahaahaahaahczicECcGlcziczicBacGmcGncGocGScEJcHccGrcrPcqycGscBgcGtcGucGvcGwcBgcBgcBgcGxcXdcERcERddqcrQcrQcrQcrQcrQcKJcKKcKLdhfcHwcGzcNMcQGcQGdkBdkBdlCcQGaahaahaahaahaahaahcAicAicAicAicAicAicKbcAicAiczpcuAcAocAocFmcAocAocAocAocAocAocAscAscAscAscAscKScAscAscuLcBvcAycAycAycAycAycAycAycAycAyaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacHHcGCcGDcGEcGEcGFcGGcGGcGGcGGcGHcGIcGIcGJcGKcGLcCtbkQbkQahyahyahybkQbkQaahaahaahcxrcIdcIecxrcxraahaahcBIcFgcGPcFFcBIcGRcHRcCGcCGcwdcGTcCIcGUcGVcGWcGWcGWcGXcGXcGXcGXcGYcCKahyahycwhczRcwhaahaahaahaahaahcxzcGZczecABcHaczVcCPcCQcHbcHSczecGkcxzaahaahaahaahaahaahaahczicAbczicziaahcBacHdcHedmEcHgcHfcHccHicHjcHkcHlcHmcHncHocHmcHpcHmaahcBgcBgcHqcGxcGxdnjcOUdBScFVcMfcrQcrQcMgcMhdhfcHwcGzdBVdDhdDgdDjdDidDkcQGaahaahaahaahaahaahaahaahaahaahcHycHzcKTazzcHycHCcHDcHEazAcKWcIzcHEaahaahaahaahaahaahaahcHIcHJcLgazBcHIcHMcLhcHOazCcHQcJtcHOaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahcJecJecJgbgicJgcJgaahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahycJebPGbNIbQCbQAcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahaahaahaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadcvMcvMcvMcvMcvMcvMcvMaadaaacJwcGCcDXcHTcDXcHUcHVcxgcxgcHWcCtcHXcGKcHYcHZcIacCtbkQcIbcIccIccIccIcbkQaahcJecJecJgcNHcJgcJgaahaahaahcBIcBQcIfcGOcBIcIhcIicIjcIkcwdcIlcImcIncCKcGecIocGecEwcGecEwcEwcEwcCKahyahycwhczRcwhaahaahaahaahaahcxzcIpczecIqcAVcIrcIscItcAWcIuczecGkcxzaahaahaahaahaahaahaahczicAbcziaahaahcBacIvcIwcHhcFXcIycKDcrOcrPcIAcDicHmcIBcICcIDcIEcHmaahaahcBgcHqcBgcOTdDlcNKcNTcNLcNNctzcNOcNPcNQdDmcNScNTdDncQGdDodDqdDpdDrcQGaahaahaahaahaahaahcHycHycHycHycHycIIcMpdHhcHyczpcuAcHEcMqcIMcINcHEcHEcHEcHEcHEcHIcHIcHIcHIcIOcMrdHicHIcuLcBvcHOcMtcIScITcHOcHOcHOcHOcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadcvMcvMcvMcvMcvMaadaadaadcuScuScuScuScuScuScuScIUcIVcIWcIXcIYcIZddOcJbcCtcCtahycIccJccJdcJccIcahyahycJebPGbNIbZtbQAcJeaahaahaahcBIcBQcJhcJicJjcJkcJlcJmcJmcwdcJncJocJpcCKcJqcGecEwcEwcEwcEwcJrcExcCKahyahycwhczRcwhaahaahaahaahaahcxzcJsczecMLcJuczVcJvczXczYcNgczeczecxzaahaahaahaahaahaahaahczicAbcziaahaahcBacJxcJycIxcGScJAcJBcJCcJDcJEcJFcHmcJGcJHcJIcJJcHmaahaahcBgcGycBgcBgcBgcrQdFdcsYcOWdHjcrQcHtdDscOYdDtcsYdDucQGdDvcQGdDwcQGcQGaahaahaahaahaahaahcHycJOcJPcJQcHycHycMucHycHycJScvAcHEcMvcJTcHEcHEcJUcJVcJWcHEcJXcJYcJZcHIcHIcMwcHIcHIcvHcMxcHOcHOcKccHOcHOcKdcKecKfcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaadaadaadaadaadaaaaadbkQaahaahaahaahaahcuScuScuScuScCtcCtcCtcCtcCtcCtaahahycIccJccJccJccIcahyahycJebRFbRhcaBbWGcJecKjcKjcKjcBIcBIcKkcKlcBIazDcKncKocKpcKqcKrcKscKtcKqcKucGedeccKvcEwcKwcKwcKwcCKahyahycwhczRcwhaahaahaahaahaahcxzcKxczecHScKyczecKzczgcKAcHScKBcKBcxzaahaahaahaahaahaahaahczicAbcziaahcKCcKCcNYcKEcKFcKCcKCcKCcKGcKHcKIcKCcKCcKCcKCcKCcKCcKCcKCaahcBgcHqcBgaahaahcrQcrQcQAcQBcQCcrQcQDcQEdDydDxcsYcsYcQGdDzcQGdDAcQGaahaahaahaahaahaahaahcHycKOcKPcKQcKRcKQcMzcMycKUcDAcwIcKVcMBcMAcKYcKZcKYcLacLbcHEcLccLdcLecLfcLecMCcMDcLicwWcHNcLjcLkcLlcLmcLncLmcLocLpcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahcJecdHccecghdEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahaahaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcyscAxdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcMPcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLcBvcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccOdcOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwbfocPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMcPNcPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPbsUcWucWuaahaahaahaahaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcRscRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRTcRWcRVcLPcRWcRXcRJcRYcOOcOPcOQcRZcRJcRTcRWcLPcRVcRWcSacKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDUdDRahyaahaahaahaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcSJcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUdDTahyahyahyaahaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcSIcTYcKjcUvcUacUvcMTcUbcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuahyahyahyahyaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccUEcUEcUFcUGcVucVgcUJcUKcULcUMcPMcUMcUNcUOcUPcUQcURcUScUTcUUcUVcRqcUWcUXcVQcUZcOocOocOocOocOocVacRucVbcUhcVccNecVdcVecVfcWicVhcVicVjcVkcVlcVmahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahahyahyahyahyahyahyczicVncEDcKCcLPcLPcVocNEcNEcNEcNDcNCcVpcVqcVrcNycNxcNwcNwcVscLPcLPcLPcKCcGxcVtcBgahyahyahyahyahyahyahyahyahyahyahydDRdbMdbSdDRahyahyahyahyahycXGaslaskasmcXGahyahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahycWvcVvcVwcVxcPnaahaahaahaahaahabTasoasnabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccVycVzcVAcNZahycTZcVBcVCcVDcVEcVFcUMcVGcVHcVIcVJcVKcVKcVLcVMcVNcPMcVOcVPcWBcVRcVScVScVTcOocVUcVVcMTcVWcVXcVYcNecVZcWacWbcWicWccWdcWecWfcWgcVmcwhcwhcwhcRQcwhcWhcWhcWOcWjcWkcWhcWhcWOcWjcWkcWhcWhahyahyahyahyahyahyahyahyahyahyahyahycziczicWlczicKCcWmcWncWocWpcvtcLPcLRcONcOOcOOcOQcONcLRcLPcvtcWpcWqcWrcWscKCcBgcWtcBgcBgahyahyahyahyahyahyahyahyahyahydDTdbMdbSdDTahyahyahyahyahycXGcXGaspcXGcXGahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahyahycXncWwcWxcWycWuaahabTabTabTabTabTastasqabTabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcWFcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucZncXzcXzcXAcWucWucXBasvdHkcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWuabTabTaswacwacwasxacuaeVaszasyacwacwabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcXOcXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYRbtlcYRcYRcYRcYWcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcZvcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdambujdamdamdamdapdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxasUasSasWasVasXasXatbasZatdatcacJacuacuacuadKabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMdaPcPMdaQcPMcPMdaRdaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzdbAdbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdcrdbMdbMdbMdbMdbOdbMdbVdbMdbMdbMdbMdbMdbMdbPdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcodcpcTQdcpdcmdcodcqdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddsabTaezacuaeVacuacuatVatUacuacuacuacuaeCabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMddyddzcWLddAddBddCdeedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXaubaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcWLcWLcVIcVJdeAdeBdeCdeDdcudeEdeFdeGdeHdeIdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsabTabTabTaflaflafmaflaflabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqdfvcWLcPMcPMdfwdfxdfydfzdcudcudfAaIndfCdfDdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaacaaadeddeddeddeddeddeddeddeddeddeddedaaaaacaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaflagBaflaudafBaueafDafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTSdgpdgpdgqcPMdgrdgsdaSdgtdcudgudgvdhzdgxdfDdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaflauPaflafPafQafRaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhacWLcWLdhbdhadhcdhddaSdhedcudcucyNdhEdfCdhhdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaflagAaflagfaggaggaghafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibdicdiddaSdiedcudcucyNdiYdfCdfDdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaflaflaflaflagqaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahahyahyahyahyahydjtdizdiAdiBdiCdiBdiDdiEdiCdiBdiFdiEdiCdiCdiDdiGcMNcMNdaSdiHdiIdiJdiKdjudiMdiNdiOdgzdfFdihdgBdiidijdiPdiQdiRdijdhrdiSdiTdiUdiVdiWcwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjwddYdjcdjddjedcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdjfdjgdjhdeidjiddcaaaaaaaaaaaaaaadjjdjkdjkdjkdjkdjkdjjaaaaaaaaaaaaaaaddidjldemdjmdjndjoddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodjpdjqdjrdjsddsaahaahaahaflagyaggagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQbkQahydaSdgzdgzdgzdgzdgzdjydgzdgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaflagyagLagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIcbkQaahdjHdjHdjIdjJdjKdjLdjMdjNdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaaaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaaaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaflaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaacAaaddkeaadbkQcIcdkfdkgdkhcIcddrdcYdfQcIcdkldkmdkncIcaahaahdjHdkodkpdkqdkrdksdktdkqdkudjPdkvdkwdkxdjCdkydkydkzdjXdjXdkAdkAdEbdjCdhtcwhdkYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHddZdkIdlEdfSdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdkNdkOdkPdehdeidfgdhMaaaaaadisdkcbwQdlWdHmdHldjkdHldHnbCYbEMdkcdiwaaaaaadifdfidemdendkTdlYdkVdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdladlbdlcdixdgXdldddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIcaahaahdjHdlmdlndkqdlodlpdlqdlrdlsdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIaOpdlKdlLaOrdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPaOsdlRdlSdlTdokdkNdkMdlVdjjbuAdjkdjkdjkdjkdjkdjkdjkdjkdjkbuAdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIcaahaahdjHdlmdmqdkqdlpdlpdmrdmsdmtdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHaOtdmJdmKaOudeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOaPedmQdehdmRdmSdmTdgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaadaadcIccIccIccIccIccIccIccIccIccIccIccIccIcaahaahdjHdkodkpdkqdlodlpdktdkqdEedjPdfFdihdnkdjCdnldnmdnndnodnpdnqdnrdnsdjCdntczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdnvddYddZdnwdlEdhvdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdnxdkOdnydehdnzdokdnxdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdnAdkXdnBdendnCdlYdnAdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdnDdlbdnEdixdgXdnFddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaaabkQdnGdnGdnGdnGdnGdjHdjHdnHdnIdnJdnKdnLdnMdjHdjHdnNdnOdnPdjCdjCdnQdnodnRdnSdnTdnrdjCdjCdhtczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadeqdeXdnVdnWdgRdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdgSdnYdnZdnXdhMaaaaaadoadjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdoaaaaaaadifdocdoddoedhGdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdesdogdohddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaaaaaddqrdojdojdojdojdnGdqLdoldnGdnGdomdomdondoodopdjHdjHdjHdjHdjHdjHdjHdjHdoqdordosdotdoudjCdjCdjCdjCdjCdjCdjCdjCdjCdhtczQdovdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdgwdfRdfSdkadfUddZdgRdhydfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdhAdgSdehdeidowdhMaaaaaadoxdjkdjkdjkdjkdjkbvidjkdjkdjkdjkdjkdoxaaaaaadifdozdemdendhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdixdoAddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaadoDaaaaaaaaadqNdoFdoGdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoQdoRdoSdoTdoUdoVdoWdoRdoOdoXdoYdoZdpadpbdpcdpddpedpfdpgdphdpidpjdpkdpldpmdpndhtdpodqTdpqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdprdpsdptdpudpvdpwdpxdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdpydpzdeidnXdhMaaaaaadpAdjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdpAaaaaaadifdocdemdpBdpCdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdpDdpEdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddpFdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGdpGdpGdpKdpLdpMdpNdpOcBhcAMdpRdpSdpTdpUdpVdpWdpXdpYdpZdqadqbdqcdqddqedoudoudqfdoudqgdoudqhdqidoudoudqjdoudqfdqkdqldqmdqndqodqpdqqcwhdqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdhIdfRdhvdkadqsdcZdqtdlEdfSdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdkNdkOdquddfdqvdokdkNdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdkVdkXdqyddldqzdlYdkVdkWdkXaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaadmGdkZdladlbdqBdqCdqDddsaahaahaahdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadaaaaaaaaadqNdoFdqGdqHcBPcBldojdnGdqJdqKdnGdnGdrxdoldqMdnGdrAdqOdqOdqPdqOdqQdqRdqQdqSdrBdqUdqVdrBdqUdqSdqWdqXdsLdnGdqZdqZdnGdnGcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadfmdeXddYddZdmHaPvdrbdrcaQTdeddeddeddeddeddeddeddeddeddeddeddeddedaQXdrfdrgaQYdmQdehdmRdmSdridgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdrjdmVdmXdendmYdrkdrldrmdrnaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadrodrpdrqdrrdnhdixdgXddsdqEdqEdqEdqEdrsdrtdrudrvdrsdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGdrHdrIdqQdrJdrKdrLdrMdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYaQZdsadsbaRNdeddeddeddeddeddeddeddeddeddeddeddeddedaWEdsedsfaWHdshdlSdsidokdnxdkMdlVdjjbuAbFIdlWdjkdjkdjkdjkdjkdlXbFIbuAdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaadaadaaaaaaaaaaaaaaadnGdsJdsKdtZaaddtXdsMdsNdsOdsPdqOdsQdsRdsSdqQdsTdsUdrLdsVdsWdsXdsYdsZdrLdtadtbdtcdnGdtddtedtfdtZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdtgdlEdhvdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdnxdkOdthdehdeidfgdhMaaaaaadujdkcbuldtidjkdHobuBdHpdjkdwfbumdkcdunaaaaaadifdfidemdendtldlYdnAdkWdkXaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadmGdkZdtmdtndtodtpdtqdtqdBMdtsdttdtudtvdtwdtxdtydtzdtwdtAdtBdtCdtDdtEdtBdtBdtBdtBdtFdtGdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaaaaaaahyaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccLqcLrcLscIcahyaahcJecdHcceccMdEXcJecLwcLxcLycLzcBIcLAcBIcCGcCGcLBcCGcLCcKqcLDcLEcLFcKqcLGcLGcLGcLGcLGcLGcLGcLGahyahyahycwhczRcwhcziaahaahaahaahcxzcxzcxzcxzcLHcLIcLJcLKcLLcxzcxzcxzcxzaahaahaahaahaahaahcziczicAbczicKCcKCcLMcLNcLOawvcLQcLRcLScLTcLUcLVcLWcLXcLYcLZcMacMbcMccKCcKCcBgcHqcBgahyaahaahcrQcrQcrQcrQcrQcrQcrQcrQcrQdDCdDBcQGcQGcQGcQGcQGaahaahaahaahaahaahaahcHycMidEYcMkcMlcMmcMndBWcHycyccydcHEdBYdBXdCadBZdCcdEZdCedCddCgdFadCidChdCkdCjdClcHIcyscAxdCodCncMEcMFcMGcMHdFbcMJcHOaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQcIccMKcNZcMMcIcbkQcMNcMNcMNcMNcghcMOcKjcMQcMRcMScMTcMUcMVcMWdDDcoucMZcNacMUcNbcNccNdcNecrVcOpcNhcNicNjcTfcLGcNlcLGcLGahyahycwhcNmcNncziczicziczicziczicNocNpcxzcNqcxzcNrcxzcNqcxzcEDcEDcziczicziczicziczicziczicUqcXxcUucKCcNucLPcLPcNvcNwcNwcNxcNycNzcNAcNBcNCcNDcNEcNEcNEcNFcLPcNGcKCcZgdDEcBgahyahyaahaahaahaahaahaahaahaahcWudDFdbMdbMdDGcWuaahaahaahaahaahaahaahaahaahaahcHycHycHycHycHycHycHycHycHyczpcuAcHEcHEcHEcHEcHEcHEcHEcHEcHEcHIcHIcHIcHIcHIcHIcHIcHIcuLcBvcHOcHOcHOcHOcHOcHOcHOcHOcHOaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahybkQbkQcOsahycOMbkQbkQcMNcOacObcOccjScOecOfcOgcOhcOicMTcOjcOkcOlcOlcOmcOncOocPFcOqcNccNdcNecOrcPPcOtcOtcyzdDHcOvcOtcOwcLGahyahycwhcOxcOycOzcOAcOBcOCcOCcOCcOCcOAcOAcOAcODcOEcOFcOAcOCcOCcOGcOCcOCcOCcOCcOCcOCcOCcOCdlDdBIdBHcKCcOKcLPcLPcOLcLPcLPcPYcONcOOcOPcOQcONcPYcLPcLPcLPcORcLPcLPcKCdBJcHqcBgahyahyahyaahaahaahaahaahaahaahcWudDIdbMdbMdDJcWuaahaahaahaahaahaahaahaahaahaahcPdcPecPfcPgcPhaGYcPjcPkcPdcPlcPmcPncuscPpcPpcPqcPpcutcPrcPscPpcPtcPpcPucPpcPpcvkcPncPwbfocPxcPycPzcPAaEycPCcPDcPEcPxaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaadaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahyahycQscPGcPGcPHcPGcPIcPJcPKcMNcPLcPMcPMckycPOcRfcPQcPRcPScMTcPTcPUcOocPVcPWcOocPXcRucPZcNccQacQbcQcdcEdDKdDMdDLdDNcQicQjcQkcLGahyahycwhcQlczQczicziczicziczicziczicziczicEDcEDcEEcNscEDczicziczicziczicziczicziczicziczicQmcEDdBKcKCcQocQocLPcQpcQqcQrcRJcQtcOOcQucQvcQwcRJcQxcQocLPcQycQqcQocKCdCRcHqcBgahyahyahyahyaahaahaahaahaahaahcWucWudDPbsUcWucWuaahaahaahaahaahaahaahaahaahaahcPdcQJcQKcQKcQLcQKcQKcQMcQNcQOcQPcQQcQRcQRcQRcQScQRcQTcQUcQVcQWcQXcQRcQYcQRcQRcQRcQQcQZarAcRbcRccRccRccRdcRccRccRecPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadbLjbLjaahaahaahaahaahaahaahaahaahaahaahaahaahaahahyahycSAcRgcRhcRicRjcRkcRlcRmcRncRocRpcRqcRrcmbcRtcSLcRvcRwcRxcMTcRycPUcRzcRAcRBcRCcOlcRDcREcRFcRGcRHcRIcTadDQcRKcRLcRMcRNcROcRPcLGahyahycwhcRQcwhcziahyahyahyahyahyahyahycziczicziczicziczicziaahaahaahaahaahaahaahaahaahcziczicRRdCScKCcRWcRWcRVcLPcRWcNIcRJcRYcOOcOPcOQcRZcRJcRWcRWcLPcRVcRWcRWcKCdCTcSccBgahyahyahyahyahyaahaahaahaahaahahydDRdbMdDUdDRahyaahaahaahaahaahcXGcXGcXGcXGaahcPdcSdcSecSfcSgcShcSicSjcSjcSkcSlcSmcSlcSlcSlcSncSlcSlcSlcSocSpcSqcSqcSrcSqcSqcSqcSscStarBcSucSucSvcSwcSxcSycSyarCcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahbLjbLjaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQcTZcSBcSCcPMcSDcPMcSEcSFcSGcSHcPMcPMcSIcmmcSKcUlcSMcSNcSOcMTcSPcSQcSRcSScSTcSUcSVcSWcSXcSYcSZcNecRIcUscTbcOtcTccOtcTearDcTgcLGahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahaahaahaahczicThcRScKCcTicTjcTkcLPcTlcTjcRJcTmcTncTocOQcTmcRJcTjcTjcTpcLPcTlcTqcKCcSbcTrcBgahyahyahyahyahyahyahyahyahyahyahydDTdbMdDUdDTahyahyahyaahaahcXGcXGasfasecXGaahcPdcPdcTscTtcTucTvcTwcTxcPdcPncPncPncTycTzcTzcTAcTBcTCcTDcTEcTFcTGdCUcTHcTzcTzasgcPncTDashcPxcTJcTKasicTMcTNcTOcPxcPxaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcTZcSBcTPcTQcTRcTScTTcTUcTVcTWcPMcPMcTXcmncTYcKjcUvcUacUvcMTcUbcUccUdcUecUecUfcPXcPFcUgcUhcUicUjcRIcUkcUycUmcUodcLcUkcUkcUkcLGahyahycwhcUpcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahaahaahaahaahaahaahaahahyczidCVcRScKCcUrcLPcORcLPcLPcLPcUHcONcOOcOPcOQcONcUHcLPcLPcOLcLPcLPcUtcKCcSbdCWcBgahyahyahyahyahyahyahyahyahyahyahycWudDWdDVcWuahyahyahyahyaahcXGasjaskdaDcXGaahaahcPdcUIcUwcUwcUwcUxcPdcPdaahaahcPncPncUYcUzcUzcUAcPncUBcUCcUDcPncPncPncPncPncPncPncUBcPmcPxcPxcPxcPxcPxcPxcPxcPxaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccUEcUEcUFcUGcVucVgcUJcUKcULcUMcPMcUMcUNcUOcUPcUQcURcUScmocUUcUVcRqcUWcUXcVQcUZcOocOocOocOocOocVacRucVbcUhcVccNecVdcVecVfcWicVhcVicVjcVkcVlcVmahyahycwhcRQcwhahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyahyaahaahaahahyahyahyahyahyahyczicVncEDcKCcLPcLPcVocNEcNEcNEcNDcNCcVpcVqcVrcNycNxcNwcNwcVscLPcLPcLPcKCcGxcVtcBgahyahyahyahyahyahyahyahyahyahyahydDRdbMdbSdDRahyahyahyahyahycXGaslaskasmcXGahyahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahycWvcVvcVwcVxcPnaahaahaahaahaahabTasoasnabTaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIccVycVzcVAcNZahycTZcVBcVCcVDcVEcVFcUMcVGcVHcVIcVJcVKcVKcnlcVMcVNcPMcVOcVPcWBcVRcVScVScVTcOocVUcVVcMTcVWcVXcVYcNecVZcWacWbcWicWccWdcWecWfcWgcVmcwhcwhcwhcRQcwhcWhcWhcWOcWjcWkcWhcWhcWOcWjcWkcWhcWhahyahyahyahyahyahyahyahyahyahyahyahycziczicWlczicKCcWmcWncWocWpcvtcLPcLRcONcOOcOOcOQcONcLRcLPcvtcWpcWqcWrcWscKCcBgcWtcBgcBgahyahyahyahyahyahyahyahyahyahydDTdbMdbSdDTahyahyahyahyahycXGcXGaspcXGcXGahyahyahyahyahyahyahyaahaahaahaahaahahyahyahyahyahyahycXncWwcWxcWycWuaahabTabTabTabTabTastasqabTabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccUEcUEcWzcWAcVucXucWCcWDcWEcWFcWGcWHcWIcWJcWJcWJcWFcWFcnmcWKcWLcPMcWMcWNcMTcMTcXycWPcwAcvvcXycWPcWScWTcWUcVYcNecWVcWWcWXcWicWYcWZcXacXbcXccVmdDXcXecXecXfczQcWhcXgcXhcXicXjcXkcXlcXhcXmcXhcXhcWhcWhcXHcXocXocXocXocXocXpcXqcXHcXpcXqcXqcXrcXscXtcKCcKCcNYcKEcKFcKCcKCcKCcYfcXvcXvcKIcYfcKCcKCcKCcNYcKEcKFcKCcKCcXtcXwdCXcXqcXqcZncXzcXzcXzcXAcWucWucWudDYcWucWwdDZcWucZncXzcXzcXAcWucWucXBasvdHkcWucWucWucWucZncXzcXzcXAcWucWucWucWucWucWucWucZncXzcXzcXAcWucXDcXEcXFcWuabTabTaswacwacwasxacuaeVaszasyacwacwabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQcZocXIcXJcVDcXKcXLcUMcUNcXMcXMcXNcUOcVEcnncXPcWFcXQcXRcXScXTcXUcXVcXWcXXcXYcXZcYacYbcYacYccYdcNecYecWacNcdaTcYgcYhcYicYjcYkcVmcRQczQcYlczQczQcYmcYncYocYpcYqcYncYrcYpcYscYtcYucYvcYwcYxcYycYxcYxcYzcYxcYAcYBcYxcYxcYCcYDcYEcYFcYGcYHcYCcYxcYIcYxcYycYJcYKcYxcYxcYxcYLcYxcYMcYNcYycYxcYxcYxcYCcYxcYGcYOcYPcYPcYQcYRcYScYRcYTcYRcYUcYVdCYcYRcYScYRbtlcYRcYRcYRcYWcYRcYXcYScYYasAcYZdCYcYXcYRcZacYRcYRcZbcYRcYRcZccYUdCYcYRcYRcZdcYRcYRcYScYRcYXcZecZfcXFasBasDasCacuacuacuasEasFaeVacuacuacuacuawwabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkcZlcZmdbDdbdcZpcZqcVMcZrcPMcUMcUNcZscZtcZucVGcVHcojcZqcZwcZxcZycZqcZzcZAcZBcZCcZDcZEcZFcZGcZHcZGcZIcZJcZKcZLdmbcZNcZOcZPcZQcZRcZScZTcVmcRQcwhcwhcZUcwhcZVcZWcZXcWhcZVcZWcZYcWhcZVcZZdaadabdacdaddaddaddaedaddaddafdaddaddaddagdaedahdaidajdakdagdaddajdaddaddaddaedaddaddaddaddaddafdaddaddaddaddaddagdakdajdaldaddaedagdamdamdamdandamdamdaodamdamdamdambujdamdamdamdapdamdaqdaodardasdatdaudaqdamdandamdamdaodamdamdamdamdamdamdamdavdamdamdaudamdaqdawdaxasUasSasWasVasXasXatbasZatdatcacJacuacuacuadKabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahaahahycIcdaEdaFdaGcNZahycTZdaHdaIdaJdaKcTSdaLcUNdaMdaNaImcUNcPMcokcPMdaQcPMddBcoldaSdaSdbIdaUdaVdaWdbIdaUdaSdaXdaYdaZdbadbbdbcdbNdbedbfdbgdbNdbedbcdbccRQcwhdbhdbidbjcZVdbkdbldbmcWhdbndbldbocZVcWhdbpcXhdbqdbrdbrdbrdbsdbtdbrdbrdbudbrdbrdbvdbwdbxdbydbzcOddbBdbCdcedbCdbCdbEdbFdbCdbCdbGdbCdbCdbCdbHdbCdbCdcfdbCdbBdbJdbzdbydbKdbLdbvdbMdcrdbMdbMdbMdbMdbOdbMdbVdbMdbMdbMdbMdbMdbMdbPdbMcWwdbQdbRdbScXEdbTcWwdbMdcrdbMdbMdbUdbMdbVdbMdbMdbMdbVdbMdbMdbMdbMdbWdbMcWwdbWdbXcXFdbYadCacuacuateatOatfatSatPacJacuacuacuatTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccZkcZkdccdcddcDdczdcgdchdcidaPcPMcUMdcjdckdcldcmdcndcocpfcTQdcpdcmcpgcphdcJdcsdctdcudcvdcwdcxdcydcxddbdcAdcBdcCddndmkdcFdcGdcHdcIddtdcKczfdbcdcMcwhdcNdbidcOcZVdcPdcQdcRcWhdcSdcTdcUcZVcWhcWhcWhcWhcXHcXocXocXocXocXocXpdcVcXHcXpdcWdcXdpPdqIdpQdcXdcWddDdcVcXHcXocXocXocXocXpdcVcXHcXocXocXocXocXpdcVddDddcddddskdtrdstddddddddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddiddjdBAdBCdBBddjddiddPddhcZncXzcXzcXzcXzcXAddhcZncXzcXzcXzcXzcXAddhddPddodBEdBDdBFddsabTaezacuaeVacuacuatVatUacuacuacuacuaeCabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdducXJddvddwcTSddxcPMcUOcVFcVEcPMcPMcpkddzcWLddAdfwcpideedcsdcudcudcvdcwddEddEddFddGddHddIdcCddJddKddKddKddLddMddNddNdBGdbccRQcwhdekddQddRcZVddSddTddScWhddUddVddUcZVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqddXddYddZdeadebdeqaaaaaaaaaaaaaaadeddeddeddeddeddeddedaaaaaaaaaaaaaaadeWdefdegdehdeidejdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdeldemdendeodepdfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdetdeuddsatWatYatXauaatZaegacuaeXaubaciaeYabTabTaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahbkQcIcdevdevdewcZmdbDdbddexcZqdeydezcVNcUMcPMdcjdclcVHcSHcPMcpKcWLcVIcVJcqacqEdeCdeDdcudeEdeFdeGcvzcuRdeJdeKdeLdeMdeNddJddKddKdeOdePdeQdeRddKdeSdbccRQcwhahyahyahycZVddSdeTddScWhddUdeUddUcZVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfhdeXdeYdeZdeadfadfmaaaaaaaaaaaadeddeddeddeddeddeddeddeddedaaaaaaaaaaaadfBdfddegdfedffdfgdfBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfIdfidfjdfkdeodfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdfndfoddsabTabTabTaflaflafmaflaflabTabTabTabTaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahaahahycIcdfpdfqdfrcNZahycTZdfscPMcUMcWLcVIdeydftcZqdfucZqdftcZqcrbcWLcPMcPMdhcdhddfydfzdcudcudfAaIndcucAvdfEddbdfFdfGdfHddndfXdfJdfKdfYdfMdfYdfNdbcdbccRQcwhahyahyahyahyddSdfOddScZVddUdfPddUdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgwdfRdfSdfTdfUdfVdfWdhgdcWaaaaacaaadeddeddeddeddeddeddeddeddeddeddedaaaaacaaaddcdhudfZdgadgbdgcddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidgddemdgedgfdggddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodghdgidgjdgkddsaahaflagBaflaudafBaueafDafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahaahahycIcdevdevdgldcddcDdczdgmcTSdgncWLcPMdgocTTcTSdgpcTScTScTScrcdgpdgqcPMdiccredaSdgtdcudgudgvdhzcAzcAvdgydgzdgAddIdgBdgCdgCdgCdgCdgCdgCdgCdgCdbcdgDdgEcwhcwhahyahyahydgFdgGdgHaaadgIdgJdgKdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdgLdgMdgNdgOdgPdgQdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdgTdeidfgdeWaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfbdfidemdgUdgVdfldfbaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdgWdgjdgXddsaahaflauPaflafPafQafRaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQcIccIccIccIccIcbkQddWdgYcXJcPMcWLcPMcPMdgZdhacWLcPMcPMdhactkcthctsctpcOJcOudaSdhedcudcucyNdhEdcucBZdhidgzdhjdfGdhkdhldhmdhndhodhpdhqdhrdhsczQczQdhtczQcwhahyahyaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdhIdfRdhvdfTdhwdhxdgRdhydfhaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadhMdhAdhBdgadhCdhDdhMaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadifdhFdemdgedhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdhKdhLddsaahaflagAaflagfaggaggaghafEaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahbkQbkQahyahyahybkQbkQdiLdhNdhOdhPcVIdhQdhRdhSdhTdhUdhVdhWdhXdhYdhZdiadibcPMcuFdaSdiedcudcucyNdiYdcucAvdigdgzdfFdihdgBdiidijdikdildimdindiodipcXecXediqdircwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVdeVaaaaaadfmdeXddYddZdgRdfadfmaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadfBdfddgSdehdeidfgdfBaaaaaaaaaaaaaaadisditdiudiudiudivdiwaaaaaaaaaaaaaaadfIdfidemdendhGdfldfIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfLderdesdixdgXddsaahaflaflaflaflagqaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaahaahahyahyahyahyahydjtdizdiAdiBdiCdiBdiDdiEdiCdiBdiFdiEdiCdiCdiDdiGcuKcOXdaSdiHdiIdiJdiKdjucCgcCadiOdgzdfFdihdgBdiidijdiPdiQdiRdijdhrdiSdiTdiUdiVdiWcwhahyaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjwddYdjcdjddjedcWaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaaddcdjfdjgdjhdeidjiddcaaaaaaaaaaaaaaadjjdjkdjkdjkdjkdjkdjjaaaaaaaaaaaaaaaddidjldemdjmdjndjoddiaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddodjpdjqdjrdjsddsaahaahaahaflagyaggagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaahaahaahaahaahaahaahaahaaaaaaaaaahydkCdjxdbDdbDdkJdjxdkLdbDdkJdjxdkLdbDdkJdkUcOsbkQcuKcPNdaSdgzdgzdgzdgzdgzdgzdjydgzdgzdjzdjAdjBdjCdjCdjCdjCdjCdjCdjCdjCdjCcxxdhtcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdgRdfadeqaaaaaaaaadeddeddeddeddeddeddeddeddeddeddedaaaaaaaaadeWdfddgSdehdeidfgdeWaaaaaaaaaaaaaaadjjdjDdjEdjkdjEdjDdjjaaaaaaaaaaaaaaadfbdfidemdendhGdfldfbaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfcderdesdixdgXddsaahaahaahaflagyagLagzaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAacAaaadjFaaabkQcIcdjGcNZcMKcIcdjGcNZcMKcIcdjGcNZcMKcIccuKcRacRsdjHdkodjIcRXcRTcSacCqdjOdjPdjQdjRdjSdjCdjTdjUdjVdjWdjXdjYdjZdjCdjCdhtcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadfUddZdgRdebdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdejdgSdehdeidgSdhMaaaaaaaaaaaadisdkbdkcdkcdkddkcdkcdkbdiwaaaaaaaaaaaadifdhGdemdendhGdepdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiyderdesdixdgXddsddsaahaahaflaflaflaflaflaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaaadaadaadaaaacAaaddkeaadbkQcIcdkfdkgdkhcIcddrdcYdfQcIcdkldkmdkncIccuKcChcDNdjHdlmdkpdkrdksdlpdktdkudjPdkvdkwdkxdjCdkydkydkzdjXdjXdkAdkAdEbdjCdhtcwhdkYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadkDdkEdkFdkGdkHddZdkIdlEdfSdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdkNdkOdkPdehdeidfgdhMaaaaaadisdkcbwQdlWdHmdHldjkdHldHnbCYbEMdkcdiwaaaaaadifdfidemdendkTdlYdkVdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdladlbdlcdixdgXdldddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledlfdlgaaadledlfdlgaaadledlfdlgaaadledlfdlgaaaacAaadaadaaaaaacIcdlhdlidlhcIcdkjdkidkjcIcdlkdlldlkcIccuKcGMcGNdjHcSzdlndlodlpdlpdlqcHBdltdludlvdlwdlxdlydlzdlAdlzdlzdlBdlzdEcdjCdhtdDadoidlFaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadlGdlHdlIaOpdlKdlLaOrdeddeddeddeddeddeddeddeddeddeddeddeddeddlNdlOdlPaOsdlRdlSdlTdokdkNdkMdlVdjjbuAdjkdjkdjkdjkdjkdjkdjkdjkdjkbuAdjjdoEdkWdkVdkXdlZdmadDbdmcdmddmedmfaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmgdmhdmidmjdDcdixdgXdmlddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledmmdlgaaddledmmdlgaaddledmmdlgaaddledmmdlgaadacOaaaaadaadaaacIcdlhdmndlhcIcdkjdkkdkjcIcdlkdmpdlkcIccuKcvwcHLdjHcSzdmqdlpdlpdlpdmrdmsdmudmvdmwdmxdmydmzdmAdmBdmCdmCdmDdlzdEddjCdhtczQdmFdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadfmdeXddYddZdmHaOtdmJdmKaOudeddeddeddeddeddeddeddeddeddeddeddeddeddmMdmNdmOaPedmQdehdmRdmSdmTdgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdmWdmVdmXdendmYdmZdnadnbdncaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnddnednfdngdnhdixdgXdniddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaadaadcIccIccIccIccIccIccIccIccIccIccIccIccIccuKcvwcHLdjHdlmdkpdlodlpdlpdktdEedjPdfFdihdnkdjCdnldnmdnndnodnpdnqdnrdnsdjCdntczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdnvddYddZdnwdlEdhvdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdnxdkOdnydehdnzdokdnxdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdnAdkXdnBdendnCdlYdnAdkWdkXaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmGdkZdnDdlbdnEdixdgXdnFddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaadaadaadaadaaaaaaaadaadaadaaabkQdnGdnGdnGcuKcSJcuKdjHdkodnHcTLcTIcUTcHPdjHdjHdnNdnOdnPdjCdjCdnQdnodnRdnSdnTdnrdjCdjCdhtczQdnudppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadeqdeXdnVdnWdgRdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdgSdnYdnZdnXdhMaaaaaadoadjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdoaaaaaaadifdocdoddoedhGdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdesdogdohddsddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaadledmmdlgaaadledmmdlgaaadledmmdlgaaadledmmdlgaaaaadaaaaaaaaaaaaaaddqrdojdojdojdojdnGdqLdoldnGdnGdomdomdoncvEcvKdjHdjHdjHdjHdjHdjHdjHdjHdoqdordosdotdoudjCdjCdjCdjCdjCdjCdjCdjCdjCdhtczQdovdppaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdgwdfRdfSdkadfUddZdgRdhydfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdhAdgSdehdeidowdhMaaaaaadoxdjkdjkdjkdjkdjkbvidjkdjkdjkdjkdjkdoxaaaaaadifdozdemdendhGdhHdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydhJdesdixdoAddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaadoDaaaaaaaaadqNdoFdoGdoHdoIdoJdoKdoLdoMdoNdoOdoPdoQdoQdoRcvQdoTdoUdoVdoWdoRdoOdoXdoYdoZdpadpbdpcdpddpedpfdpgdphdpidpjdpkdpldpmdpndhtdpodqTdpqaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdprdpsdptdpudpvdpwdpxdeXdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMdnXdpydpzdeidnXdhMaaaaaadpAdjkdmUdmUdmUdmUdjkdmUdmUdmUdmUdjkdpAaaaaaadifdocdemdpBdpCdocdifaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiydofdpDdpEdgXddsaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddpFdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGbCXdpGdpGdpGdpGdpGdpKdpLdpMdpNdpOcBhcAMdpRdpSdpTdpUdpVdpWdpXdpYdpZcvRcxKdqZcxXdosdoudoudqfdoudqgdoudqhdqidoudoudqjdoudqfdqkdqldqmdqndqodqpdqqcwhdqYaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdhIdfRdhvdkadqsdcZdqtdlEdfSdfRdfTdeddeddeddeddeddeddeddeddeddeddeddeddeddokdkMdkNdkOdquddfdqvdokdkNdkMdkOdjjdqwdjkdjkdjkdjkdjkdjkdjkdjkdjkdqxdjjdlYdkWdkVdkXdqyddldqzdlYdkVdkWdkXaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaadmGdkZdladlbdqBdqCdqDddsaahaahaahdqEdqEdqEdqEdqEdqEdqEaahaahaahaahaahaahaahaahaahaahaahaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaaaadaaaaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadbCWaadaaaaadaaaaaaaaadqNdoFdqGdqHcBPcBldojdnGdqJdqKdnGdnGdrxdoldqMdnGdrAdqOdqOczqdqOdqQdqRdqQdqSdrBdqUdqVdrBdqUdqSdqWdqXdsLdnGdqZdqZdnGdnGcwhcwhaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadnUdnUdnUdnUdnUdnUdnUdnUdnUdnUdnUaaaaaaaaadfmdeXddYddZdmHaPvdrbdrcaQTdeddeddeddeddeddeddeddeddeddeddeddeddedaQXdrfdrgaQYdmQdehdmRdmSdridgSdmSdkddjkdjkdjkdmUdmUdjkdmUdmUdjkdjkdjkdkddmVdhGdrjdmVdmXdendmYdrkdrldrmdrnaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadrodrpdrqdrrdnhdixdgXddsdqEdqEdqEdqEdrsdrtdrudrvdrsdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEdqEaahaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAacAacAaadaaddledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaaaaaddtkdojdojdojdojdnGdrydrzdtIaaadtXdrCdrDdrEdrFdqOdrGcAldrIdqQdrJdrKdrLdrMdrNdrOdrPdrQdrLdrRdrSdrTdnGdrUdrVdrWdtIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadiXdcWdjvdiZdjadcXdcXdcXdcXdcXdcWdjbdrXdlHdrYaQZdsadsbaRNdeddeddeddeddeddeddeddeddeddeddeddeddedaWEdsedsfaWHdshdlSdsidokdnxdkMdlVdjjbuAbFIdlWdjkdjkdjkdjkdjkdlXbFIbuAdjjdoEdkWdnAdkXdsjdmadDddsldsmdsndsoaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadspdsqdsrdssdDedsudsvdswdBLdsydsydsydszdsAdszdsBdszdsydsxdsydsydsydsCdsDdsEdsFdsGdsHdqEdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaaadaaaaaaaaaaadaadaaaaaaaaaaaaaaadnGdsJdsKdtZaaddtXdsMdsNdsOdsPdqOdsQcApdsSdqQdsTdsUdrLdsVdsWdsXdsYdsZdrLdtadtbdtcdnGdtddtedtfdtZaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadeqdeXddYddZdtgdlEdhvdfRdkKdeddeddeddeddeddeddeddeddeddeddeddeddeddlUdkMdnxdkOdthdehdeidfgdhMaaaaaadujdkcbuldtidjkdHobuBdHpdjkdwfbumdkcdunaaaaaadifdfidemdendtldlYdnAdkWdkXaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaadmGdkZdtmdtndtodtpdtqdtqdBMdtsdttdtudtvdtwdtxdtydtzdtwdtAdtBdtCdtDdtEdtBdtBdtBdtBdtFdtGdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadaaadledrwdlgaaadledrwdlgaaadledrwdlgaaadledrwdlgaaaacAaaaaaaaadaadaaaaaaaaaaaaaaaaaadnGdtHdtHdnGahydxKdoldtJdqLdoldqOdtKdtLdtMdtNdtOdtPdtQdtRdtSdtTdtUdtVdtWdxNdtYdxOduadubducdnGdnGaaddudduedueduedueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadgwdfRdfSdkadufddZdgRdugdfhaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadhMduhdgSdehdeiduidhMaaaaaaaaaaaadujdukduldumdumdumduldukdunaaaaaaaaaaaadifduodemdendhGdupdifaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadiyduqdixdurddsdqEdqEdusdutduudqEdusdutduvdqEdusdqEdqEdqEdqEdqEdqEdqEdtBdtFdtBdqEaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacAaaddledrwdlgaaddledrwdlgaaddledrwdlgaaddledrwdlgaadacAaaaaadaadaaaaaaaaaaaaaaaaaaaaaduwduxduyduwbkQduzduAduBduAduzdqOduCduDduEdqQduFduGdrLduHduIduJduIduKdrLduLduMduNduaduOduPduQduRaaaaadaadaaaaaadueaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaduSduTduUduVduWduXdjddfadfmaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaadfBdfddjgduYdeidfgdfBaaaaaaaaaaaaaaaaaadujdukdukdukdunaaaaaaaaaaaaaaaaaadfIdfidemduZdjndfldfIaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaadfLdvadvbdvcddsaahaahdqEdvddvedvfdqEdvgdvhdvidqEaahaahaahaahaahaahdvjdvjdvkdvjdvjaahaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadsIdsIdsIdsIdsIdsIdsIdsIdsIaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacOaaadledvldlgaaadledvldlgaaadledvldlgaaadledvldlgaaaaadaadaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabkQdvmdvndvodvpdvmdvqdvrdvsdvtdqQdvudvvdrLdvwdvxdvydvzdvAdrLdvBdvCdvDduadvEdvFduQdvGaaaaadaadaaaaaaaadaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadhIdfRdhvdkadvHdvIdgRdvJdcWaaaaaadeddeddeddeddeddeddeddeddeddeddeddeddedaaaaaaddcdvKdgSdvLdeidjiddcaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaddidjldemdvMdhGdvNddiaaaaaaaaaaaaaaaaaadqAdqAdqAdqAdqAdqAdqAaaaaaaaaaaaaaaaddodvOdvPdvQddsaahaahdqEdvRdvSdvTdqEdvUdvVdvWdqEaahaahaahaahaahaahdvjdvXdvYdvZdvjbvVaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadoBdoBdoBdoBdoBdoBdoBdoBdoBaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-2.dmm b/maps/polaris-2.dmm index 4f41567e0d0..e12cb241f53 100644 --- a/maps/polaris-2.dmm +++ b/maps/polaris-2.dmm @@ -510,7 +510,7 @@ "ajP" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) "ajQ" = (/obj/structure/bed/chair,/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) "ajR" = (/obj/structure/flora/pottedplant{icon_state = "plant-22"},/turf/simulated/floor/carpet,/area/shuttle/trade/centcom) -"ajS" = (/obj/machinery/sleep_console{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) +"ajS" = (/obj/machinery/sleep_console{dir = 8},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "ajT" = (/obj/machinery/sleeper{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "ajU" = (/obj/structure/shuttle/engine/propulsion{dir = 4},/turf/space,/area/shuttle/trade/centcom) "ajV" = (/turf/space/transit/north/shuttlespace_ns8,/area/skipjack_station/transit) @@ -619,7 +619,7 @@ "alU" = (/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alV" = (/obj/effect/step_trigger/thrower{affect_ghosts = 1; direction = 8; name = "thrower_escapeshuttletop(left)"; tiles = 0},/turf/space/transit/north/shuttlespace_ns12,/area/space) "alW" = (/obj/machinery/door/blast/shutters{density = 0; dir = 8; icon_state = "shutter0"; id = "tradebridgeshutters"; name = "Blast Shutters"; opacity = 0},/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/simulated/shuttle/plating,/area/shuttle/trade/centcom) -"alX" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) +"alX" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "alY" = (/obj/machinery/light{dir = 4},/obj/structure/sign/kiddieplaque{desc = "A plaque commemorating the construction of the cargo ship Beruang."; name = "Beruang"; pixel_x = 32},/mob/living/simple_animal/corgi/tamaskan/spice,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/shuttle/trade/centcom) "alZ" = (/obj/machinery/door/airlock/silver{name = "Toilet"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) "ama" = (/obj/machinery/door/airlock/silver{name = "Restroom"},/turf/simulated/shuttle/floor{icon_state = "floor7"},/area/shuttle/trade/centcom) @@ -1096,7 +1096,7 @@ "avd" = (/obj/structure/table/standard,/obj/machinery/recharger,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "ave" = (/obj/machinery/computer/security/nuclear,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avf" = (/obj/machinery/computer/shuttle_control/multi/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"avg" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"avg" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avh" = (/obj/structure/table/standard,/obj/machinery/button/remote/blast_door{id = "syndieshutters"; name = "remote shutter control"; req_access = list(150)},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "avi" = (/obj/structure/bed/chair/comfy/black,/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "avj" = (/obj/machinery/door/airlock/centcom{name = "Kitchen"; opacity = 1; req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) @@ -1145,7 +1145,7 @@ "awa" = (/obj/item/weapon/stool/padded,/obj/effect/floor_decal/corner/red/diagonal,/obj/effect/floor_decal/corner/blue/diagonal{dir = 4},/turf/unsimulated/floor{icon_state = "steel"},/area/centcom/specops) "awb" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/donkpockets{pixel_x = 2; pixel_y = 3},/obj/machinery/light{dir = 8; icon_state = "tube1"; pixel_y = 0},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "awc" = (/obj/structure/bed/chair{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) -"awd" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) +"awd" = (/obj/structure/frame/computer,/obj/machinery/light{dir = 4},/turf/simulated/shuttle/floor{icon_state = "floor6"},/area/syndicate_station/start) "awe" = (/obj/structure/bed/chair/comfy/black{dir = 1},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "awf" = (/obj/machinery/vending/cola{name = "hacked Robust Softdrinks"; prices = list()},/turf/unsimulated/floor{tag = "icon-cult"; name = "plating"; icon_state = "cult"},/area/syndicate_mothership) "awg" = (/obj/structure/closet/secure_closet/freezer/kitchen{req_access = list(150)},/turf/unsimulated/floor{icon_state = "white"},/area/syndicate_mothership) diff --git a/maps/polaris-3.dmm b/maps/polaris-3.dmm index 7b303c6b863..c0c85cada7c 100644 --- a/maps/polaris-3.dmm +++ b/maps/polaris-3.dmm @@ -20,7 +20,7 @@ "at" = (/obj/item/weapon/scalpel,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "au" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/derelict/ship) "av" = (/turf/simulated/shuttle/plating,/area/derelict/ship) -"aw" = (/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"aw" = (/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "ax" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) "ay" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) "az" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced,/turf/simulated/shuttle/plating,/area/derelict/ship) @@ -80,8 +80,8 @@ "bB" = (/obj/item/weapon/material/shard{icon_state = "medium"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bC" = (/obj/item/weapon/material/shard,/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bD" = (/obj/structure/bed/chair,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bE" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) -"bF" = (/obj/structure/cable,/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bE" = (/obj/structure/cable,/obj/structure/frame/computer,/obj/item/stack/cable_coil/cut,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) +"bF" = (/obj/structure/cable,/obj/structure/frame/computer,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bG" = (/obj/structure/table/rack,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/obj/item/weapon/tank/emergency_oxygen,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bH" = (/obj/structure/table/rack,/obj/item/clothing/suit/space/syndicate,/obj/item/clothing/head/helmet/space/syndicate,/obj/item/clothing/mask/breath,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) "bI" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/shuttle/floor{icon_state = "floor3"},/area/derelict/ship) @@ -197,7 +197,7 @@ "dO" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/airless,/area/tcomsat) "dP" = (/obj/structure/cable/yellow{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/obj/machinery/camera/network/telecom{c_tag = "Telecoms - Solar South"},/turf/simulated/floor/airless,/area/tcomsat) "dQ" = (/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 4; icon_state = "1-4"},/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless,/area/tcomsat) -"dR" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) +"dR" = (/obj/structure/frame/computer,/obj/structure/cable{icon_state = "0-2"; d2 = 2},/turf/simulated/floor/airless,/area/AIsattele) "dS" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/obj/machinery/atmospherics/pipe/simple/hidden/supply,/obj/structure/cable{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/tcomsat) "dT" = (/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 1},/turf/space,/area/tcomsat) "dU" = (/obj/structure/window/reinforced{dir = 1},/obj/structure/lattice,/obj/machinery/light,/turf/space,/area/tcomsat) diff --git a/maps/polaris-4.dmm b/maps/polaris-4.dmm index 95291cf44a6..d7246141b83 100644 --- a/maps/polaris-4.dmm +++ b/maps/polaris-4.dmm @@ -8,7 +8,7 @@ "ah" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) "ai" = (/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/airless,/area/mine/explored) "aj" = (/obj/structure/girder,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) -"ak" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/airless,/area/mine/explored) +"ak" = (/obj/structure/frame/computer,/turf/simulated/floor/airless,/area/mine/explored) "al" = (/obj/machinery/teleport/station,/turf/simulated/floor/airless,/area/mine/explored) "am" = (/obj/machinery/teleport/hub,/turf/simulated/floor/airless,/area/mine/explored) "an" = (/turf/simulated/floor/tiled/white/airless,/area/mine/explored) @@ -24,7 +24,6 @@ "ax" = (/obj/item/stack/material/steel,/turf/simulated/floor/airless,/area/wreck/main) "ay" = (/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) "az" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/reagent_containers/syringe/antiviral,/obj/item/stack/rods,/turf/simulated/floor/airless,/area/wreck/main) -"aA" = (/obj/structure/frame{anchored = 1; frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/tiled/airless,/area/wreck/main) "aB" = (/obj/structure/table/steel_reinforced,/obj/item/weapon/scalpel/laser3,/turf/simulated/floor/tiled/airless,/area/wreck/main) "aC" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/airless,/area/wreck/main) "aD" = (/obj/structure/table/steel_reinforced,/turf/simulated/floor/tiled/airless,/area/wreck/main) @@ -105,7 +104,7 @@ "ca" = (/obj/structure/table/rack,/obj/item/weapon/storage/toolbox/syndicate,/turf/simulated/floor/airless,/area/wreck/main) "cb" = (/obj/item/weapon/circuitboard/teleporter,/turf/simulated/floor/tiled/white/airless,/area/wreck/main) "cc" = (/obj/machinery/teleport/station,/turf/simulated/floor/tiled/airless,/area/wreck/main) -"cd" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/tiled/airless,/area/wreck/main) +"cd" = (/obj/structure/frame/computer,/turf/simulated/floor/tiled/airless,/area/wreck/main) "ce" = (/obj/machinery/teleport/hub,/turf/simulated/floor/tiled/airless,/area/wreck/main) "cf" = (/obj/machinery/light{dir = 4},/turf/simulated/floor/airless,/area/wreck/main) "cg" = (/turf/simulated/shuttle/wall{icon_state = "swall_t"; dir = 8},/area/wreck/main) @@ -244,7 +243,7 @@ "eJ" = (/obj/machinery/door/airlock/glass_engineering{name = "Engineering Airlock"},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/tiled,/area/outpost/abandoned) "eK" = (/obj/structure/cable,/turf/simulated/floor,/area/outpost/abandoned) "eL" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/tiled,/area/outpost/abandoned) -"eM" = (/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"eM" = (/obj/structure/frame/computer,/turf/simulated/floor/tiled,/area/outpost/abandoned) "eN" = (/obj/structure/table/steel,/obj/machinery/cell_charger,/obj/machinery/alarm{frequency = 1439; pixel_y = 22},/turf/simulated/floor/tiled,/area/outpost/abandoned) "eO" = (/obj/structure/bed/padded,/obj/item/weapon/bedsheet/orange,/turf/simulated/floor/tiled,/area/outpost/abandoned) "eP" = (/obj/structure/toilet{dir = 4},/turf/simulated/floor/tiled,/area/outpost/abandoned) @@ -274,7 +273,7 @@ "fn" = (/obj/machinery/atmospherics/pipe/simple/hidden/supply{dir = 9; pixel_y = 0},/obj/machinery/atmospherics/pipe/simple/hidden/scrubbers{dir = 10},/turf/simulated/floor/tiled,/area/outpost/abandoned) "fo" = (/obj/structure/table/standard,/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/turf/simulated/floor/tiled,/area/outpost/abandoned) "fp" = (/obj/structure/cable/yellow{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor,/area/outpost/abandoned) -"fq" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/frame{frame_type = "computer"; icon_state = "computer_0"},/turf/simulated/floor/tiled,/area/outpost/abandoned) +"fq" = (/obj/structure/cable/yellow{d2 = 8; icon_state = "0-8"},/obj/structure/frame/computer,/turf/simulated/floor/tiled,/area/outpost/abandoned) "fr" = (/obj/structure/cable/yellow{d1 = 4; d2 = 8; icon_state = "4-8"},/obj/structure/cable/yellow{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/outpost/abandoned) "fs" = (/obj/structure/sink{icon_state = "sink"; dir = 8; pixel_x = -12; pixel_y = 2},/obj/structure/mirror{dir = 4; pixel_x = -32; pixel_y = 0},/obj/machinery/firealarm{dir = 1; pixel_x = 0; pixel_y = -24},/obj/machinery/light,/turf/simulated/floor/tiled,/area/outpost/abandoned) "ft" = (/obj/machinery/door/airlock/glass_engineering{name = "Break Room"; req_access = list(10)},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor,/area/outpost/abandoned) @@ -453,7 +452,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababarararararabaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababararararasarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababatatauauauauavavarararawawarararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavayaxatazaBaAaDaCauavavavawasarararawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababavayaxatazaBcdaDaCauavavavawasarararawaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaEaFavavavaHaGaJaIaJaKaHavavavavavaLararaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaMaNaFaOaOauaJaJaJaJaJauaPaOavavavavasaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaQaFavauauauaJaJaRaJaJauauauavavavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -463,9 +462,9 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababab aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaFaubcaKaJaJaJaJaJaubfbeaubgaKaKaKaubhbhavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauauauauauauaKaJaKaKaKaKauauauauauauaKaKauauauauauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahafaiafacacacajababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauaCbiaKbjauauaYauauaJbkaJbmblaDblauaKaKaKbobnbpauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahahafafafafafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataAbqbraKaKaKaJaAauaJaKaKaKaJaKaJauaKaKaKbobsaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababahahahabahahahahafafafafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataAbtaKbubvaKaJbwaubxaKauaKaJaJaJauaKbyaKbzaKaKaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababahahahahahabahahahahahajafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababauaAbAbBaKaKaKaJaAauaJaKaKaKaJaKaJauaKaKaKboaKaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababababababahahahahahafafafafafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababatcdbqbraKaKaKaJcdauaJaKaKaKaJaKaJauaKaKaKbobsaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababababababababababababahahahabahahahahafafafafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababatcdbtaKbubvaKaJbwaubxaKauaKaJaJaJauaKbyaKbzaKaKaHaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahabababababababababababababababahahahahahabahahahahahajafahafafafabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaucdbAbBaKaKaKaJcdauaJaKaKaKaJaKaJauaKaKaKboaKaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahahahahahahahahahahababababahahahabahahahabahahahahahahafafahafahahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababaybCbjauauaYauauaJaJaJbEbDaDbFauaKaKaKbobGaKauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahahahababababahahahahahahahahahahahahabababahahajahahahahahafafafafafahahahahahababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababataubHaJaKaKaKaKauauauauauauaKaKauauauauauaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababahahahababababababahahahahahahahahahababababababahahahahahababahafakalamafacahahahahabababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababababbIayaJaJaJaJaJaubKbJauaKaKaKaKaubLavavavaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/maps/polaris-5.dmm b/maps/polaris-5.dmm index 5871c0d1c77..35c2776ab3b 100644 --- a/maps/polaris-5.dmm +++ b/maps/polaris-5.dmm @@ -847,7 +847,7 @@ "qo" = (/obj/item/device/radio/intercom{name = "Station Intercom (General)"; pixel_y = -21},/turf/simulated/floor/tiled,/area/outpost/research/tempstorage) "qp" = (/obj/effect/floor_decal/corner/purple{dir = 5},/obj/machinery/status_display{layer = 4; pixel_x = 0; pixel_y = 32},/obj/machinery/space_heater,/turf/simulated/floor/tiled/white,/area/outpost/research/hallway/mid) "qq" = (/obj/effect/floor_decal/corner/purple{dir = 10},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) -"qr" = (/obj/effect/floor_decal/corner/purple/full{dir = 4},/turf/simulated/floor/tiled/white,/area/outpost/research/dock) +"qr" = (/obj/effect/floor_decal/corner/purple/full{dir = 4},/obj/machinery/recharge_station,/turf/simulated/floor/tiled/white,/area/outpost/research/dock) "qs" = (/obj/machinery/artifact_analyser,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "qt" = (/obj/machinery/artifact_scanpad,/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) "qu" = (/obj/structure/table/rack,/obj/item/clothing/head/welding,/obj/item/weapon/weldingtool,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/outpost/research/anomaly) @@ -1886,7 +1886,7 @@ "Kn" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/obj/machinery/access_button{command = "cycle_exterior"; frequency = 1379; master_tag = "eoutpost_solar_airlock"; name = "exterior access button"; pixel_x = 25; pixel_y = 25; req_access = list(10)},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) "Ko" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) "Kp" = (/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/kitchen) -"Kq" = (/turf/space,/area/shuttle/constructionsite/site) +"Kq" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/shuttle/constructionsite/site) "Kr" = (/turf/simulated/wall,/area/outpost/engineering/hallway) "Ks" = (/obj/structure/cable/yellow{d1 = 1; d2 = 2; icon_state = "1-2"},/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/mine/explored) "Kt" = (/obj/structure/grille,/turf/simulated/mineral/floor/ignore_mapgen,/area/mine/explored) @@ -1909,6 +1909,7 @@ "KK" = (/obj/structure/lattice,/obj/structure/grille{density = 0; icon_state = "brokengrille"},/turf/space,/area/space) "KL" = (/obj/structure/lattice,/obj/structure/grille,/turf/space,/area/space) "KM" = (/obj/machinery/power/tracker,/obj/structure/cable/yellow,/turf/simulated/floor/airless{icon_state = "asteroidplating2"},/area/outpost/engineering/solarsoutside/aft) +"KN" = (/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -20},/turf/simulated/floor/tiled,/area/outpost/mining_main/south_hall) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2077,7 +2078,7 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSCvCfCfCwCf aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSCvCfCHCICJCJCKCLDKCNCOCPEiCQCnCnCRBOCSCTBPdloVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSDUCVCWCVCVCXCYCZDaDbDcDcDdDcDVBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacBSBSDfDgCfCfDhDWDjDkBPCnCnDlDmBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacBSBSBSDnDoDhDpDpCkBPDqDrBOBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacBSBSBSDnDoDhKNDpCkBPDqDrBOBOBOdldldloVoVoVacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacBSBSBSDhDsDtDuBPBOBOBOdldldldldloVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacBSBSDvDwDxBOBOacdldldldldldloVoVdlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacoVoVDyoVacacdldldldldldloVoVdldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacjWdldldldldldldldldldlacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -2122,8 +2123,8 @@ aaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaagPgPgPaaaaaaaaaaaaaaaaaaaaaaaaaagPgPgPaaaadldlHVJvdldldldldldldlKoKqKqKqKqKqKodldlKtdlKuKuKuKuKudlKsdlKuKuKuKuKudlKtdldldldldlaaacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaagPgPgPgPgPgPgPgPgPgPgPgPgPgPgPaaaaaaaaaadlHVJvdldldldldldldloVKqKqKqKqKqoVdldlKtgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtdldldldldlaaacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPKBKCdldldldldldldloVKqKqKqKqKqoVdldlKtdlKDKDKDKDKDdlKEdlKDKDKDKDKDdlKtdldldldldlaaaaacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPKFgPaadldldldldldlaaKqKqKqKqKqoVdldlKtdldldldldldldlKEdldldldlgNdldlKGdldldldlaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPgPgPaaaadldldldlaaaaKqKqKqKqKqoVdldlKtdlKuKuKuKuKudlKEdlKuKuKuKuKudlKtdldldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPKFgPaadldldldldldldlKqKqKqKqKqoVdldlKtdldldldldldldlKEdldldldlgNdldlKGdldldldlaaaaaaaaacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadmaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa +aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaagPgPgPaaaadldldldldldlKqKqKqKqKqoVdldlKtdlKuKuKuKuKudlKEdlKuKuKuKuKudlKtdldldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlKHjWKqKqKqKqKqjWKIdlgNgNKvKwKwKwKwKyKxKyKzKzKzKzKAgNKtdldldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacacacacacacacacacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldlgNjWoVoVoVjWgNdldlKtdlKDKDKDKDKDdlKEdlKDKDKDKDKDdlKtdldldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaacaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaadldldldldldldldldldlKtdldldldldldldlKEdldldldlgNdldlgNdldlaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa diff --git a/nano/templates/identification_computer.tmpl b/nano/templates/identification_computer.tmpl index e783d9e3af4..d37ea009e95 100644 --- a/nano/templates/identification_computer.tmpl +++ b/nano/templates/identification_computer.tmpl @@ -137,7 +137,7 @@ Special - {{:helper.link("Captain", '', {'choice' : 'assign', 'assign_target' : 'Captain'}, data.target_rank == 'Captain' ? 'disabled' : null)}} + {{:helper.link("Station Administrator", '', {'choice' : 'assign', 'assign_target' : 'Station Administrator'}, data.target_rank == 'Station Administrator' ? 'disabled' : null)}} {{:helper.link("Custom", '', {'choice' : 'assign', 'assign_target' : 'Custom'})}} diff --git a/polaris.dme b/polaris.dme index 1095f16c658..c5e71101e1b 100644 --- a/polaris.dme +++ b/polaris.dme @@ -25,6 +25,7 @@ #include "code\__defines\damage_organs.dm" #include "code\__defines\dna.dm" #include "code\__defines\gamemode.dm" +#include "code\__defines\inventory_sizes.dm" #include "code\__defines\items_clothing.dm" #include "code\__defines\lighting.dm" #include "code\__defines\machinery.dm" @@ -169,6 +170,7 @@ #include "code\datums\progressbar.dm" #include "code\datums\recipe.dm" #include "code\datums\sun.dm" +#include "code\datums\weakref.dm" #include "code\datums\autolathe\arms.dm" #include "code\datums\autolathe\autolathe.dm" #include "code\datums\autolathe\devices.dm" @@ -1275,6 +1277,10 @@ #include "code\modules\economy\price_list.dm" #include "code\modules\economy\retail_scanner.dm" #include "code\modules\economy\TradeDestinations.dm" +#include "code\modules\error_handler\_defines.dm" +#include "code\modules\error_handler\error_handler.dm" +#include "code\modules\error_handler\error_viewer.dm" +#include "code\modules\error_handler\~defines.dm" #include "code\modules\events\apc_damage.dm" #include "code\modules\events\blob.dm" #include "code\modules\events\brand_intelligence.dm" @@ -1310,12 +1316,14 @@ #include "code\modules\examine\stat_icons.dm" #include "code\modules\examine\descriptions\armor.dm" #include "code\modules\examine\descriptions\atmospherics.dm" +#include "code\modules\examine\descriptions\containers.dm" #include "code\modules\examine\descriptions\devices.dm" #include "code\modules\examine\descriptions\engineering.dm" #include "code\modules\examine\descriptions\machines.dm" #include "code\modules\examine\descriptions\medical.dm" #include "code\modules\examine\descriptions\mobs.dm" #include "code\modules\examine\descriptions\paperwork.dm" +#include "code\modules\examine\descriptions\smokeables.dm" #include "code\modules\examine\descriptions\stacks.dm" #include "code\modules\examine\descriptions\structures.dm" #include "code\modules\examine\descriptions\telecomms.dm" @@ -1360,6 +1368,19 @@ #include "code\modules\hydroponics\trays\tray_soil.dm" #include "code\modules\hydroponics\trays\tray_tools.dm" #include "code\modules\hydroponics\trays\tray_update_icons.dm" +#include "code\modules\integrated_electronics\_defines.dm" +#include "code\modules\integrated_electronics\arithmetic.dm" +#include "code\modules\integrated_electronics\assemblies.dm" +#include "code\modules\integrated_electronics\converters.dm" +#include "code\modules\integrated_electronics\coordinate.dm" +#include "code\modules\integrated_electronics\data_transfer.dm" +#include "code\modules\integrated_electronics\input_output.dm" +#include "code\modules\integrated_electronics\logic.dm" +#include "code\modules\integrated_electronics\manipulation.dm" +#include "code\modules\integrated_electronics\memory.dm" +#include "code\modules\integrated_electronics\time.dm" +#include "code\modules\integrated_electronics\tools.dm" +#include "code\modules\integrated_electronics\~defines.dm" #include "code\modules\library\lib_items.dm" #include "code\modules\library\lib_machines.dm" #include "code\modules\library\lib_readme.dm" @@ -1616,6 +1637,7 @@ #include "code\modules\mob\living\simple_animal\friendly\lizard.dm" #include "code\modules\mob\living\simple_animal\friendly\mouse.dm" #include "code\modules\mob\living\simple_animal\friendly\mushroom.dm" +#include "code\modules\mob\living\simple_animal\friendly\penguin.dm" #include "code\modules\mob\living\simple_animal\friendly\slime.dm" #include "code\modules\mob\living\simple_animal\friendly\spiderbot.dm" #include "code\modules\mob\living\simple_animal\friendly\tomato.dm" @@ -1626,6 +1648,7 @@ #include "code\modules\mob\living\simple_animal\hostile\creature.dm" #include "code\modules\mob\living\simple_animal\hostile\faithless.dm" #include "code\modules\mob\living\simple_animal\hostile\giant_spider.dm" +#include "code\modules\mob\living\simple_animal\hostile\goose.dm" #include "code\modules\mob\living\simple_animal\hostile\hivebot.dm" #include "code\modules\mob\living\simple_animal\hostile\hostile.dm" #include "code\modules\mob\living\simple_animal\hostile\mimic.dm" @@ -1760,6 +1783,7 @@ #include "code\modules\power\singularity\particle_accelerator\particle_emitter.dm" #include "code\modules\power\singularity\particle_accelerator\particle_power.dm" #include "code\modules\projectiles\ammunition.dm" +#include "code\modules\projectiles\dnalocking.dm" #include "code\modules\projectiles\effects.dm" #include "code\modules\projectiles\gun.dm" #include "code\modules\projectiles\projectile.dm" @@ -1821,6 +1845,7 @@ #include "code\modules\reagents\Chemistry-Machinery.dm" #include "code\modules\reagents\Chemistry-Metabolism.dm" #include "code\modules\reagents\Chemistry-Readme.dm" +#include "code\modules\reagents\Chemistry-Reagents-Helpers.dm" #include "code\modules\reagents\Chemistry-Reagents.dm" #include "code\modules\reagents\Chemistry-Recipes.dm" #include "code\modules\reagents\reagent_containers.dm" @@ -1976,6 +2001,10 @@ #include "code\modules\vehicles\cargo_train.dm" #include "code\modules\vehicles\train.dm" #include "code\modules\vehicles\vehicle.dm" +#include "code\modules\ventcrawl\ventcrawl.dm" +#include "code\modules\ventcrawl\ventcrawl_atmospherics.dm" +#include "code\modules\ventcrawl\ventcrawl_multiz.dm" +#include "code\modules\ventcrawl\ventcrawl_verb.dm" #include "code\modules\virus2\admin.dm" #include "code\modules\virus2\analyser.dm" #include "code\modules\virus2\antibodies.dm" diff --git a/sound/machines/ventcrawl.ogg b/sound/machines/ventcrawl.ogg new file mode 100644 index 00000000000..2df8b5c8981 Binary files /dev/null and b/sound/machines/ventcrawl.ogg differ