From 72319a9794a9a3b5cc4be595f9d4254ab14a7a1a Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Thu, 11 Jan 2018 12:05:49 -0800 Subject: [PATCH 01/55] Replace hardcoded z-level numbers with a trait system --- code/__DEFINES/maps.dm | 33 ++- code/__HELPERS/level_traits.dm | 12 +- code/_globalvars/lists/mapping.dm | 7 - code/controllers/subsystem/mapping.dm | 51 ++-- code/controllers/subsystem/minimap.dm | 3 +- code/controllers/subsystem/squeak.dm | 2 +- code/datums/explosion.dm | 26 +- code/datums/helper_datums/teleport.dm | 7 +- code/datums/position_point_vector.dm | 242 ++++++++++++++++++ code/game/gamemodes/blob/blob_report.dm | 2 +- code/game/gamemodes/meteor/meteors.dm | 6 +- .../machinery/computer/camera_advanced.dm | 2 +- code/game/turfs/simulated/river.dm | 2 +- code/modules/admin/verbs/mapping.dm | 65 ++++- code/modules/awaymissions/signpost.dm | 6 +- code/modules/events/immovable_rod.dm | 7 +- .../mapping/space_management/space_level.dm | 14 + .../space_management}/space_transition.dm | 62 ++--- .../mapping/space_management/traits.dm | 46 ++++ .../space_management/zlevel_manager.dm | 32 +++ code/modules/mining/aux_base.dm | 5 +- .../mapGenerators/lava_river.dm | 6 +- tgstation.dme | 5 +- 23 files changed, 518 insertions(+), 125 deletions(-) create mode 100644 code/modules/mapping/space_management/space_level.dm rename code/modules/{space_transition => mapping/space_management}/space_transition.dm (75%) create mode 100644 code/modules/mapping/space_management/traits.dm create mode 100644 code/modules/mapping/space_management/zlevel_manager.dm diff --git a/code/__DEFINES/maps.dm b/code/__DEFINES/maps.dm index cdd2739b3c..b7043d01ff 100644 --- a/code/__DEFINES/maps.dm +++ b/code/__DEFINES/maps.dm @@ -21,7 +21,7 @@ Last space-z level = empty #define CITY_OF_COGS "City of Cogs" #define EMPTY_AREA_1 "Empty Area 1" #define EMPTY_AREA_2 "Empty Area 2" -#define MINING "Mining Asteroid" +#define MINING_ASTEROID "Mining Asteroid" #define EMPTY_AREA_3 "Empty Area 3" #define EMPTY_AREA_4 "Empty Area 4" #define EMPTY_AREA_5 "Empty Area 5" @@ -36,11 +36,8 @@ Last space-z level = empty #define MAP_REMOVE_JOB(jobpath) /datum/job/##jobpath/map_check() { return (SSmapping.config.map_name != JOB_MODIFICATION_MAP_NAME) && ..() } //zlevel defines, can be overridden for different maps in the appropriate _maps file. -#define ZLEVEL_CENTCOM 1 #define ZLEVEL_STATION_PRIMARY 2 -#define ZLEVEL_MINING 5 #define ZLEVEL_LAVALAND 5 -#define ZLEVEL_CITYOFCOGS 6 #define ZLEVEL_EMPTY_SPACE 12 //Unless you modify it in map config should be equal to ZLEVEL_SPACEMAX #define ZLEVEL_TRANSIT 13 @@ -49,3 +46,31 @@ Last space-z level = empty #define ZLEVEL_SPACEMAX 13 #define SPACERUIN_MAP_EDGE_PAD 15 +#define ZLEVEL_SPACE_RUIN_COUNT 5 + +// traits +#define ZTRAIT_CENTCOM "CentCom" +#define ZTRAIT_STATION "Station" +#define ZTRAIT_MINING "Mining" +#define ZTRAIT_REEBE "Reebe" +#define ZTRAIT_TRANSIT "Transit" +#define ZTRAIT_AWAY "Away Mission" +#define ZTRAIT_SPACE_RUINS "Space Ruins" +#define ZTRAIT_LAVA_RUINS "Lava Ruins" +#define ZTRAIT_BOMBCAP_MULTIPLIER "Bombcap Multiplier" + +// trait definitions +#define DL_NAME "name" +#define DL_LINKAGE "linkage" +#define DL_TRAITS "traits" + +#define DECLARE_LEVEL(NAME, LINKAGE, TRAITS) list(DL_NAME = NAME, DL_LINKAGE = LINKAGE, DL_TRAITS = TRAITS) +// corresponds to basemap.dm +#define DEFAULT_MAP_TRAITS list(\ + DECLARE_LEVEL("CentCom", SELFLOOPING, list(ZTRAIT_CENTCOM = TRUE)),\ + DECLARE_LEVEL("Main Station", CROSSLINKED, list(ZTRAIT_STATION = TRUE)),\ + DECLARE_LEVEL("Empty Area 1", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\ + DECLARE_LEVEL("Empty Area 2", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)),\ + DECLARE_LEVEL("Lavaland", UNAFFECTED, list(ZTRAIT_MINING = TRUE, ZTRAIT_LAVA_RUINS = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 3)),\ + DECLARE_LEVEL("Reebe", UNAFFECTED, list(ZTRAIT_REEBE = TRUE, ZTRAIT_BOMBCAP_MULTIPLIER = 0.5)),\ +) diff --git a/code/__HELPERS/level_traits.dm b/code/__HELPERS/level_traits.dm index e2a74cf8e0..4d20c9b513 100644 --- a/code/__HELPERS/level_traits.dm +++ b/code/__HELPERS/level_traits.dm @@ -1,17 +1,17 @@ // Helpers for checking whether a z-level conforms to a specific requirement // Basic levels -#define is_centcom_level(z) ((z) == ZLEVEL_CENTCOM) +#define is_centcom_level(z) SSmapping.level_trait(z, ZTRAIT_CENTCOM) -#define is_station_level(z) ((z) in GLOB.station_z_levels) +#define is_station_level(z) SSmapping.level_trait(z, ZTRAIT_STATION) -#define is_mining_level(z) ((z) == ZLEVEL_MINING) +#define is_mining_level(z) SSmapping.level_trait(z, ZTRAIT_MINING) -#define is_reebe(z) ((z) == ZLEVEL_CITYOFCOGS) +#define is_reebe(z) SSmapping.level_trait(z, ZTRAIT_REEBE) -#define is_transit_level(z) ((z) == ZLEVEL_TRANSIT) +#define is_transit_level(z) SSmapping.level_trait(z, ZTRAIT_TRANSIT) -#define is_away_level(z) ((z) > ZLEVEL_SPACEMAX) +#define is_away_level(z) SSmapping.level_trait(z, ZTRAIT_AWAY) // If true, the singularity cannot strip away asteroid turf on this Z #define is_planet_level(z) (GLOB.z_is_planet["z"]) diff --git a/code/_globalvars/lists/mapping.dm b/code/_globalvars/lists/mapping.dm index 51af2b3525..0d8965d10a 100644 --- a/code/_globalvars/lists/mapping.dm +++ b/code/_globalvars/lists/mapping.dm @@ -1,14 +1,7 @@ -#define Z_NORTH 1 -#define Z_EAST 2 -#define Z_SOUTH 3 -#define Z_WEST 4 - GLOBAL_LIST_INIT(cardinals, list(NORTH, SOUTH, EAST, WEST)) GLOBAL_LIST_INIT(alldirs, list(NORTH, SOUTH, EAST, WEST, NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) GLOBAL_LIST_INIT(diagonals, list(NORTHEAST, NORTHWEST, SOUTHEAST, SOUTHWEST)) -GLOBAL_LIST_INIT(station_z_levels, list(ZLEVEL_STATION_PRIMARY)) - GLOBAL_LIST(global_map) //list/global_map = list(list(1,5),list(4,3))//an array of map Z levels. //Resulting sector map looks like diff --git a/code/controllers/subsystem/mapping.dm b/code/controllers/subsystem/mapping.dm index 07c08cda55..11e2b5d3dd 100644 --- a/code/controllers/subsystem/mapping.dm +++ b/code/controllers/subsystem/mapping.dm @@ -22,6 +22,9 @@ SUBSYSTEM_DEF(mapping) var/loading_ruins = FALSE + // Z-manager stuff + var/list/z_list + /datum/controller/subsystem/mapping/PreInit() if(!config) #ifdef FORCE_MAP @@ -39,28 +42,34 @@ SUBSYSTEM_DEF(mapping) repopulate_sorted_areas() process_teleport_locs() //Sets up the wizard teleport locations preloadTemplates() + + // Create space levels + for(var/I in 1 to ZLEVEL_SPACE_RUIN_COUNT) + add_new_zlevel("Empty Area [2 + I]", CROSSLINKED, list(ZTRAIT_SPACE_RUINS = TRUE)) + add_new_zlevel("Empty Area [3 + ZLEVEL_SPACE_RUIN_COUNT]", CROSSLINKED, list()) // no ruins + add_new_zlevel("Transit", UNAFFECTED, list(ZTRAIT_TRANSIT = TRUE)) + // Pick a random away mission. createRandomZlevel() - // Generate mining. + if (z_list.len < world.maxz) + add_new_zlevel("Away Mission", UNAFFECTED, list(ZTRAIT_AWAY = TRUE)) + + // Generate mining ruins loading_ruins = TRUE - var/mining_type = config.minetype - if (mining_type == "lavaland") - seedRuins(list(ZLEVEL_LAVALAND), CONFIG_GET(number/lavaland_budget), /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) - spawn_rivers() + var/list/lava_ruins = levels_by_trait(ZTRAIT_LAVA_RUINS) + if (lava_ruins.len) + seedRuins(lava_ruins, CONFIG_GET(number/lavaland_budget), /area/lavaland/surface/outdoors/unexplored, lava_ruins_templates) + for (var/lava_z in lava_ruins) + spawn_rivers(lava_z) - // deep space ruins - var/space_zlevels = list() - for(var/i in ZLEVEL_SPACEMIN to ZLEVEL_SPACEMAX) - switch(i) - if(ZLEVEL_MINING, ZLEVEL_LAVALAND, ZLEVEL_EMPTY_SPACE, ZLEVEL_TRANSIT, ZLEVEL_CITYOFCOGS) - continue - else - space_zlevels += i - - seedRuins(space_zlevels, CONFIG_GET(number/space_budget), /area/space, space_ruins_templates) + // Generate deep space ruins + var/list/space_ruins = levels_by_trait(ZTRAIT_SPACE_RUINS) + if (space_ruins.len) + seedRuins(space_ruins, CONFIG_GET(number/space_budget), /area/space, space_ruins_templates) loading_ruins = FALSE + repopulate_sorted_areas() - // Set up Z-level transistions. + // Set up Z-level transitions. setup_map_transitions() generate_station_area_list() ..() @@ -98,6 +107,8 @@ SUBSYSTEM_DEF(mapping) config = SSmapping.config next_map_config = SSmapping.next_map_config + z_list = SSmapping.z_list + /datum/controller/subsystem/mapping/proc/TryLoadZ(filename, errorList, forceLevel, last) var/static/dmm_suite/loader if(!loader) @@ -107,11 +118,6 @@ SUBSYSTEM_DEF(mapping) if(last) QDEL_NULL(loader) -/datum/controller/subsystem/mapping/proc/CreateSpace(MaxZLevel) - while(world.maxz < MaxZLevel) - ++world.maxz - CHECK_TICK - #define INIT_ANNOUNCE(X) to_chat(world, "[X]"); log_world(X) /datum/controller/subsystem/mapping/proc/loadWorld() //if any of these fail, something has gone horribly, HORRIBLY, wrong @@ -121,6 +127,7 @@ SUBSYSTEM_DEF(mapping) INIT_ANNOUNCE("Loading [config.map_name]...") TryLoadZ(config.GetFullMapPath(), FailedZs, ZLEVEL_STATION_PRIMARY) + InitializeDefaultZLevels() INIT_ANNOUNCE("Loaded station in [(REALTIMEOFDAY - start_time)/10]s!") if(SSdbcore.Connect()) var/datum/DBQuery/query_round_map_name = SSdbcore.NewQuery("UPDATE [format_table_name("round")] SET map_name = '[config.map_name]' WHERE id = [GLOB.round_id]") @@ -129,8 +136,6 @@ SUBSYSTEM_DEF(mapping) if(config.minetype != "lavaland") INIT_ANNOUNCE("WARNING: A map without lavaland set as its minetype was loaded! This is being ignored! Update the maploader code!") - CreateSpace(ZLEVEL_SPACEMAX) - if(LAZYLEN(FailedZs)) //but seriously, unless the server's filesystem is messed up this will never happen var/msg = "RED ALERT! The following map files failed to load: [FailedZs[1]]" if(FailedZs.len > 1) diff --git a/code/controllers/subsystem/minimap.dm b/code/controllers/subsystem/minimap.dm index 4bead36bb1..fa9821b85b 100644 --- a/code/controllers/subsystem/minimap.dm +++ b/code/controllers/subsystem/minimap.dm @@ -5,9 +5,10 @@ SUBSYSTEM_DEF(minimap) var/const/MINIMAP_SIZE = 2048 var/const/TILE_SIZE = 8 - var/list/z_levels = list(ZLEVEL_STATION_PRIMARY) + var/list/z_levels /datum/controller/subsystem/minimap/Initialize(timeofday) + z_levels = SSmapping.levels_by_trait(ZTRAIT_STATION) var/hash = md5(SSmapping.config.GetFullMapPath()) if(CONFIG_GET(flag/generate_minimaps)) if(hash == trim(file2text(hash_path()))) diff --git a/code/controllers/subsystem/squeak.dm b/code/controllers/subsystem/squeak.dm index 022b659d8a..861bb0d8d5 100644 --- a/code/controllers/subsystem/squeak.dm +++ b/code/controllers/subsystem/squeak.dm @@ -34,7 +34,7 @@ SUBSYSTEM_DEF(squeak) /datum/controller/subsystem/squeak/proc/find_exposed_wires() exposed_wires.Cut() var/list/all_turfs - for (var/z in GLOB.station_z_levels) + for (var/z in SSmapping.levels_by_trait(ZTRAIT_STATION)) all_turfs += block(locate(1,1,z), locate(world.maxx,world.maxy,z)) for(var/turf/open/floor/plating/T in all_turfs) if(is_blocked_turf(T)) diff --git a/code/datums/explosion.dm b/code/datums/explosion.dm index 9b5cd18774..0616d0e4c6 100644 --- a/code/datums/explosion.dm +++ b/code/datums/explosion.dm @@ -1,6 +1,4 @@ #define EXPLOSION_THROW_SPEED 4 -#define CITYOFCOGS_CAP_MULTIPLIER 0.5 -#define MINING_CAP_MULTIPLIER 3 GLOBAL_LIST_EMPTY(explosions) //Against my better judgement, I will return the explosion datum @@ -54,17 +52,14 @@ GLOBAL_LIST_EMPTY(explosions) var/orig_dev_range = devastation_range var/orig_heavy_range = heavy_impact_range var/orig_light_range = light_impact_range - + var/orig_max_distance = max(devastation_range, heavy_impact_range, light_impact_range, flash_range, flame_range) - + //Zlevel specific bomb cap multiplier - var/cap_multiplier = 1 - switch(epicenter.z) - if(ZLEVEL_CITYOFCOGS) - cap_multiplier = CITYOFCOGS_CAP_MULTIPLIER - if(ZLEVEL_MINING) - cap_multiplier = MINING_CAP_MULTIPLIER - + var/cap_multiplier = SSmapping.level_trait(epicenter.z, ZTRAIT_BOMBCAP_MULTIPLIER) + if (isnull(cap_multiplier)) + cap_multiplier = 1 + if(!ignorecap) devastation_range = min(GLOB.MAX_EX_DEVESTATION_RANGE * cap_multiplier, devastation_range) heavy_impact_range = min(GLOB.MAX_EX_HEAVY_RANGE * cap_multiplier, heavy_impact_range) @@ -91,11 +86,11 @@ GLOBAL_LIST_EMPTY(explosions) if(adminlog) message_admins("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area: [epi_area] [ADMIN_COORDJMP(epicenter)]") log_game("Explosion with size ([devastation_range], [heavy_impact_range], [light_impact_range], [flame_range]) in area [epicenter.loc.name] ([epicenter.x],[epicenter.y],[epicenter.z])") - + var/x0 = epicenter.x var/y0 = epicenter.y var/z0 = epicenter.z - + SSblackbox.record_feedback("associative", "explosion", 1, list("dev" = devastation_range, "heavy" = heavy_impact_range, "light" = light_impact_range, "flash" = flash_range, "flame" = flame_range, "orig_dev" = orig_dev_range, "orig_heavy" = orig_heavy_range, "orig_light" = orig_light_range, "x" = x0, "y" = y0, "z" = z0, "area" = epi_area.type)) // Play sounds; we want sounds to be different depending on distance so we will manually do it ourselves. @@ -199,7 +194,7 @@ GLOBAL_LIST_EMPTY(explosions) //------- EX_ACT AND TURF FIRES ------- if(T == epicenter) // Ensures explosives detonating from bags trigger other explosives in that bag - var/list/items = list() + var/list/items = list() for(var/I in T) var/atom/A = I items += A.GetAllContents() @@ -418,6 +413,3 @@ GLOBAL_LIST_EMPTY(explosions) // 10 explosion power is a (1, 3, 6) explosion. // 5 explosion power is a (0, 1, 3) explosion. // 1 explosion power is a (0, 0, 1) explosion. - -#undef CITYOFCOGS_CAP_MULTIPLIER -#undef MINING_CAP_MULTIPLIER diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index c030bd4c2a..f90d6eed32 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -166,9 +166,12 @@ // Safe location finder -/proc/find_safe_turf(zlevel = ZLEVEL_STATION_PRIMARY, list/zlevels, extended_safety_checks = FALSE) +/proc/find_safe_turf(zlevel, list/zlevels, extended_safety_checks = FALSE) if(!zlevels) - zlevels = list(zlevel) + if (zlevel) + zlevels = list(zlevel) + else + zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) var/cycles = 1000 for(var/cycle in 1 to cycles) // DRUNK DIALLING WOOOOOOOOO diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 2a98d57efd..7f25584588 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -1,3 +1,4 @@ +<<<<<<< HEAD //Designed for things that need precision trajectories like projectiles. //Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. @@ -237,3 +238,244 @@ last_process = world.time last_move = world.time increment(needed_time) +======= +//Designed for things that need precision trajectories like projectiles. +//Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. + +#define RETURN_PRECISE_POSITION(A) new /datum/position(A) +#define RETURN_PRECISE_POINT(A) new /datum/point(A) + +/datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. + var/x = 0 + var/y = 0 + var/z = 0 + var/pixel_x = 0 + var/pixel_y = 0 + +/datum/position/proc/valid() + return x && y && z && !isnull(pixel_x) && !isnull(pixel_y) + +/datum/position/New(_x = 0, _y = 0, _z = 0, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/point. + if(istype(_x, /datum/point)) + var/datum/point/P = _x + var/turf/T = P.return_turf() + _x = T.x + _y = T.y + _z = T.z + _pixel_x = P.return_px() + _pixel_y = P.return_py() + else if(isatom(_x)) + var/atom/A = _x + _x = A.x + _y = A.y + _z = A.z + _pixel_x = A.pixel_x + _pixel_y = A.pixel_y + x = _x + y = _y + z = _z + pixel_x = _pixel_x + pixel_y = _pixel_y + +/datum/position/proc/return_turf() + return locate(x, y, z) + +/datum/position/proc/return_px() + return pixel_x + +/datum/position/proc/return_py() + return pixel_y + +/datum/position/proc/return_point() + return new /datum/point(src) + +/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below. + var/datum/point/P = new + P.x = round(a.x + (b.x - a.x) / 2, 1) + P.y = round(a.y + (b.y - a.y) / 2, 1) + P.z = a.z + return P + +/proc/pixel_length_between_points(datum/point/a, datum/point/b) + return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) + +/proc/angle_between_points(datum/point/a, datum/point/b) + return ATAN2((b.y - a.y), (b.x - a.x)) + +/datum/point //A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! + var/x = 0 + var/y = 0 + var/z = 0 + +/datum/point/proc/valid() + return x && y && z + +/datum/point/proc/copy_to(datum/point/p = new) + p.x = x + p.y = y + p.z = z + return p + +/datum/point/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/position or /atom. + if(istype(_x, /datum/position)) + var/datum/position/P = _x + _x = P.x + _y = P.y + _z = P.z + _pixel_x = P.pixel_x + _pixel_y = P.pixel_y + else if(istype(_x, /atom)) + var/atom/A = _x + _x = A.x + _y = A.y + _z = A.z + _pixel_x = A.pixel_x + _pixel_y = A.pixel_y + initialize_location(_x, _y, _z, _pixel_x, _pixel_y) + +/datum/point/proc/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) + if(!isnull(tile_x)) + x = ((tile_x - 1) * world.icon_size) + world.icon_size / 2 + p_x + if(!isnull(tile_y)) + y = ((tile_y - 1) * world.icon_size) + world.icon_size / 2+ p_y + if(!isnull(tile_z)) + z = tile_z + +/datum/point/proc/return_turf() + return locate(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + +/datum/point/proc/return_coordinates() //[turf_x, turf_y, z] + return list(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) + +/datum/point/proc/return_position() + return new /datum/position(src) + +/datum/point/proc/return_px() + return MODULUS(x, world.icon_size) - 16 + +/datum/point/proc/return_py() + return MODULUS(y, world.icon_size) - 16 + +/datum/point/proc/mapcheck() + . = FALSE + var/maxx = world.icon_size * world.maxx + var/maxy = world.icon_size * world.maxy + var/move_zx = 0 + var/move_zy = 0 + if(x < 0) + x += maxx + move_zx -= 1 + if(y < 0) + y += maxy + move_zy -= 1 + if(x > maxx) + x -= maxx + move_zx += 1 + if(y > maxy) + y -= maxy + move_zy += 1 + var/datum/space_level/S = SSmapping.get_level(z) + if(move_zx != 0) + var/datum/space_level/L = S.neigbours["[move_zx < 0? WEST : EAST]"] + z = L.z_value + . = TRUE + if(move_zy != 0) + var/datum/space_level/L = S.neigbours["[move_zy < 0? SOUTH : NORTH]"] + z = L.z_value + . = TRUE + +/datum/point/vector + var/speed = 32 //pixels per iteration + var/iteration = 0 + var/angle = 0 + var/mpx = 0 //calculated x/y movement amounts to prevent having to do trig every step. + var/mpy = 0 + var/starting_x = 0 //just like before, pixels from EDGE of map! This is set in initialize_location(). + var/starting_y = 0 + var/starting_z = 0 + +/datum/point/vector/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0, _angle, _speed) + ..() + initialize_trajectory(_speed, _angle) + +/datum/point/vector/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) + . = ..() + starting_x = x + starting_y = y + starting_z = z + +/datum/point/vector/copy_to(datum/point/vector/v = new) + ..(v) + v.speed = speed + v.iteration = iteration + v.angle = angle + v.mpx = mpx + v.mpy = mpy + v.starting_x = starting_x + v.starting_y = starting_y + v.starting_z = starting_z + return v + +/datum/point/vector/proc/initialize_trajectory(pixel_speed, new_angle) + if(!isnull(pixel_speed)) + speed = pixel_speed + set_angle(new_angle) + +/datum/point/vector/proc/set_angle(new_angle) //calculations use "byond angle" where north is 0 instead of 90, and south is 180 instead of 270. + if(isnull(angle)) + return + angle = new_angle + update_offsets() + +/datum/point/vector/proc/update_offsets() + mpx = sin(angle) * speed + mpy = cos(angle) * speed + +/datum/point/vector/proc/set_speed(new_speed) + if(isnull(new_speed) || speed == new_speed) + return + speed = new_speed + update_offsets() + +/datum/point/vector/proc/increment(multiplier = 1) + iteration++ + x += mpx * 1 + y += mpy * 1 + if(mapcheck()) + on_z_change() + +/datum/point/vector/proc/return_vector_after_increments(amount = 7, multiplier = 1, force_simulate = FALSE) + var/datum/point/vector/v = copy_to() + if(force_simulate) + for(var/i in 1 to amount) + v.increment(multiplier) + else + v.increment(multiplier * amount) + return v + +/datum/point/vector/proc/on_z_change() + return + +/datum/point/vector/processed //pixel_speed is per decisecond. + var/last_process = 0 + var/last_move = 0 + var/paused = FALSE + +/datum/point/vector/processed/Destroy() + STOP_PROCESSING(SSprojectiles, src) + +/datum/point/vector/processed/proc/start() + last_process = world.time + last_move = world.time + START_PROCESSING(SSprojectiles, src) + +/datum/point/vector/processed/process() + if(paused) + last_move += world.time - last_process + last_process = world.time + return + var/needed_time = world.time - last_move + last_process = world.time + last_move = world.time + increment(needed_time) +>>>>>>> 827c4b3... Replace hardcoded z-level numbers with a trait system (#34090) diff --git a/code/game/gamemodes/blob/blob_report.dm b/code/game/gamemodes/blob/blob_report.dm index 6585da0ba4..4385b732c3 100644 --- a/code/game/gamemodes/blob/blob_report.dm +++ b/code/game/gamemodes/blob/blob_report.dm @@ -8,7 +8,7 @@ var/mach = 0 /datum/station_state/proc/count() - for(var/Z in GLOB.station_z_levels) + for(var/Z in SSmapping.levels_by_trait(ZTRAIT_STATION)) for(var/turf/T in block(locate(1,1,Z), locate(world.maxx,world.maxy,Z))) // don't count shuttles since they may have just left if(istype(T.loc, /area/shuttle)) diff --git a/code/game/gamemodes/meteor/meteors.dm b/code/game/gamemodes/meteor/meteors.dm index 9e0c965271..13ab7a8bb1 100644 --- a/code/game/gamemodes/meteor/meteors.dm +++ b/code/game/gamemodes/meteor/meteors.dm @@ -31,7 +31,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event var/max_i = 10//number of tries to spawn meteor. while(!isspaceturf(pickedstart)) var/startSide = pick(GLOB.cardinals) - var/startZ = pick(GLOB.station_z_levels) + var/startZ = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) pickedstart = spaceDebrisStartLoc(startSide, startZ) pickedgoal = spaceDebrisFinishLoc(startSide, startZ) max_i-- @@ -40,7 +40,6 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event var/Me = pickweight(meteortypes) var/obj/effect/meteor/M = new Me(pickedstart, pickedgoal) M.dest = pickedgoal - M.z_original = M.z /proc/spaceDebrisStartLoc(startSide, Z) var/starty @@ -95,7 +94,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event pass_flags = PASSTABLE var/heavy = 0 var/meteorsound = 'sound/effects/meteorimpact.ogg' - var/z_original = ZLEVEL_STATION_PRIMARY + var/z_original var/threat = 0 // used for determining which meteors are most interesting var/lifetime = DEFAULT_METEOR_LIFETIME var/timerid = null @@ -126,6 +125,7 @@ GLOBAL_LIST_INIT(meteorsC, list(/obj/effect/meteor/dust)) //for space dust event /obj/effect/meteor/Initialize(mapload, target) . = ..() + z_original = z GLOB.meteor_list += src SSaugury.register_doom(src, threat) SpinAnimation() diff --git a/code/game/machinery/computer/camera_advanced.dm b/code/game/machinery/computer/camera_advanced.dm index 7c790f63de..f007050560 100644 --- a/code/game/machinery/computer/camera_advanced.dm +++ b/code/game/machinery/computer/camera_advanced.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/camera_advanced/Initialize() . = ..() if(station_lock_override) - z_lock = GLOB.station_z_levels.Copy() + z_lock = SSmapping.levels_by_trait(ZTRAIT_STATION) /obj/machinery/computer/camera_advanced/syndie icon_keyboard = "syndie_key" diff --git a/code/game/turfs/simulated/river.dm b/code/game/turfs/simulated/river.dm index a5753edcd1..79846791d3 100644 --- a/code/game/turfs/simulated/river.dm +++ b/code/game/turfs/simulated/river.dm @@ -4,7 +4,7 @@ #define RANDOM_LOWER_X 50 #define RANDOM_LOWER_Y 50 -/proc/spawn_rivers(target_z = ZLEVEL_LAVALAND, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) +/proc/spawn_rivers(target_z, nodes = 4, turf_type = /turf/open/lava/smooth/lava_land_surface, whitelist_area = /area/lavaland/surface/outdoors, min_x = RANDOM_LOWER_X, min_y = RANDOM_LOWER_Y, max_x = RANDOM_UPPER_X, max_y = RANDOM_UPPER_Y) var/list/river_nodes = list() var/num_spawned = 0 while(num_spawned < nodes) diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index ce50378f4d..fac7d93f9a 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -45,7 +45,8 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( /client/proc/start_line_profiling, /client/proc/stop_line_profiling, /client/proc/show_line_profiling, - /client/proc/create_mapping_job_icons + /client/proc/create_mapping_job_icons, + /client/proc/debug_z_levels, )) /obj/effect/debugging/mapfix_marker @@ -292,4 +293,64 @@ GLOBAL_VAR_INIT(say_disabled, FALSE) //Also add the x for(var/x_number in 1 to 4) final.Insert(icon('icons/mob/screen_gen.dmi', "x[x_number == 1 ? "" : x_number]"), "x[x_number == 1 ? "" : x_number]") - fcopy(final, "icons/mob/landmarks.dmi") \ No newline at end of file + fcopy(final, "icons/mob/landmarks.dmi") + +/client/proc/debug_z_levels() + set name = "Debug Z-Levels" + set category = "Mapping" + + var/list/z_list = SSmapping.z_list + var/list/messages = list() + messages += "World: [world.maxx] x [world.maxy] x [world.maxz]
" + + var/list/linked_levels = list() + var/min_x = INFINITY + var/min_y = INFINITY + var/max_x = -INFINITY + var/max_y = -INFINITY + + for(var/z in 1 to max(world.maxz, z_list.len)) + if (z > z_list.len) + messages += "[z]: Unmanaged (out of bounds)
" + continue + var/datum/space_level/S = z_list[z] + if (!S) + messages += "[z]: Unmanaged (null)
" + continue + var/linkage + switch (S.linkage) + if (UNAFFECTED) + linkage = "no linkage" + if (SELFLOOPING) + linkage = "self-looping" + if (CROSSLINKED) + linkage = "linked at ([S.xi], [S.yi])" + linked_levels += S + min_x = min(min_x, S.xi) + min_y = min(min_y, S.yi) + max_x = max(max_x, S.xi) + max_y = max(max_y, S.yi) + else + linkage = "unknown linkage '[S.linkage]'" + + messages += "[z]: [S.name], [linkage], traits: [json_encode(S.traits)]
" + if (S.z_value != z) + messages += "-- z_value is [S.z_value], should be [z]
" + if (S.name == initial(S.name)) + messages += "-- name not set
" + if (z > world.maxz) + messages += "-- exceeds max z" + + var/grid[max_x - min_x + 1][max_y - min_y + 1] + for(var/datum/space_level/S in linked_levels) + grid[S.xi - min_x + 1][S.yi - min_y + 1] = S.z_value + + messages += "" + for(var/y in max_y to min_y step -1) + var/list/part = list() + for(var/x in min_x to max_x) + part += "[grid[x - min_x + 1][y - min_y + 1]]" + messages += "" + messages += "
[part.Join("")]
" + + to_chat(src, messages.Join("")) diff --git a/code/modules/awaymissions/signpost.dm b/code/modules/awaymissions/signpost.dm index f6fd4d9071..b1f85ca537 100644 --- a/code/modules/awaymissions/signpost.dm +++ b/code/modules/awaymissions/signpost.dm @@ -5,12 +5,12 @@ anchored = TRUE density = TRUE var/question = "Travel back?" - var/list/zlevels = list() + var/list/zlevels /obj/structure/signpost/New() . = ..() set_light(2) - zlevels = GLOB.station_z_levels + zlevels = SSmapping.levels_by_trait(ZTRAIT_STATION) /obj/structure/signpost/attackby(obj/item/W, mob/user, params) return attack_hand(user) @@ -44,6 +44,6 @@ zlevels = list() for(var/i in 1 to world.maxz) zlevels += i - zlevels -= ZLEVEL_CENTCOM // no easy victory, even with meme signposts + zlevels -= SSmapping.levels_by_trait(ZTRAIT_CENTCOM) // no easy victory, even with meme signposts // also, could you think of the horror if they ended up in a holodeck // template or something diff --git a/code/modules/events/immovable_rod.dm b/code/modules/events/immovable_rod.dm index 9612fd8018..2bb75cfade 100644 --- a/code/modules/events/immovable_rod.dm +++ b/code/modules/events/immovable_rod.dm @@ -32,8 +32,9 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 /datum/round_event/immovable_rod/start() var/datum/round_event_control/immovable_rod/C = control var/startside = pick(GLOB.cardinals) - var/turf/startT = spaceDebrisStartLoc(startside, ZLEVEL_STATION_PRIMARY) - var/turf/endT = spaceDebrisFinishLoc(startside, ZLEVEL_STATION_PRIMARY) + var/z = pick(SSmapping.levels_by_trait(ZTRAIT_STATION)) + var/turf/startT = spaceDebrisStartLoc(startside, z) + var/turf/endT = spaceDebrisFinishLoc(startside, z) new /obj/effect/immovablerod(startT, endT, C.special_target) /obj/effect/immovablerod @@ -60,7 +61,7 @@ In my current plan for it, 'solid' will be defined as anything with density == 1 enter_link="(Click to orbit)", source=src, action=NOTIFY_ORBIT) GLOB.poi_list += src - + var/special_target_valid = FALSE if(special_target) var/turf/T = get_turf(special_target) diff --git a/code/modules/mapping/space_management/space_level.dm b/code/modules/mapping/space_management/space_level.dm new file mode 100644 index 0000000000..22a6d6ed6f --- /dev/null +++ b/code/modules/mapping/space_management/space_level.dm @@ -0,0 +1,14 @@ +/datum/space_level + var/name = "Your config settings failed, you need to fix this for the datum space levels to work" + var/list/neigbours = list() + var/list/traits + var/z_value = 1 //actual z placement + var/linkage = SELFLOOPING + var/xi + var/yi //imaginary placements on the grid + +/datum/space_level/New(new_z, new_name, new_linkage = SELFLOOPING, list/new_traits = list()) + z_value = new_z + name = new_name + traits = new_traits + set_linkage(new_linkage) diff --git a/code/modules/space_transition/space_transition.dm b/code/modules/mapping/space_management/space_transition.dm similarity index 75% rename from code/modules/space_transition/space_transition.dm rename to code/modules/mapping/space_management/space_transition.dm index edcad9b620..fa7cab9436 100644 --- a/code/modules/space_transition/space_transition.dm +++ b/code/modules/mapping/space_management/space_transition.dm @@ -1,18 +1,6 @@ -//This is a simple 3 by 3 grid working off the corpse of the space torus. The donut is dead, cube has been avenged! - -GLOBAL_LIST_EMPTY(z_levels_list) - -/datum/space_level - var/name = "Your config settings failed, you need to fix this for the datum space levels to work" - var/list/neigbours = list() - var/z_value = 1 //actual z placement - var/linked = SELFLOOPING - var/xi - var/yi //imaginary placements on the grid - -/datum/space_level/New(transition_type) - linked = transition_type - if(linked == SELFLOOPING) +/datum/space_level/proc/set_linkage(new_linkage) + linkage = new_linkage + if(linkage == SELFLOOPING) neigbours = list() var/list/L = list(TEXT_NORTH,TEXT_SOUTH,TEXT_EAST,TEXT_WEST) for(var/A in L) @@ -69,21 +57,15 @@ GLOBAL_LIST_EMPTY(z_levels_list) if(y-1 >= 1) neigbours |= grid[x][y-1] -/proc/setup_map_transitions() //listamania +/datum/controller/subsystem/mapping/proc/setup_map_transitions() //listamania var/list/SLS = list() - var/datum/space_level/D - var/list/cached_transitions = SSmapping.config.transition_config - var/conf_set_len = cached_transitions.len - var/k = 1 - for(var/A in cached_transitions) - D = new(cached_transitions[A]) - D.name = A - D.z_value = k - if(D.linked != CROSSLINKED) - GLOB.z_levels_list["[D.z_value]"] = D - else + var/list/cached_z_list = z_list + var/conf_set_len = 0 + for(var/A in cached_z_list) + var/datum/space_level/D = A + if (D.linkage == CROSSLINKED) SLS.Add(D) - k++ + conf_set_len++ var/list/point_grid[conf_set_len*2+1][conf_set_len*2+1] var/list/grid = list() var/datum/space_transition_point/P @@ -99,7 +81,7 @@ GLOBAL_LIST_EMPTY(z_levels_list) var/list/used_points = list() grid.Cut() while(SLS.len) - D = pick_n_take(SLS) + var/datum/space_level/D = pick_n_take(SLS) D.xi = P.x D.yi = P.y P.spl = D @@ -108,10 +90,7 @@ GLOBAL_LIST_EMPTY(z_levels_list) possible_points.Remove(used_points) D.set_neigbours(used_points) P = pick(possible_points) - grid["[D.z_value]"] = D - - for(var/A in GLOB.z_levels_list) - grid[A] = GLOB.z_levels_list[A] + CHECK_TICK //Lists below are pre-calculated values arranged in the list in such a way to be easily accessable in the loop by the counter //Its either this or madness with lotsa math @@ -123,13 +102,12 @@ GLOBAL_LIST_EMPTY(z_levels_list) var/list/x_pos_transition = list(1, 1, TRANSITIONEDGE + 2, world.maxx - TRANSITIONEDGE - 2) //values of x for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective x value later in the code var/list/y_pos_transition = list(TRANSITIONEDGE + 2, world.maxy - TRANSITIONEDGE - 2, 1, 1) //values of y for the transition from respective blocks on the side of zlevel, 1 is being translated into turfs respective y value later in the code - for(var/zlevelnumber = 1, zlevelnumber<=grid.len, zlevelnumber++) - D = grid["[zlevelnumber]"] - if(!D) - CRASH("[zlevelnumber] position has no space level datum.") - if(!(D.neigbours.len)) + for(var/I in cached_z_list) + var/datum/space_level/D = I + if(!D.neigbours.len) continue - for(var/side = 1, side<5, side++) + var/zlevelnumber = D.z_value + for(var/side in 1 to 4) var/turf/beginning = locate(x_pos_beginning[side], y_pos_beginning[side], zlevelnumber) var/turf/ending = locate(x_pos_ending[side], y_pos_ending[side], zlevelnumber) var/list/turfblock = block(beginning, ending) @@ -143,12 +121,8 @@ GLOBAL_LIST_EMPTY(z_levels_list) while(D.neigbours["[dirside]"] && D.neigbours["[dirside]"] != D) D = D.neigbours["[dirside]"] zdestination = D.z_value - D = grid["[zlevelnumber]"] + D = I for(var/turf/open/space/S in turfblock) S.destination_x = x_pos_transition[side] == 1 ? S.x : x_pos_transition[side] S.destination_y = y_pos_transition[side] == 1 ? S.y : y_pos_transition[side] S.destination_z = zdestination - //S.maptext = "[zdestination]" // for debugging - - for(var/A in grid) - GLOB.z_levels_list[A] = grid[A] diff --git a/code/modules/mapping/space_management/traits.dm b/code/modules/mapping/space_management/traits.dm new file mode 100644 index 0000000000..78e2fa2a21 --- /dev/null +++ b/code/modules/mapping/space_management/traits.dm @@ -0,0 +1,46 @@ +// Look up levels[z].traits[trait] +/datum/controller/subsystem/mapping/proc/level_trait(z, trait) + if (!z) + return null + var/list/trait_list + if (z_list) + var/datum/space_level/S = get_level(z) + trait_list = S.traits + else + var/list/default_map_traits = DEFAULT_MAP_TRAITS + trait_list = default_map_traits[z][DL_TRAITS] + return trait_list[trait] + +// Check if levels[z] has any of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_any_trait(z, list/traits) + for (var/I in traits) + if (level_trait(z, I)) + return TRUE + return FALSE + +// Check if levels[z] has all of the specified traits +/datum/controller/subsystem/mapping/proc/level_has_all_traits(z, list/traits) + for (var/I in traits) + if (!level_trait(z, I)) + return FALSE + return TRUE + +// Get a list of all z which have the specified trait +/datum/controller/subsystem/mapping/proc/levels_by_trait(trait) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + if (S.traits[trait]) + . += S.z_value + +// Get a list of all z which have any of the specified traits +/datum/controller/subsystem/mapping/proc/levels_by_any_trait(list/traits) + . = list() + var/list/_z_list = z_list + for(var/A in _z_list) + var/datum/space_level/S = A + for (var/trait in traits) + if (S.traits[trait]) + . += S.z_value + break diff --git a/code/modules/mapping/space_management/zlevel_manager.dm b/code/modules/mapping/space_management/zlevel_manager.dm new file mode 100644 index 0000000000..5cb7261348 --- /dev/null +++ b/code/modules/mapping/space_management/zlevel_manager.dm @@ -0,0 +1,32 @@ +// Populate the space level list and prepare space transitions +/datum/controller/subsystem/mapping/proc/InitializeDefaultZLevels() + if (z_list) // subsystem/Recover or badminnery, no need + return + + z_list = list() + var/list/default_map_traits = DEFAULT_MAP_TRAITS + + if (default_map_traits.len != world.maxz) + WARNING("More or less map attributes pre-defined ([default_map_traits.len]) than existent z-levels ([world.maxz]). Ignoring the larger.") + if (default_map_traits.len > world.maxz) + default_map_traits.Cut(world.maxz + 1) + + for (var/I in 1 to default_map_traits.len) + var/list/features = default_map_traits[I] + var/datum/space_level/S = new(I, features[DL_NAME], features[DL_LINKAGE], features[DL_TRAITS]) + z_list += S + +/datum/controller/subsystem/mapping/proc/add_new_zlevel(name, linkage = SELFLOOPING, traits = list(), z_type = /datum/space_level) + var/new_z = z_list.len + 1 + if (world.maxz < new_z) + ++world.maxz + CHECK_TICK + // TODO: sleep here if the Z level needs to be cleared + var/datum/space_level/S = new z_type(new_z, name, linkage, traits) + z_list += S + return new_z + +/datum/controller/subsystem/mapping/proc/get_level(z) + . = z_list[z] + if (!.) + CRASH("Unmanaged z-level: '[z]'") diff --git a/code/modules/mining/aux_base.dm b/code/modules/mining/aux_base.dm index df20ce5921..5ea18b631c 100644 --- a/code/modules/mining/aux_base.dm +++ b/code/modules/mining/aux_base.dm @@ -102,7 +102,10 @@ interface with the mining shuttle at the landing site if a mobile beacon is also if(href_list["random"] && !possible_destinations) usr.changeNext_move(CLICK_CD_RAPID) //Anti-spam - var/turf/LZ = safepick(Z_TURFS(ZLEVEL_MINING)) //Pick a random mining Z-level turf + var/list/all_mining_turfs = list() + for (var/z_level in SSmapping.levels_by_trait(ZTRAIT_MINING)) + all_mining_turfs += Z_TURFS(z_level) + var/turf/LZ = safepick(all_mining_turfs) //Pick a random mining Z-level turf if(!ismineralturf(LZ) && !istype(LZ, /turf/open/floor/plating/asteroid)) //Find a suitable mining turf. Reduces chance of landing in a bad area to_chat(usr, "Landing zone scan failed. Please try again.") diff --git a/code/modules/procedural_mapping/mapGenerators/lava_river.dm b/code/modules/procedural_mapping/mapGenerators/lava_river.dm index d825a02846..0486acae56 100644 --- a/code/modules/procedural_mapping/mapGenerators/lava_river.dm +++ b/code/modules/procedural_mapping/mapGenerators/lava_river.dm @@ -1,6 +1,6 @@ /datum/mapGenerator/lavaland - var/start_z = ZLEVEL_LAVALAND + var/start_z var/min_x = 0 var/min_y = 0 var/max_x = 0 @@ -19,11 +19,9 @@ /datum/mapGeneratorModule/river var/river_type = /turf/open/lava/smooth var/river_nodes = 4 - var/start_z = ZLEVEL_LAVALAND /datum/mapGeneratorModule/river/generate() var/datum/mapGenerator/lavaland/L = mother if(!istype(L)) return - start_z = L.start_z - spawn_rivers(start_z, river_nodes, river_type, min_x = L.min_x, min_y = L.min_y, max_x = L.max_x, max_y = L.max_y) + spawn_rivers(L.start_z, river_nodes, river_type, min_x = L.min_x, min_y = L.min_y, max_x = L.max_x, max_y = L.max_y) diff --git a/tgstation.dme b/tgstation.dme index 27146c1614..7f35e065b8 100755 --- a/tgstation.dme +++ b/tgstation.dme @@ -1685,6 +1685,10 @@ #include "code\modules\mapping\mapping_helpers.dm" #include "code\modules\mapping\reader.dm" #include "code\modules\mapping\ruins.dm" +#include "code\modules\mapping\space_management\space_level.dm" +#include "code\modules\mapping\space_management\space_transition.dm" +#include "code\modules\mapping\space_management\traits.dm" +#include "code\modules\mapping\space_management\zlevel_manager.dm" #include "code\modules\mining\abandoned_crates.dm" #include "code\modules\mining\aux_base.dm" #include "code\modules\mining\aux_base_camera.dm" @@ -2332,7 +2336,6 @@ #include "code\modules\shuttle\supply.dm" #include "code\modules\shuttle\syndicate.dm" #include "code\modules\shuttle\white_ship.dm" -#include "code\modules\space_transition\space_transition.dm" #include "code\modules\spells\spell.dm" #include "code\modules\spells\spell_types\aimed.dm" #include "code\modules\spells\spell_types\area_teleport.dm" From b128c9d3b5c70cddb236b0b0645706cff7331459 Mon Sep 17 00:00:00 2001 From: oranges Date: Fri, 12 Jan 2018 09:06:45 +1300 Subject: [PATCH 02/55] Merge pull request #34117 from ShizCalev/medbot-tweak Makes medbots unable to inject you if you are are fully covered with THICKMATERIAL. --- code/modules/mob/living/simple_animal/bot/medbot.dm | 7 ++++++- 1 file changed, 6 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/bot/medbot.dm b/code/modules/mob/living/simple_animal/bot/medbot.dm index 03dbc240ec..5ef27e0f67 100644 --- a/code/modules/mob/living/simple_animal/bot/medbot.dm +++ b/code/modules/mob/living/simple_animal/bot/medbot.dm @@ -353,6 +353,11 @@ if(emagged == 2) //Everyone needs our medicine. (Our medicine is toxins) return TRUE + if(ishuman(C)) + var/mob/living/carbon/human/H = C + if((H.head && (H.head.flags_1 & THICKMATERIAL_1)) && (H.wear_suit && (H.wear_suit.flags_1 & THICKMATERIAL_1))) + return FALSE // Skip over them if they have no exposed flesh. + if(declare_crit && C.health <= 0) //Critical condition! Call for help! declare(C) @@ -479,7 +484,7 @@ C.visible_message("[src] is trying to inject [patient]!", \ "[src] is trying to inject you!") - var/failed = FALSE; + var/failed = FALSE if(do_mob(src, patient, 30)) //Is C == patient? This is so confusing if((get_dist(src, patient) <= 1) && (on) && assess_patient(patient)) if(reagent_id == "internal_beaker") From d6fc0f5d261100ca986fb4259fa5102ecdae6c33 Mon Sep 17 00:00:00 2001 From: LetterJay Date: Thu, 11 Jan 2018 15:20:02 -0600 Subject: [PATCH 04/55] Update position_point_vector.dm --- code/datums/position_point_vector.dm | 242 --------------------------- 1 file changed, 242 deletions(-) diff --git a/code/datums/position_point_vector.dm b/code/datums/position_point_vector.dm index 7f25584588..6fae092c9d 100644 --- a/code/datums/position_point_vector.dm +++ b/code/datums/position_point_vector.dm @@ -1,244 +1,3 @@ -<<<<<<< HEAD -//Designed for things that need precision trajectories like projectiles. -//Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. - -#define RETURN_PRECISE_POSITION(A) new /datum/position(A) -#define RETURN_PRECISE_POINT(A) new /datum/point(A) - -/datum/position //For positions with map x/y/z and pixel x/y so you don't have to return lists. Could use addition/subtraction in the future I guess. - var/x = 0 - var/y = 0 - var/z = 0 - var/pixel_x = 0 - var/pixel_y = 0 - -/datum/position/proc/valid() - return x && y && z && !isnull(pixel_x) && !isnull(pixel_y) - -/datum/position/New(_x = 0, _y = 0, _z = 0, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/point. - if(istype(_x, /datum/point)) - var/datum/point/P = _x - var/turf/T = P.return_turf() - _x = T.x - _y = T.y - _z = T.z - _pixel_x = P.return_px() - _pixel_y = P.return_py() - else if(isatom(_x)) - var/atom/A = _x - _x = A.x - _y = A.y - _z = A.z - _pixel_x = A.pixel_x - _pixel_y = A.pixel_y - x = _x - y = _y - z = _z - pixel_x = _pixel_x - pixel_y = _pixel_y - -/datum/position/proc/return_turf() - return locate(x, y, z) - -/datum/position/proc/return_px() - return pixel_x - -/datum/position/proc/return_py() - return pixel_y - -/datum/position/proc/return_point() - return new /datum/point(src) - -/proc/point_midpoint_points(datum/point/a, datum/point/b) //Obviously will not support multiZ calculations! Same for the two below. - var/datum/point/P = new - P.x = round(a.x + (b.x - a.x) / 2, 1) - P.y = round(a.y + (b.y - a.y) / 2, 1) - P.z = a.z - return P - -/proc/pixel_length_between_points(datum/point/a, datum/point/b) - return sqrt(((b.x - a.x) ** 2) + ((b.y - a.y) ** 2)) - -/proc/angle_between_points(datum/point/a, datum/point/b) - return ATAN2((b.y - a.y), (b.x - a.x)) - -/datum/point //A precise point on the map in absolute pixel locations based on world.icon_size. Pixels are FROM THE EDGE OF THE MAP! - var/x = 0 - var/y = 0 - var/z = 0 - -/datum/point/proc/valid() - return x && y && z - -/datum/point/proc/copy_to(datum/point/p = new) - p.x = x - p.y = y - p.z = z - return p - -/datum/point/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0) //first argument can also be a /datum/position or /atom. - if(istype(_x, /datum/position)) - var/datum/position/P = _x - _x = P.x - _y = P.y - _z = P.z - _pixel_x = P.pixel_x - _pixel_y = P.pixel_y - else if(istype(_x, /atom)) - var/atom/A = _x - _x = A.x - _y = A.y - _z = A.z - _pixel_x = A.pixel_x - _pixel_y = A.pixel_y - initialize_location(_x, _y, _z, _pixel_x, _pixel_y) - -/datum/point/proc/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) - if(!isnull(tile_x)) - x = ((tile_x - 1) * world.icon_size) + world.icon_size / 2 + p_x - if(!isnull(tile_y)) - y = ((tile_y - 1) * world.icon_size) + world.icon_size / 2+ p_y - if(!isnull(tile_z)) - z = tile_z - -/datum/point/proc/return_turf() - return locate(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) - -/datum/point/proc/return_coordinates() //[turf_x, turf_y, z] - return list(CEILING(x / world.icon_size, 1), CEILING(y / world.icon_size, 1), z) - -/datum/point/proc/return_position() - return new /datum/position(src) - -/datum/point/proc/return_px() - return MODULUS(x, world.icon_size) - 16 - -/datum/point/proc/return_py() - return MODULUS(y, world.icon_size) - 16 - -/datum/point/proc/mapcheck() - . = FALSE - var/maxx = world.icon_size * world.maxx - var/maxy = world.icon_size * world.maxy - var/move_zx = 0 - var/move_zy = 0 - if(x < 0) - x += maxx - move_zx -= 1 - if(y < 0) - y += maxy - move_zy -= 1 - if(x > maxx) - x -= maxx - move_zx += 1 - if(y > maxy) - y -= maxy - move_zy += 1 - var/datum/space_level/S = GLOB.z_levels_list["[z]"] - if(move_zx != 0) - var/datum/space_level/L = S.neigbours["[move_zx < 0? WEST : EAST]"] - z = L.z_value - . = TRUE - if(move_zy != 0) - var/datum/space_level/L = S.neigbours["[move_zy < 0? SOUTH : NORTH]"] - z = L.z_value - . = TRUE - -/datum/point/vector - var/speed = 32 //pixels per iteration - var/iteration = 0 - var/angle = 0 - var/mpx = 0 //calculated x/y movement amounts to prevent having to do trig every step. - var/mpy = 0 - var/starting_x = 0 //just like before, pixels from EDGE of map! This is set in initialize_location(). - var/starting_y = 0 - var/starting_z = 0 - -/datum/point/vector/New(_x, _y, _z, _pixel_x = 0, _pixel_y = 0, _angle, _speed) - ..() - initialize_trajectory(_speed, _angle) - -/datum/point/vector/initialize_location(tile_x, tile_y, tile_z, p_x = 0, p_y = 0) - . = ..() - starting_x = x - starting_y = y - starting_z = z - -/datum/point/vector/copy_to(datum/point/vector/v = new) - ..(v) - v.speed = speed - v.iteration = iteration - v.angle = angle - v.mpx = mpx - v.mpy = mpy - v.starting_x = starting_x - v.starting_y = starting_y - v.starting_z = starting_z - return v - -/datum/point/vector/proc/initialize_trajectory(pixel_speed, new_angle) - if(!isnull(pixel_speed)) - speed = pixel_speed - set_angle(new_angle) - -/datum/point/vector/proc/set_angle(new_angle) //calculations use "byond angle" where north is 0 instead of 90, and south is 180 instead of 270. - if(isnull(angle)) - return - angle = new_angle - update_offsets() - -/datum/point/vector/proc/update_offsets() - mpx = sin(angle) * speed - mpy = cos(angle) * speed - -/datum/point/vector/proc/set_speed(new_speed) - if(isnull(new_speed) || speed == new_speed) - return - speed = new_speed - update_offsets() - -/datum/point/vector/proc/increment(multiplier = 1) - iteration++ - x += mpx * 1 - y += mpy * 1 - if(mapcheck()) - on_z_change() - -/datum/point/vector/proc/return_vector_after_increments(amount = 7, multiplier = 1, force_simulate = FALSE) - var/datum/point/vector/v = copy_to() - if(force_simulate) - for(var/i in 1 to amount) - v.increment(multiplier) - else - v.increment(multiplier * amount) - return v - -/datum/point/vector/proc/on_z_change() - return - -/datum/point/vector/processed //pixel_speed is per decisecond. - var/last_process = 0 - var/last_move = 0 - var/paused = FALSE - -/datum/point/vector/processed/Destroy() - STOP_PROCESSING(SSprojectiles, src) - -/datum/point/vector/processed/proc/start() - last_process = world.time - last_move = world.time - START_PROCESSING(SSprojectiles, src) - -/datum/point/vector/processed/process() - if(paused) - last_move += world.time - last_process - last_process = world.time - return - var/needed_time = world.time - last_move - last_process = world.time - last_move = world.time - increment(needed_time) -======= //Designed for things that need precision trajectories like projectiles. //Don't use this for anything that you don't absolutely have to use this with (like projectiles!) because it isn't worth using a datum unless you need accuracy down to decimal places in pixels. @@ -478,4 +237,3 @@ last_process = world.time last_move = world.time increment(needed_time) ->>>>>>> 827c4b3... Replace hardcoded z-level numbers with a trait system (#34090) From 15f0b623ba237578ecda078505c132af8b2eb367 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Thu, 11 Jan 2018 19:40:19 -0500 Subject: [PATCH 05/55] Update cit_objectives.dm --- code/game/gamemodes/cit_objectives.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm index faa376571c..76a23a581e 100644 --- a/code/game/gamemodes/cit_objectives.dm +++ b/code/game/gamemodes/cit_objectives.dm @@ -98,9 +98,9 @@ for(var/mob/living/carbon/C in GLOB.mob_list) var/mob/living/simple_animal/borer/D = C.has_brain_worms() var/turf/location = get_turf(C) - if(location.z == ZLEVEL_CENTCOM && D && D.stat != DEAD) + if(is_centcom_level(z) && D && D.stat != DEAD) total_borer_hosts++ if(target_amount <= total_borer_hosts) return TRUE else - return FALSE \ No newline at end of file + return FALSE From eedf8eb101d274fdd74512c3c508da70dc766e7a Mon Sep 17 00:00:00 2001 From: deathride58 Date: Thu, 11 Jan 2018 20:19:09 -0500 Subject: [PATCH 06/55] Update cit_objectives.dm --- code/game/gamemodes/cit_objectives.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/gamemodes/cit_objectives.dm b/code/game/gamemodes/cit_objectives.dm index 76a23a581e..fbcfc675e3 100644 --- a/code/game/gamemodes/cit_objectives.dm +++ b/code/game/gamemodes/cit_objectives.dm @@ -98,7 +98,7 @@ for(var/mob/living/carbon/C in GLOB.mob_list) var/mob/living/simple_animal/borer/D = C.has_brain_worms() var/turf/location = get_turf(C) - if(is_centcom_level(z) && D && D.stat != DEAD) + if(is_centcom_level(location.z) && D && D.stat != DEAD) total_borer_hosts++ if(target_amount <= total_borer_hosts) return TRUE From f234c471ee140b2c0d3087a66eca23abff5dee5b Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 11 Jan 2018 19:11:46 -0800 Subject: [PATCH 07/55] Fixes forensics runtimes (#34336) --- code/modules/detectivework/detective_work.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/detectivework/detective_work.dm b/code/modules/detectivework/detective_work.dm index 5bf4ad27b8..42d6fcbe1e 100644 --- a/code/modules/detectivework/detective_work.dm +++ b/code/modules/detectivework/detective_work.dm @@ -91,7 +91,7 @@ var/obj/item/clothing/gloves/G = gloves G.add_blood_DNA(blood_dna) else if(length(blood_dna)) - AddComponent(/datum/component/forensics, null, null, dna) + AddComponent(/datum/component/forensics, null, null, blood_dna) bloody_hands = rand(2, 4) update_inv_gloves() //handles bloody hands overlays and updating return TRUE From 5920ec6996ef8b7ecefbff8e7689242073901ef2 Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 11 Jan 2018 19:22:51 -0800 Subject: [PATCH 09/55] Adds logging and feedback messages to organ manipulations by admins (#34298) * logging * Update manipulate_organs.dm --- code/modules/admin/verbs/manipulate_organs.dm | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/code/modules/admin/verbs/manipulate_organs.dm b/code/modules/admin/verbs/manipulate_organs.dm index 3ff0ff75ac..e82a99815e 100644 --- a/code/modules/admin/verbs/manipulate_organs.dm +++ b/code/modules/admin/verbs/manipulate_organs.dm @@ -14,6 +14,8 @@ organ = organs[organ] organ = new organ organ.Insert(C) + log_admin("[key_name(usr)] has added organ [organ.type] to [key_name(C)]") + message_admins("[key_name_admin(usr)] has added organ [organ.type] to [key_name(C)]") if("add implant") for(var/path in subtypesof(/obj/item/implant)) @@ -24,6 +26,8 @@ organ = organs[organ] organ = new organ organ.implant(C) + log_admin("[key_name(usr)] has added implant [organ.type] to [key_name(C)]") + message_admins("[key_name_admin(usr)] has added implant [organ.type] to [key_name(C)]") if("drop organ/implant", "remove organ/implant") for(var/X in C.internal_organs) @@ -41,6 +45,9 @@ var/obj/item/organ/O var/obj/item/implant/I + log_admin("[key_name(usr)] has removed [organ.type] from [key_name(C)]") + message_admins("[key_name_admin(usr)] has removed [organ.type] from [key_name(C)]") + if(isorgan(organ)) O = organ O.Remove(C) From 08339940c154377c1df5884351ed5ea414b1cafd Mon Sep 17 00:00:00 2001 From: kevinz000 <2003111+kevinz000@users.noreply.github.com> Date: Thu, 11 Jan 2018 19:24:11 -0800 Subject: [PATCH 11/55] Update ark_of_the_clockwork_justicar.dm (#34297) --- .../ark_of_the_clockwork_justicar.dm | 13 ++++++++----- 1 file changed, 8 insertions(+), 5 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm index 36a74ec62b..15dd038cf6 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/ark_of_the_clockwork_justicar.dm @@ -146,12 +146,15 @@ countdown = null for(var/mob/L in GLOB.player_list) if(L.z == z) - L.forceMove(get_turf(pick(GLOB.generic_event_spawns))) + var/atom/movable/target = L + if(isobj(L.loc)) + target = L.loc + target.forceMove(get_turf(pick(GLOB.generic_event_spawns))) L.overlay_fullscreen("flash", /obj/screen/fullscreen/flash/static) - L.clear_fullscreen("flash", 30) - if(isliving(L)) - var/mob/living/LI = L - LI.Stun(50) + L.clear_fullscreen("flash", 30) + if(isliving(L)) + var/mob/living/LI = L + LI.Stun(50) for(var/obj/effect/clockwork/city_of_cogs_rift/R in GLOB.all_clockwork_objects) qdel(R) if(GLOB.ark_of_the_clockwork_justiciar == src) From 08da9ea5a053a23c144eaebfc624f12696fa9a72 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Wed, 10 Jan 2018 20:50:10 -0500 Subject: [PATCH 13/55] Fixes brass skewer grammar --- .../clock_cult/clock_structures/traps/brass_skewer.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/gamemodes/clock_cult/clock_structures/traps/brass_skewer.dm b/code/game/gamemodes/clock_cult/clock_structures/traps/brass_skewer.dm index c91cf594e8..ea56aaa833 100644 --- a/code/game/gamemodes/clock_cult/clock_structures/traps/brass_skewer.dm +++ b/code/game/gamemodes/clock_cult/clock_structures/traps/brass_skewer.dm @@ -102,8 +102,8 @@ return wiggle_wiggle = FALSE else - user.visible_message("You start tenderly lifting [user] off of [src]...", \ - "You start tenderly lifting [user] off of [src]...") + user.visible_message("[user] starts tenderly lifting [skewee] off of [src]...", \ + "You start tenderly lifting [skewee] off of [src]...") if(!do_after(user, 60, target = skewee)) skewee.visible_message("[skewee] painfully slides back down [src].") skewee.emote("moan") From 36265db1b27b20f5d6d41c1d39c4fe18bbcef8fa Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Thu, 11 Jan 2018 19:27:20 -0800 Subject: [PATCH 15/55] Fix pixel offsets of east-facing unary atmospherics (#34293) --- .../atmospherics/components/unary_devices.dmi | Bin 69136 -> 69070 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/atmospherics/components/unary_devices.dmi b/icons/obj/atmospherics/components/unary_devices.dmi index 4f9354a28754661b90f611c483418e15a6dd7728..f5b86cddcc261f03c387e7088140ae307e3ccc56 100644 GIT binary patch delta 23294 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 delta 23361 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 b%iT7}K Date: Thu, 11 Jan 2018 22:26:46 -0500 Subject: [PATCH 17/55] Add /datum prefix to custom root types (#34294) --- code/__DATASTRUCTURES/heap.dm | 22 +++++++++++----------- code/__HELPERS/AStar.dm | 24 ++++++++++++------------ 2 files changed, 23 insertions(+), 23 deletions(-) diff --git a/code/__DATASTRUCTURES/heap.dm b/code/__DATASTRUCTURES/heap.dm index 7246eff877..ce03b482e5 100644 --- a/code/__DATASTRUCTURES/heap.dm +++ b/code/__DATASTRUCTURES/heap.dm @@ -1,28 +1,28 @@ ////////////////////// -//Heap object +//datum/Heap object ////////////////////// -/Heap +/datum/Heap var/list/L var/cmp -/Heap/New(compare) +/datum/Heap/New(compare) L = new() cmp = compare -/Heap/proc/IsEmpty() +/datum/Heap/proc/IsEmpty() return !L.len //Insert and place at its position a new node in the heap -/Heap/proc/Insert(atom/A) +/datum/Heap/proc/Insert(atom/A) L.Add(A) Swim(L.len) //removes and returns the first element of the heap //(i.e the max or the min dependant on the comparison function) -/Heap/proc/Pop() +/datum/Heap/proc/Pop() if(!L.len) return 0 . = L[1] @@ -33,7 +33,7 @@ Sink(1) //Get a node up to its right position in the heap -/Heap/proc/Swim(var/index) +/datum/Heap/proc/Swim(var/index) var/parent = round(index * 0.5) while(parent > 0 && (call(cmp)(L[index],L[parent]) > 0)) @@ -42,7 +42,7 @@ parent = round(index * 0.5) //Get a node down to its right position in the heap -/Heap/proc/Sink(var/index) +/datum/Heap/proc/Sink(var/index) var/g_child = GetGreaterChild(index) while(g_child > 0 && (call(cmp)(L[index],L[g_child]) < 0)) @@ -52,7 +52,7 @@ //Returns the greater (relative to the comparison proc) of a node children //or 0 if there's no child -/Heap/proc/GetGreaterChild(var/index) +/datum/Heap/proc/GetGreaterChild(var/index) if(index * 2 > L.len) return 0 @@ -65,11 +65,11 @@ return index * 2 //Replaces a given node so it verify the heap condition -/Heap/proc/ReSort(atom/A) +/datum/Heap/proc/ReSort(atom/A) var/index = L.Find(A) Swim(index) Sink(index) -/Heap/proc/List() +/datum/Heap/proc/List() . = L.Copy() diff --git a/code/__HELPERS/AStar.dm b/code/__HELPERS/AStar.dm index 6be5fc2b16..37ca3bb082 100644 --- a/code/__HELPERS/AStar.dm +++ b/code/__HELPERS/AStar.dm @@ -25,19 +25,19 @@ Actual Adjacent procs : */ ////////////////////// -//PathNode object +//datum/PathNode object ////////////////////// //A* nodes variables -/PathNode +/datum/PathNode var/turf/source //turf associated with the PathNode - var/PathNode/prevNode //link to the parent PathNode + var/datum/PathNode/prevNode //link to the parent PathNode var/f //A* Node weight (f = g + h) var/g //A* movement cost variable var/h //A* heuristic variable var/nt //count the number of Nodes traversed -/PathNode/New(s,p,pg,ph,pnt) +/datum/PathNode/New(s,p,pg,ph,pnt) source = s prevNode = p g = pg @@ -45,7 +45,7 @@ Actual Adjacent procs : f = g + h nt = pnt -/PathNode/proc/calc_f() +/datum/PathNode/proc/calc_f() f = g + h ////////////////////// @@ -53,11 +53,11 @@ Actual Adjacent procs : ////////////////////// //the weighting function, used in the A* algorithm -/proc/PathWeightCompare(PathNode/a, PathNode/b) +/proc/PathWeightCompare(datum/PathNode/a, datum/PathNode/b) return a.f - b.f //reversed so that the Heap is a MinHeap rather than a MaxHeap -/proc/HeapPathWeightCompare(PathNode/a, PathNode/b) +/proc/HeapPathWeightCompare(datum/PathNode/a, datum/PathNode/b) return b.f - a.f //wrapper that returns an empty list if A* failed to find a path @@ -81,13 +81,13 @@ Actual Adjacent procs : return 0 maxnodedepth = maxnodes //no need to consider path longer than maxnodes - var/Heap/open = new /Heap(/proc/HeapPathWeightCompare) //the open list + var/datum/Heap/open = new /datum/Heap(/proc/HeapPathWeightCompare) //the open list var/list/closed = new() //the closed list var/list/path = null //the returned path, if any - var/PathNode/cur //current processed turf + var/datum/PathNode/cur //current processed turf //initialization - open.Insert(new /PathNode(start,null,0,call(start,dist)(end),0)) + open.Insert(new /datum/PathNode(start,null,0,call(start,dist)(end),0)) //then run the main loop while(!open.IsEmpty() && !path) @@ -123,10 +123,10 @@ Actual Adjacent procs : var/newg = cur.g + call(cur.source,dist)(T) - var/PathNode/P = pnodelist[T] + var/datum/PathNode/P = pnodelist[T] if(!P) //is not already in open list, so add it - var/PathNode/newnode = new /PathNode(T,cur,newg,call(T,dist)(end),cur.nt+1) + var/datum/PathNode/newnode = new /datum/PathNode(T,cur,newg,call(T,dist)(end),cur.nt+1) open.Insert(newnode) pnodelist[T] = newnode else //is already in open list, check if it's a better way from the current turf From edfa9268861050c5a3db7739f627c447fe25d529 Mon Sep 17 00:00:00 2001 From: Jordan Brown Date: Thu, 11 Jan 2018 22:30:24 -0500 Subject: [PATCH 19/55] Move a definition to the right file (#34288) --- code/modules/mob/mob.dm | 3 --- code/modules/mob/mob_defines.dm | 1 + 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index e78adfe697..c7ed20370b 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -1,6 +1,3 @@ -/mob - use_tag = TRUE - /mob/Destroy()//This makes sure that mobs with clients/keys are not just deleted from the game. GLOB.mob_list -= src GLOB.dead_mob_list -= src diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index a6ee2712af..4e179c0b4d 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -5,6 +5,7 @@ flags_1 = HEAR_1 hud_possible = list(ANTAG_HUD) pressure_resistance = 8 + use_tag = TRUE var/lighting_alpha = LIGHTING_PLANE_ALPHA_VISIBLE var/datum/mind/mind var/list/datum/action/actions = list() From 145cc8a8225d4938fa872a917d1a874448b4b519 Mon Sep 17 00:00:00 2001 From: PKPenguin321 Date: Thu, 11 Jan 2018 19:31:36 -0800 Subject: [PATCH 21/55] Makes cyborg module damage visible to anyone nearby (#34287) * swaps to_chats with visilbe_messages in damage feedback * adds an actual alarm sound --- code/modules/mob/living/silicon/robot/robot.dm | 9 ++++++--- 1 file changed, 6 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 739b0dc672..92f960a5c9 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -888,13 +888,16 @@ ..() if(health < maxHealth*0.5) //Gradual break down of modules as more damage is sustained if(uneq_module(held_items[3])) - to_chat(src, "SYSTEM ERROR: Module 3 OFFLINE.") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 50, 1, 1) + visible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 3 OFFLINE.\"", "SYSTEM ERROR: Module 3 OFFLINE.") if(health < 0) if(uneq_module(held_items[2])) - to_chat(src, "SYSTEM ERROR: Module 2 OFFLINE.") + visible_message("[src] sounds an alarm! \"SYSTEM ERROR: Module 2 OFFLINE.\"", "SYSTEM ERROR: Module 2 OFFLINE.") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 60, 1, 1) if(health < -maxHealth*0.5) if(uneq_module(held_items[1])) - to_chat(src, "CRITICAL ERROR: All modules OFFLINE.") + visible_message("[src] sounds an alarm! \"CRITICAL ERROR: All modules OFFLINE.\"", "CRITICAL ERROR: All modules OFFLINE.") + playsound(loc, 'sound/machines/warning-buzzer.ogg', 75, 1, 1) /mob/living/silicon/robot/update_sight() if(!client) From 7f9d721a72db361ddf40583b68c50c4148f1d0a9 Mon Sep 17 00:00:00 2001 From: AnturK Date: Fri, 12 Jan 2018 04:32:46 +0100 Subject: [PATCH 23/55] Fixes mobs on lavaland targeting through walls on wakeup (#34280) --- code/modules/mob/living/simple_animal/hostile/hostile.dm | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/hostile/hostile.dm b/code/modules/mob/living/simple_animal/hostile/hostile.dm index 866c2f0463..e976efd288 100644 --- a/code/modules/mob/living/simple_animal/hostile/hostile.dm +++ b/code/modules/mob/living/simple_animal/hostile/hostile.dm @@ -476,12 +476,15 @@ mob/living/simple_animal/hostile/proc/DestroySurroundings() // for use with mega toggle_ai(AI_Z_OFF) return - if (isturf(T) && !is_station_level(T.z)) + var/cheap_search = isturf(T) && !is_station_level(T.z) + if (cheap_search) tlist = ListTargetsLazy(T.z) else tlist = ListTargets() if(AIStatus == AI_IDLE && FindTarget(tlist, 1)) + if(cheap_search) //Try again with full effort + FindTarget() toggle_ai(AI_ON) /mob/living/simple_animal/hostile/proc/ListTargetsLazy(var/_Z)//Step 1, find out what we can see From 7e740208f97ea6d11ccf1307a07930819f904f34 Mon Sep 17 00:00:00 2001 From: YPOQ <30683121+YPOQ@users.noreply.github.com> Date: Thu, 11 Jan 2018 20:34:01 -0700 Subject: [PATCH 25/55] Makes bot emagging more consistent (#34274) --- code/modules/mob/living/simple_animal/bot/ed209bot.dm | 2 +- code/modules/mob/living/simple_animal/bot/honkbot.dm | 2 +- code/modules/mob/living/simple_animal/bot/secbot.dm | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/simple_animal/bot/ed209bot.dm b/code/modules/mob/living/simple_animal/bot/ed209bot.dm index 463082adda..a57e8493f0 100644 --- a/code/modules/mob/living/simple_animal/bot/ed209bot.dm +++ b/code/modules/mob/living/simple_animal/bot/ed209bot.dm @@ -161,7 +161,7 @@ Auto Patrol[]"}, final = final|JUDGE_RECORDCHECK if(weaponscheck) final = final|JUDGE_WEAPONCHECK - if(emagged) + if(emagged == 2) final = final|JUDGE_EMAGGED //ED209's ignore monkeys final = final|JUDGE_IGNOREMONKEYS diff --git a/code/modules/mob/living/simple_animal/bot/honkbot.dm b/code/modules/mob/living/simple_animal/bot/honkbot.dm index 1052542f5a..690abb6a84 100644 --- a/code/modules/mob/living/simple_animal/bot/honkbot.dm +++ b/code/modules/mob/living/simple_animal/bot/honkbot.dm @@ -102,7 +102,7 @@ Maintenance panel panel is [open ? "opened" : "closed"]"}, var/final = NONE if(check_records) final = final|JUDGE_RECORDCHECK - if(emagged) + if(emagged == 2) final = final|JUDGE_EMAGGED return final diff --git a/code/modules/mob/living/simple_animal/bot/secbot.dm b/code/modules/mob/living/simple_animal/bot/secbot.dm index b8b2621875..63b8cd4b8b 100644 --- a/code/modules/mob/living/simple_animal/bot/secbot.dm +++ b/code/modules/mob/living/simple_animal/bot/secbot.dm @@ -163,7 +163,7 @@ Auto Patrol: []"}, final = final|JUDGE_RECORDCHECK if(weaponscheck) final = final|JUDGE_WEAPONCHECK - if(emagged) + if(emagged == 2) final = final|JUDGE_EMAGGED return final From af73323477fe10c929ea6b67a3bc2108bef32094 Mon Sep 17 00:00:00 2001 From: Dax Dupont Date: Fri, 12 Jan 2018 04:36:00 +0100 Subject: [PATCH 27/55] Adds an indestructible disco/dance machine for admemes and disco inferno shuttle (#34260) * Dance machine fix * I have no ass and i must blast --- _maps/shuttles/emergency_discoinferno.dmm | 5 +---- code/game/machinery/dance_machine.dm | 12 ++++++++++-- 2 files changed, 11 insertions(+), 6 deletions(-) diff --git a/_maps/shuttles/emergency_discoinferno.dmm b/_maps/shuttles/emergency_discoinferno.dmm index ec42f163f1..eb3a27359b 100644 --- a/_maps/shuttles/emergency_discoinferno.dmm +++ b/_maps/shuttles/emergency_discoinferno.dmm @@ -114,10 +114,7 @@ /turf/open/floor/mineral/plasma, /area/shuttle/escape) "v" = ( -/obj/machinery/disco{ - anchored = 1; - req_access = null - }, +/obj/machinery/disco/indestructible, /turf/open/floor/light/colour_cycle, /area/shuttle/escape) "w" = ( diff --git a/code/game/machinery/dance_machine.dm b/code/game/machinery/dance_machine.dm index 79ec733303..62d203464c 100644 --- a/code/game/machinery/dance_machine.dm +++ b/code/game/machinery/dance_machine.dm @@ -1,4 +1,4 @@ -// DISCO DANCE MACHINE - For engineering power optimization incentive nurturing test system (POINTS) +// DISCO DANCE MACHINE - For admin, engineering and shuttle memes/abuse. /obj/machinery/disco name = "radiant dance machine mark IV" @@ -23,6 +23,14 @@ ) var/datum/track/selection = null +/obj/machinery/disco/indestructible + name = "radiant dance machine mark V" + desc = "Now redesigned with data gathered from the extensive disco and plasma research." + req_access = null + anchored = TRUE + resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + flags_1 = NODECONSTRUCT_1 + /datum/track var/song_name = "generic" var/song_path = null @@ -59,7 +67,7 @@ return ..() /obj/machinery/disco/attackby(obj/item/O, mob/user, params) - if(!active) + if(!active && !(flags_1 & NODECONSTRUCT_1)) if(istype(O, /obj/item/wrench)) if(!anchored && !isinspace()) to_chat(user,"You secure [src] to the floor.") From 8af2ee0fddf7d7d95f9f3f032739f706f60edd86 Mon Sep 17 00:00:00 2001 From: ExcessiveUseOfCobblestone <11748095+ExcessiveUseOfCobblestone@users.noreply.github.com> Date: Thu, 11 Jan 2018 22:37:41 -0500 Subject: [PATCH 29/55] Pointing will now properly reflect a lack of arms (and legs!) (#34259) * Update emote.dm * Update emote.dm * Update emote.dm * toot --- code/modules/mob/living/emote.dm | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/code/modules/mob/living/emote.dm b/code/modules/mob/living/emote.dm index 7a7a6e19d7..ef2cebecf2 100644 --- a/code/modules/mob/living/emote.dm +++ b/code/modules/mob/living/emote.dm @@ -231,6 +231,19 @@ message_param = "points at %t." restraint_check = TRUE +/datum/emote/living/point/run_emote(mob/user, params) + message_param = initial(message_param) // reset + if(ishuman(user)) + var/mob/living/carbon/human/H = user + if(H.get_num_arms() == 0) + if(H.get_num_legs() != 0) + message_param = "tries to point at %t with a leg, falling down in the process!" + H.Knockdown(20) + else + message_param = "bumps their head on the ground trying to motion towards %t." + H.adjustBrainLoss(5) + ..() + /datum/emote/living/pout key = "pout" key_third_person = "pouts" From de695abb262705c83d228992b0751ad5f7e75078 Mon Sep 17 00:00:00 2001 From: MoreRobustThanYou Date: Thu, 11 Jan 2018 22:50:27 -0500 Subject: [PATCH 31/55] Sigils of submission now uncuff upon successful conversion (#34174) * Sigils of submission now uncuff upon successful conversion No more retards forgetting to uncuff after conversion * Update clock_sigils.dm --- code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm index e60b72073f..2ce9bf31d4 100644 --- a/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm +++ b/code/game/gamemodes/clock_cult/clock_effects/clock_sigils.dm @@ -140,6 +140,9 @@ hierophant_message("With the conversion of a new servant the Ark's power grows. Application scriptures are now available.") if(add_servant_of_ratvar(L)) L.log_message("Conversion was done with a [sigil_name].", INDIVIDUAL_ATTACK_LOG) + if(iscarbon(L)) + var/mob/living/carbon/M = L + M.uncuff() L.Knockdown(50) //Completely defenseless for five seconds - mainly to give them time to read over the information they've just been presented with if(iscarbon(L)) var/mob/living/carbon/C = L From 8bd1f0735332ea7761ec884a0f5f91df8a7d8619 Mon Sep 17 00:00:00 2001 From: ShizCalev Date: Fri, 12 Jan 2018 07:16:45 -0500 Subject: [PATCH 33/55] Fixes pet collars not updating icons (#34184) --- .../mob/living/simple_animal/friendly/cat.dm | 9 ++++++ .../mob/living/simple_animal/friendly/dog.dm | 9 +++--- .../mob/living/simple_animal/friendly/pet.dm | 30 ++++++++++-------- icons/mob/pets.dmi | Bin 59796 -> 59600 bytes 4 files changed, 30 insertions(+), 18 deletions(-) diff --git a/code/modules/mob/living/simple_animal/friendly/cat.dm b/code/modules/mob/living/simple_animal/friendly/cat.dm index 44eebeba33..47b00cb7f5 100644 --- a/code/modules/mob/living/simple_animal/friendly/cat.dm +++ b/code/modules/mob/living/simple_animal/friendly/cat.dm @@ -29,6 +29,7 @@ var/turns_since_scan = 0 var/mob/living/simple_animal/mouse/movement_target gold_core_spawnable = FRIENDLY_SPAWN + collar_type = "cat" /mob/living/simple_animal/pet/cat/Initialize() . = ..() @@ -39,8 +40,11 @@ if(client && stat != DEAD) if (resting) icon_state = "[icon_living]_rest" + collar_type = "[initial(collar_type)]_rest" else icon_state = "[icon_living]" + collar_type = "[initial(collar_type)]" + regenerate_icons() /mob/living/simple_animal/pet/cat/space @@ -60,6 +64,7 @@ icon_state = "original" icon_living = "original" icon_dead = "original_dead" + collar_type = null unique_pet = TRUE /mob/living/simple_animal/pet/cat/kitten @@ -71,6 +76,7 @@ density = FALSE pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL + collar_type = "kitten" //RUNTIME IS ALIVE! SQUEEEEEEEE~ /mob/living/simple_animal/pet/cat/Runtime @@ -162,17 +168,20 @@ if(prob(1)) emote("me", 1, pick("stretches out for a belly rub.", "wags its tail.", "lies down.")) icon_state = "[icon_living]_rest" + collar_type = "[initial(collar_type)]_rest" resting = 1 update_canmove() else if (prob(1)) emote("me", 1, pick("sits down.", "crouches on its hind legs.", "looks alert.")) icon_state = "[icon_living]_sit" + collar_type = "[initial(collar_type)]_sit" resting = 1 update_canmove() else if (prob(1)) if (resting) emote("me", 1, pick("gets up and meows.", "walks around.", "stops resting.")) icon_state = "[icon_living]" + collar_type = "[initial(collar_type)]" resting = 0 update_canmove() else diff --git a/code/modules/mob/living/simple_animal/friendly/dog.dm b/code/modules/mob/living/simple_animal/friendly/dog.dm index 53ad13c3b8..812d4448d5 100644 --- a/code/modules/mob/living/simple_animal/friendly/dog.dm +++ b/code/modules/mob/living/simple_animal/friendly/dog.dm @@ -31,6 +31,7 @@ var/nofur = 0 //Corgis that have risen past the material plane of existence. gold_core_spawnable = FRIENDLY_SPAWN can_be_held = TRUE + collar_type = "corgi" /mob/living/simple_animal/pet/dog/pug name = "\improper pug" @@ -42,6 +43,7 @@ icon_dead = "pug_dead" butcher_results = list(/obj/item/reagent_containers/food/snacks/meat/slab/pug = 3) gold_core_spawnable = FRIENDLY_SPAWN + collar_type = "pug" /mob/living/simple_animal/pet/dog/Initialize() . = ..() @@ -469,7 +471,7 @@ /mob/living/simple_animal/pet/dog/corgi/regenerate_icons() - cut_overlays() + ..() if(inventory_head) var/image/head_icon var/datum/dog_fashion/DF = new inventory_head.dog_fashion(src) @@ -509,10 +511,6 @@ back_icon = DF.get_overlay() add_overlay(back_icon) - if(pcollar) - add_overlay(collar) - add_overlay(pettag) - return @@ -527,6 +525,7 @@ density = FALSE pass_flags = PASSMOB mob_size = MOB_SIZE_SMALL + collar_type = "puppy" //puppies cannot wear anything. /mob/living/simple_animal/pet/dog/corgi/puppy/Topic(href, href_list) diff --git a/code/modules/mob/living/simple_animal/friendly/pet.dm b/code/modules/mob/living/simple_animal/friendly/pet.dm index d6294ff727..04295dfbd1 100644 --- a/code/modules/mob/living/simple_animal/friendly/pet.dm +++ b/code/modules/mob/living/simple_animal/friendly/pet.dm @@ -1,20 +1,16 @@ /mob/living/simple_animal/pet icon = 'icons/mob/pets.dmi' mob_size = MOB_SIZE_SMALL - var/obj/item/clothing/neck/petcollar/pcollar = null - var/collar = "" - var/pettag = "" + var/obj/item/clothing/neck/petcollar/pcollar + var/collar_type var/unique_pet = FALSE blood_volume = BLOOD_VOLUME_NORMAL /mob/living/simple_animal/pet/attackby(obj/item/O, mob/user, params) if(istype(O, /obj/item/clothing/neck/petcollar) && !pcollar) - var/pet_icon_states = icon_states("[icon]") - if("[icon_state]collar" in pet_icon_states) + if(collar_type) var/obj/item/clothing/neck/petcollar/P = O - pcollar = P - collar = "[icon_state]collar" - pettag = "[icon_state]tag" + pcollar = P.type regenerate_icons() to_chat(user, "You put the [P] around [src]'s neck.") if(P.tagname && !unique_pet) @@ -41,17 +37,25 @@ /mob/living/simple_animal/pet/revive(full_heal = 0, admin_revive = 0) if(..()) + if(collar_type) + collar_type = "[initial(collar_type)]" regenerate_icons() - . = 1 + . = TRUE /mob/living/simple_animal/pet/death(gibbed) ..(gibbed) + if(collar_type) + collar_type = "[initial(collar_type)]_dead" regenerate_icons() +/mob/living/simple_animal/pet/gib() + if(pcollar) + new pcollar(drop_location()) + ..() + /mob/living/simple_animal/pet/regenerate_icons() cut_overlays() - if(collar) - add_overlay(collar) - if(pettag) - add_overlay(pettag) + if(pcollar && collar_type) + add_overlay("[collar_type]collar") + add_overlay("[collar_type]tag") diff --git a/icons/mob/pets.dmi b/icons/mob/pets.dmi index 651dbb896cee85d4009d9346e0b12872eef6a06d..31e1cbae83b99463e9c82b0b5b21823e48a14f59 100644 GIT binary patch literal 59600 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 literal 59796 zcmdSAWl$Z_^EP;KO>hhD?(XivHMj+L3GVI?+&w_>;C68f4#6FQ1$T!Xe*agt_QTdz z?fX{kei+VWX6`*b-F>?IdHPJGvZC|{#7~GI5a@%fjD#u(1hEMm-SDu$8846aBH*8A zFLiBKiLWlE&Q^}DRu1+ckVke^YNvfL3#OFCGp1(y%+IL?eEF2J-&0`7wy4;;ZKKg| zmL5+ZDHJk^@0HsFU7sHo!Fn!}8`x)~N>4rNJ8 z5oy>8b(JReT|}$Jty(-}ZNBv*$2Z-5KJ5pY;0gMuh>IwuxCbtT6(a2^w<^=*4}~j9 z`A#T(Gt@kKIEWR9Fbg4>%4pV6HecN%fFmC`YL5aXZ5F&rhLC2wO5{mpjRL=xm8U?C zoftE$ABcE__by}5c=wuY*&pd~7w`t=Ap8*wo%T3@>g%Oz4?g;2Kw$K~#6Tu%ts9PI#Kfz5uSh8;~f^56r zGMzaKjyK{>i9;A#8+DSkEqDtTor8)}2=4!UUmo1F{R`u-P@i`Fd&&w!VY!u~9qcY_ zJbe0vT<-WcKIxTOR}3Zo%I{d)?O4_wzb7P+j!>{?B;35#S)44n zY_Qi`d<)ordKjb5@clAbe^=S*cl4#1QC&+bm;^qEB;xP)!bT`)QB-IrQZdNSsKBRB zBLADl{OH?|s4&>D@96n;Xf(8F+?Q|o_$qddh}QhP3C9?~)FGeXr#s@Nq@RNljnMuq z3jtz@mW7%?+~NrPCstTm8iCNMf^=4>0m0!pBg;{E(pxCi&KsJP-sQeP?*yeKdlV_) zsfJ`)zMq5&KpafJwz4$p$&D<2{4Vh{(j<)z((jUk%+WR31DjcIK_6qECZ^r_IE>)9ADjG;qc;-mkFQg6R z<`A$F5Ri_d(UT%&v>4D%#v)=qerRc+cb!3_;WuDXzK@(3Gjxj~4Tzs&iJ(jFLZQ|enYyqAVpt1xs7c>Qm3P1oph(XEx|8a~cD>sUP5Rnvznq5wF!9q8B ze-u`%m^#3@Gyxle)OD*MH-3~T$<~)_yCKfa%~_X7zI#Zfa!aGzb{PxD~1 z_pfeem+GK~NJwpA#gx;5K?sgxfbomt2YpF&78f2f5y%Jty{eDqS^p@3Ey&b8%(&(V zr`{BzplcJ_hvr!wSCE2DzVnwMj(rmOZe`f!mtqrCfNL2_>|}qwWPkIkG}EeFw2=h< zl`MPA!Z|-F;who*hn=Kv_q(;K*Z)CW?P#(LPA$@`S-zd&utm1v=&bDo`F}RE+jtb2 z-O!*rhSesb2OQ+v;SF-$33mRCAQ?QF7be2F2n{rX2?@&-o%gjZdVecYY!FohZa$T8 z5Xts#_7N0SL?9@V8CVzpyVv#qu6Xf(_q!5$fRUJ>v!DyOD7v9V`y~Ml|HlKuLZZo< z)fnN$3hmG&3P~ZT(0hR;F^6c%IZK8v4%{`TY112`&D1fcNgv6~ny;c`p3@BZSwVgI z60p{9nfKe|3!%S@;r z;{J!odB}qeIJs$3(cQJyAy4{lP{80|2$kV^e59?I4$Qm#e&6HZQUn09j(Re7&uLa9 z3=bEd=n}&NHZ6-xCV@YZb?g=`n*=V71oWqoL9lWuGNOnHWUTz0hnTCPS>~Rtz{oF@;6Q7@5M+H;M|jKbAVa28rzxL``6`bET*>k zCb70@+sjt@-Bl_GK3`u|$^?|BDxfA#7rF)Hj-U6t_#dpJM}}qQBZ$G28D^72Sn}>m ziDLAN1i#x(n*@R?f`{aS5}r&Gh_PfJWqc5VBK|8>0pa&QA?ts|xQSbLQf{^d&O5tB zu$z9oTUdS#4YQNss{b$&_m61EIS!pc1J=BptyX3QJ+$O^chGK^*;0I%j8GzID8NpM zvOZnDSZwI+>A~I*!TOOcp_*QY0UN1ao8jkU&COX&qc3H)(!(SdMb>V*T%sx6fX6JI zBzSmIMJNQrfT=ZARfE2NM=zu7)p>i> zS<&i!NPYVU{)fqTd^2qCi^vkEO40jF0Qwot@_Gmf0w(`^mFA#Cq35%^!K)Y27`C4= z_UnS@wnwG>7y7Zb{;wSVJeD+tOFyfc*3DzMU<;v^)+m;zB0ZW?--$40g*3}~po(KwlU_QQ8D^+sf1 z(xH#FKbszY4J?Ti3R49ZFE4LddAafU__&Zt$dau&xm1jZv^3m|;NiK8Z`>>i;)Rvs zx5gm6Xk)Hu6NYRdp>GPg#*^{c2AeO}ZZ?|a z*Jn@Xcj9zYAPx?WZsA8zz}}vDK|ulO0q=Gg7cD!rjSf7{#`PUNSrpAiUaH;2L)^6( zN#_&>Ck{PPKNjNA_`1%w+GpyGJorj(r6BuN*NbSw*V)*tT*s#ZTnC+j%INja9HC&{!oIf%X%M`6QzSCJj3AOoW zfZ3vFX>+xH5EKO2^5YaHS6-EItgFd_fsjXm?GOe62A6p?2+NOPQV15LSuscbL1@a7 zgp@}SR$?G%r}!@5S}gBvKvlO%SnBb|N!Y-Nlv@4WT~qqiG`AhM>sv0C`=i{H#;bs1 zQ7>9sq=b7P`n7Kh7wLnNd*6477J}4?m^0G$eZu^^ zy`yAYIp&gu0XiJlh?RB)O^(MYjN!N(x)I4#yo|@Q`VRMW;d7)}SL-(mkq39>5z`;OT9(gS8pRZoCDF}6B8v+YxqfkqWixJFg4?^_cr2L@h(Jv_VKk1lMgox?|te? zi%Fi`a9g`%opE13bS7t1#i;2)l;N95FJI^CG z$6F&bEU9eIPLO+~tV6q%qNosuwvk}{+nfZE3aUq%}`6s}F%@5u`sK9J9)#t<2<-Xq=#Fa~l63V|{eiw+lJy8jl}m>7>4! z*5VuCzYEuqAY7IxI5@crA4Y>Mt?gs@A*9hN;tEyKj0%HHgdK4$i5xlZ=N|Q# zaAsy_AtJ^n3&?gPmQW%qVX;3zH0lY5oMJ20+XViNpIY0-5`TafNmyuD8~nVmo=0!3906!0*P>-iwquCT93YD|P3KD}f!fg&9d-Dp=9} z;-&o#mRL#>Tp_)Zi`gaKq$L+aReRXS;kg%wB!JShZM}!wc264(btP%_CGC;m?Tsgj z{!q|9uAT?v!KbDy)<#R{5Jjf zw)@9-j@C$~^-NEXQl+Mo&oL??C@L`d?c12hqut8pvIpmkg+KB_D(yA|lyNTo5PR=} zp<@!5>Pm$1P2i4NmH3=@0lJE}nhR6?X=32`1k1s6A}$M^8Jsv1KMMxbo)y;B;`W41 zp~Dn(>aeoG{dNSu$XrxjE?ZVrC249(u4CQQcQbEhcyW{O>GG=`hN{_J|4Z{qY_;MA zU%mIb?6W$_m&bWYhhDEczKsKJ#i#K`e#yGs!~4>q(Db((!x!2w=fnKzN(2v_JaJ)F zl^opMNSvIUCZUbrsP%Mz+((^(#18BeB_=FhF5t(jezGKtc7g5B1eLWB^5Jts#!+V!6%#cOSXA|Y^yfZpv&`Hfj|D7YU}xCfd# zn5xAq#jcp&>?-3l#!BPooc_2QVZCkm*QR_%#dodWiSnb&^T1^A$Ai41PFH$;m0574 zFqy5puGDLW+9)eC>g*y8YFKIdz=L+{`EggQ=-Xess6d@p&+5Fhc+3|_if+~FlO&BUd%O4{mAFiEuw04(Y)$Pw>AZF87XGb{KvsX#q(csYUfGiWx$a^o&mrY_1UJ*~~x|vI9tG{V9PXV{P8#oJgYI^etAnCy7$U^8UZoY@K?<+b?DA(MHG^5_FwZ_Si zO|TZlwt0X=*9en;LsMSNCG%g^WC;@U`i$K@osvVT%Yl_DP5QRB{dmmi@X}# zk|y7W2KbWcBA;?a&LX2$X1TP7n1MItcW_}{gBBA$Goxz$ds==rHZxPH2n;r$VPyP@ z?IM&dSg5?jzuIA?qw!wgv)Uw>b)Bf^G?=LOkYt%{OuNyYQW=4f$w97*M_47?>kUzE zAD2+)c&8t~zsw0pqIojBhJU6Xso6l5WE&-}I-#z3CWnYae?Usv<>vWw>#`)I#GZL= z!n?0`B`Gf_FJH3ph3Qv8Q$?&#q(p03$Z~a9mE}zIZnn!f4r9Tk(wfVEXB;hwSl-!P zOAx~U)6o%G`zP|4>Q|%0CNzK=kf7;BWI>Q4Nu`6r7jmKi@aK1l1>kC*0*>*0f1+%w z1#sockbJ(W)LBFmw0&Vkq8|@H<0NLT#4;E7pcY4X+HO6|AgtScbnNKRFAUgjFK?wt zAeL3v#7RT2U?MOZL%pp4!ydY=+aHqGy13I*LG7s_0^y&W-5R;-&!IR;N z!lX;P4hiu@0U#8Bok8=VMhs%sb=umpvIuf=a``{u4N1WdcK~?I>+w5G#@8LE`>g*B_EPjhi$YUguOw6h$n*U9 z%sRN$7CnEua8pkPBEP(xc4^NSRdUw>6z~osn}}B)anB)e`Uzz(2K2Z_o=Q5YXt~IH z1{U^TvM)P|lOdAdd{{J~{U5wgD=qwBuVck5w)!G(B1s}#zUM=(HgwbG|D(Z&pH3E* z+xSe5W7k-x&?4@0R}=&M`c(%VGbt6+x&NVCC3CJ4M@R2WLwC7051jLBu zCoagr#BJCen)9@(@P2ae_8U2t^f?(kv zA^;Ez1EkXKT)DmUTiSrBntz`n{!5Bk6v#vJPW;_oL{MB2QKH}{j~K8_OlEA6k+;(E z(0m784oL(=AVoK@*kf^7Ap!g+b0@)C9jgVGoiB;$JS~kirpEz|3Tn~m0Z?a_BrCQe z@hzGuh$Sn!qf056%{{P zTU)1h!PAfXL%}k&3?}*|R(}q;kzDVRx*+0MIQFjM}d=LT>mkj4Bxj_b=L~Ig1W59_gDwr5_9)TJD(2HqgFlkUZKj zw0W{7LvVC)sh^sfA~{Jw6txO&9%277D@Ji4X@<7@H2aGYJXDGUc^H~o){2YsAUQg1 z(z(Qcxwz~6@O<-sf}`?Yfp@bDAJ$q95t@mkE`Df?wH+u-;|Lcd@0Wyyh2<+u$zA2S zO=m^zZ~u%FD1_;c&|<25By->(2-#cCapD%f;@!C1XI^ZQC}@0a^Kl+ zecRuP%9rRlfH?e)Pfs`Mw-pT$+J5K3*{k!2aVH+wYX^Z*7GU9Na2Awbx_ zf=yvvxfx_bMvV{0?umYRuS0k#Jw#RQl;IveV$jXlX;)Zp)Oc$1ZhB6Q_x%o}h!1E^ zm#28T^gPt*g@d5_nPE6u?g;qTmnuzA0O0jvk0in$MMSjXtzVU2kw{XXaaa&D-;4&i znN9bMcMI=t-QeI^CS#`g$~mrn7a0=IAVFx^Y;uV#Ph3h%AElZIaaT&wf;tW2XL|PX zp8}yLH9l$#S1gW=s1VrcbZ(cm8zZ=u`bST!dUxX#S=yhfU$@IYOiqo1oY10=*_k1n zFB+L51rV3|HjYRC&<7Am_fLeIP-0VN1MnU;?T2~xuWRZ*e&C7N-DBuiQ( z)Zg?9g)3UeOSF4yq_1SNnus;oI#rs)7l}_jZB-VfzKmWRAm z_mW&B#V%$^l^eQefJTEfz)!%oh#r8gh%7S-00Qw)|L zS|)rnI|>!Jh^gJ{NeJRn-@5%Ql&G1Q?g?=C7uXt+^hUs(VweYLr5-2pz4#-!!ai*Z z%OqB6Yg)hiwG`L1a)KJX)R##d+VntJj{~86%THVN&KhU5HTrSV+T@85KHY55o6BsF zhrGNX5D+trs<|j^0R0oVo^hT0=pNZ($0W!#U(_xVS&y+{%AzPK#}fF(X-o702zy91 zPvP)E$XU{Ti>vT@rLTn|$#14 zON$xPUk(H)9RY(+P;oZpOL2v0Nl+LGNWV5N_Q>KRhQ0)UpaRd_=4z`E^3b4r@!ncH zNLUi2wD8tAqb08(hwt+xYsz^P*w7_pUThA(B|2bu^eu-9UPz*#H;9$XnKbZWmyOikL>R+(fLT*iO(-Dud;Q?R; z6eubzy0Kx886{WiiUogODHvGIKT9lD)J9P01l{G0*qi?+B!we9ujrSQ{Wi%jWF?0y z9d=8tt=8d&V0#wI9P|7*Sq!5I0#$PXJdkFRpQS%Q!l^*!*Qr!qq$MYJYy841Q&1)C zM-qC?e!>YuAp5hKYQ*T|^DLsEpzs;(JycOLRea3UZQ zef%MD_70zfYYH$$UJzJMW_rx8Klptp)96APBR(2W3Mf20s4&=1dUM_R(dUJxY@w9> zVamSazwZS&Nmz5rz5I11?og3F^NeE<;Fgj5XSu`wYmr_k0DjqP@1)?@7>!7+$$>>{ z`Fd$I<@>sw1-|;W0p+pb;6)1PDLUGL26uWaD?5uk!k?jK&HmuVRl6e3FIC-4j@sQs< zg6!DSpsg(+sFR&6yW|H{U_~t@I#UN)dxyYoQiXGUp{Rf2IUeS)-0t(}PXtg@g))GiK zx=i4J#pmO1?Zz^{m=W+U4v8h5jg$OQ+;U@JwLCw+bY-{I@WCL{-sME&k2SqUl7rx~Zwidt;S!et+2V>@`DYWbVF#JaX>p79mGP0JqPL(EH z>$})zw`iCzd}G*!Zj;0#hAF2oHSmk~VMapGOFsr1xOv|LNK`*P5*l`oED>7XZLUFeq!Xt+{7McN5}(hay{D4Y$j{l!jC7rTHFMW$Xld5pS^ zwKcl6jmVK|z`=>M#B)#6_vprnX3&t=yf9Bt*aJJy1D7-w9n4MJ?4vu(#eoL zLbWlTpMo&H_Bo7S1=ur%CYD<}k|r-9AH?nW4Fu}lmoTAyc`Tqy9yuo4603yya8wEr z@YB?Y481ao{!a@AOvo8jm{thm9y&1^cAIYZrId$3&;H7^!-Z?;<&J4akp{mzac0&~ z;j1k4?Td9kkj+9aP_vAY2^|W{OCfJ=ZXiKi97Q?;WxF>au?ZpyF z$tdmV4J!vTV+6$4j#R7s+q=9XO}rynOveEWX4lk_5QpXfyiwEeFkNuwuB6Z@S>Fos z+T0Q>l#Q%`ymnbn8bW^SH|okAGl-8}QtRWpXTdu(391D=FAIYj#kC{|{TY?6(n<~s1C$erQY5a0vdE8>b2RSn-zVZlUDwQpT-?QvaDS@k z1k${rkYxO9y~K?|k8)rDng56k^>A~UlIlbM6gxvFgIt%wDVKoVlkTLQjR;+H01Hj* z2OjhizNa|`Dme&p@TJ9X5QuknYHle^tV!NUQXlIn7t{|hN=|S%hAF{$ZAahWfyJ0k z(`Ug~85l`+VIZ-mLSR!b2Ya5>l>Ktwe0PgqKITC%sok#R2AqNX^Ln@03 zC?G<6tEBq#aF%QzvhrKPO7vRyLejf58k&Z3dtsfepiUi)r;FuHtjP595q~K1M;IT; z$h$Wxai5oyry8_`vP0iEtGwRB45*_WC~2KI<>#MG_s-9fEwnP{q-SSt6FkV$;!sno z1T_jVEq3@x>OS)zSbGZOc47ksBQnswVDqh!k&ai^*C)In z@iYtp`UsLJna|nUM2HTU&X|K}rf?zmsi~=KYH|)H71Y7g5PZUcI{2J6%xEd_OR7>uzIZ^Ehi$G)7>Ed7Q0==9A(2qPK_(l5D zrSOLGslqdgs6qQVjeOD{0HwezklQXPS@c3$784O_gnu_M8gFYfZ&Omq-;t}Up>F@q zpL23OJY0uX9K;8{KApV*B*wRkUxeqWcRg|V02s{P@L}9`dZj@(>TVZP=D@)n<#h%+ z)AJ48yd;Q1idI(T>Z2(ef0b9}q`(q|dg@|!T78-vhXc+NA~#=2_Jm2!TchrH@egiO ze)tPL8OvXsmA z(-tUt&C2eV3zsj0CtsA})^YQaTHBry_>13uaAR@xa=Doi90Zin8-J97c zErEas>S!ACP=nR%`4MMVEM2GP)gCJZGTx*5SO$Ce$>Y*-?a+T_g~x%HpHpCs{w!c- zj$8XSEnBO;)_*I^hme66R=lhwXK#%5OB$5=Gb_F1-;an;T45${=%jjw3Yc-fZ)I>$};RT3JCF>=53~V7DMCF7DoS-U>S!D)=|x z#u|Mdg+(8-RBs`FcGZ|?AIJAW%|J*>@R~qXRh7kQ_ebr}%u@iuHbJkd8wNcs{)hB% zxKmr9u)*a%OPzDSUV|9>^0vs7m<$@f5xVo!18XP{2hlxA!EK7k`}xl;f=1pu)!br_ zIHSBcpGr8->dyr4m_Q;m3-T*#_S~S&oV>MIucJAHcCB{{xq7iePK=Ka0CJw6_o3{B z;uv(}J>j*iF+EQXE^Ie-`8+s(8zOYy-0TTXKyv2Uo6MX1{6p_L?*tB71XVTR`*+Cp zwKy#UPfE*Ad?g>3Zq?a9WkCPL9IvjSAsIr%*Vk8@IGG3s357v_j7t!Eah3b3u21{w zxh-S^zv?8sZ?$c{bZ<$oMFPtoJ*8STOYUUAS+NrNt&89Bc#9rFn%;<^|GZSFr>t`{{CwYsnsFTgdav>w%xeKWV;Q z*bO|;&R-=v?)(()vE+D+s3C!$I=TT8eal7S{>8tFnx9sxg@9R(2O}}gw@y1j{lh@# zPLm#}+734Q5z4%r2z6^6o%9xbe{DgxwY51OFR~8o!v_Vt`h_L`!Gsq>{HQ1xaapy? zlJPlR*k8!|W=;#rC+a7{vL2T#`nH*xj?Qm}Js<6{2cQ{^H3RqHq!%%_9as{*MA=lp zvP3tXrwbuHICn5v6)>V1DQ_!&(LFPO(8;|DCY=nc{LVTvlwhH@25xm@yuty?fM0yX zOD8)c_nsa7hR?1hxm~5)a;6R7gn_$)M}BmW#O-ElAG{s@dv7GY8&}d-pL9qMeirza%4|3R_8z^vSoc0N9*Dw< znw6V9O32Ja6h-~o=wri+Yl_?X`=-|jIP3ZE(+Q?pi^q1UVw^@Zc zMd5QgdyalO+u4`DI0uP|<}tbTt7vusm_>F_WbiQ8fX z7LUG3V2um{UWti~z1<&)@vd3LY@Wd0-d>5U>jB|qLeMnxS=SAY;p$bUx)GF!*1{K8 zx152A9R50&eZ@omAtM&hT?e*$ND^azU6dnBR8-U=u%3E^r=wWTg5BEJa9cf#C&7tX z(!D3&hSuOJLXt66nq14v4-Sq4I@eC?1r0KlxVDx2mqUP_{=oh!uQ&E6hxvmoKA@*G zeLl$W_&+AbbGP~Xp>{!BS>wp4lH4y%c8+!k)!VW|Jm`)D2!sgu(mjrs2*_>(qJpXA z=HJGzj-XwRbhrwg5pKKg=s_Y%HBee>&xU25re3{B2KF0EMCq(tf?PmN;VXD@U@ZV5 z`L*~pC8lSdlk2nZ=Hz12mat>nc&tjUHw9Ph&|crz(8r>G_jfU$7_C%5okRK45r)Or!Kt{oED7R?(!94*O)QaaX2t`&s zPmsM437>pR>Z0^S-t4sSv+E6E)7Go2>uXn(n=Zj zqWZ}Cm{#d$whm2*Tsn&Y62d|+VbE^TeqWO9TaQkl0I0WT%(K-yeV?;dch3X!0LX~xov?x9@EJs75C@8^(O|)jAsI-*YOwEDgU}lDuW;UW}9-!yd$>#mJdcOn` z2&p28*wXnw?4}hRK>@n9?T_hA5V*l3g0tGZ08UXx!Mg_E8-kJapd z`wW`J8?UpF(%=OUk>axplCx+@t*pf^LfhIeJZ;N9kEIWS&U`twE4sm& z%Fj)#In}7J!KBK?0#PyN($u-%uw)}y|k!k;2(DzmSS>pa<%12X(RT*_pCIC z`}p{{>B?u!g6r7U31zV+C^L6hXWSQ7dq-Lf;{LDhEiwpTSO7*d?5-F;wcD!?T^m10 zI^VyZS$=GMfBW~=TUHdvyYbA=7Y*R^r}Wy@IIr}Q&6&Iq_C!P9V@^68mPt<^^VZsp zJ49??Xk+F%mBz<-Wre2S2_|SL(-Acj3CsxOAc4#46<}kNS{3VukGfaSe1Ug2Lcl4H zn+#9Trm1+j;l(y{OPD|wZlJg=tz*-I>;}dK|8Qcw*y%q$dPy67eG3&fb24Q&4EcK+ zOQtp=(#r>;BHz3prcB^L)bW3QWJmRD)Bo0}`F}KWw%k9GI~boULB-8?+a>z2Vax50 zkXusTl>reuVy{gXv82QYn5M>oT5cq(Ev>o^~(f` z6%saJvWsUzF;^h+-54N>3q~d;slrek&^4c6n>Rt3;3MrsL*C$cvk#nIRn_qC30Tyw zhd+PRdD;nOxXnnY`SF7cXPZbOxNuF4VhXythy!@gS5Ll?_vH^omF9*Fm_#0YUZgqz z_Ip9(?%~<&n&axXgPJR`&Gpf*J1$T|d5y)6?JuxQNR+cNLI6c_hC&v0pAR!#@UzQf?;@I3hkN7WQDHh{v>#oi*8cG5chwP;m$rI;%BwoD|B z92N}kp`KILh>1kQQH?#jY>kackt=Gj2WDLI~h>(2o8&ZkCtk_KLqin$7ua4|SfCz{jSGvIO%Nc9 zX=vauAA=|J={bk5Kk0<#RD-)B9c}`e1_)VPC7}n8JGO6-6SsV3DKRRX`a*?TM0R1( z0=rK@R2X6A{2^K8>6f!d9+l=?ypw{kUF?zWR z_wjO@DtU8|A9a-6EVeORMO6n~%JS>Cd)A)*<@!l`VLXiup7@~pU$AgEnoKRLOf@Va zEkvMgPN%?Yc_pT{OCd|v7s!nWgLyV(Rn1KsLxYEerA;!1Ty{R!0VxQ5!jER=<|a4) z<~(c%c0d8g$F`LQou4u?G7kPZ_GdS#;+hUmOh{>2Q0wR_ZQH(m`MbAQmik&z1Ezbg z=Wp)r#7k#M#}i0TT=;SvUE33~OeOsNyEra&g+Rwc!mmyunFY!MD2w4nXqE|f*4J29 zfkwfwA0YK4d+eTOYq3SP_Zg&D2!8%hU~2o(A!p@H=Gf%FWoLhL z-%xEF`)p;`w=;+&zoG&u=BCfyoqRSS4h$ADGmC&+TU(1oBbPFo$`_@fp;5kG9ir-f zBoRB{LBuVvX0HWysA^VVff9gz(4)YL8@ER$SWxUpsW%h6g(YIp4Fy)H8R<6+`6H2* z2$w@@cx+*Rw?<9uNO1pD>BuzLGdQKaaq@%9-H066{5N7c<9MYMT%P1|VdpMDt)i(V@*XvEa%yfyA z45`rL)06S=aQ7;&yUE)t)WLzJq@Mv7_~iuOXm~6pJ3#F9en=QG8i&!$_XU|R=i|3_ zLMLpHpTW(pNzhXhN7{i|^7sk(qES z0GJZV;el81dvO*{j?s(@v((}FJA`f63jba^RJT2Jv3PFZ{ER+l^gkSWow0E;nOMPn zo?qi}IvT}&9@2FjHGHh|3)Io@Cz z%Hyo_PFYVcW^XSE*JZBx{N>D#`0VwJzmB3J9l-uRZqGbST^$6S_S`~m&n|jiOC>b) z_<_t_m3>R~(|32_g+p`EdCz~T%PK1RbR9ZFGs)pD!iAqnH^G9B2Sv8OlW8rjta<{W z;2c-%nrWK~v;&Tgj$o2sBR;r2Yho^?E(8-F@Ic~9Lx6x?#!m@TeSwKm^XC>qfY5Vg-+xq7Sq(Wz_&yRx?-ku8(V<>WFQ*A$<97kH(zmk1z> zU~uj?ANOhc|5VXtLpoMO*FoWis&0|W>xLeHQWqUM@L8};&ZR3Hf&Z*Cls}#kpIAek zu0Tw-7-Lr*@LF`mfQ1ClYv(MUf&s0sP56QIe7Nc5w9t=6E+!-Gt*p@e&b`7L8cZp2 zeVppghkNm2-iR`YS9_n+f{%3`SzYVyzrSYlePjL8gaQBQTUusfLFzp%O8{u*lsyw})x583VDcZI(- z%6v4n{7<*a*3M4Ud&NrNZq)_h?&43m8jt5Cg^oZ<+WfpG2N&0NKf;Y}Aj1IV{o_$h zo$V4EgFyp}nV+13f~1WNed?;au;1%d9{q&7N@tw%XfxV}kY?6UuN8$~>p@AMpP)|c zM4-m=WNy*Fx&WM{HXvaJ9&BFOd15HLwtGCr+Jr%+zo~9-H7Br{vEGa20z0d~yC^Qm zR8UE=a9s-X)QdOTKCc)3fq$?sr{1D2TMxtUu6;xHb5J<(!u_QK3yJe3lADpUI-Exsfxf$gWU1?)bUMGg{bxMOoxxaJfVFAaiQ})e zKeRf^+2gjSgOO`t1ss0!DCZh{m z=j$h|PomjfAy}J{^xUMBlrTj^ULSvSJeOfK=iP!EJa3PedI9F$G6=N-icoZF84#a~%LhE4GJ&yZUfhz4f z^PH4w`s$E~tB?9+gzjr@IHQx3(*FL!xJPhDXVM0_2tcdAq6YlR06|o~kyD-TT?5yX|2JfP zeSMxKM=`>8e=%j-1%Xsm-B6(+;7W-kL`8{Cvjyen%(sU8?!{MG^V^R3czQ876rZY?U|WT9KOT(ya8DBn(#nTMD$LiiWcQZUJc+Qy~mRlePX1iv5+C0D_@2`7XqK|Ye)UI``dnakPX5?$64D;ld{oXq7 zwx=GYjoY4AW>_y4t#sJKTcZcJ2cH&9?vE`B6_3scck&&U;BI>%^pfgvYUZ- zg!~U0)h?{Z@!n4!heAy?ANOtW4@w@vhE4iOwOqV5I^x8}+OXg{y`rlJ;Aq+nZIL&& z9M7Nu?CzL_;SW~&pPzhz=Hcsgse+}@5^iZle`x=&ucM2=F_9s5G^b^V1r~BreeRWL zmX4?E0~FD6vY@M82lzT)(-JG9mS0j}rz0qC9cs~iFZ{r{weGBI79`RLuZ}Qepu_M1 zQZ0!+cx*Uu4yVow7lKEh8k47R zp^fOH*gW}tmkZ8AHi%DH7HOyLyY#u zGMsX1N_;sbSahCro9(}{TTJu^qX?Bn`Zn_T6l43p7~#BH?AZLghF}J`%=@)P1?_Vw z{5@X}R?uc0jsXZ%DYzKb2&e1ha%bO<9~fr(b|sIyX?Izzs}UDgt$yITeZ`1Vs{PPs z`0*Z|ABX3)69`|EXTpI63yK4Eu_$%#nur!)oNH`6D>{rmVL5cuRyByA+zkbxYEX>F z@9t+^^Ktmr5dzntK-jT?X72AMe}2Ufdc8ypTHO$Smh?2d6*2A&L9iXlVjjv-WFX%G zqPq5OL%RmrmbUcXna9=FGSc3y<8T6)m&;LRqzbJXY{fjGST)9Rp0#xdkRxBt@WhCu z!T&+pTR>G6es99(f*{@9p@PyOAxJ5rASKMOS$%Y)MkEof{@8+Rgi}_ z6M;>c;Kl9vQF!+f*jjaXN#M;4l+dE(URSG*&EkcW)>6Zj6Mek#&Qe7>{&zJvJJp>j z3(lS!^1!+^)N)?Z6I5?n^ige3=9OB(>IN8NS)jw3DI`vGa0m9rb5uX+;Bgb05S)${ zb-}f~e4#8?FQhtZH@z`w**Dqwyo&t`B80`jYN}M+Wqn!?;A~PRCQNhIb_#w1FOtDx zBzXng4^M8M$eup~L3C)gPC_xs1zt+uJ{W3H8BCXdvIHGcz0vJCpVdqNu;80i^bKG# zknsdCR8IT#_o|JS#>yLgp6XTR-=3TSo`|woLuKc9yGosPs>VidWcRwlZsm;=n3aNF zuD7tj+cOcfcE_GJOYehUsT`s-c$U`B?zPo>Q%8UvR;tZQF4K!?cavRQaM~JVv^${r z&cj_kq`$+=KcOX&57o$CPoaOnB0A(;bHUkSWZQNpr*p)4?;$kinUnDPBI>E}>Yyvt zr9DmbEN@-$UD$M_eOsxb z9js!hq8-;90&)49Y>ss~c^uzJpfrad93(Zw_ZH_VVo}b3!Wnv6`y@BDmi+7 z8UGE_~!m(e7}ldL7XOicg$>S84+t~kfD zs*69MqQvFxakTf1(aqIlGb;4sN62qbq{PkLJr*qUJk&U3Je{V<&Cr-V zG149h_%H8W2*L+2ybpE=LT`wUoxR+kT{diBW0?nZm1?um+`O9v`L$(lY*ggE-`nhG zy(}fnaxAJa$>*R5wwO1POavmNbqzOe!WBmRGzD|P_xH_ont&ASP3wHsZX(J! zHKS*8^mdf5gDvzWlXI86N7M0R+7vmyj@?(Bt6SGoUK=(L-K7cTGUemhpxR+&8c!aV zhMp8TizX72VDAP`Mpj0K1aFxViiopH!i({<1BS6mW1Ki#&c2tA2VA|p?$A4Un6xae zzuzT$khnHx{!Ht%(2Iq%SV;hRR3XD&_W&e@agt%(8%$mvcgUM$UXGM(TS_f~64f6T z!IdAH%(X`R+4XJ)uzM}f>hPS5GXTY75C2cX9E1NuHV{Sh3 z_jV}r)$?XANWJFF)v3LMvdpoMQoZ40J{01Q=Xk{nkkqh;u18m3Dm=X0NM8ZL85yr> z%m>1-rR9|8E)4fx8VGJOuv;=uqnEq-y4$9*e!rt##q`Bu>5;tEkr{SaJJ)|&z5K|h z(B=~MLb)^>_zAOkTm{yk1DYONa$Ha;tlvUYiQz`buqsy*cGbYaEg`sfo00J2F1r3a$ zjp6GF0+9bkl9KU0fCMgp+5#K9`Q?Wgl=8iWMp{zGs9z*V3rb!U~ihK;J<(0pPZhGCot&GUy(BE?i{W4O;bD1!NNQJ=IfnT zT3}^Qyuq|U7Wqbi3TI0_RgOt=;>c=xdYXQ8e|NWYI9p0lR~M w$d}=-%NuTS#c z6sc_4F4uu9>?P71Xb>h**N4;^jLK!AOH;4@f>q0E@`ebsQun4^T#l!Q)fxvM+~0t4 z&+kuSAiXoY(s+}opw9E6i{AaE!aEI=`fNjwm9gnf3lRpg8RoRN*dZs;e2&`>xk}b%3k9U*5Hv%^iw2TGt-V&CST4jjRlDaGsIV6rXN;YUzGHqLjD!p9s@P?*N?8hyVC03uOYU&o-)R5LJxUpFBQKoraZGrq$pb0X;6+VC_ityDA1-)(rj*gCq zu8G4I7Ic5)gdQ{E(g=qD=Zz{Dhg!nbRZz7=w|J9275ErDN$)?5zJR87&wP4B)O|UA z78SieYTt5r_6v$Zh+XgQ?!vks_liJs-ggLA4i4PA+Z#Q|M_kg_tkeJmSOaONzqCAl z7ZaOYle0G)vU*(|_!nS`%c)`4FRyognX39da=2wNxOippB&%<&tJS~WZhWNb9jSg) z@-P#rFwGWH>$T%0Cd2zK)*q2%-xOeb#ezt{>R=hM8@m4cvmf{YT6Tf2MdmjSAMVFq z(X260g`-i;od)sZS?+j?;GVUSp@|Cn%#7n^bwwcOMCVE#&J(% z+h%Q=i)+z;=jWsQ)Vh%@Mw&{XmuYMJ?;e}%r7okXi{l-f>`uPc9!-|lK<7j2{m9+A zmeU8$%s!9E0I#@ymOY{ zp=|ZCkjmd=QuvS|?##4!oYH<{2s~adY}FvY=sUW8gm1bj{q6OX-h+D&5N{dctgpwl z-~S%!N{e)T>rN%-aJqO5S1GmapNaR^A}{Cu;cIh6QkI^A%U8Ia{-CB$Yrsp#jr{j1 zySC!TA5pa>G zR1h$R(<-E_&E9M8d#^0w&3?I8YHBL9INCw=-a|-8C?|I-A_B|d{A9VPk=j4(?|lSe zGVs0ibW+zpP-V9L&6@DP#E-eB(esYG>XRWKh=#-rC-?Z^Xjk@98Pa({F^ zGjqPd-+UQqdxtoexm5Z&x|C$%9oc+`*uPkflefJ(F)O_l!FtBc$j?s-zq>s@oY1n7 zw0L4(OBY#Nqj@m^02bhLB-o||h1EasIO9SVMl@TB%#-3&wKJG>NOMt7deqsuZfO>Sx@)Y2sIzH@X!TvzdBYiQrR9B*OBG`u>Qq?uC(5j1 zek<9DwrV@av0vrSYFpp;uu=>gPSQGy%?iWKQGr5>xmp`=&~v>ab12A?o+k z)I(rb+#p>xGCpsb##LGw`h>p2c3e?1;Xyp_+e@b1&CQUT8;_kloi!=NKf(|8Hy;Iv z(d98U6^Rv&o4-#JCKneMS70Vmud${k;n0mJ)~fN#VzxeWdj0yr3+KI}$&%~y{n4nX zC_vzey?>8o)Lg9qGU`@uc@0n`G8Oaz{e^~w6(Et>0wSfQ=bTu+z9mZ=iJ|J{AJM^R z%ury)!^0EX5%oXAKAiZ=Z|2O!lixcrL4uEu&;0CJ8{n)C76%>nlHff(Z{3#K0_V77 z8vNpRlVxSRTXOnEtdDlfcu3N%+>Nf0+&bW-pV@4yJ16aj3N=LzeU14mxy0+sJYk3l z(&m=F*@w-q`_0D4nx8Tg+{r|T-jJYN)?M7TbD^TBJBMVH%`feoerWc5$ZujC(Okv= zaq`&g&zwWhkNsPsSsPBIp&^?efjcy6!zVZt(KjiFb6ol5w-PLtpH{42@UV{Myoj!7 ze94YgB4YLs>S%&pKf$z}x^d-&D$kC(lAl{(>9#PXdq|K1_wX1 zUT6qy55{R5(DhcUU^gdLqSXGq!|3ATk^#up*=noy<<9V><>fYXZg*B@=C>u@YQMBI z8ygz#F*5&$ly^JKT0^8nMEctk#b_>8jMcZEEV?O*8IG2VExsMMJf?86ofn&_FLrV$hI-yp*=wIZNZJyL=P9EyMH2z2YYh=*oyK0ykm{zmA01K_%HN7N2U&eQbN;B z1b3NjeZa%~oW#z?#?Q&LOa!1}~xYVz&6wL)J>MKnePrn;X+Jd1j)c zFTcQP*oa<8Fgx(phtCfVMmsgsre9lDb5y|{8*1S@4i~jFep?5`?np}|Etrp6c7zmD zcdQgktw`qg$CDan^)ZQGu_?%qzDVA}43yZDhuhi5_7TVQ5gUh+Sit`*ka&4{Ih@Mt zrR++9|LylDD6bipp8cq2-kH!y);TOgZbTh{`d2#5n_zM&57caX@>8Q?J~jVVhhrU*b^dJ=*HI%2jA$Bo%aBoDn<6ulXItD5;_cqSU zU4;wmv>tc<`%7(i9T9~fFcZwtLIUzv4-4W9FL{4Tnwvj+oY1#To7d3q`L%BiL@ZTd zLl>8q!$k^VuNn3RzpDzSkX(1?zWe<=UDjb`6k5L)PMs02_JjL+gE^(N%I@k(JP%6H6mLKGa|lO+an#a+&ZcXRM; zND1++->koiFtq~ti! z`*^*5YnM_GzuJ+1*UK^j?)@nO!&b$v%l@11uQMlz48KW}56vchKceKrk6OgWC*6@r zOJ9-zVpD3Pn&NRJwrASYb5E*`T1#Qu30+#pR2pWGZvQcFMmF|MZ3!C z7~`jST}y28rR|ZtyVl6K&cxGPWcO*&@rjqn8HTrgf5*7x!;Vn=nt&ag@i^~djd9_| z#pF`z;^}Anu%q&&4~jGTEVVfbe=g?{F>AEwo@rdnEh?SlC!2rlUGSIIUD(wKRYOQ0 zgdLV2r`M_vCnY#cbE#8OQcg{AYN*-mh(ay96(?jxWl~X7QgO+a9r;YF4kj)6OePhX zqOacl`N-Y#k^AGPPf6dIEDfyl#B9FGznDA{ZaL3ZnkXve1{c>?PQShY z7BEW)`yhPb%9dLDB4DBBEZxBye%27qNhBZZ`LtU65XA?yX_@7XzBZx)>Exe-hg&0r zBQBG?)AlPz=3wg-X{d12?sO32#LJ9X`b8?ZP~aGo?D8cfwi5U|^ZZLzugh?c?$$ny9F#rkzLOrP+9O zZ{!mDFP22M$4wBYNG+wXjwBiF9Cp3MRfdjQ?&-$Aixz@)tdU$tmP%>?f?}Oh;iRG0 zM=X%*0CiE{4t%lhJnPk_{^4_%5$~4q1st2Ztw0oC!;fRDywlMU$yBUpL@T?Zjf>_s z59P0LzY;xJ(RFAqo^eb<&=1!6--JD>KWrPxfHrz9Q!Ibv53c?CPA%c=VD$SN^_%9Fa(gh-kuKxe@p1Naca*yDBqw3%lwXuh3br8(fBm(5QFHyforP%U zly$=%(g|lHo$2@>D{{V1c40vQgJcY`XgSCx5Jbhq*C_b|_lzPu=NHL4JyLl!eAUR> z!0aVrvd1s|t@EXZavcke%djDK;vCzpA((5R{Lp^?o&Ht9{_u=S)NRwQYXv@qO*mKZ zr`mKc?CXi!IMhVDg>MzFHY*V_Tlbs$F#Sp6Cf-c$Cr(RE)Ro0=4}fVFSG;tY%h-H4 zO%38$#M&|fl|!vyB6}Msz$jD=U!VyZi}X_yFv};W7FF5oif&zRO>(Z6Vr3r6PR5WD z`y(}!+GyPzkN-m@WS-&+#}u2n&2eb0*0|p)AE)){RD85<^kgv!9-6gTUF<&{o@<(~ zhv`2jSiY#IkD%9389I0;%)rrv;d-djc&+IA^Uqew$mduRJ)3gsCeBV$nX0ac%xShl zic9v_42l(Oa;+OY)44Nd>|b@Mhvl9>z}b&9@R)i|JO3ei@gusZ{Y#4Fh18F$#3HTr zQRACKnaEIvk%@d|aZ^`Hq)l{c=2X`p;>046$L!HAV?ozWGYT?vyM8UCyZj_dxO3Nk?hLhnueVDnM+(Nh z895(KYUueky*z7Vl8jg|+Mw1j7c^|znI#t@<6|I$M&}O@Ial4JXI7Zd=DaK3N9pxC ztugb3UrTb#D*0R)ouBeJ@o?glYmaOm?$v3RbY4?X6ZKCBxcdfaZN@?;&Kk#oKPTPZ zVlc3pXVZLhZec4?_aK%yhkYljxMmBjSC23>L#Q4;E)znP35OlP5sBZvNt%(IBv-#b z>{qVr;&*&vMP5(yDl7NtdkqbZgX3d=9khnw^IV=`Bn5hmqJ%yee{p|A?QsR z7vI!9GG$TSb#e7`K5BV)jGyzmm|MB|$mZ{__gzficn)HB#lO-OX?WP?Gow)HKu}{8 zTbJVjy!ZNSirgG5)+ap~`j%diTVZGJbu0y5T7FIi^e)_2DwWa~#NNlU5^3gmkTH^Z zU=bFGCQkZO_+9HB`uq89VrY4JNBmwv4Irh$jLC4iQ%TZ+&d#cTMA~hw&J@2-!bDpic z?<|u+2WOW9>UhjSS#Y8_WF_EvAv)+Erg(iaS3;RJ9`^EQGOu#OeI3A49q)+_)jB>y z{gm~q;bHo=U;K8`#iJeUKna84iTFKrDj`KF`;?N$r2STG8vm}?wxX?@%Gea~Ca6 zLz9Vu?cY8L@_KqscO{?Lwp;JCj7D?y7t$kSr)02mL_?g*`J8W;v@JOiXAuzMm%oU0 zp0$4x`2$>RcHbhOf|E=Af}Qxfv+1`3mJw}a#exs*=f!KbBvp{!a$j4R?b$iy5}4=i zMu>#T5e4GuBOGf>U?|Fx=vQZ+PUsugThty38*fmvrBn1^%O;ObS+HNfK~eWSgq)Qs zmal5^IO+g3%R7$vYO68Mbt-kI;u1Q-f#pFU|-GPqq|7oWt5M%&LWr2cHbD?TvBhvULi z#ILIz+7moK2*O0PwWE+Eg-*OI(Dy}@iA{!HK5WD=QN+}KCx8TP3T~>*)!nc_i%Uy& zXp{nIo19oE2vT}BgsXw20_4MlBRI4hsWVl>mgeSy1l^u1aU0*Uku?h8wuK=?7h6Vb8|ofY z#HQbsC^qpXc={W)=sxYk;as9;gM4!+qoe=>}dWDAcRZp zx-I?k#LWYy&xMOh0qj6q6F7~ayLb7C8Edq5g>XPS?~QMpg^XZG!8}#Esva8U>|Fee zEKTu2#Cp}XlSC`)e#GJHZli<82i*R-7d>H)z<)J2B}jgf`~L0m@$t&7=u}N+>x9Rv zLA7m>&!7JNsLic>FUb%)oV2!6F^gOwf6PtVidWMNmv$Evd2@%ZRO$k^dmR*@A9I9P z(#OGvn*Ru&o%%&f-!OM->c1UY!9z#e{kMX(&Ob&*Xccxgfc?as{t?q13o`}8FAl8f z`Tjlbk!$n=uMcnceG6a&J=*8RwN%9}7OlwlCNMw?;oj-nW;(HnxIV)^m@NLWEEQ`V zcGrn*l;a(e&CKFA%Fr1#c*Ul#@nb{>6oye*gE-e_qWUEmo zV-W$;8iBxycHV}*1ovo4|3e}t+|6*%U~dJT9{^k4Kh#)Tb{A95QnEEcj8n;mLi*DQ zwH9#X8jpo`!MoolII`9cA?9M!G>sBV1Nis04iUzJZR8g3ZKX+7rNI?UrIOLHV+Vwd zsbTDtj{E83`FHvW9bIZB|9CAV{f&CDUp8CzJWP5YBxC4YOv23)u^wgv+Q3k&*)s4) z?lOt_Giz~G2l72bE~Ap8D9ONt&b~t~?H3L$GDh)!19E`{R!^FGtS;=RMUtLRp<4xt z6%2l;EPv=GuYsE|gRT)T!K(0Yet&Tx_9{Q(O{+s+BlsB>T~Gg{2iHpER;7*>J>6Zl z+sar!q+vU{UU63pFDMdjd%E~#;K(gl!3CPQue-X$AV+(jIV9w|E;=FFt$wy)fl^*7 zxQ>9;h>_Ansa^@@ZvcomXE_hKtimHUqTYS;b3-pB_u@yOLm4uTG=49J@9j0a(suBV z@C{K7yl07u&qQ0_W#$6~H1aIC&HHeJxo2?ALk5m`IyvYCK%A>$4llrfFVvMQ8tLQ` z4C%hxc6wf+GkQ+@{AS2QDWCsI_vlQ2mnEzVrGI38sDCZkShp?zXBQGzMpCtpr%dJHEys3_TCLIOfXrTpEtuYDGAugt>f zT)w7t?iaLSj`)Y;D*F9OmoT%(5VlacB#&|8F2`L^R^Pe*L%>!qA2&PX_PhLX+B zTwg}8><8kG#4r|il2xL(^{gCxM8-&8TDU(N`b3Pb82g#)Nf z#)$RjJ>#?Lb}a^Q_~M)LH(qXwY=-G)595o|pPJ}sJ_(_NpIs6dh#8e9ypd7kr?nNlg!qgqQX*;P%zBqlE%Y5$yWk0` z>^}R`+2 zv<8RK?OUzKk(hF%Cd~2E)+-^V$%KI0^%_5rc4h{JgoSZmuA%(aSux{h zk2u~JI(am7@ykwR6zOk$+PdFgzk6tn5bp{%wE6gLm=4!$H|#BP42+Ic?1|3~^7VOi z{qfs^nzadK-YySfXwlThe>AvB!~SZB--4ZLzN#zp*HaZ36iPaf@`-7^aQEb7YZRZD zI1q7to^pbtQ*Cjxx3X*w$=f`lqC7We;(}Ixet#*r2VN|wj}A9eI?CZ=ySjh&wSuV| z*5h3jN5)SO6^VRs0$%(FJ|a7?0**DRsHm7I;`zd`X~z0U$TtP^zbu60OiQY!CwvCC z8<$2Qz}?mMT-r=~P9(Y1HvCdCG}wvVTQeqdHT^7_N9`sela&PqJ=&T7o&4*UpJq;w ze=0WBt`$Ae3;$fRshOGOnUZeCRmnQz**_et64KHb42+Ciu16m|nszOeB)6aXoK!q? zZcx!>^$k&7{Ogdr5ndH7{7{&Uf zGKD8jJb@^OXbbco7k$Ll>8bhJ)mdZS8G66G)wy}+oWaY3W|pnIU#jiH3#d_Ne5Dl? z{+h*Y-h(;%|9q_TzNjS5qgY}w+11C9YeXw#tBPeRL;4-(dUsc(%n*?zJ-?nGiEb0q zWobfeEX>>6TS=}Trr>zC81-B(DoUYH#nz!TFuRd$XLt8tHuj~(v%VjnRLaA`Ixsg* zRprdJn!y>AmE+&_c?p%9L^d{3gQi~E)W@vSL}8MW`u?)k2-~MXGv&?U`MK1aH*c~_ z>ILbM-n;x#Z}xiWxjn(g);e0VFIff0+ny}>$+i@nGg1|ROLA02A$B@YQKP6+9E7cd zT_t`0r&;{KJh5wjVN}h9ukYY9T-PP}+ICJR^+j9P1dg}%i^z@@I5Onn;c-xT@|21y zbtp&8<}2~XXiV}KMeojz?Ct5|{=~$`8=o|s(z1~`gB}d@u|z1}KHwC*iA?@yzUuHt zJW?9nmo2ccnJU~blx^|;kzndWp5oIa-hx8$@x06ry}mQ5cY)dNBAR!@NZD)%kbwsf zvegZ~ym3{3G)`ZB0B25HqBval^lOXHihQ=WPg>JQNg#%sz+|os`=wFct*|fk|G7ry zD1X7s`GB5RsQ*fB#V(jtSxqJDO)-Q`fue({Z)D+5@$D(asLQI^yA?g$REN*Y5rRzn z+85-7jB4$FGy;Igz-U^kuk^4Yvetb~t@7aLrJ%vTojBQ~P-=4WchM<$VM;&co(tGt z+(sU|d`StcxUMPj)kLT4MKup3`1cG&*xLq$f>&58oGbGu2Q-$b-()Nyujf)t!UIP% z5|621B9}$^8wNn6#TAWj$%?q{ zO#-JGw%48;7PvX;8w81KnMDN>TX7#=zj?D97p-QnKO?!4d`0&4ktnX!Z1wXQ&w7_b z!xyZq5mDjc?Wgc%MRvA;#ztgi3=~sMY|1b{6ALb3ZJpSJxZo9j+BWgkouL@3hp`py zhbg$=#fP|RYQQe-L0Mv>=6OUIQ?o)D+L|HT&7F+w>^KGn1}A_3!oH>9;pQHyw$gfg zbo}=(cArEV@{gv8nL#0-;d>FjgdU|?Og1j&F{w}R&kGMc+=KBRTA6`F5)aSkr;s}?U0{z{k zijh433*NY8?(GY*7$Q)d20wFW)H{~1-r&O32r5M=D=XjE zSxFRjs>vVPP0kQ&SoHA$En()Qgbs2nbD< zlfwZ|um%^0oDwDDs>_CHa!gsdWqO+Y-f!_<5oT&SJUpDLG$Rxi7UtA%fq?Xj0hooy z_^(ez1rN~1%F8FcAO=511}ZaKeQx57Pl=Y^vNRKvE+3U&kbWZ!H3*sg044I!I9ng7 zAC5nqy`mnPCLilys%>^epF0Z}dTdX~rYdF;miGKX3^9DYLt(Py7g|~I810j&j%*Rn zzveKh*RK_fx+0bW_olDOq3~+ z-$iIf4`sZn5s{_vwnEb&uehlQ4rVGSC^)#VWAE*g9v&IbIje2>!v}JVV$;*3opxso z2Gd^Fx*Rf$nLpR8whRUN=)$f?z|Vu6oSY88GUOr5lkd9F;Ce6c8nz#LEAT=vb24UF z3%U>p`K|*KpfpF6n^yYGQ@Dy4*#lpPPf(A-Kj>l^j`-f?+8-tc=wcY1u2MiK zL`d-wz_>5ejKitxoAM{G{{NIfgXcUZ?YWjAm-h*A?Sv@`KWWiW5_i*|b?jMcI1yJw zNJs{+)wa_<#ZfRq&b}%prGlGxV|-!75SJPTc{ChiTHj4&wz^y#(62YlxX-ESd0BB? zKOZ-DadpkK(xTO_`;0(++1Ow|oJ{cJr6cQcXeQ~&gPtp5+;R7>~%UYG4jK3a@9f5ww_*Zt<`+zB1Hbl}wh322=JI|rZ1+ej-K~&_&Mp1@mK%+IZ@t*W#GWbzw#a&Smiun^{JDzD zQRM?Uxq*h9M(2IqXMB7lyt1$Im9z3f$is{C^2F@yxR#@6#CMin2{>}o5QIKhSXekX zJZ#;YuU}eP@&)ERk?WoJgQBBx8yXww zW8d2T`zUOPODi!q%*YICHAtew-GM3`3eUb}m{F9Kl}*(t!nPuM?w?-klZ9!Brs_NMcpe zfh{d!_bH>7M{DY!CRw%hd{{@vYb+`Oyzzo(O|s_nz`+K&KBcC^3}55pmkhcXFDegT z{gk5~D)XoHmeq$IKYk1(GILJ4O%IaD$(iG&hcjPE)z;Om^ybLq6%tS=?i?h z`%z5EZ@tL;0vJ0suU0iDzbiK;9*2|y>u+pdrE}y z^=l#@^+}5_vct!Zj}X&c*e52G{E0Uy2+I{zw^lzC2X%F_-L0)qFh8{dy)Pfp0rO+@ z3b+>~Veq+sN($xN+??&+ly31p{}f7p^^XOLzn0F}{35@)oz!k^Z<#fbYHzo_TpXz_ z{+&X3ge{r7+wY(ML;z(I=gleSjOH0E10X#J1DD$I9gA{60s+ZVYpxzSj2+NG3pYy= z4Rs$Bi5zF=}SzGiG;-r z`!m)6sqG1pDwB|Pit~?`;*8Ot`bi7uNK*yF68I) zsz#U2A^7v>j{wk&{?cv4sB0iVl45E&-mAZWJHwYEok=qTr!Z^0LIWcs`)lXB2W)kQ zP*K3_yL2*iMl|`)Ol1w*XY2FL?U%DU0D^WZ;mTXPUyg~L>@P%%rg{q#O-xr%_p^rSq?(S9D?PhoZ?UENe5pIsY#>q|{eB zxKvtWCu-1-qz3MSSx{KF-Y1(2)Rpz`WcZV1 zgTq)7xr+HoXr6X?OL*EIt-fnO49s3^ex>5MVX?iI;P!ELEmO%aYHMTs5a3kQvdc>O zRpe>c-K|JCk|Mf%>9S0~OqhIf0Ejnnw?r`wy$ z%E(A;2_aSeCHxjOvj!;!ZtgF-b)O&K=L~`DTRN~(adB~(!kb=dRvA7x2h!;aAe6lK zXaocWGd-`*N~@{@#puLf_oJy|{=XK=2SO|_`(Efn>|Aet!|5q4Wa(}=dg8n;oKfK>CoEO0k zT8U~-=z|kS^E-`p5lDUX7Br-4RY~8#N84)TV0jqyz%k1}uZOk%e5CRvfYOmZrgZ~i zg6~f}7jHL`Bj)XWB+#HR!B2ud<|uP)r8lW7CI(%dY-OKzXFY9-KYFFMIDKgBdCNN< zJ)<$@LR1yu{yl8>wmSX-$;bH+1f7eV1F7!Dz zadvh##j6?;N+0iy<8Ans){=q+#7>P1E8y)P%wcT}f7%a|<m zD6lkr=J^#I<%SK}y4>Aye*AZRpB%gX6xsIn!g)@D%?%~d%6F#m=EFn}p~J^U>0$n+f|4LEMiks3?W#H|jBe+HuS@jK|)Fo%OxesiXZ} zRYD8hm{@13m!bH;`kFd)u4!u5j%fxiZ89}K&UMIt;>F1APPS%OquXW%N|kp(LfMa0}D@y?s%2KHq&LE2Y?18(&(LUgu=*+%11c5rUzCk}!zR zqN*^i@{CG%3fWq2oTRGRdj5s^{BK9Hxu2AlmX@WTj*WX47HEugao&9X%ngbpbZhN2 zU+)P$JHCac3t2_;L)QqO|$>`2wC-yxcrIiV6xo>0USZqEwWdAlOmXmZSP6H{})Fg1z_?Qh!MLCr`S5*?4OIR zm-}Y@(ht&2qcF|cWqUTVFb4}fJ(qi}w}1Kmt)cxrS=6My4-fK({4%%$2vLIS8VZHurnA*-)|h(Y@EG$Sska>Q?AK^oYF=nzS^7ps{$DYh=@=N0 zl3CQ1LPJBbUrb3jMPD8^(*%LpsuuC#)BKSx8@DwQMD^P#_yBf{8d;H0g9K&`0O2c~ zq!_9ygm`YxOm+Zrlp?Q~XzcUeoM71Ls8C3fL3;dci(%l8J^S2##GIM^EdO%^>2&mZ zR2kPo^5v8HtQ?lC>})~3w)S?jD$PKflL(ok{@`%Z(E$m1KFg_==`aw4d?F^kXnWf? zqzzEqEx#M#%CnQUnJNqH+-6|7-=#j}&v+h@VCMTh-04* zyXmb2txP;?ru+FGHYmtOCE|eRbcSPVXP}wQE87la#?Oc=nBTc-kn@}seh^p5d7WeL zUWAp7gNutxL`-Y|hQ@v1tgWqG3WgP{ZbPCF2@%n2*b@xSd!7O9ffv2atN-X+{~si+ z!U+!VDP$>Uy@q%1#><>;wPtVis4X@`_0B*PmnQV$Nn~!L@T{$<+x#x+eACl|t-cBe z9iP)<_{^ECZ^zwbsr-Y)1MSw^spmD*gZ*}dnzKz$?~mw?8nN0*Dl)o^Y_ZW?wVQ$z zdUtFDUj&t315Bs~p~!@G(Yo`5iW1!FmVola=GWgk|5kx>@dQ0m_hd6B`OlZO{lN*! z+PBpf|9vx2Ng3BWH2DrH{KHx4U z5fuT{t(2n3&{yf438#w8*-k?0&z}E73(#$nKpQR4kkC*3JuNM*^5@T=tw>*A4v?(k z?0@3_Ss3Zp0q1>t!}dV_kjV%fQ9tl(&uBe3(P^bk;I8SFJd#-SjL}i$k3)}XC9lcG zv)tpw>XcNIyrFS(glWbc92XjOQ@py!kPIiOb>638i+x+!btL@q<<>8q`mCZNEWa6` zku^^}kBC6|a$)gm`Oc#&z0wCAn*czf0DYz?61*o5;GWtMfbb}U2{*>tTFw=wc0e)d zpU+ln?_b;#Vb8s^#5Oq-4J$9_-s7maQ*8QTO*X&xGw6(;>35(+vAm_4js~b(Q&Qet zYyEP5+coF`I41PyHa@uff)MtE3?z*Ff9V-Y$~#vKI>b&ZwaqtD8M-WD0ed>*h1cHB zP>*u_w;lkI0j=!x9@Ck3MJvf`r1RgRRdePjU-zccf6*qdd<2--kQD;*dCiasz~ob} z;AzF1zmeencw#O@n-7_g-g8QO8Q_DwNj!4$P{4Ss0LQ^%-leJ-{uxSwdd(oA)6GhdTeDTP$?TxHiKmP=>}?p~zTTxh-ap-hg+ zE;&Ge(#U4uGQ97u;j%Py{M{nyBElt;aA0(D04hz+)ZAvHtY}_dL{eUL&8cKC=Y9RG zKos~7&)2)VZu?c=x7&s1=`* z5;I>p%qY%V>WvZ>xqkFNqoNk#xB=v&qk`X+mT+d9^)sgf7@ABmS<}AnabQ9=Hn0p!L(j)g98JXKn|(wbDMZi5lJ3B8 z6i_CuqpQmhun2RJ4^4@%23y|u=Nd{cVM1eZ?zKdUHF&Myw#bOt0&Mq{ok$xEJHy_r z1se0GY44%cX=|p`41AYWA`v~nB14}ui}-|yxu6UJQ($B>b$Vbksyu8J^sg00pP-Pl z_9SGk;|1ykN)55~bn@wEdL>Y(f*YI=(yTHM1O*0vIgQVqu`RaSJ0rS6A|ift%c6CH zl=oWptxmASfpE{x&W`M*`J<~yGF*NRS^)eHRZ{Q~p$twKDy!wk0J0z=SQ?9hbaiM9 z)2O}$ERy)t)REx+ig(e4%zjZ05Lnjo3>lgsTPCbf4XEnUD8)@o&Z~Bd8RKQdA66kK z4-eM|okw@NDD_enQH%YQXLH%FZuWX!Wxic5!6mrccz)~TL3(R1^)M=~Z%y6x;OH5J zkI`-bRan-6Y?}&J%IY1U5n&X?nN0F&_lUhj<`AfWS6QNgZf4HWa_oY@rvEeeYPLEv zBr*~OYIuGu`@+0m^S;XayLa#23U~$)8YuR~&z&EAPE1kARAvzPxT6W((!UCR?naeN z?rmT#0{Y>>f$jSgK5P&tgVhv*k|G2XPGb?eO5Leb4qxKpC{I&ojwwGi8;zLGRJ@{# z>5s7cWNe&O=JXsL2d4`p&`kf~kG$FgN%D&;EB>GQ;_U*>jD|L9OoGKKG@m@WT^C;- z)Vt~H>!bXJ3$k6GOxLVb9O!{19WiZ^f(PvRd=&K;`AeR;#enZ{Z;m{g!`={=dyElC z_cQG`24sIdz`I_bwqe#0dILqdpsTK3dcV# zj_}#DXZKze0CkIz^tb6gpCJ#O(31O<86}m`o~2uG-4Vy;gLc*>HkuTd#k|DI9Na-re}FM|!)tx#=vV z;CY|j1eF?K-hn!F_hIiXK##5}B6HmPjj>A^2$o=*RKH}wR~w{ zjVG_DC?GqI@G6R|2E`}Zzef=AsTVBPBXM$C$;sifl`o>CRC@L;ufPx^kObYx&MY6B zU+atfM@wSLJokmcA@BKPO4wtLRT1Z{5fttuEbgSg`o7kA2Wu&W`(MRaNsJESf2T)g zR@q=*7Q0$S26m)(z>^Or+X609!gQ3CiHJ!^-rQ}7-nII`kQJ0W{^kn(?|>P@{{t{H zrND>Ew7R-&_XcFRE&uq_(e!PH(h%O{IVQB<@ak@b_O1o&AcK_2xjOrY=2aBFzP?c6 zVJ?6Y7vv#9qFpz-Aza3y$*-2>mu>nlCJUkGc-~6x zVmlDslP5ujS_(ir91s(M!Iq<1c?jl%)0LIx4RKT$w zD=&bS6BlUU0O8EY%S-g%ID5;Wx`M7t7>D3a2p%LzaEIXT?oM!*;O@cQ-QC^YgS)%C zJIvvEzISTstNAsRqUu7pmvj1b@7`n7<$)L09>$V5Z@I z3F8D$hPSb);tTb!z8mj!Jo`r5aF>$+?#M67ppaBuzI?XNACnA5JHe8r;Q)EJi@$3} z-=|Mc{zR+|t22(M0VC52KG@4egbu|^8Sfh-!M*|+^9#fy#Zyk0@MvpRF`T12;A@A`TqaM99pH0c_Yd zPELbBl-DyihXctnWi}?K{ecwI^WBPHI?`&*(xH_&7=TQy1MBT>#fyuolS~Nt^22v= z0AZY4QUVLimBXoAXuuP|2GB29tTsh26#wOUy#yyorf}e#wHq?{w}>RA!obQ)9rF+U z704UhQx1&m#TgWMhvDRY9WyXIy9b34eNhz7yvRy(#*S-?x|w<`Q|bk5ZDL^&5rth{ zIRw9>EZ3R(0XYwVWo>uF0b8IvhCmWoU`RyIGrO})3N8(ey{?rWYfNYqob|aOt5w7J zru2dTMp);(@n zU*qMq1^Ce-r}Hxt*7snb376U?z&KLht(OVcM8^oHr0DO^4f z9b570t&-_kSSlGOk?d&}{89CMI<#oDP4Gy>h`I=L)LO?_FeUIMU@`EO)NYL-<;sf!1 zUDY%&GR_4uU?3y_%7K2%EviEt`S7}#kN#;x0zIIE6X3hS^Ir;c=t6R$1@-&UjOO{kZw+h<*7S~>vFwI?Uhq5P z=x=61WvbP_lt4z;N<$flR9m`Eb?~o$W+wLj>dHrd886QBC<24({#a@Ow^Qo>i?GIS zOp@W9#ax7n`uaKZ5u_3clkIK~fdCJJNWcNZ=?2}@L|4zAQt-JX;>E)gs5Nrh%EGYS z6pOP;;W@!RRKoA8AJCznPUtq#2k~Z<>kp0N_OEL@cw7xOy_Xeo?cj+ z2=b7Tkx5Cnv@%n-;J#dfG?i{SO|5;u_;`=R()rvdb^0C`&~!i5h{!MrL2VIH{{i__ zybwwMPcIfFKf!yrW#{4j$FVBsN4e!kWkmfaaQ`rKc6FUj3H4y=1E9naAdF*u#0&jG zm&x#)SYRWc?)6_4YX<-NWAD#U!l|NnC^z3we#BZAy| zMr#oOx+QA?OKR(EIv?%<9|&Xye%~z$t&J6Q8Ozq;LQ{QfzGi?D`{YeAy+B17gHCuy zJK&66lEoO0b#RNmesJ91@oj%BR98k~alQX3tpG9ksnrt4&GO^~;$WSxe*}E00R#5K z(jrdwPj0ByxRlXa*;GadG??E1O(^*EZSdcVy_UlUcbc}rTp71!f$H{1f0HjpPwdSH z((&Otj;eAUW%nC^Rs$H`WXXYg|GRo$7YyBsdvFjiCu-<1u~Fbo6mC$Oz;(^sC-`Me zf?AwBC`Ab7TQ_p<1In9!Z6P;lypfSy{Q&-1L%oo^k3ms&03+aw*$}8n6C_J+aILNe zufF�}pIWdSjbfH|U|JIn3OI4BIUYA+OhMDZz2V0>b(g9t5a(s;`U%T45n&YH|PK z-?kL<(Q*6FWnlH4FV|B6{5D~c zRM1<+yvxLps`qv4c|B`7bmQ8q^siLbbTW6qu@M-^PYUD+BG}8GUat}d2!b@!<>s~W z*Zl46h(||9ho8?lIe?v2=0tP-haR6=*&3JpOY&I>1r?Qml~u)hWkP(s?Ex%m!Q6$> zl+;Ry!GE}lmZiVRE-r^QXW{$wG&T!fH(YQozmFbyhyjS?-M4Wa^{9c{aMudBtAcoJ zp1?gmKkLioTwOpyLxY0=nS6Z%Lbn7~oz+ICm9S|{)Qy>6*$c+yq)Klk5r3z%4yBPq^ae#6?G)A9|rR|Z(=l97w z58B^5g1Xxct#Z301J(;~rD}Cgj@GVYuFBj-F=btzm|xWs7>HvpCa=dkRcPOa)gl;m zYQp$$t^Z(RneC69ex09~_L&oD?BKwxkU+s-rM9oIp(Q=_=>#w zsgwQOkwIn(d?oVR>GXc=Tn0adA#`8y0lbNY{D66mEj|_u@U6E!C&)i0n}LE^l8wdC z`8G29Xz~27FSJ0#9}K9hm@LfKuCxFC=$BMDz@h#)L-^-7yJ&rWSEI1Ebde&z0svmx zF2~m z>U9!zHNpAwMvzfX8qD{@)Ocq=S&{3>PW(RV1P8GB7xwhYtrq7 zf03kq)X^_9aorPzyHCmC!J9Z6U1LvvIc4ODc)@+QZBxci>IHO9b*Ehj64+| zHL~j)z<;LvSuQ&h33>$soyCS3)z=?tk)0JA0AE2*LHjAf`Uw$3hX6!?%|A_GxjA^Y zu3s2WO@j~0PPm{Yhm(s>PlZgl2lFlpSV%hD?YGlW|Mu&{ugm8yu!PcgE}1h10seE7 zr$}8&@m*&s#fnk!jFH4miUT{ql>qz(l#ZGq&FKm=69MyOG68fZJH0w9fm<49XEa^y z{ny2S{w2u%`XW)ocTT4rZu50__Z#5mfTqDIuh#{K`=!*#yL`}2=F0Nw&-JUp`0fBD z724TcHa~E`=EgjU-Z5A##do7U+-c>wPEc`e$UoL8e1ITR zWHRV_P*bk++mp79W#IJRZ(~-o8~`+H$|FXHaw<|{G=3~wA*~Y#0qQ6{YX&7E*{`MT z(t(x4_!Dc*^9o0^KM&zH6PTGc$NIy$<9TXa>c3~!99A#y6+@#l_*LQ z2avm;C=hsfS!Ri}!j|PG$E08TPvffq=qVX0zlkWWJ=9L>`yX;aI<`NtR)MM~#MBAE zokZxcfZVR$LV`gd#jJo2U@Mc2M_`lb@dst4iZLFR_aafDiZw}XEAE7_Q#;B9D>B*Wk$#

K3*Fv^;}X?{%ocg-Mb-We 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 Date: Fri, 12 Jan 2018 11:02:46 -0200 Subject: [PATCH 35/55] Merge pull request #34312 from AutomaticFrenzy/patch/canister-grammar Fix description of relabelled canisters --- code/modules/atmospherics/machinery/portable/canister.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index b14c17d875..13bef3ba1b 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -84,7 +84,7 @@ gas_type = /datum/gas/plasma /obj/machinery/portable_atmospherics/canister/bz - name = "BZ canister" + name = "\improper BZ canister" desc = "BZ, a powerful hallucinogenic nerve agent." icon_state = "purple" gas_type = /datum/gas/bz @@ -383,7 +383,7 @@ if(newtype) var/obj/machinery/portable_atmospherics/canister/replacement = newtype name = initial(replacement.name) - desc = initial(replacement.name) + desc = initial(replacement.desc) icon_state = initial(replacement.icon_state) if("restricted") restricted = !restricted From ab76f05a1e2ef294604d4fa6ae62a0526cbb004b Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 12 Jan 2018 11:04:16 -0200 Subject: [PATCH 37/55] Merge pull request #34305 from AutomaticFrenzy/patch/debug-mapping Add JMP buttons to mapping debug verbs --- code/modules/admin/verbs/atmosdebug.dm | 10 +++++----- code/modules/admin/verbs/mapping.dm | 14 +++++++------- 2 files changed, 12 insertions(+), 12 deletions(-) diff --git a/code/modules/admin/verbs/atmosdebug.dm b/code/modules/admin/verbs/atmosdebug.dm index 8c564551ba..1f14934065 100644 --- a/code/modules/admin/verbs/atmosdebug.dm +++ b/code/modules/admin/verbs/atmosdebug.dm @@ -9,17 +9,17 @@ //all plumbing - yes, some things might get stated twice, doesn't matter. for (var/obj/machinery/atmospherics/plumbing in GLOB.machines) if (plumbing.nodealert) - to_chat(usr, "Unconnected [plumbing.name] located at [plumbing.x],[plumbing.y],[plumbing.z] ([get_area(plumbing.loc)])") + to_chat(usr, "Unconnected [plumbing.name] located at [ADMIN_COORDJMP(plumbing)] ([get_area(plumbing.loc)])") //Manifolds for (var/obj/machinery/atmospherics/pipe/manifold/pipe in GLOB.machines) if (!pipe.nodes[1] || !pipe.nodes[2] || !pipe.nodes[3]) - to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") + to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_COORDJMP(pipe)] ([get_area(pipe.loc)])") //Pipes for (var/obj/machinery/atmospherics/pipe/simple/pipe in GLOB.machines) if (!pipe.nodes[1] || !pipe.nodes[2]) - to_chat(usr, "Unconnected [pipe.name] located at [pipe.x],[pipe.y],[pipe.z] ([get_area(pipe.loc)])") + to_chat(usr, "Unconnected [pipe.name] located at [ADMIN_COORDJMP(pipe)] ([get_area(pipe.loc)])") /client/proc/powerdebug() set category = "Mapping" @@ -33,9 +33,9 @@ if (!PN.nodes || !PN.nodes.len) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") + to_chat(usr, "Powernet with no nodes! (number [PN.number]) - example cable at [ADMIN_COORDJMP(C)] in area [get_area(C.loc)]") if (!PN.cables || (PN.cables.len < 10)) if(PN.cables && (PN.cables.len > 1)) var/obj/structure/cable/C = PN.cables[1] - to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [C.x], [C.y], [C.z] in area [get_area(C.loc)]") \ No newline at end of file + to_chat(usr, "Powernet with fewer than 10 cables! (number [PN.number]) - example cable at [ADMIN_COORDJMP(C)] in area [get_area(C.loc)]") diff --git a/code/modules/admin/verbs/mapping.dm b/code/modules/admin/verbs/mapping.dm index ce50378f4d..1b85506c6e 100644 --- a/code/modules/admin/verbs/mapping.dm +++ b/code/modules/admin/verbs/mapping.dm @@ -96,28 +96,28 @@ GLOBAL_LIST_INIT(admin_verbs_debug_mapping, list( for(var/obj/machinery/camera/C in GLOB.cameranet.cameras) CL += C - var/output = {"CAMERA ANNOMALITIES REPORT


-The following annomalities have been detected. The ones in red need immediate attention: Some of those in black may be intentional.
    "} + var/output = {"Camera Abnormalities Report
    +The following abnormalities have been detected. The ones in red need immediate attention: Some of those in black may be intentional.
      "} for(var/obj/machinery/camera/C1 in CL) for(var/obj/machinery/camera/C2 in CL) if(C1 != C2) if(C1.c_tag == C2.c_tag) - output += "
    • c_tag match for sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) and \[[C2.x], [C2.y], [C2.z]\] ([C2.loc.loc]) - c_tag is [C1.c_tag]
    • " + output += "
    • c_tag match for cameras at [ADMIN_COORDJMP(C1)] ([C1.loc.loc]) and [ADMIN_COORDJMP(C2)] ([C2.loc.loc]) - c_tag is [C1.c_tag]
    • " if(C1.loc == C2.loc && C1.dir == C2.dir && C1.pixel_x == C2.pixel_x && C1.pixel_y == C2.pixel_y) - output += "
    • FULLY overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]
    • " + output += "
    • FULLY overlapping cameras at [ADMIN_COORDJMP(C1)] ([C1.loc.loc]) Networks: [json_encode(C1.network)] and [json_encode(C2.network)]
    • " if(C1.loc == C2.loc) - output += "
    • overlapping sec. cameras at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Networks: [C1.network] and [C2.network]
    • " + output += "
    • Overlapping cameras at [ADMIN_COORDJMP(C1)] ([C1.loc.loc]) Networks: [json_encode(C1.network)] and [json_encode(C2.network)]
    • " var/turf/T = get_step(C1,turn(C1.dir,180)) if(!T || !isturf(T) || !T.density ) - if(!(locate(/obj/structure/grille,T))) + if(!(locate(/obj/structure/grille) in T)) var/window_check = 0 for(var/obj/structure/window/W in T) if (W.dir == turn(C1.dir,180) || W.dir in list(5,6,9,10) ) window_check = 1 break if(!window_check) - output += "
    • Camera not connected to wall at \[[C1.x], [C1.y], [C1.z]\] ([C1.loc.loc]) Network: [C1.network]
    • " + output += "
    • Camera not connected to wall at [ADMIN_COORDJMP(C1)] ([C1.loc.loc]) Network: [json_encode(C1.network)]
    • " output += "
    " usr << browse(output,"window=airreport;size=1000x500") From ed6ec3d63a01e0dee3d6ba65e4ba629e329c7688 Mon Sep 17 00:00:00 2001 From: JJRcop Date: Fri, 12 Jan 2018 08:03:28 -0500 Subject: [PATCH 39/55] Removes some hrefs from logging (#34310) * Removes key_name_admin calls from logging * Removes JMP from gibtonite reaction logs --- code/datums/mind.dm | 4 ++-- code/game/machinery/computer/apc_control.dm | 4 ++-- code/game/objects/items/devices/transfer_valve.dm | 2 +- code/game/objects/items/implants/implantchair.dm | 4 ++-- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/turfs/simulated/minerals.dm | 2 +- code/modules/admin/admin.dm | 2 +- code/modules/admin/topic.dm | 2 +- 8 files changed, 11 insertions(+), 11 deletions(-) diff --git a/code/datums/mind.dm b/code/datums/mind.dm index 4e46aeca65..cc58c9445d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -1174,7 +1174,7 @@ if(devilinfo) devilinfo.ascendable = FALSE message_admins("[key_name_admin(usr)] has made [current] unable to ascend as a devil.") - log_admin("[key_name_admin(usr)] has made [current] unable to ascend as a devil.") + log_admin("[key_name(usr)] has made [current] unable to ascend as a devil.") return if(!ishuman(current) && !iscyborg(current)) to_chat(usr, "This only works on humans and cyborgs!") @@ -1186,7 +1186,7 @@ if(devilinfo) devilinfo.ascendable = TRUE message_admins("[key_name_admin(usr)] has made [current] able to ascend as a devil.") - log_admin("[key_name_admin(usr)] has made [current] able to ascend as a devil.") + log_admin("[key_name(usr)] has made [current] able to ascend as a devil.") return if(!ishuman(current) && !iscyborg(current)) to_chat(usr, "This only works on humans and cyborgs!") diff --git a/code/game/machinery/computer/apc_control.dm b/code/game/machinery/computer/apc_control.dm index e9390a3cf5..7bd6cf46e0 100644 --- a/code/game/machinery/computer/apc_control.dm +++ b/code/game/machinery/computer/apc_control.dm @@ -138,7 +138,7 @@ APC.interact(usr, GLOB.not_incapacitated_state) playsound(src, 'sound/machines/terminal_prompt_confirm.ogg', 50, 0) message_admins("[key_name_admin(usr)] remotely accessed [APC] from [src] at [get_area(src)].") - log_game("[key_name_admin(usr)] remotely accessed [APC] from [src] at [get_area(src)].") + log_game("[key_name(usr)] remotely accessed [APC] from [src] at [get_area(src)].") if(APC.locked) APC.say("Remote access detected. Interface unlocked.") playsound(APC, 'sound/machines/boltsup.ogg', 25, 0) @@ -196,7 +196,7 @@ if(emagged) return user.visible_message("You emag [src], disabling precise logging and allowing you to clear logs.") - log_game("[key_name_admin(user)] emagged [src] at [get_area(src)], disabling operator tracking.") + log_game("[key_name(user)] emagged [src] at [get_area(src)], disabling operator tracking.") playsound(src, "sparks", 50, 1) emagged = TRUE diff --git a/code/game/objects/items/devices/transfer_valve.dm b/code/game/objects/items/devices/transfer_valve.dm index cb83a1adbc..4e899aa324 100644 --- a/code/game/objects/items/devices/transfer_valve.dm +++ b/code/game/objects/items/devices/transfer_valve.dm @@ -56,7 +56,7 @@ GLOB.bombers += "[key_name(user)] attached a [item] to a transfer valve." message_admins("[key_name_admin(user)] attached a [item] to a transfer valve.") - log_game("[key_name_admin(user)] attached a [item] to a transfer valve.") + log_game("[key_name(user)] attached a [item] to a transfer valve.") attacher = user return diff --git a/code/game/objects/items/implants/implantchair.dm b/code/game/objects/items/implants/implantchair.dm index 7dd14bda88..448b32e2d5 100644 --- a/code/game/objects/items/implants/implantchair.dm +++ b/code/game/objects/items/implants/implantchair.dm @@ -185,11 +185,11 @@ return 0 objective = stripped_input(usr,"What order do you want to imprint on [C]?","Enter the order","",120) message_admins("[key_name_admin(user)] set brainwash machine objective to '[objective]'.") - log_game("[key_name_admin(user)] set brainwash machine objective to '[objective]'.") + log_game("[key_name(user)] set brainwash machine objective to '[objective]'.") var/datum/objective/custom_objective = new/datum/objective(objective) custom_objective.owner = C.mind C.mind.objectives += custom_objective C.mind.announce_objectives() message_admins("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") - log_game("[key_name_admin(user)] brainwashed [key_name_admin(C)] with objective '[objective]'.") + log_game("[key_name(user)] brainwashed [key_name(C)] with objective '[objective]'.") return 1 diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index f1cc7c7c25..dc0540307e 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -290,7 +290,7 @@ resin_cooldown = TRUE R.remove_any(100) var/obj/effect/resin_container/A = new (get_turf(src)) - log_game("[key_name_admin(user)] used Resin Launcher at [get_area(user)] [COORD(user)].") + log_game("[key_name(user)] used Resin Launcher at [get_area(user)] [COORD(user)].") playsound(src,'sound/items/syringeproj.ogg',40,1) for(var/a=0, a<5, a++) step_towards(A, target) diff --git a/code/game/turfs/simulated/minerals.dm b/code/game/turfs/simulated/minerals.dm index c737848749..47ec9d032b 100644 --- a/code/game/turfs/simulated/minerals.dm +++ b/code/game/turfs/simulated/minerals.dm @@ -414,7 +414,7 @@ message_admins("An explosion has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") if(!triggered_by_explosion) - log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [ADMIN_JMP(bombturf)].") + log_game("[key_name(user)] has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)].") else log_game("An explosion has triggered a gibtonite deposit reaction at [A.name] [COORD(bombturf)]") diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 79d9838ea2..27fdf2f95f 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -20,7 +20,7 @@ return if(!isobserver(usr)) - log_game("[key_name_admin(usr)] checked the player panel while in game.") + log_game("[key_name(usr)] checked the player panel while in game.") if(!M) to_chat(usr, "You seem to be selecting a mob that doesn't exist anymore.") diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index bd104f86ab..0cf917d840 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1242,7 +1242,7 @@ to_chat(usr, "Failed to apply ban.") return ban_unban_log_save("[key_name(usr)] has permabanned [key_name(M)]. - Reason: [reason] - This is a permanent ban.") - log_admin_private("[key_name(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis is a permanent ban.") + log_admin_private("[key_name(usr)] has banned [key_name(M)].\nReason: [reason]\nThis is a permanent ban.") var/msg = "[key_name_admin(usr)] has banned [key_name_admin(M)].\nReason: [reason]\nThis is a permanent ban." message_admins(msg) var/datum/admin_help/AH = M.client ? M.client.current_ticket : null From 429237d06c9288c268c202c7bbdb921462e5b00e Mon Sep 17 00:00:00 2001 From: Leo Date: Fri, 12 Jan 2018 11:05:18 -0200 Subject: [PATCH 41/55] Merge pull request #34301 from kevinz000/patch-428 Harvesters now normally attack those with NODISMEMBER species --- code/modules/mob/living/simple_animal/constructs.dm | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/code/modules/mob/living/simple_animal/constructs.dm b/code/modules/mob/living/simple_animal/constructs.dm index f40a3a8b95..0a3061cacc 100644 --- a/code/modules/mob/living/simple_animal/constructs.dm +++ b/code/modules/mob/living/simple_animal/constructs.dm @@ -318,6 +318,11 @@ /mob/living/simple_animal/hostile/construct/harvester/AttackingTarget() if(iscarbon(target)) + if(ishuman(target)) + var/mob/living/carbon/human/H = target + if(H.dna && H.dna.species) + if(NODISMEMBER in H.dna.species.species_traits) + return ..() //ATTACK! var/mob/living/carbon/C = target var/list/parts = list() var/undismembermerable_limbs = 0 From 12da7d5decc3c364acc787b3799e406e73d6280e Mon Sep 17 00:00:00 2001 From: Tad Hardesty Date: Fri, 12 Jan 2018 07:43:06 -0800 Subject: [PATCH 43/55] Fix the batch file method of mapmerge2 and save a .before (#34361) --- tools/mapmerge2/mapmerge.py | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/tools/mapmerge2/mapmerge.py b/tools/mapmerge2/mapmerge.py index ccfbfec784..f449bd948f 100644 --- a/tools/mapmerge2/mapmerge.py +++ b/tools/mapmerge2/mapmerge.py @@ -85,9 +85,10 @@ def merge_map(new_map, old_map, delete_unused=False): def main(settings): for fname in frontend.process(settings, "merge", backup=True): + shutil.copyfile(fname, fname + ".before") old_map = DMM.from_file(fname + ".backup") new_map = DMM.from_file(fname) - merge_map(old_map, new_map).to_file(fname, settings.tgm) + merge_map(new_map, old_map).to_file(fname, settings.tgm) if __name__ == '__main__': main(frontend.read_settings()) From 5c8f1f7f5bc366e3537e86af615e134a550d6a47 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:41:32 -0600 Subject: [PATCH 45/55] Automatic changelog generation for PR #4764 [ci skip] --- html/changelogs/AutoChangeLog-pr-4764.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4764.yml diff --git a/html/changelogs/AutoChangeLog-pr-4764.yml b/html/changelogs/AutoChangeLog-pr-4764.yml new file mode 100644 index 0000000000..90895d055f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4764.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - refactor: "Information about the properties of z-levels is now less hardcoded than before." From e4a3f2fe1a9fc9587506875564bb8c7124a68e59 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:41:47 -0600 Subject: [PATCH 46/55] Automatic changelog generation for PR #4765 [ci skip] --- html/changelogs/AutoChangeLog-pr-4765.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4765.yml diff --git a/html/changelogs/AutoChangeLog-pr-4765.yml b/html/changelogs/AutoChangeLog-pr-4765.yml new file mode 100644 index 0000000000..7720c33e71 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4765.yml @@ -0,0 +1,4 @@ +author: "ShizCalev" +delete-after: True +changes: + - tweak: "Medbots are no longer able to inject you if you do not have any exposed flesh." From 4d67f2966b137eb430a8cdedca3012d58a4ecf5b Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:42:59 -0600 Subject: [PATCH 47/55] Automatic changelog generation for PR #4775 [ci skip] --- html/changelogs/AutoChangeLog-pr-4775.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4775.yml diff --git a/html/changelogs/AutoChangeLog-pr-4775.yml b/html/changelogs/AutoChangeLog-pr-4775.yml new file mode 100644 index 0000000000..2fbcb720c4 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4775.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - spellcheck: "Fixed message grammar when lifting someone off a brass skewer" From 927853512dfb12dacd2fbc0ee61276dfc3de3807 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:44:30 -0600 Subject: [PATCH 48/55] Automatic changelog generation for PR #4779 [ci skip] --- html/changelogs/AutoChangeLog-pr-4779.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4779.yml diff --git a/html/changelogs/AutoChangeLog-pr-4779.yml b/html/changelogs/AutoChangeLog-pr-4779.yml new file mode 100644 index 0000000000..73d753951e --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4779.yml @@ -0,0 +1,5 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - tweak: "Cyborgs that take enough damage to have a module disabled will now automatically announce that they've had a module disabled to anybody nearby. Now if you want to stop a cyborg from interfering with your business but don't want to kill it, you can simply bash until you see the CRITICAL ERROR message." + - soundadd: "Borgs will play an alarm sound in addition to displaying this message as they have their modules disabled." From c2cb0ed43689520e3883f37f749de56cd0264bc1 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:45:16 -0600 Subject: [PATCH 49/55] Automatic changelog generation for PR #4781 [ci skip] --- html/changelogs/AutoChangeLog-pr-4781.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4781.yml diff --git a/html/changelogs/AutoChangeLog-pr-4781.yml b/html/changelogs/AutoChangeLog-pr-4781.yml new file mode 100644 index 0000000000..aef45d3e2f --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4781.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Securitrons/ED-209s/Honkbots will only activate their emag functions after their internals are emagged" From d1f7df200bf3e6e844ce1fa0521a73e222fa09be Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:46:03 -0600 Subject: [PATCH 50/55] Automatic changelog generation for PR #4782 [ci skip] --- html/changelogs/AutoChangeLog-pr-4782.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4782.yml diff --git a/html/changelogs/AutoChangeLog-pr-4782.yml b/html/changelogs/AutoChangeLog-pr-4782.yml new file mode 100644 index 0000000000..21cfdfabe7 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4782.yml @@ -0,0 +1,4 @@ +author: "Dax Dupont" +delete-after: True +changes: + - rscadd: "Thanks to the extensive disco and plasma research gathered by the Disco Inferno shuttles, an indestructible mark V disco machine is now available. The latest edition of the Disco Inferno shuttle now carries it." From 061c6f220727e1b4781b0d740126d3025e914ca5 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:46:32 -0600 Subject: [PATCH 51/55] Automatic changelog generation for PR #4783 [ci skip] --- html/changelogs/AutoChangeLog-pr-4783.yml | 5 +++++ 1 file changed, 5 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4783.yml diff --git a/html/changelogs/AutoChangeLog-pr-4783.yml b/html/changelogs/AutoChangeLog-pr-4783.yml new file mode 100644 index 0000000000..b62d596e07 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4783.yml @@ -0,0 +1,5 @@ +author: "Cobby" +delete-after: True +changes: + - tweak: "As a human, you will now point with your legs when you have no arms, falling over each time." + - tweak: "As a human, you will bump your head on the ground trying to motion towards something when you have no arms or legs." From cbd6163210cbd67caaee02d6bf49734844cff9c0 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:46:48 -0600 Subject: [PATCH 52/55] Automatic changelog generation for PR #4784 [ci skip] --- html/changelogs/AutoChangeLog-pr-4784.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4784.yml diff --git a/html/changelogs/AutoChangeLog-pr-4784.yml b/html/changelogs/AutoChangeLog-pr-4784.yml new file mode 100644 index 0000000000..00e4ed5b98 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4784.yml @@ -0,0 +1,4 @@ +author: "More Robust Than You" +delete-after: True +changes: + - balance: "Sigils of submission now uncuff upon successful conversion" From 903da0a79abadffe4c29cad105a7cb3797dbb403 Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:47:10 -0600 Subject: [PATCH 53/55] Automatic changelog generation for PR #4785 [ci skip] --- html/changelogs/AutoChangeLog-pr-4785.yml | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4785.yml diff --git a/html/changelogs/AutoChangeLog-pr-4785.yml b/html/changelogs/AutoChangeLog-pr-4785.yml new file mode 100644 index 0000000000..c6829cce33 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4785.yml @@ -0,0 +1,22 @@ +author: "ShizCalev" +delete-after: True +changes: + - bugfix: "You can now attach collars to pets again!" + - bugfix: "Corrected pet collars icon mismatch." + - bugfix: "Pets will now drop their collars when gibbed." + - tweak: "You will no longer be able to rename unique pets, such as Ian or Runtime. You can still rename pets without a special name." + - bugfix: "Secbot assemblies will no longer lose their weld hole when dragged North" + - imageadd: "Secbot assemblies now have new North facing sprites!" + - imageadd: "Cleaned up a rogue pixel on beepsky's sprite." + - bugfix: "Defibrillators now have inhands again!" + - bugfix: "Defibrillators will no longer stay in your hands after you die." + - bugfix: "Losing an arm while wielding a two handed weapon will now cause you to drop the weapon." + - bugfix: "Losing an arm while carrying an item that requires two hands to hold will now cause you to drop the item." + - spellcheck: "Improved user feedback from chem dispenser macros." + - bugfix: "Fixed Tests Areas debug verb." + - bugfix: "Only the chaplain can now purify a bloody bastard sword." + - bugfix: "Fully healing a mob as an admin now cures disabilities properly." + - bugfix: "Non-cultists hulks can no longer withstand the immense powers of Ratvar's influence while holding a bloody bastard sword." + - bugfix: "The average body temperature has been corrected to 98.6F." + - tweak: "Safe dials will now present itself in 1 number increments, instead of 5." + - bugfix: "Relabeled canisters will no longer switch to an incorrect sprite when broken." From 732c16cae54f733e499f0c0bc8f61579ec4202fb Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:47:42 -0600 Subject: [PATCH 54/55] Automatic changelog generation for PR #4786 [ci skip] --- html/changelogs/AutoChangeLog-pr-4786.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4786.yml diff --git a/html/changelogs/AutoChangeLog-pr-4786.yml b/html/changelogs/AutoChangeLog-pr-4786.yml new file mode 100644 index 0000000000..2e779a4c6c --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4786.yml @@ -0,0 +1,4 @@ +author: "CitadelStationBot" +delete-after: True +changes: + - bugfix: "Relabelled canisters once again have the correct description." From 8686d2af17e90184f87dee98b8b4e1f06da235bf Mon Sep 17 00:00:00 2001 From: CitadelStationBot Date: Fri, 12 Jan 2018 11:48:16 -0600 Subject: [PATCH 55/55] Automatic changelog generation for PR #4788 [ci skip] --- html/changelogs/AutoChangeLog-pr-4788.yml | 4 ++++ 1 file changed, 4 insertions(+) create mode 100644 html/changelogs/AutoChangeLog-pr-4788.yml diff --git a/html/changelogs/AutoChangeLog-pr-4788.yml b/html/changelogs/AutoChangeLog-pr-4788.yml new file mode 100644 index 0000000000..5d32b3aa70 --- /dev/null +++ b/html/changelogs/AutoChangeLog-pr-4788.yml @@ -0,0 +1,4 @@ +author: "JJRcop" +delete-after: True +changes: + - code_imp: "Removes some links intended for admins from game logs."