From d71a2be3469e1e5f8b10edea61fd0a369a4167f4 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sat, 3 Feb 2018 19:19:26 -0500 Subject: [PATCH 01/30] POLARIS: Add shuttle door/environment sensors --- code/modules/shuttles/shuttles_web.dm | 88 +++++++++++++++++++++++- nano/templates/flight.tmpl | 97 +++++++++++++++++++++++++-- 2 files changed, 179 insertions(+), 6 deletions(-) diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index 5034d249ac..c55aba9c39 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -128,6 +128,31 @@ icon_state = "flightcomp_center" icon_keyboard = "flight_center_key" icon_screen = "flight_center" + var/list/my_doors //Should be list("id_tag" = "Pretty Door Name", ...) + var/list/my_sensors //Should be list("id_tag" = "Pretty Sensor Name", ...) + +/obj/machinery/computer/shuttle_control/web/initialize() + . = ..() + var/area/my_area = get_area(src) + if(my_doors) + var/list/find_doors = my_doors + my_doors = list() + for(var/obj/machinery/door/airlock/A in my_area) + if(A.id_tag in find_doors) + my_doors[find_doors[A.id_tag]] = A + find_doors -= A.id_tag + for(var/lost in find_doors) + log_debug("[my_area] shuttle computer couldn't find [lost] door!") + + if(my_sensors) + var/list/find_sensors = my_sensors + my_sensors = list() + for(var/obj/machinery/shuttle_sensor/S in my_area) + if(S.id_tag in find_sensors) + my_sensors[find_sensors[S.id_tag]] = S + find_sensors -= S.id_tag + for(var/lost in find_sensors) + log_debug("[my_area] shuttle computer couldn't find [lost] sensor!") // Fairly copypasta-y. /obj/machinery/computer/shuttle_control/web/attack_hand(mob/user) @@ -244,6 +269,21 @@ if(total_time) // Need to check or we might divide by zero. percent_finished = (elapsed_time / total_time) * 100 + + var/list/doors = list() + if(my_doors) + for(var/doorname in my_doors) + var/obj/machinery/door/airlock/A = my_doors[doorname] + if(A) + doors[doorname] = list("bolted" = A.locked, "open" = !A.density) + + var/list/sensors = list() + if(my_sensors) + for(var/sensorname in my_sensors) + var/obj/machinery/shuttle_sensor/S = my_sensors[sensorname] + if(S) + sensors[sensorname] = S.air_list() + data = list( "shuttle_location" = shuttle_location, "future_location" = future_location, @@ -261,13 +301,15 @@ "cloaked" = shuttle.cloaked ? 1 : 0, "can_autopilot" = shuttle.can_autopilot ? 1 : 0, "autopilot" = shuttle.autopilot ? 1 : 0, - "can_rename" = shuttle.can_rename ? 1 : 0 + "can_rename" = shuttle.can_rename ? 1 : 0, + "doors" = doors, + "sensors" = sensors ) ui = nanomanager.try_update_ui(user, src, ui_key, ui, data, force_open) if(!ui) - ui = new(user, src, ui_key, "flight.tmpl", "[shuttle.visible_name] Flight Computer", 470, 500) + ui = new(user, src, ui_key, "flight.tmpl", "[shuttle.visible_name] Flight Computer", 500, 500) ui.set_initial_data(data) ui.open() ui.set_auto_update(1) @@ -411,3 +453,45 @@ processing_objects -= src qdel(src) + +//A sensor for detecting air outside shuttles! Handy, that. +/obj/machinery/shuttle_sensor + name = "environment sensor" + icon = 'icons/obj/airlock_machines.dmi' + icon_state = "airlock_sensor_standby" + var/id_tag + +/obj/machinery/shuttle_sensor/process() + return PROCESS_KILL //nty + +/obj/machinery/shuttle_sensor/proc/air_list() + . = list("reading" = FALSE) + var/turf/T = get_step(src,dir) + + if(isnull(T)) + return + + var/list/aircontents + var/datum/gas_mixture/environment = T.return_air() + var/pressure = environment.return_pressure() + var/total_moles = environment.total_moles + + if(total_moles) + var/o2_level = environment.gas["oxygen"]/total_moles + var/n2_level = environment.gas["nitrogen"]/total_moles + var/co2_level = environment.gas["carbon_dioxide"]/total_moles + var/phoron_level = environment.gas["phoron"]/total_moles + var/unknown_level = 1-(o2_level+n2_level+co2_level+phoron_level) + aircontents = list(\ + "pressure" = "[round(pressure,0.1)]",\ + "nitrogen" = "[round(n2_level*100,0.1)]",\ + "oxygen" = "[round(o2_level*100,0.1)]",\ + "carbon_dioxide" = "[round(co2_level*100,0.1)]",\ + "phoron" = "[round(phoron_level*100,0.01)]",\ + "other" = "[round(unknown_level, 0.01)]",\ + "temp" = "[round(environment.temperature-T0C,0.1)]",\ + "reading" = TRUE\ + ) + + if(aircontents) + return aircontents diff --git a/nano/templates/flight.tmpl b/nano/templates/flight.tmpl index 2ffec337ba..60d4cd605a 100644 --- a/nano/templates/flight.tmpl +++ b/nano/templates/flight.tmpl @@ -116,7 +116,6 @@ {{if data.is_moving == 0}}

Available Destinations

-

{{for data.routes}} @@ -127,9 +126,7 @@
{{:helper.link(value.travel_time, 'clock', {"traverse" : value.index})}} - -
- +
{{/for}} @@ -150,3 +147,95 @@ {{/if}} + +{{if data.doors}} +

Hatch Status

+
+
+ {{props data.doors}} +
+
{{:key}}
+
+ {{if value.open}} + OPN + {{else}} + CLS + {{/if}} + - + {{if value.bolted}} + BLT + {{else}} + UBLT + {{/if}} +
+
+ {{/props}} +
+{{/if}} + +{{if data.sensors}} +

Air Readout

+
+ {{props data.sensors}} +
+
+ {{:key}} +
+
+ {{if value.reading == 1}} +
+ Pressure: +
+
+ {{:helper.string('{1} kPa', value.pressure < 80 || value.pressure > 120 ? 'bad' : value.pressure < 95 || value.pressure > 110 ? 'average' : 'good' , value.pressure)}} +
+
+ Temperature: +
+
+ {{:helper.string('{1} °C', value.temp < 5 || value.temp > 35 ? 'bad' : value.temp < 15 || value.temp > 25 ? 'average' : 'good' , value.temp)}} +
+
+
+ Oxygen: +
+
+ {{:helper.string('{1}%', value.oxygen < 17 ? 'bad' : value.oxygen < 19 ? 'average' : 'good' , value.oxygen)}} +
+
+ Nitrogen: +
+
+ {{:helper.string('{1}%', value.nitrogen > 82 ? 'bad' : value.nitrogen > 80 ? 'average' : 'good' , value.nitrogen)}} +
+
+ Carbon Dioxide: +
+
+ {{:helper.string('{1}%', value.carbon_dioxide > 5 ? 'bad' : 'good' , value.carbon_dioxide)}} +
+
+ Phoron: +
+
+ {{:helper.string('{1}%', value.phoron > 0 ? 'bad' : 'good' , value.phoron)}} + +
+ {{if value.other > 0}} +
+ Unknown: +
+
+ {{:value.other}}% +
+ {{/if}} + {{else}} +
+ Unable to get air reading +
+ {{/if}} +
+
+ {{/props}} +{{/if}} + From 9d0ffb96ee2755f30c584e48f1a8ca599f92741c Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Thu, 25 Jan 2018 16:33:36 -0500 Subject: [PATCH 02/30] POLARIS: Tweak map-loading in some ways Fixes loading of map templates, now loads it acutally in the center instead of to the upper-left of center. Warns you if you try to load a submap which is larger than the current world size. --- code/modules/admin/verbs/map_template_loadverb.dm | 7 ++++++- code/modules/maps/tg/map_template.dm | 15 ++++++++++----- maps/~map_system/maps.dm | 6 ++++++ 3 files changed, 22 insertions(+), 6 deletions(-) diff --git a/code/modules/admin/verbs/map_template_loadverb.dm b/code/modules/admin/verbs/map_template_loadverb.dm index 25fda4bfb3..7fde6c58e1 100644 --- a/code/modules/admin/verbs/map_template_loadverb.dm +++ b/code/modules/admin/verbs/map_template_loadverb.dm @@ -41,7 +41,12 @@ if(!map) return template = map_templates[map] - + + if(template.width > world.maxx || template.height > world.maxy) + if(alert(usr,"This template is larger than the existing z-levels. It will EXPAND ALL Z-LEVELS to match the size of the template. This may cause chaos. Are you sure you want to do this?","DANGER!!!","Cancel","Yes") == "Cancel") + to_chat(usr,"Template placement aborted.") + return + if(alert(usr,"Confirm map load.", "Template Confirm","No","Yes") == "Yes") if(template.load_new_z()) message_admins("[key_name_admin(usr)] has placed a map template ([template.name]) on Z level [world.maxz].") diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index f8b9667095..096b5a7197 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -103,18 +103,23 @@ var/list/global/map_templates = list() admin_notice("Submap initializations finished.", R_DEBUG) -/datum/map_template/proc/load_new_z() - var/x = round(world.maxx/2) - var/y = round(world.maxy/2) +/datum/map_template/proc/load_new_z(var/centered = FALSE, var/dont_init = FALSE) + var/x = 1 + var/y = 1 - var/list/bounds = maploader.load_map(file(mappath), x, y) + if(centered) + x = round((world.maxx - width)/2) + y = round((world.maxy - height)/2) + + var/list/bounds = maploader.load_map(file(mappath), x, y, no_changeturf = TRUE) if(!bounds) return FALSE // repopulate_sorted_areas() //initialize things that are normally initialized after map load - initTemplateBounds(bounds) + if(!dont_init) + initTemplateBounds(bounds) log_game("Z-level [name] loaded at at [x],[y],[world.maxz]") return TRUE diff --git a/maps/~map_system/maps.dm b/maps/~map_system/maps.dm index ae40bc129c..986ade2162 100644 --- a/maps/~map_system/maps.dm +++ b/maps/~map_system/maps.dm @@ -38,6 +38,12 @@ var/list/all_maps = list() //This list contains the z-level numbers which can be accessed via space travel and the percentile chances to get there. var/list/accessible_z_levels = list() + //List of additional z-levels to load above the existing .dmm file z-levels using the maploader. Must be map template >>> NAMES <<<. + var/list/lateload_z_levels = list() + + //Similar to above, but only pick ONE to load, useful for random away missions and whatnot + var/list/lateload_single_pick = list() + var/list/allowed_jobs = list() //Job datums to use. //Works a lot better so if we get to a point where three-ish maps are used //We don't have to C&P ones that are only common between two of them From 13bfcf6bd3efffebdfbf1b6a01a2d60f421c1572 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 4 Feb 2018 01:00:25 -0500 Subject: [PATCH 03/30] Improve admin idlekick capability/awareness --- code/controllers/Processes/inactivity.dm | 30 ++++++++++-- code/game/machinery/cryopod.dm | 4 +- code/modules/admin/admin_verbs.dm | 3 +- code/modules/admin/topic.dm | 11 +++++ code/modules/admin/verbs/randomverbs.dm | 60 ++++++++++++++++++++++++ 5 files changed, 101 insertions(+), 7 deletions(-) diff --git a/code/controllers/Processes/inactivity.dm b/code/controllers/Processes/inactivity.dm index b1029e0391..2a6cd44d2c 100644 --- a/code/controllers/Processes/inactivity.dm +++ b/code/controllers/Processes/inactivity.dm @@ -7,8 +7,30 @@ for(last_object in clients) var/client/C = last_object if(C.is_afk(config.kick_inactive MINUTES)) - if(!istype(C.mob, /mob/observer/dead)) - log_access("AFK: [key_name(C)]") - C << "You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected." - del(C) // Don't qdel, cannot override finalize_qdel behaviour for clients. + if(!istype(C.mob, /mob/observer/dead) && !istype(C.mob, /mob/new_player)) + to_chat(C,"You have been inactive for more than [config.kick_inactive] minute\s and have been disconnected.") + var/information + + if(ishuman(C.mob)) + var/job + var/mob/living/carbon/human/H = C.mob + var/datum/data/record/R = find_general_record("name", H.real_name) + if(R) + job = R.fields["real_rank"] + if(!job && H.mind) + job = H.mind.assigned_role + if(!job && H.job) + job = H.job + if(job) + information = " while [job]." + + else if(issilicon(C.mob)) + information = " while a silicon." + + var/adminlinks + adminlinks = " (JMP|CRYO)" + + log_and_message_admins("being kicked for AFK[information][adminlinks]", C.mob) + + qdel(C) SCHECK diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d3936ca7c0..d254228795 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -346,8 +346,8 @@ // This function can not be undone; do not call this unless you are sure // Also make sure there is a valid control computer -/obj/machinery/cryopod/robot/despawn_occupant() - var/mob/living/silicon/robot/R = occupant +/obj/machinery/cryopod/robot/despawn_occupant(var/mob/to_despawn) + var/mob/living/silicon/robot/R = to_despawn if(!istype(R)) return ..() qdel(R.mmi) diff --git a/code/modules/admin/admin_verbs.dm b/code/modules/admin/admin_verbs.dm index 2532554193..721a959c35 100644 --- a/code/modules/admin/admin_verbs.dm +++ b/code/modules/admin/admin_verbs.dm @@ -101,7 +101,8 @@ var/list/admin_verbs_admin = list( /client/proc/toggle_attack_logs, /datum/admins/proc/paralyze_mob, /client/proc/fixatmos, - /datum/admins/proc/sendFax + /datum/admins/proc/sendFax, + /client/proc/despawn_player ) var/list/admin_verbs_ban = list( diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index c2cf55ab00..81c709f6d8 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -1864,6 +1864,17 @@ show_player_panel(M) + else if(href_list["cryoplayer"]) + if(!check_rights(R_ADMIN)) return + + var/mob/M = locate(href_list["cryoplayer"]) + if(!istype(M)) + to_chat(usr,"Mob doesn't exist!") + return + + var/client/C = usr.client + C.despawn_player(M) + // player info stuff if(href_list["add_player_info"]) diff --git a/code/modules/admin/verbs/randomverbs.dm b/code/modules/admin/verbs/randomverbs.dm index 961dbdcdfb..9536f830fb 100644 --- a/code/modules/admin/verbs/randomverbs.dm +++ b/code/modules/admin/verbs/randomverbs.dm @@ -935,3 +935,63 @@ Traitors and the like can also be revived with the previous role mostly intact. usr << "Random events disabled" message_admins("Admin [key_name_admin(usr)] has disabled random events.", 1) feedback_add_details("admin_verb","TRE") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + +/client/proc/despawn_player(var/mob/M in living_mob_list) + set name = "Cryo Player" + set category = "Admin" + set desc = "Removes a player from the round as if they'd cryo'd." + set popup_menu = FALSE + + if(!check_rights(R_ADMIN)) + return + + if(!M) + return + + var/confirm = alert("Are you sure you want to cryo [M]?","Confirmation","No","Yes") + if(confirm == "No") + return + + var/list/human_cryopods = list() + var/list/robot_cryopods = list() + + for(var/obj/machinery/cryopod/CP in machines) + if(!CP.control_computer) + continue //Broken pod w/o computer, move on. + + var/listname = "[CP.name] ([CP.x],[CP.y],[CP.z])" + if(istype(CP,/obj/machinery/cryopod/robot)) + robot_cryopods[listname] = CP + else + human_cryopods[listname] = CP + + //Gotta log this up here before they get ghostized and lose their key or anything. + log_and_message_admins("[key_name(src)] admin cryo'd [key_name(M)].") + feedback_add_details("admin_verb","ACRYO") //If you are copy-pasting this, ensure the 2nd parameter is unique to the new proc! + + if(ishuman(M)) + var/obj/machinery/cryopod/CP = human_cryopods[input(usr,"Select a cryopod to use","Cryopod Choice") as null|anything in human_cryopods] + if(!CP) + return + M.ghostize() + CP.despawn_occupant(M) + return + + else if(issilicon(M)) + if(isAI(M)) + var/mob/living/silicon/ai/ai = M + empty_playable_ai_cores += new /obj/structure/AIcore/deactivated(ai.loc) + global_announcer.autosay("[ai] has been moved to intelligence storage.", "Artificial Intelligence Oversight") + ai.clear_client() + return + else + var/obj/machinery/cryopod/robot/CP = robot_cryopods[input(usr,"Select a cryopod to use","Cryopod Choice") as null|anything in robot_cryopods] + if(!CP) + return + M.ghostize() + CP.despawn_occupant(M) + return + + else if(isliving(M)) + M.ghostize() + qdel(M) //Bye From 8b6c76af814c93607dc8197fa08389f1a328cc00 Mon Sep 17 00:00:00 2001 From: Arokha Sieyes Date: Sun, 4 Feb 2018 01:32:04 -0500 Subject: [PATCH 04/30] POLARIS: Cut down ghosting admin spam --- code/modules/mob/dead/observer/observer.dm | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/code/modules/mob/dead/observer/observer.dm b/code/modules/mob/dead/observer/observer.dm index cc7fe00711..e7f0db6b30 100644 --- a/code/modules/mob/dead/observer/observer.dm +++ b/code/modules/mob/dead/observer/observer.dm @@ -204,8 +204,11 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp return resting = 1 var/turf/location = get_turf(src) - message_admins("[key_name_admin(usr)] has ghosted. (JMP)") - log_game("[key_name_admin(usr)] has ghosted.") + var/special_role = check_special_role() + if(!istype(loc,/obj/machinery/cryopod)) + log_and_message_admins("has ghosted outside cryo[special_role ? " as [special_role]" : ""]. (JMP)",usr) + else if(special_role) + log_and_message_admins("has ghosted in cryo as [special_role]. (JMP)",usr) var/mob/observer/dead/ghost = ghostize(0) // 0 parameter is so we can never re-enter our body, "Charlie, you can never come baaaack~" :3 if(ghost) ghost.timeofdeath = world.time // Because the living mob won't have a time of death and we want the respawn timer to work properly. From 2cf7149607cb0cf29d0d36c405b5cc68ce68dc98 Mon Sep 17 00:00:00 2001 From: Cyantime Date: Sun, 4 Feb 2018 02:22:35 -0500 Subject: [PATCH 05/30] Makes containment fields and tesla bolts bypass gloves --- code/modules/power/singularity/containment_field.dm | 3 +-- code/modules/power/tesla/energy_ball.dm | 2 +- 2 files changed, 2 insertions(+), 3 deletions(-) diff --git a/code/modules/power/singularity/containment_field.dm b/code/modules/power/singularity/containment_field.dm index d57c133cd1..d8712a0e4c 100644 --- a/code/modules/power/singularity/containment_field.dm +++ b/code/modules/power/singularity/containment_field.dm @@ -53,7 +53,7 @@ if(isliving(user)) hasShocked = 1 var/shock_damage = min(rand(30,40),rand(30,40)) - user.electrocute_act(shock_damage, src) + user.electrocute_act(shock_damage, src, 1, BP_TORSO) var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) user.throw_at(target, 200, 4) @@ -61,7 +61,6 @@ sleep(20) hasShocked = 0 - return /obj/machinery/containment_field/proc/set_master(var/master1,var/master2) if(!master1 || !master2) diff --git a/code/modules/power/tesla/energy_ball.dm b/code/modules/power/tesla/energy_ball.dm index 71cb8a35e7..4327bbf42d 100644 --- a/code/modules/power/tesla/energy_ball.dm +++ b/code/modules/power/tesla/energy_ball.dm @@ -285,7 +285,7 @@ else if(closest_mob) var/shock_damage = Clamp(round(power/400), 10, 90) + rand(-5, 5) - closest_mob.electrocute_act(shock_damage, source, 1/*, tesla_shock = 1, stun = stun_mobs*/) + closest_mob.electrocute_act(shock_damage, source, 1, ran_zone()) if(issilicon(closest_mob)) var/mob/living/silicon/S = closest_mob if(stun_mobs) From 79f774e591fa8e1bd5fa7f80cf0f4dfa54ebec09 Mon Sep 17 00:00:00 2001 From: mistyLuminescence Date: Sun, 4 Feb 2018 21:17:51 +0000 Subject: [PATCH 06/30] Fixes syndie powertool toolboxes --- .../objects/items/weapons/storage/toolbox.dm | 39 ++++++++++--------- 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/code/game/objects/items/weapons/storage/toolbox.dm b/code/game/objects/items/weapons/storage/toolbox.dm index ec3f3e2631..21bebfa399 100644 --- a/code/game/objects/items/weapons/storage/toolbox.dm +++ b/code/game/objects/items/weapons/storage/toolbox.dm @@ -68,26 +68,29 @@ item_state_slots = list(slot_r_hand_str = "toolbox_syndi", slot_l_hand_str = "toolbox_syndi") origin_tech = list(TECH_COMBAT = 1, TECH_ILLEGAL = 1) force = 14 + var/powertools = FALSE + +/obj/item/weapon/storage/toolbox/syndicate/powertools + powertools = TRUE /obj/item/weapon/storage/toolbox/syndicate/New() // This is found in maint, so it should have the basics, plus some gloves. - ..() - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/weapon/screwdriver(src) - new /obj/item/weapon/wrench(src) - new /obj/item/weapon/weldingtool(src) - new /obj/item/weapon/crowbar(src) - new /obj/item/weapon/wirecutters(src) - new /obj/item/device/multitool(src) - -/obj/item/weapon/storage/toolbox/syndicate/powertools/New() // Available in the uplink and is the 'real' syndie toolbox. - // ..() isn't called or else this box would contain the basic tools, power tools, and duplicate gloves. - new /obj/item/clothing/gloves/yellow(src) - new /obj/item/weapon/screwdriver/power(src) - new /obj/item/weapon/weldingtool/experimental(src) - new /obj/item/weapon/crowbar/power(src) - new /obj/item/device/multitool(src) - new /obj/item/stack/cable_coil/random(src,30) - new /obj/item/device/analyzer(src) + ..() //all storage items need this to work properly! + if(powertools) + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/weapon/screwdriver/power(src) + new /obj/item/weapon/weldingtool/experimental(src) + new /obj/item/weapon/crowbar/power(src) + new /obj/item/device/multitool(src) + new /obj/item/stack/cable_coil/random(src,30) + new /obj/item/device/analyzer(src) + else + new /obj/item/clothing/gloves/yellow(src) + new /obj/item/weapon/screwdriver(src) + new /obj/item/weapon/wrench(src) + new /obj/item/weapon/weldingtool(src) + new /obj/item/weapon/crowbar(src) + new /obj/item/weapon/wirecutters(src) + new /obj/item/device/multitool(src) /obj/item/weapon/storage/toolbox/lunchbox max_storage_space = ITEMSIZE_COST_SMALL * 4 //slightly smaller than a toolbox From cee3066a415b04ba969503e5bbb730e8d544ba76 Mon Sep 17 00:00:00 2001 From: Andromeda-K22 Date: Sun, 4 Feb 2018 19:04:28 -0500 Subject: [PATCH 07/30] RUST additions and updates, Modular guns, and Lead. (#4667) * expanding rupture procs adds hydromagnetic traps for power production. * Minor tweaks. * Adds modular guns using research components. * Updates materials to have a radiation_resistance variable, used in calculating radiation. Adds Lead as a material. * Un-zeros stock material radiation resistance. * Adds, and enables four 'end-events' for the RUST in place of the old Rupture() proc. * Map muckery? * absolute pathing i guess? * getting angry, travis. * TRAVIS STAHP * I... Comments? Lists? Who the hell knows. --- code/datums/repositories/radiation.dm | 2 +- code/modules/materials/material_sheets.dm | 7 + code/modules/materials/materials.dm | 31 ++- code/modules/power/fusion/core/_core.dm | 2 +- code/modules/power/fusion/core/core_field.dm | 193 +++++++++++++++--- code/modules/power/fusion/fusion_reactions.dm | 3 +- code/modules/power/fusion/fusion_reagents.dm | 12 +- code/modules/power/fusion/magpower.dm | 54 +++++ code/modules/projectiles/guns/modular_guns.dm | 174 ++++++++++++++++ icons/obj/gun.dmi | Bin 80403 -> 84173 bytes icons/obj/machines/power/fusion.dmi | Bin 41882 -> 43629 bytes polaris.dme | 2 + 12 files changed, 440 insertions(+), 40 deletions(-) create mode 100644 code/modules/power/fusion/magpower.dm create mode 100644 code/modules/projectiles/guns/modular_guns.dm diff --git a/code/datums/repositories/radiation.dm b/code/datums/repositories/radiation.dm index 4755b982ec..5d06eccc77 100644 --- a/code/datums/repositories/radiation.dm +++ b/code/datums/repositories/radiation.dm @@ -116,7 +116,7 @@ var/global/repository/radiation/radiation_repository = new() else if(O.density) //So open doors don't get counted var/material/M = O.get_material() if(!M) continue - cached_rad_resistance += M.weight + cached_rad_resistance += M.radiation_resistance // Looks like storing the contents length is meant to be a basic check if the cache is stale due to items enter/exiting. Better than nothing so I'm leaving it as is. ~Leshana radiation_repository.resistance_cache[src] = (length(contents) + 1) diff --git a/code/modules/materials/material_sheets.dm b/code/modules/materials/material_sheets.dm index 0f76f6172e..d212851071 100644 --- a/code/modules/materials/material_sheets.dm +++ b/code/modules/materials/material_sheets.dm @@ -94,6 +94,13 @@ apply_colour = 1 no_variants = FALSE +/obj/item/stack/material/lead + name = "lead" + icon_state = "sheet-adamantine" + default_type = "lead" + apply_colour = 1 + no_variants = TRUE + /obj/item/stack/material/sandstone name = "sandstone brick" icon_state = "sheet-sandstone" diff --git a/code/modules/materials/materials.dm b/code/modules/materials/materials.dm index af5e1b7475..2fa2b1dbbe 100644 --- a/code/modules/materials/materials.dm +++ b/code/modules/materials/materials.dm @@ -99,6 +99,7 @@ var/list/name_to_material var/conductivity = null // How conductive the material is. Iron acts as the baseline, at 10. var/list/composite_material // If set, object matter var will be a list containing these values. var/luminescence + var/radiation_resistance = 20 // Radiation resistance, used in calculating how much radiation a material absorbs. Equivlent to weight, but does not affect weaponry. // Placeholder vars for the time being, todo properly integrate windows/light tiles/rods. var/created_window @@ -236,6 +237,7 @@ var/list/name_to_material weight = 22 stack_origin_tech = list(TECH_MATERIAL = 5) door_icon_base = "stone" + radiation_resistance = 80 //dense, so it's okay-ish as rad shielding. /material/diamond name = "diamond" @@ -261,6 +263,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 4) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + radiation_resistance = 120 //gold is dense. /material/gold/bronze //placeholder for ashtrays name = "bronze" @@ -276,7 +279,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 3) sheet_singular_name = "ingot" sheet_plural_name = "ingots" - + radiation_resistance = 22 //R-UST port /material/supermatter name = "supermatter" @@ -337,6 +340,7 @@ var/list/name_to_material door_icon_base = "stone" sheet_singular_name = "brick" sheet_plural_name = "bricks" + radiation_resistance = 22 /material/stone/marble name = "marble" @@ -345,6 +349,7 @@ var/list/name_to_material hardness = 100 integrity = 201 //hack to stop kitchen benches being flippable, todo: refactor into weight system stack_type = /obj/item/stack/material/marble + radiation_resistance = 26 /material/steel name = DEFAULT_WALL_MATERIAL @@ -391,6 +396,7 @@ var/list/name_to_material conductivity = 13 // For the purposes of balance. stack_origin_tech = list(TECH_MATERIAL = 2) composite_material = list(DEFAULT_WALL_MATERIAL = SHEET_MATERIAL_AMOUNT, "platinum" = SHEET_MATERIAL_AMOUNT) //todo + radiation_resistance = 60 //Plasteel is presumably dense and is the dominant material used in the engine. Still not great. // Very rare alloy that is reflective, should be used sparingly. /material/durasteel @@ -408,6 +414,7 @@ var/list/name_to_material reflectivity = 0.7 // Not a perfect mirror, but close. stack_origin_tech = list(TECH_MATERIAL = 8) composite_material = list("plasteel" = SHEET_MATERIAL_AMOUNT, "diamond" = SHEET_MATERIAL_AMOUNT) //shrug + radiation_resistance = 120 //it reflects XRAY LASERS. /material/plasteel/titanium name = "titanium" @@ -436,6 +443,7 @@ var/list/name_to_material window_options = list("One Direction" = 1, "Full Window" = 4, "Windoor" = 2) created_window = /obj/structure/window/basic rod_product = /obj/item/stack/material/glass/reinforced + radiation_resistance = 15 /material/glass/build_windows(var/mob/living/user, var/obj/item/stack/used_stack) @@ -527,6 +535,7 @@ var/list/name_to_material created_window = /obj/structure/window/reinforced wire_product = null rod_product = null + radiation_resistance = 30 /material/glass/phoron name = "borosilicate glass" @@ -554,6 +563,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 2) composite_material = list() //todo rod_product = null + radiation_resistance = 30 /material/plastic name = "plastic" @@ -568,6 +578,7 @@ var/list/name_to_material conductivity = 2 // For the sake of material armor diversity, we're gonna pretend this plastic is a good insulator. melting_point = T0C+371 //assuming heat resistant plastic stack_origin_tech = list(TECH_MATERIAL = 3) + radiation_resistance = 12 /material/plastic/holographic name = "holoplastic" @@ -618,6 +629,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 2) sheet_singular_name = "ingot" sheet_plural_name = "ingots" + radiation_resistance = 27 /material/iron name = "iron" @@ -627,6 +639,17 @@ var/list/name_to_material conductivity = 10 sheet_singular_name = "ingot" sheet_plural_name = "ingots" + radiation_resistance = 22 + +/material/lead + name = "lead" + stack_type = /obj/item/stack/material/lead + icon_colour = "#273956" + weight = 35 + conductivity = 10 + sheet_singular_name = "ingot" + sheet_plural_name = "ingots" + radiation_resistance = 350 //actual radiation shielding, yay... // Adminspawn only, do not let anyone get this. /material/alienalloy @@ -640,6 +663,7 @@ var/list/name_to_material hardness = 500 weight = 500 protectiveness = 80 // 80% + radiation_resistance = 500 // Likewise. /material/alienalloy/elevatorium @@ -697,6 +721,7 @@ var/list/name_to_material destruction_desc = "splinters" sheet_singular_name = "plank" sheet_plural_name = "planks" + radiation_resistance = 18 /material/wood/log name = MAT_LOG @@ -739,7 +764,7 @@ var/list/name_to_material stack_origin_tech = list(TECH_MATERIAL = 1) door_icon_base = "wood" destruction_desc = "crumples" - + radiation_resistance = 1 /material/snow name = MAT_SNOW stack_type = /obj/item/stack/material/snow @@ -756,7 +781,7 @@ var/list/name_to_material destruction_desc = "crumples" sheet_singular_name = "pile" sheet_plural_name = "pile" //Just a bigger pile - + radiation_resistance = 1 /material/cloth //todo name = "cloth" stack_origin_tech = list(TECH_MATERIAL = 2) diff --git a/code/modules/power/fusion/core/_core.dm b/code/modules/power/fusion/core/_core.dm index 760c46ea93..7f81b70ffd 100644 --- a/code/modules/power/fusion/core/_core.dm +++ b/code/modules/power/fusion/core/_core.dm @@ -77,7 +77,7 @@ var/list/fusion_cores = list() if(owned_field) icon_state = "core0" if(force_rupture || owned_field.plasma_temperature > 1000) - owned_field.Rupture() + owned_field.MRC() else owned_field.RadiateAll() qdel(owned_field) diff --git a/code/modules/power/fusion/core/core_field.dm b/code/modules/power/fusion/core/core_field.dm index 37351c53af..ef1c3716fa 100644 --- a/code/modules/power/fusion/core/core_field.dm +++ b/code/modules/power/fusion/core/core_field.dm @@ -1,6 +1,7 @@ #define FUSION_ENERGY_PER_K 20 #define FUSION_MAX_ENVIRO_HEAT 5000 //raise this if you want the reactor to dump more energy into the atmosphere -#define PLASMA_TEMP_RADIATION_DIVISIOR 15 //radiation divisior. plasma temp / divisor = radiation. +#define PLASMA_TEMP_RADIATION_DIVISIOR 20 //radiation divisior. plasma temp / divisor = radiation. + /obj/effect/fusion_em_field name = "electromagnetic field" @@ -19,6 +20,8 @@ var/tick_instability = 0 var/percent_unstable = 0 var/stable = 1 + var/id_tag + var/critical = 0 var/obj/machinery/power/fusion_core/owned_core var/list/dormant_reactant_quantities = list() @@ -31,7 +34,8 @@ /obj/structure/cable, /obj/machinery/atmospherics, /obj/machinery/air_sensor, - /mob/observer/dead + /mob/observer/dead, + /obj/machinery/power/hydromagnetic_trap ) var/light_min_range = 2 @@ -52,7 +56,7 @@ owned_core = new_owned_core if(!owned_core) qdel(src) - + id_tag = owned_core.id_tag //create the gimmicky things to handle field collisions var/obj/effect/fusion_particle_catcher/catcher @@ -194,37 +198,46 @@ if(percent_unstable >= 1) owned_core.Shutdown(force_rupture=1) else - if(percent_unstable > 0.5 && prob(percent_unstable*100)) + if(percent_unstable > 0.1 && prob(percent_unstable*100)) if(plasma_temperature < 2000) visible_message("\The [src] ripples uneasily, like a disturbed pond.") else var/flare var/fuel_loss var/rupture - if(percent_unstable < 0.2) + if(percent_unstable > 0.2) visible_message("\The [src] ripples uneasily, like a disturbed pond.") - fuel_loss = prob(5) - flare = prob(50) - else if(percent_unstable < 0.9) + flare = prob(25) + else if(percent_unstable > 0.5) visible_message("\The [src] undulates violently, shedding plumes of plasma!") flare = prob(50) fuel_loss = prob(20) rupture = prob(5) - else + else if(percent_unstable > 0.8) visible_message("\The [src] is wracked by a series of horrendous distortions, buckling and twisting like a living thing!") flare = 1 fuel_loss = prob(50) rupture = prob(25) if(rupture) - owned_core.Shutdown(force_rupture=1) + if(prob(80)) + MagneticQuench() + return + else if(prob(15)) + MRC() + return + else if(prob(5)) + QuantumFluxCascade() + return + else if(prob(5)) + BluespaceQuenchEvent() + return else var/lost_plasma = (plasma_temperature*percent_unstable) radiation += lost_plasma if(flare) - radiation += plasma_temperature/2 - plasma_temperature -= lost_plasma - + spawn(1) + emflare() if(fuel_loss) for(var/particle in dormant_reactant_quantities) var/lost_fuel = dormant_reactant_quantities[particle]*percent_unstable @@ -234,17 +247,19 @@ dormant_reactant_quantities.Remove(particle) Radiate() return - -/obj/effect/fusion_em_field/proc/Rupture() - visible_message("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!") - set_light(15, 15, "#CCCCFF") - empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300)) - sleep(5) - global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor") - RadiateAll() - explosion(get_turf(owned_core),-1,-1,8,10) // Blow out all the windows. - return - +/*/obj/effect/fusion_em_field/proc/CheckCriticality() + if (plasma_temperature > 70000) + critical += 0.2 + else if (instability > 0.45) + critical += 0.6 + if(critical >= 25 && prob(percent_unstable*100)) + if (critical >= 90) + visible_message("\The [src] rumbles and quivers violently, threatening to break free!") + else if(critical >= 50) + visible_message("\The [src] rumbles and quivers energetically, the walls distorting slightly.") + else if(critical >= 25) + visible_message("\The [src] rumbles and quivers slightly, vibrating the deck.") +*/ /obj/effect/fusion_em_field/proc/ChangeFieldStrength(var/new_strength) var/calc_size = 1 if(new_strength <= 50) @@ -490,19 +505,19 @@ //All procs below this point are called in _core.dm, starting at line 41. //Stability monitoring. Gives radio annoucements if field stability is below 80% /obj/effect/fusion_em_field/proc/stability_monitor() - var/warnpoint = 0.10 + var/warnpoint = 0.10 //start warning at 10% instability var/warnmessage = "Warning! Field unstable! Instability at [percent_unstable * 100]%, plasma temperature at [plasma_temperature + 295]k." var/stablemessage = "Containment field returning to stable conditions." - if(percent_unstable >= warnpoint) + if(percent_unstable >= warnpoint) //we're unstable, start warning engineering global_announcer.autosay(warnmessage, "Field Stability Monitor", "Engineering") - stable = 0 - sleep(20 SECONDS) - return - if(percent_unstable < warnpoint && stable == 0) + stable = 0 //we know we're not stable, so let's not state the safe message. + sleep(20) + return + if(percent_unstable < warnpoint && stable == 0) //The field is stable again. Let's set our safe variable and state the safe message. global_announcer.autosay(stablemessage, "Field Stability Monitor", "Engineering") stable = 1 - return + return //Reaction radiation is fairly buggy and there's at least three procs dealing with radiation here, this is to ensure constant radiation output. /obj/effect/fusion_em_field/proc/radiation_scale() @@ -513,7 +528,8 @@ if(owned_core && owned_core.loc) var/datum/gas_mixture/environment = owned_core.loc.return_air() if(environment && environment.temperature < (T0C+FUSION_MAX_ENVIRO_HEAT)) - environment.add_thermal_energy(plasma_temperature*20000) + environment.add_thermal_energy(plasma_temperature*5000) + check_instability() //Temperature changes depending on color. /obj/effect/fusion_em_field/proc/temp_color() @@ -538,8 +554,121 @@ light_max_range = 5 light_max_power = 5 return +//moved the flare to a proc for various reasons. Called on line 225. +/obj/effect/fusion_em_field/proc/emflare() + radiation += plasma_temperature/2 + light_color = "#ff0000" + light_max_power = 30 + light_min_power = 30 + light_min_range = 30 + light_max_range = 30 + visible_message("\The [src] flares to eye-searing brightness!") + sleep(60) + temp_color() + //plasma_temperature -= lost_plasma + return +//Rupture() is no longer the end all be all. Fear the magnetic resonance cascade and quantum flux cascade +/obj/effect/fusion_em_field/proc/Rupture() + visible_message("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!") + set_light(15, 15, "#CCCCFF") + empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300)) + global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor") + RadiateAll() + var/list/things_in_range = range(10, owned_core) + var/list/turfs_in_range = list() + var/turf/T + for (T in things_in_range) + turfs_in_range.Add(T) + + explosion(pick(things_in_range), -1, 5, 5, 5) + empulse(pick(things_in_range), ceil(plasma_temperature/1000), ceil(plasma_temperature/300)) + spawn(25) + explosion(pick(things_in_range), -1, 5, 5, 5) + spawn(25) + explosion(pick(things_in_range), -1, 5, 5, 5) + spawn(25) + explosion(pick(things_in_range), -1, 5, 5, 5) + spawn(10) + explosion(pick(things_in_range), -1, 5, 5, 5) + spawn(10) + explosion(pick(things_in_range), -1, 5, 5, 5) + spawn(10) + explosion(pick(things_in_range), -1, 5, 5, 5) + return + +/obj/effect/fusion_em_field/proc/MRC() //spews electromagnetic pulses in an area around the core. + visible_message("\The [src] glows an extremely bright pink and flares out of existance!") + global_announcer.autosay("Warning! Magnetic Resonance Cascade detected! Brace for electronic system distruption.", "Field Stability Monitor") + set_light(15, 15, "#ff00d8") + var/list/things_in_range = range(15, owned_core) + var/list/turfs_in_range = list() + var/turf/T + for (T in things_in_range) + turfs_in_range.Add(T) + for(var/loopcount = 1 to 10) + spawn(200) + empulse(pick(things_in_range), 10, 15) + Destroy() + return + +/obj/effect/fusion_em_field/proc/QuantumFluxCascade() //spews hot phoron and oxygen in a radius around the RUST. Will probably set fire to things + global_announcer.autosay("Warning! Quantum fluxuation detected! Flammable gas release expected.", "Field Stability Monitor") + var/list/things_in_range = range(15, owned_core) + var/list/turfs_in_range = list() + var/turf/T + for (T in things_in_range) + turfs_in_range.Add(T) + for(var/loopcount = 1 to 10) + var/turf/TT = get_turf(pick(turfs_in_range)) + if(istype(TT)) + var/datum/gas_mixture/plasma = new + plasma.adjust_gas("oxygen", (size*100), 0) + plasma.adjust_gas("phoron", (size*100), 0) + plasma.temperature = (plasma_temperature/2) + plasma.update_values() + TT.assume_air(plasma) + TT.hotspot_expose(plasma_temperature) + plasma = null + Destroy() + return + +/obj/effect/fusion_em_field/proc/MagneticQuench() //standard hard shutdown. dumps hot oxygen/phoron into the core's area and releases an EMP in the area around the core. + global_announcer.autosay("Warning! Magnetic Quench event detected, engaging hard shutdown.", "Field Stability Monitor") + empulse(owned_core, 10, 15) + var/turf/TT = get_turf(owned_core) + if(istype(TT)) + var/datum/gas_mixture/plasma = new + plasma.adjust_gas("oxygen", (size*100), 0) + plasma.adjust_gas("phoron", (size*100), 0) + plasma.temperature = (plasma_temperature/2) + plasma.update_values() + TT.assume_air(plasma) + TT.hotspot_expose(plasma_temperature) + plasma = null + Destroy() + owned_core.Shutdown() + return + +/obj/effect/fusion_em_field/proc/BluespaceQuenchEvent() //!!FUN!! causes a number of explosions in an area around the core. Will likely destory or heavily damage the reactor. + visible_message("\The [src] shudders like a dying animal before flaring to eye-searing brightness and rupturing!") + set_light(15, 15, "#CCCCFF") + empulse(get_turf(src), ceil(plasma_temperature/1000), ceil(plasma_temperature/300)) + global_announcer.autosay("WARNING: FIELD RUPTURE IMMINENT!", "Containment Monitor") + RadiateAll() + var/list/things_in_range = range(10, owned_core) + var/list/turfs_in_range = list() + var/turf/T + for (T in things_in_range) + turfs_in_range.Add(T) + for(var/loopcount = 1 to 10) + explosion(pick(things_in_range), -1, 5, 5, 5) + empulse(pick(things_in_range), ceil(plasma_temperature/1000), ceil(plasma_temperature/300)) + Destroy() + owned_core.Shutdown() + return + #undef FUSION_HEAT_CAP #undef FUSION_MAX_ENVIRO_HEAT #undef PLASMA_TEMP_RADIATION_DIVISIOR \ No newline at end of file diff --git a/code/modules/power/fusion/fusion_reactions.dm b/code/modules/power/fusion/fusion_reactions.dm index 38f73812f9..623f70bd6b 100644 --- a/code/modules/power/fusion/fusion_reactions.dm +++ b/code/modules/power/fusion/fusion_reactions.dm @@ -117,7 +117,7 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) var/turf/origin = get_turf(holder) holder.Rupture() qdel(holder) - var/radiation_level = rand(100, 200) + var/radiation_level = 200 // Copied from the SM for proof of concept. //Not any more --Cirra //Use the whole z proc --Leshana radiation_repository.z_radiate(locate(1, 1, holder.z), radiation_level, 1) @@ -141,7 +141,6 @@ proc/get_fusion_reaction(var/p_react, var/s_react, var/m_energy) return 1 - // High end reactions. /decl/fusion_reaction/boron_hydrogen p_react = "boron" diff --git a/code/modules/power/fusion/fusion_reagents.dm b/code/modules/power/fusion/fusion_reagents.dm index 875bf63fee..80b1cbb336 100644 --- a/code/modules/power/fusion/fusion_reagents.dm +++ b/code/modules/power/fusion/fusion_reagents.dm @@ -5,4 +5,14 @@ description = "A colorless, odorless, tasteless and generally inert gas used in fusion reactors. Non-radioactive." id = "helium-3" reagent_state = GAS - color = "#808080" \ No newline at end of file + color = "#808080" + +/obj/structure/reagent_dispensers/he3 + name = "fueltank" + desc = "A fueltank." + icon = 'icons/obj/objects.dmi' + icon_state = "weldtank" + amount_per_transfer_from_this = 10 + New() + ..() + reagents.add_reagent("helium-3",1000) \ No newline at end of file diff --git a/code/modules/power/fusion/magpower.dm b/code/modules/power/fusion/magpower.dm new file mode 100644 index 0000000000..c6882c6eb3 --- /dev/null +++ b/code/modules/power/fusion/magpower.dm @@ -0,0 +1,54 @@ +#define ENERGY_PER_K 20 +#define MINIMUM_PLASMA_TEMPERATURE 10000 + +/obj/machinery/power/hydromagnetic_trap + name = "\improper hydromagnetic trap" + desc = "A device for extracting power from high-energy plasma in toroidal fields." + icon = 'icons/obj/machines/power/fusion.dmi' + icon_state = "mag_trap0" + anchored = 1 + var/list/things_in_range = list()//what is in a radius of us? + var/list/fields_in_range = list()//What EM fields are in that radius? + var/list/active_field = list()//Our active field. + var/active = 0 //are we even on? + var/id_tag //needed for !!rasins!! + +/obj/machinery/power/hydromagnetic_trap/process() + if(!powernet && anchored == 1) + return + spawn(1) + Active() + Search() + +/obj/machinery/power/hydromagnetic_trap/proc/Search()//let's not have +100 instances of the same field in active_field. + things_in_range = range(7, src) + var/obj/effect/fusion_em_field/FFF + for (FFF in things_in_range) + fields_in_range.Add(FFF) + for (FFF in fields_in_range) + if (active_field.len > 0) + return + else if (active_field.len == 0) + Link() + return + +/obj/machinery/power/hydromagnetic_trap/proc/Link() //discover our EM field + var/obj/effect/fusion_em_field/FFF + for(FFF in fields_in_range) + if (FFF.id_tag != id_tag) + return + active_field += FFF + active = 1 + return + +/obj/machinery/power/hydromagnetic_trap/proc/Active()//POWERRRRR + var/obj/effect/fusion_em_field/FF + if (active == 0) + return + for (FF in active_field) + if (FF.plasma_temperature >= MINIMUM_PLASMA_TEMPERATURE) + icon_state = "mag_trap1" + add_avail(ENERGY_PER_K * FF.plasma_temperature) + if (FF.plasma_temperature <= MINIMUM_PLASMA_TEMPERATURE) + icon_state = "mag_trap0" + return diff --git a/code/modules/projectiles/guns/modular_guns.dm b/code/modules/projectiles/guns/modular_guns.dm new file mode 100644 index 0000000000..8f81e971c4 --- /dev/null +++ b/code/modules/projectiles/guns/modular_guns.dm @@ -0,0 +1,174 @@ +//This will likely drive me insane, but fuck it. Let's give it a shot. -k22 +//This was heavily assisted by MoondancerPony +/obj/item/weapon/gun/energy/modular + name = "modular weapon" + desc = "You shouldn't be seeing this. Contact your local time-police station." + icon_state = "mod_pistol" + cell_type = /obj/item/weapon/cell/device/weapon + charge_cost = 120 + + var/max_components = 3 //How many components we can hold. + var/capacitor_rating = 0 //How good are the capacitors inside us? + var/laser_rating = 0 //How good are the lasers inside of us? + var/manipulator_rating = 0 //How good are the manipulators inside us? + var/assembled = 1 //Are we closed up? + var/max_burst_size = 5 //Don't let our maximum burst size get too high. + var/list/guncomponents = list() //Generate our list of components. + var/accepted_components = list( + /obj/item/weapon/stock_parts/capacitor/, + /obj/item/weapon/stock_parts/capacitor/adv, + /obj/item/weapon/stock_parts/capacitor/super, + /obj/item/weapon/stock_parts/micro_laser/, + /obj/item/weapon/stock_parts/micro_laser/high, + /obj/item/weapon/stock_parts/micro_laser/ultra, + /obj/item/weapon/stock_parts/manipulator/, + /obj/item/weapon/stock_parts/manipulator/nano, + /obj/item/weapon/stock_parts/manipulator/pico, + ) + //Excessively long because it won't accept subtypes for some reason! + + +/obj/item/weapon/gun/energy/modular/New() //Initialize our components. + ..() + guncomponents = list() + guncomponents += new /obj/item/weapon/stock_parts/capacitor + guncomponents += new /obj/item/weapon/stock_parts/micro_laser + guncomponents += new /obj/item/weapon/stock_parts/manipulator + CheckParts() + FireModeModify() + +/obj/item/weapon/gun/energy/modular/proc/CheckParts() //What parts do we have inside us, and how good are they? + capacitor_rating = 0 + laser_rating = 0 + manipulator_rating = 0 + for(var/obj/item/weapon/stock_parts/capacitor/CA in guncomponents) + capacitor_rating += CA.rating + for(var/obj/item/weapon/stock_parts/micro_laser/ML in guncomponents) + laser_rating += ML.rating + for(var/obj/item/weapon/stock_parts/manipulator/MA in guncomponents) + manipulator_rating += MA.rating + FireModeModify() + +/obj/item/weapon/gun/energy/modular/attackby(obj/item/O, mob/user) + if(istype(O, /obj/item/weapon/screwdriver)) + to_chat(user, "You [assembled ? "disassemble" : "assemble"] the gun.") + assembled = !assembled + playsound(src, O.usesound, 50, 1) + return + if(istype(O, /obj/item/weapon/crowbar)) + if(assembled == 1) + to_chat(user, "Disassemble the [src] first!") + return + for(var/obj/item/I in guncomponents) + to_chat(user, "You remove the gun's components.") + playsound(src, O.usesound, 50, 1) + I.forceMove(get_turf(src)) + guncomponents.Remove(I) + CheckParts() + return + //Someone's attacking us, and it's not anything we have a special case for (i.e. a tool) + ..() + if(assembled) // can't put anything in + return + if(!(O.type in accepted_components))//check if we can accept it + to_chat(user, "You can't add this to [src]!") + return + if(guncomponents.len >= max_components) //We have too many componenets and can't fit more. + to_chat(user, "You can't add any more components!") + return + if(istype(O, /obj/item/weapon/stock_parts/capacitor) && capacitor_rating == 5) + to_chat(user, "You can't add any more capacitors!") + return + user.drop_item() + guncomponents += O + O.forceMove(src) + to_chat(user, "You add a component to the [src]") + CheckParts() + + +/obj/item/weapon/gun/energy/modular/proc/FireModeModify() //Check our laser, manipulator, and capacitor ratings, adjust stun and lethal firemodes depending on laser / manipulator rating and burst size depending on capacitors. + //check our lethal and stun ratings depending on laser and manipulator rating. + var/burstmode = capacitor_rating + var/beammode + var/beammode_lethal + var/chargecost + var/chargecost_lethal + + if(laser_rating >= 15) + beammode_lethal = /obj/item/projectile/beam/sniper + beammode = /obj/item/projectile/beam/stun + chargecost = 300 + chargecost_lethal = 600 + else if(laser_rating >= 10) + beammode_lethal = /obj/item/projectile/beam/xray + beammode = /obj/item/projectile/beam/stun + chargecost = 300 + chargecost_lethal = 200 + else if(laser_rating == 8 && manipulator_rating == 5) //very specific set of combinations. No, you can't make a pulse rifle. Sorry research. + beammode_lethal = /obj/item/projectile/beam/heavylaser + beammode = /obj/item/projectile/beam/stun + chargecost = 300 + chargecost_lethal = 600 + else if(laser_rating >= 5) + beammode_lethal = /obj/item/projectile/beam/midlaser + beammode = /obj/item/projectile/beam/stun/med + chargecost = 180 + chargecost_lethal = 240 + else if(laser_rating < 5) + beammode_lethal = /obj/item/projectile/beam/weaklaser + beammode = /obj/item/projectile/beam/stun/weak + chargecost = 100 + chargecost_lethal = 200 + + firemodes = list( + new /datum/firemode(src, list(mode_name="stun", projectile_type=beammode, fire_sound='sound/weapons/Taser.ogg', charge_cost = chargecost)), + new /datum/firemode(src, list(mode_name="lethal", projectile_type=beammode_lethal, fire_sound='sound/weapons/Laser.ogg', charge_cost = chargecost_lethal)), + new /datum/firemode(src, list(mode_name="[burstmode] shot stun", projectile_type=beammode, fire_sound='sound/weapons/Taser.ogg', charge_cost = chargecost, burst = burstmode)), + new /datum/firemode(src, list(mode_name="[burstmode] shot lethal", projectile_type=beammode_lethal, fire_sound='sound/weapons/Laser.ogg', charge_cost = chargecost_lethal, burst = burstmode)), + ) + +/obj/item/weapon/gun/energy/modular/load_ammo(var/obj/item/C, mob/user) + if(istype(C, cell_type)) + if(self_recharge || battery_lock) + user << "[src] does not have a battery port." + return + var/obj/item/weapon/cell/P = C + if(power_supply) + user << "[src] already has a power cell." + else + user.visible_message("[user] is reloading [src].", "You start to insert [P] into [src].") + if(do_after(user, 10)) + user.remove_from_mob(P) + power_supply = P + P.loc = src + user.visible_message("[user] inserts [P] into [src].", "You insert [P] into [src].") + playsound(src.loc, 'sound/weapons/flipblade.ogg', 50, 1) + update_icon() + update_held_icon() + return + +/obj/item/weapon/gun/energy/modular/pistol + name = "modular pistol" + icon_state = "mod_pistol" + max_components = 6 + desc = "A bulky modular pistol frame. This only only accepts six parts." + origin_tech = list(TECH_COMBAT = 3, TECH_MAGNET = 3) + burst_delay = 2 + +/obj/item/weapon/gun/energy/modular/carbine + name = "modular carbine" + icon_state = "mod_carbine" + max_components = 8 + desc = "A modular version of the standard laser carbine. This one can hold 8 components." + origin_tech = list(TECH_COMBAT = 4, TECH_MAGNET = 3, TECH_MATERIAL = 3) + burst_delay = 2 + +/obj/item/weapon/gun/energy/modular/cannon + name = "modular cannon" + icon_state = "mod_cannon" + max_components = 14 + desc = "Say hello, to my little friend!" + one_handed_penalty = 4 //dual wielding = no. + cell_type = /obj/item/weapon/cell //We're bigger. We can use much larger power cells. + origin_tech = list(TECH_COMBAT = 6, TECH_MAGNET = 6, TECH_MATERIAL = 5, TECH_BLUESPACE = 4) //its a damn cannon capable of holding a huge amount of parts. + burst_delay = 4 //preventing extreme silliness. \ No newline at end of file diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index d7a107da9409dea8225d7fac0c65ca8490279dd0..a9c1789bf4eede81136696a9307a0fecb85a87e9 100644 GIT binary patch delta 25619 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∿sNnS)ex-&dKYoZ35EX732 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 diff --git a/icons/obj/machines/power/fusion.dmi b/icons/obj/machines/power/fusion.dmi index be236a145e92ccaeff823cf155eb368bcdad8873..4d20f04fcdae319fcf48993d06e7f4f208402a02 100644 GIT binary patch delta 3695 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 GJ^dfV45VHF delta 1943 zcmYk6eLU0a8^^yRp@hy+RG!j29F;k>oKDtuN{-gyD5*J3n#4Q~rD$wlhv@uD7E38i z+4NxIi0)~-2dFy^?H9kpX<6`_f)sm9j?}OC>TNX z^@}?Yd@ks0SWH}4Gywn-@{4b@5nebOyZ5$W{Qf=9Y&sweKKi%g`svkKv37$la;XQ=>%$`U)X{0WZP5)?n z9g5qP7neA;X(Yo#uQBk~mdfKnAa2)IS*cqXZZ}2$%0nQ-PAe()WPBi#TYC298~L?c z>*wR}MlRu`^sXb14q91XiCECTLLj?e+D2`u8t8Huo(yg0ofsSWUr(ucboBJF zg-;S~U~_ZOkVW=CKCPRZwmM#RKK>-(eHSSjw`UDWaA_@lqH~m`Mzw9d{03ApTpxct zwP*g>y7Gi(reMvr-m$r$O)l(-M}xtQZ9_JzR~4iEi0mGhz$)!q|KvO(&mGOOc79?8 ztJl;#6w|zV1N;HN8bBY|=bKPj0a4|FZ14^1?e2_W%Dt|26{ByA32+PI(^Tz_0tf#Z zzI)7u+G56v+LP&-^;7AkYv6C{bOQ`w9_**+-z?4hTl#$s9j6JQ4^kB?mB*mUQw%7% z;OhcJcH&AY_r=Etz2yOd3B|&F&$YD0eHoQ>nZRVcCXcnZk3{{;Y07KjlZ^`BeqXcnRWF@?Y6@<5YM3+d z7ZebWSuffMcFufxd$nDfN|$lh&+GW~Dvf-mZfvf@l2l9@XQG@lL}OT7z9wL|i2gME zG9ex;W6g2Kg=`cx_QNbliaIzR`#$d`s%>C^Ha9otR83Lt#R)n$Q2M6cz3OaYbx@89 zui7krUUFIb5mqK+KVrE?yu=c}v6s^8UduNhTfqsBSYkqL72bx(v1Q|vRf;GHT=Gf` zYiQ;s7e4`0R9N%GR|Rmp(4NWj=l57FS{AevDn1_v_o76Tt?T~Af*PPiDi>X6r9`&~ z$cc@U;z9P)_-9M!yEpBcc{<6I-PW_$^`=HeN2*ga`E~4#zFdeX=^io_yCh#*69q&DxPehSSboSw~H zjkpjdGj%wc>{^gH`;tPO<|%rq7y7e9RD1`em@07*QK6FH=R=%Zn2lBz9)A=__J6YJ zzXi+MNI9{?3LB0HM{~DdEKKCn!MFHIkErKmwxq~w)dQonxc=79_8&y%8s&O{YLrK3 zTq`;#C+>abe&ognI})lc$|P73Bnalk7YPY%GDJ{@C;c8H=L~|kGu(_`NP}uvfoIzN zCNI*mDi+WZn4Z?~McNF4S0#wr1$9Fz#V|ZseRDvA;t0LkU?9;Ifq>Tq@ccB#+|u%9 zAEsGD1-S#Quv6VtT=ydkYrP%kroXsn1yl=i@H|?UH&SURo0Qky>G<@1*b+r9t*)*< zbCK_oZIUtY&gimR9k@iEaB0g$#SZ^EzgVw%x7~{i3R`p`lH_BSUX094;v%0-hHz55 z$ipOXez3*9FezSXN-~tO{=#DOYC9@M*=Id!`@AoE{^*{io+i=t@uAY?E{xJiczd>E zx?YlJt=AptLKXd6gU>7yK??^k_zsat!AI0Fbif-vpo5mTxQNW5Sp{;UOZ852Uh8 zda`9US=NOtlTMThF%P; z$C%uHiDIGTI5XR~#0!OlkB_?6x^{kXnSLF)B}0QtF#^n4&W!VR(#@Nj4V2K98zK*0PSpq;$M1P8=0X5m#K zmA94RL&huq*!gS&KuGb~I~Y=IwF_LpQIQ7xsPKYtmb%Uvrs(V!`0Pwqrpm( zK)~T)w{a8B`LOYdoSJCS#-A+7cfV@=_H$Zd!}yZ{YduHh2$Ogkh!Om}TI>IU#jqE} z+$4MOu{O~DyOG)VHoD<(SEGb?dw_;W|4Z6{hm$-n#>5|RDAy=kxpo@;;(0_`a! Q0Qvyh{m%ns`*A7%0aRo8`Tzg` diff --git a/polaris.dme b/polaris.dme index 5cc6b381fb..da4169efe1 100644 --- a/polaris.dme +++ b/polaris.dme @@ -2016,6 +2016,7 @@ #include "code\modules\power\fusion\fusion_particle_catcher.dm" #include "code\modules\power\fusion\fusion_reactions.dm" #include "code\modules\power\fusion\fusion_reagents.dm" +#include "code\modules\power\fusion\magpower.dm" #include "code\modules\power\fusion\core\_core.dm" #include "code\modules\power\fusion\core\core_control.dm" #include "code\modules\power\fusion\core\core_field.dm" @@ -2058,6 +2059,7 @@ #include "code\modules\projectiles\ammunition\rounds.dm" #include "code\modules\projectiles\guns\energy.dm" #include "code\modules\projectiles\guns\launcher.dm" +#include "code\modules\projectiles\guns\modular_guns.dm" #include "code\modules\projectiles\guns\projectile.dm" #include "code\modules\projectiles\guns\vox.dm" #include "code\modules\projectiles\guns\energy\laser.dm" From 00ed88764f9145ed6c38306527b2de1db51e7ad2 Mon Sep 17 00:00:00 2001 From: elgeonmb Date: Sun, 4 Feb 2018 16:15:42 -0800 Subject: [PATCH 08/30] 2/3/18 news update (#4713) * adds an e-reader full of news to the loadout * Political Almanac -> Pocket Newscaster * news update --- code/modules/lore_codex/news_data/main.dm | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/code/modules/lore_codex/news_data/main.dm b/code/modules/lore_codex/news_data/main.dm index 52ff382199..fec4ae7c3e 100644 --- a/code/modules/lore_codex/news_data/main.dm +++ b/code/modules/lore_codex/news_data/main.dm @@ -5,6 +5,7 @@ articles. You are encouraged to check back frequently." children = list( /datum/lore/codex/page/article1, + /datum/lore/codex/page/article2, /datum/lore/codex/page/about_news, ) @@ -31,4 +32,17 @@

\ The bill passed fairly quietly this afternoon, owing to the closed nature of the Bicamarial. A post-facto Occulum poll of voting-age\ VGA citizens suggest that fully 80% of them did not even know what a Promethean was prior to the most recent general election. A\ - follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation." \ No newline at end of file + follow-up poll indicates that an appreciable number of Sivians do not support the framework's current implementation." + +/datum/lore/codex/page/article2 + name = "2/3/62-- Corporate Coup on Aetolus" + data = "A recent incident aboard the NRS Prometheus issued in a major change in the leadership of the Promethean homeworld. During \ + a late-night meeting of the Nanotrasen Board of Trustees, several high-ranking personnel, including Head of Research Naomi Harper,\ + announced their intention to assume direct control of Nanotrasen facilities in the system. It is known that several dissenting \ + members of the board were shot to death by Promethean test subjects. Our information comes from a survivor of the coup, who for \ + reasons of security has chosen to remain annonymous. All outbound shipments affiliated with Nanotrasen have ceased.\ +

\ + While neither Grayson Manufacturies nor Nanotrasen have made an official statement, Nanotrasen CEO Albary Moravec has called the \ + incident \"shocking, if the allegations are to be believed\" and has assured shareholders that Nanotrasen will respond to the \ + incident with as much force as it warrents.

Requests for a statement directed to the Board of Trustees or Dr. Harper were \ + not responded to. Free Traders are recommended to stay clear of the region until the situation resolves itself." From da4bd82a5d2af51f2987151266f7674f6768d960 Mon Sep 17 00:00:00 2001 From: mistyLuminescence <32139558+mistyLuminescence@users.noreply.github.com> Date: Mon, 5 Feb 2018 04:18:36 +0000 Subject: [PATCH 09/30] Adds more med gear to R&D and Cargo (#4691) * Adds more med gear to R&D and Cargo * standardises + adds sprites * Removes cargo crate --- code/datums/supplypacks/medical.dm | 4 ++-- code/game/objects/items/devices/scanners.dm | 18 +++++++++++------- .../objects/items/weapons/storage/firstaid.dm | 3 ++- code/modules/research/designs.dm | 9 +++++++++ icons/obj/device.dmi | Bin 63215 -> 61418 bytes 5 files changed, 24 insertions(+), 10 deletions(-) diff --git a/code/datums/supplypacks/medical.dm b/code/datums/supplypacks/medical.dm index bfaf2658bf..2c2e26d97d 100644 --- a/code/datums/supplypacks/medical.dm +++ b/code/datums/supplypacks/medical.dm @@ -330,8 +330,8 @@ access = access_cmo /datum/supply_packs/med/defib - name = "Defibrilator crate" + name = "Defibrillator crate" contains = list(/obj/item/device/defib_kit = 2) cost = 30 containertype = /obj/structure/closet/crate/medical - containername = "Defibrilator crate" \ No newline at end of file + containername = "Defibrillator crate" \ No newline at end of file diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 4187cfc422..ae255d2f7b 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -266,22 +266,26 @@ REAGENT SCANNER if(0) to_chat(usr, "The scanner will now perform a basic analysis.") -/obj/item/device/healthanalyzer/improved //reports bone fractures, IB, quantity of beneficial reagents in stomach; also regular health analyzer stuff +/obj/item/device/healthanalyzer/advanced //reports bone fractures, IB, quantity of beneficial reagents in stomach; also regular health analyzer stuff name = "advanced health analyzer" desc = "A miracle of medical technology, this handheld scanner can produce an accurate and specific report of a patient's biosigns." advscan = 1 origin_tech = list(TECH_MAGNET = 5, TECH_BIO = 6) - icon_state = "advhealth" + icon_state = "health1" -/obj/item/device/healthanalyzer/advanced //reports all of the above, as well as radiation severity and minor brain damage - name = "advanced health analyzer" +/obj/item/device/healthanalyzer/enhanced //reports all of the above, as well as radiation severity and minor brain damage + name = "enhanced health analyzer" + desc = "An even more advanced handheld health scanner, complete with a full biosign monitor and on-board radiation and neurological analysis suites." advscan = 2 - icon_state = "advhealth" + origin_tech = list(TECH_MAGNET = 6, TECH_BIO = 7) + icon_state = "health2" -/obj/item/device/healthanalyzer/enhanced //reports all of the above, as well as name and quantity of nonmed reagents in stomach +/obj/item/device/healthanalyzer/phasic //reports all of the above, as well as name and quantity of nonmed reagents in stomach name = "phasic health analyzer" + desc = "Possibly the most advanced health analyzer to ever have existed, utilising bluespace technology to determine almost everything worth knowing about a patient." advscan = 3 - icon_state = "advhealth" + origin_tech = list(TECH_MAGNET = 7, TECH_BIO = 8) + icon_state = "health3" /obj/item/device/analyzer name = "analyzer" diff --git a/code/game/objects/items/weapons/storage/firstaid.dm b/code/game/objects/items/weapons/storage/firstaid.dm index 24ba099e8f..43b7c9e22b 100644 --- a/code/game/objects/items/weapons/storage/firstaid.dm +++ b/code/game/objects/items/weapons/storage/firstaid.dm @@ -128,6 +128,7 @@ new /obj/item/weapon/storage/pill_bottle/spaceacillin(src) new /obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/clotting(src) new /obj/item/stack/medical/splint(src) + new /obj/item/device/healthanalyzer/advanced(src) return /obj/item/weapon/storage/firstaid/surgery @@ -149,7 +150,7 @@ new /obj/item/weapon/surgical/bonegel(src) new /obj/item/weapon/surgical/FixOVein(src) new /obj/item/stack/medical/advanced/bruise_pack(src) - new /obj/item/device/healthanalyzer/advanced(src) + new /obj/item/device/healthanalyzer/enhanced(src) return /obj/item/weapon/storage/firstaid/clotting diff --git a/code/modules/research/designs.dm b/code/modules/research/designs.dm index dc4401f0bc..a6e158befa 100644 --- a/code/modules/research/designs.dm +++ b/code/modules/research/designs.dm @@ -491,6 +491,15 @@ other types of metals and chemistry for reagents). build_path = /obj/item/roller/adv sort_string = "MBBAF" +/datum/design/item/medical/enhanced_analyzer + name = "enhanced health analyzer" + desc = "A prototype version of the regular health analyzer, able to distinguish the location of more serious injuries as well as accurately determine radiation levels." + id = "advanced_analyzer" + req_tech = list(TECH_MAGNET = 5, TECH_BIO = 6) + materials = list(DEFAULT_WALL_MATERIAL = 2000, "glass" = 1000, "silver" = 1000, "gold" = 1500) + build_path = /obj/item/device/healthanalyzer/advanced + sort_string = "MBBAG" + /datum/design/item/implant materials = list(DEFAULT_WALL_MATERIAL = 50, "glass" = 50) diff --git a/icons/obj/device.dmi b/icons/obj/device.dmi index c6d991962720a72500be2ffacc21d9774f410aa4..e0e3305d44fb5473fb183c1024eb1d1db40a055f 100644 GIT binary patch literal 61418 zcmdSAcT|(z7Csn21d(2(8xR$xi1eNyMNmONX-X56E+D;y1O!1rrHg_PiULxV-UA|n zv>?5Q&^w_gq)pKK-F5H%ty!~X{+o9#QV!>RbILBye)c}EjPB|(G4L?}005?2dfN8@ z0O~BtUl{#qN{d!}*B$_H3KDE$;j8W7^Vr+vnXikd2LKTGvE)H-Vy*%!Xwncp(d2lK z#Jhc*c*nKoUPxy%^`+R;l_D2!v-^L{j|1@YX!y?ego{0e5p&G~V3N4KCFC}Yh^@mN z9>pEdzUF%9P8w?@HCvaJUhw}wel}KS&ihi%rjQYex~aVd zb8kp&IqfqiUuNc>3(q+FLoul5PilT5QCrAhhgmTbf(h}e@DC)Br&IfwE9|qM! z@?An+JyFnVDl`rmO3FCO31$v8l<18lf)!lHeO!{;HlI*GX}mP&KUh0I2A>(c`s;m+ z2pxOgaO3G=Uor1Zh`}sLp*9SGPsq-GB!r=9owvYzowCnix+0D})am9yHmL^dYBq4U zc?4Fv@<>}uHgCss7kJ0nh2Mssy^~#LN@L<#iqe3yOdQ}mZeT9wrYO46e#Z}_G`yVD~p@y5A3tC52$ zvuIA4dn$9JfVOj;QyRBJt%V)|$_AM?8RtDUKX=cojj&zPSNmqiEvdws7G?HGNw)8$ z5>w?qiJd5Sy)D%CCNmR!H6h3J&U_cK$sM_#w%B*;x2z9TO;}%!Md(eYj*Z^A?*|Rb z{$m|miELK%S6R;?Z>VUJH0Kz;V}h=w&{Bse){2fzx;`+Ivr1`s)APAjOL9FiA>4Pv ziT_h^CxneH>I2qb_7{7EU&3RT+j?z7FLMA|d>6JX%KKubl-lqZ8qd0{^>bol0{JFR zfaDgh3~tSPU8707QkP^Slgz%bKQOp_rMyu)`9tn=w3_n=DeLQz3C&bw zYQ~&74_K~*o>S^usqpVXGS$G&u=)0ESEF<|@Ul5CwM1XXYwxk^OLVm^WPnhrp1}NG zmVRbW#}qx^-pJe%b(QYKm!BA~%f~D64Ugr>(b}aG0!OsN-!h)N6{mE!Z7_ZLtivK+ z^?AH-#`0(OgBRbsb$+nwEzNwX4G@)XPRE)qK`TU1=$*99uYu!vLIYxak$nSx9&bm3 zxC;Rtp&55EZPj)81x{b@gQ-~zO|>nCr-!wv(R}S;dm@-Dk;ZEhKl{`_4yj5kNc02l z&bNy1>+1*tW8b!IY&9}W8Ac9F4%RZ7f_rDzWg=dydY!3!aj65_7cR02*uSe3rTww! zg2>d;)95?o_Fc8k!lCr?n`g3tL$!LgErBJ!JsK<)+=M`OujcLfLnh8|bg(&_o_gBn z;vB%{DJIE@IO4Z8PX6u%Tg!WD?iPJLqsrCmNL6AcE9`?NpyNZ0V0O4v)@M;_EM_Hl z?32&ZhutRG)8Y)dQd9#<*>9Y!eg`zYlRfad4a^RC&i>Tv&ZP>hbRH^mN1yXc*SMv# zRqj{!q6-X;Gcxj711-43ocxERl)8Sap~x zMFa(P_HK8)70eYgEqsYv>`vv@%FJgfycyZ=P+@C4qOR=r&fn(f&DpDd>myLL=8Elg z`vDrX{j(?Myh!G1&NH3?5&Cb4a`{7@S;dxZUg!w) z_^Kc{IJwKTKqE=iFz@ui+A9ad=A>xe8^#+L%VpT{YJN)4-qM3}9_VNwDG2Lzrsqsn zk9*DZl0uUcGE-oEsMOk$5M+7oS~SZ?&Ng1Uim4@J-STBDmxAGHbLbdi2g3OngA#z>k;f zIRpm|4JsFj2v|RbXcguG05lj+^~0gZubA`l2Xo`pE>JJY?x8-18}K*0LwpMo?_E7G zWYc)_oTg{Cl|_82NA!znZj_sn6AJX3)9~@qKub7{HL<^T)#CIO5#qu=iuv!-iPJ64JMbJBwpV5 zb_Ol3h;W*HZflFEKF$$T+|!^36DX1}dI5PS+k0`v0Yo*ikUrm1RtEmc;7p#BV9F41 zuJ>KNa5wm>arviFzsBBCaY)dy?yr8A1Y3SWF(%0gYZkN@4P@LIz2@@@S$UcH#sns5 z_h8hc>_ySnDWK_Tk)|-zL-JgEY)YwhLyVM?JMB$XlpbZ$loifI=Tr2kboKRX#!-l@ zCJ*5lPg59Ht^EG3)A_1u>iVbSGQUrC(y4d`rk6R<_NUwOpX%Kg4LQ>?561nFL-;o= zx=Fj@aT39xgj-QUpq<6&?dH9QwCBMdAL(xdQ&SXO3PDIDTXFG#ILzM`(P^|H0{;H; z!)vz9`bFktc~nIFV5?TNK2iv?zRglV9lT`hCZ5$3uy!L3O(OtY@h)oSykewr#2`f2 zB5}%Z+y=*w{=d=8>#QFQ>4c*=&yxJ7F*+ zgMB{2@!>pbb>pFFnT`510ZMbl))`de7MAvFdhJHea7qWJ z(QVlWr8}Oo{`V*X%(P<*c4QUSmCQh~B}aQs&wfePyx%gMs(wS_ zQ|wFJbb5kKnx``$l~znhwdK1(n(Ij7Y4g2Yf^i{G@hq9ho3{arNp|mv_@lvhewJTu zt^X`tV}xJK)j=`{5E9VH5|(FK-3Plhn0vGegJtf=)m^CXcK{=k@0V(pXdnWiW#n27hByM{Hx1>q+byLDGD-G0BdJS$R-`cCvbzyqa8U+xSGX<+`w#--NoG>^y37# zo3zYOHzMSV=A6epwfllYM9{=I9dhEOJ5OI_u&2=Uf!1f-!J zQKC-3e%xn+qtPOBDP5qEI^hOgzbuTXbE&N6T1{7;?N;=PIDyABJOcF)jDkTv1z&$u zc9;mR^P}nK$Mzn^G8-tzfL+^tmJ+XdXRxEad?m(Ro-DX4spBv&oCs`37; z*tOUGvk>~%rvbA_Jn5#OCC*$q~ zSuszBYCvE7o8>Nky37un^!dV;peT6A$5Ek=(vPEf)`A4}u_XsSV+p4Qm^2zdgrHH_ z1@*S=-I(6BIwqDCi|}wDMa=d>a;`9#7Mk3$qF&k8buSpobu(bH!>q5fD244VzVCY1 z+q`J^u|mZ4UBzRuXhY^N+s*jWY@$!7=`2sP(cw-dXPUBIG&Rf@=Rkir!qnpDrbm%Zte1_w4e`kV7dpxpn>u96G zK25w5qni(;z%uFr2VqXq*g^Mbe?x#LTjX%|`woLK>+sB&r`@wQW@FE^jay zMr?XGbQq$>zY-}y^~uxojK16zxkn>Z4WxiuhMd$)^$;;NtFMp3CHX=zZ9oayLd7WX zO#<=w;64MFn6^&rxzAqnKR=K@Y)saav2%0l5){4Ww6SPi0PSzB^q{gB8q!3*ZKVrM z*b@U1VSjeGC=X|SH*VCCiu3dXPx?s+dA^FcVdO?SH9 z@5{p~SNmWr22E+9C#~#63uyco7+5&VLs~i5YqdR(4QhOPn~&*!hh+g(7|x6-6Q$CY z?{s}wgfnpOPTBH$7!cY-%uY->WcvO1K;rBp4F7g2x3F$mPd z)_tDVvPlhXIJo0#Y#1tdAkaNI<&|z>i)7_oCvAn|E!R@P$0c(-HNmYch`Xl*G&ndo zQXZ#>$L{RPI>oTsFM*@S$j-f34XNBXP;QaQE)&1uJ1R3aQ)HmbmxO*1pgcuj5g)_EtwGY<-?PE&}AyG z-|WZGh1fi7g&E}L@)~7(aD2f}CvTtvT;0;(;BYSaGP}1bki6qJdDuH!%6cLnC-wVA z?ebuKqzDhZb#v6V+xq$uS94Sop`6D&CZ+2eAzWd6zS<|>Ws?Qm3e+JzsBj#A0_;yw zByFUTHCsiU=YPJ5f-{jvEIldhExY1owM!jL=OqX?k8b$xCH=JRg^;tWyRG-Orxjl} z6%-|);`47NU?-J6s9C0;miUp~(c_xs{fhr1okhT~&XI=!(_v zf>M1c+ucHl7;ceU(r4$@f3hUiS!|@D2jxL1D+D7vbKX(7O|&8u@81?Wm0!6WF>ZRr zV~GGotJW!m-+l`rDRL=vp}t6R-6xh63|d7~JkJMGg4BSxk5k>0zHt(M3&9J{xE5azZu+)!zGoWdHvu#XqHpV@RH0X(GJ3aC)8kZ)uWB5OWM9TeH7R& zu!kVcst$XqExTHO7FF@@l!pE4s>;KbOpxBDZhuPg3^vjD)u;*ZThks?6U%yHFZ?{F zh~%=xr6l8pR}CHcz-;VKTZwJ9%R3*d>UaE_`I3{Ns#sRC=n-s|O3svn`u;D7#32mV z?pMm%HSc&|=vp6_TF}%}>_RRD+P~U4&BWKg)SKRWCR=@4D@>G2+|2g?kz{(M>F&$t zK&Uv8bS2d^#;keY?k%qB_NertYIbKhr1I(9fWV%(G3^Ceo9}V3{)P|AM6ZV7?Nz!Q zPkfcAuzE4cFm_c`_=~VfEKao5Vsq4Yztq;22n+QgdZbeTN&bm2T9-e0RidUCkyOF5 zgl@}IK-_$8E7wN(wn7-l!>BFzq-S4ZjediBvugmwcZ# zeLl5%!QJ&emXlz-GMX8=@M~+jq1{`g#yo^QMzq0ylf4@qjfw|!aY|Uk^C>)a4#rX- z2_Q@rA-4760W%m9AW%UGgqH9Q^al#4*T|2I!ZS;4EQoBXWaA;2Z;F^Hy8#v4O!>wp zbBg@I9d1(R&fYJ*DIh1{5y&#H*DHOg|FI)2E7XnP_`<+e_!Ja-AhZH-t#D}QWd>t( z-vQAa03YSr&~)UYqTK7F24)IGV$qOeGXbOs?hc+{48{5O@4!hYz@E1`_ifFj#&HNE z;WwI2D38YZVk8sROY=0~n}8-d&KeAm7W|iw{>M2}y!oH&ALslpU;dAe2K>M9<d=KOoFNCg1vtf_l$)U?}udzgp+n$20f% zv;8}Sc;Of>G#zPWpW?akhnqz|+S}R41|OB!K8Gfaq3VlvC+gc3nC%3b1MBNm zm|z=`NGS36H|QWMF(E-Xua`0VCZ6&ub=!?vWar-(ikI=5Ep`l5)U>cCc>KPkRs~As z6|pQA#ZRa`_agS?j^-L_#ecIYYR*&2rc>H54wR44Edzf7bfGIert3{g9?DCrL$J@< zU$Umff7P4reG!H$-&Vv#%^z^mx&=;fRy-StOF?8@Iqtex{YH^fb4aE#b!Vm!T4GVh}rh0 zIrZb|?K0{DU0BI8*yo!OC*$FW{zy0UhF>uTM+g<^AR54SO>bLJ1|@kYI{aBy=iX{E zU)DP*uz{py=4G8P8nN6`?DJQziWazyQu{7+8cRdFC1L#ril+H@QV$=Kqi2zCdXFxj zs)7!dZ47r4;h;=~?!B?rHue{O~s zOeW{0@HLM#WZE8vC-?T3vv;lw;yZ%*2|vw1PQ7U#cto^p&ir!DLZi1O7;yfvf`ieO? zngzJ!_ke;3m z@k{CEi!zHNw+CMzQ4uLo|9-C`s&>g8)jVAZfAVb(^{wKo5|-KJ_w#eEVye5dUGu&7 zH!5T02K^f*TSuK?F-^(|{wg{dm$3)CK>flyz~Mq2L*->Jhx<_mrNMdksS|wa?b{iW zGi}1l%kMrS)3l*6A1vu|T7#jns( zzMuX=J7OVXw0*w@C6RxQydv?F0|=XW2EHDb?1|u_L)BzL5}i??QHZ;2t`znWBa9PU zrgkgDY%@3i;~6o7}TkFe1wAKiw65~^{SLSto|gT`?h~X z(h>rKPIXHS9@@e_8>B1zZf*;izB`Mh;9Xotwxj@gCl0i`x?L0aEt`}{#={NCK@HPJ zWM43elZF5c-IpHzVjas+wCAB3*p*MN8OhK_ZA8$q+}k^6?mX82))%b_$((`8qF}Q? z-sTHmj$KCFb{J84r;UD%cjHzMCp`lUJSVGrvwC|UgfCz|NI-%0Wy_Lkd}wZT1im1YP*N)~{daC0=)zsiuA!Jl_H8vivz+2?^A#kR+(Ke$g{O)o)V(Mb+?+H* zrxZzsxI1E-Ozp3J%d>-)7`}~eAZsyXU1G5L43tlWC2$!LZ}~^HY$%VX7zS`&QstU> zTEVpEWDe@Z&`4SxEP$83e!8wTNjFJ^0M6C=JP5Hls4v_8)ADrYU-6 zvabYFxadmBhs3Gn`w9&{*acQGO|++r+~cLAC|r1uvy@_6q$Sk>r1=@K)lB2y@cwID zleq@b)K!4X2r2>gnEyFFMmE+KN~w*YIsM?6ulF#$ia5bq*m0=4e@kz7;M!X+U07G- zbT8*x(!wQrg~8XJF%00BYObLpZ%Zx4PR$&409_hhaUlgrWMW)3zs1f1%DZg{SiXDl z^)qn|iX)6(Du59n%QOv)Oa!(CsRuiemcafN=ES!QE59m4SE|U+I3n;Pcy5RB#y9A> z`tixKe5r+`c(w5=w^R!cZTep6`?n4UQYPN_J5|Azw>G-lM31p5C8^@lf zk7I1RzuL7)G%?<*#9J1EvDioBxi;$cv3jYXtOZE(0~M^+DotU&Z9JbUN#;^l@RzWk z_%HFwVp*{>hWQinU&#?W%T=s=-Ju$}tw3K|lPDw4z20fH^plL#QAFXAPzx5^rm@@r6QN4Bwt)O+DMqZxrb$k>mu93E=R$_b&YOb2)X zsf8e%5%~lOkgy$xvGfWK$J<`M)KLs?8&x{kZoT27gB2T)2NOMa1Wh7T z+B{{Tv z?q2AwX^fj%JOe8sVbSy8yDQ(og{1RqMppXf#qUx1+notTmBA^wHCMo=@n9ub-@NtV ztJ>^SY0nxKTY%G~Msuo5y}YYuVmZarP$j!Qwz^1AJO#gj2tO+*urQskCHVxxHHYGV z2%2M031oV{1GjpZ>-lidH!~Ng3%9C~Ki`R2_S4vW!LYit%+P-VR?q9quUuR9A7P%y z)lyfAb~11h5|&Y$YREUyEa1ercThqNkBnL$X1_{&Lt^n^4Y5h`8@a6@Y>mzSJ9y?h zu!N+>tDzq8NCJxkEkiE!p)>CINT{ZpCcbWF2` zHCll?q%A|0C`rp}!Bs}TJ*2vDrm==972#Cy*=?wCtr z#Vp)3PGSj%-xo$Qe682=4S_zOV#v4W=-X?B*AT8=9Y=HEQP^b~02OB#Px~4}@o#98 zxB~iLkoXUi2Z?HNKJaP(*|i)2Bv~BN{1XEF!|MHij2K!z0#smIRu1^LfnP+Jgn({++_LQZUQO3s4=3ph|W~x}Ca*zp(e;0G3+{^f3eQ@2)Hq8kol8 zISS&b*&YUvPk0CysPQIS5=pvglq?aq zo(Lhc)ERrkZ3Z}Cypcn_qIM?##1-c3F=Kpjg#bSE5f}aA-`i*Z?3~DsDV5A%8B>Hz z7!P{%P;uX!DC34#7Y~yO<3}I)>U80OMNoAR%uca&*`K|yl`4X9{QBzdDB)=`*ytps zht2&B)Vp+TQPyzmhXp4^|+QBlCHolpgpA!9em}6nGXO=2^yhWr|K{ zv&&&x;rzd4l@bPF@Jv|~r@D_08Bbju5efY(e19d-nj(Qi9yOEf?Ci-#iZ6k{KIZ?F z^LoN)`ZqQ-g-!iO%wYRiFW$?4;_pXd|3u>d4{Z7Ws^P!7|E0-KNnBn7$@Ncn zp`QOk4SP4ZDV*xR$1-z7$EES$_)loe|7SvfUntBj4MWzMGiPqce%JXCD16}Q+i)0D zbI{xrDBPjeFn#_o_Qii_bMQ&-v-@(&wdEt7rJC^qp9FrZL36GbBUWlsHV`FMs{dTf zUAn1L2;59$n5{1*db1xp3E#dbasCmHzvdy18DoY3dMEZ=mOeoeBzv zQ9!3UQIq{$+}yI-j-p7L|5haJ+j2c+2fw_;j}XJ#uur%kNavhz6i(gx8)=(DfV3U( zpVOGEcE5A=+!lbMI4BE58AJRBs5?(G)em|^H6k0amil0F`vFxl)f7cl#qZ6KEe_`K zETqOQMTxNU0@q&_Qz)U_;s1MGIa#Rglfi%NXIl^b-7^E-CsNWym>WPNEE*XB-ME3d^p~QKal~t zIZBqTYf_w+;fPAF!TUkY|5#}#O@Tt|Zj(CAjhF*H)IS16xluP2o+^nV;@k>KY za~;tYH2=A`*T@HsPqk}Lw)0!`l}GvyiKn=_KN|2) z_kT3wAAd$K8`cL`H6L$&OebGp3lBcna+m!tj{-j;-k>#l2LeBNY2W_yKNVe&k`{E< z)OpuL3-3g6Yc-y+fJ4??mPko=qkVUxf>UnfOA(^vsySk zx^JqJEzgaN={(Z@91DXK)uinqY zT03>d3wsQf`xen*bl)QEqnS&0M2gJp$db@Lr?exh?XC6m35xfJ;c>*-RCdt64g7MnPe{nBR@WaFe+l zBJqg(^y^)^i6JM-GY^9)ANg7yZ|*tef#Yvm6>q{Ss=@uG+<)C*=QcuvI?x73$YybV zFDz%4V1W5H1{{+0oqauJYP?C)V!rb70Q$?(6MP)5%d$el04CT){_%qdztDby>2nMz zy@LF>j^zqrr3G?xFHgsv`L!%q1iuc}RbM1}^h4Sgwy{F4IL zz7JUJ$DO#&Vf5ZROAjx7LcI>-f}E7Bc;tDtG2I6>pm2}Unsg6DXz?nZhGG?J`Y0Ln zmPkNae0)~r6)Wx6-1o>gYuw5LEw?9QxxITTCbib#SBuivncu0EQL@dI?vo1UE6JEf z)vek#F3l!&8)SrS$JVzqI>_?oE(Azzuz_Q z2)E&iwXiqTd6p39isIvjhvPcdIhYxD=R zitZCP3r*c~RW9DEWr=2S(m3DQ?evr!qPDrJJ0gzZf~p8LZ?G=vbOL1 z8*9!Amgm=CjceQX35eG|_>hMShBXtYo73c5Be?DYlF1Ayb0m}`K_uj>5=Wkr@!JT) z090tr8bbQXKX5_8`rEx|fpxV^i$V8?3e)TD;WTvG*dg!z72`sq?B@mV(u_mL>-{dk z;}_FVMFF0!gLy0^*6CRnFY*N3x^l9Pd|(*be~nV1QBtU+4dBYaUx_)9ll5AFjQkZcimpRf z)NP`bup2Yh`YB3e6)0k@*A}VrE*`LTXC%P zm{vL7?M^Rn9agUoREAJ$E98r}jiGO^YZa`|$~x-f(>vbawR=oD+HdHYY4j*z&%ku^ zVR<^Fu5a=icn`c)JLuVa2qWxt*e{91spZ6i3jl>oAJw+RBe$GU zQ4D2PC6hM&3N;~GeWRz5lnUV$8!GF%T?qsDw^U~he_Qj+C7fgY=C<7zSbx|SrsFGk zgi_UcxM3XOV0zookh_giyL7K9_`quL^X(Mx;!dabm45E9i1|BGO`L~&7@tTsO&N26-7RmQ5eXY9u~ZxtO0%Tzm4uuQe%A>0 zX!NRnV;DJB)g8p@|9udDw0&8`u;m0ll_RnIn0YvNAJ5Ot{lILDSD55zzY5bVKy-;7Kc@z0 zz7Wrt=>NrKtlXPoq^oCL6om|wzPNU-I*I1uV3{o<{(Mouo|U)v;f?r?-qTPP#4jod zW%+R~&7dh?7{s4`(M#nu68-^lG#yYn`)i&}P(w>6^9D$Yc{BL@>vdvu| zB|rIA(IQ>FjB8A7ROQwU{=#4dNlD46wPiMvVTQ^woKJC!<2Pf6LEP&zy>ZP%amig# zRbsT{VQNL^He=Z1u9C{1!0ip1;K0vSaBw$>T+ZUGJV=aFORQjVu7$QyJJ*J4RFs!n zr5N4v;4+pJ07+TZYP834EAEF~WPz$de9~|?1Sxi35s5_USnWK)>IdAs+np^^P&&LQ zqc0#3p-cm+S-!p`q~|E`r@)wg&xd|^5NHB8XzXm1qSSmm+K&80{66|Um1pOsYvXa! z24y&aXhYd}I`DaRcUdCfWX}BC%hy-8>*1N}>x&~r+j*IE+0SXudbo~#&3-@!KGEYC zA{CucP)M%^8kFT?el2=GhuS4-83acvHH7b8dguL^QrzLYGp941hT;XS3STQ_VcO`v z@9#G;l}kmjFrJyshn++7H(d_lTf2z&8@Bvwd{ ze?j6XL=?XuAq$Nfs-x|X_Q$|+Z#si2O*{0Wp!+IJsj4Huer%fIXbWj9lcDk9c{nEn>!v3{l+ zl8rpC^h~Ir<7Y>Q2;>i55ekbsuNlFVn5}klcY=fq^swV8He7cMg7Q}Z&HAOAwjj?KP0`2isnmcBD* zVwNc+gGU6o5`*g!FRRTPEwiO$TlSL@cjjV;#%JBvC>4G=qdrZPoSrd9S{(x~*jK^* zwt*SyDT6W~irV}}%BNGGAC%|r^1kIinUaR~&iAvo>}ccAZS}@ht<=eg7C)1E-&+p} zttxC?)J%5Ywnn3n6toc2f7NBUkV{ZKIC*8*+@(%-g^x{J8S+lb)@F2BRwmM{$gKAu zQ_`~fb((^^tMipcfA@3pF8aRHenjW{?{8ceAXi?`6e$KwR5%%aYvY!%cyugvcJ&=J zQ(@1~Vv`OK=FALlf^YHcKVI&$Ts`m#m>!ScICRHEvw{LPCl=EJ4mTd8fnlJg{ee67 z^;?Ce`=-&%7hdwQX~qev=5_Bqi(driY8E(QpD1|F6!UOt)-lwPHR#Y*bvbV(UtCT< z_Dm)=h2+1m&R|v!^PUY}TFtkfcZ^0*+{*o5iI-Ntb)3(=W?laynNs#?FA4Fk-Th&! zmlR&?Ivj(EJ`;_k)QQ&7w$=Ns516lEm=EH#R(^R*{~&z&bkX{4^qW|x0n0Y6v)LSq z%=t8j0nToYURvOa2~5yz3spLwiVjvzCenXn=tfYEWxy!5i>pY#7wF>R5>r22x)a63 zpEg2QnZws26ZoXBG3Z^WafxNkT}Ci=HsbxhYy(G>n4kW&hBlxw6p)iJa)eq_=*_r{6Rgq`ud&4JJEs-S@A}LHySZa&epFCoDCt*E4`&;j z$j$yqPlSPG_0w#pqm67ux6yOL`_VeFFSVS#z027>SQl?!GMB*Ly%=0xCldK~dTh!) zu!6C3(*+t5mHOXhacwaTmZX&sbu z5E;lw@qMz}z2%T6Q7@wr_gOFbXL&bO81l$Vt# zM6R8oGjOL(jwtxRWyG8&pyU8he>MyFU`Evh!O4`^G^L&1-!`OU5iDOg`{m{vK4t1h z#aQ(sk2@sLtp&z#N0S9L!EI(p^vWAi$-UIcrgWP3^xJUJxFw_Xg2P zBA1*?>AkUYcEQJN*fvIZ`P|6?t=c7@7s)hfqH$nS?X{8!0T8Z1=d_{x)FQiy=z!dT zk?+$$|HUL4XWXl|Vf9rW&w4QeppHT<<}AvSEzVuN7pd?$j~#hLu;c)ik&J3*~rC@5Wa`pfCp{;Wo$$L^l>S{*MU*F(7u%NP>6huh(Y|h@Ctif9&uRw5b zqGl!-jBCcvC!+;~d#GWl z?D+-*9d1e4mVDermp>L#veW%=6_W0jqMu@+=-i<7>;I2+rY^%4M` z@XGofWjr_wv#SuyT^=$z9+E{0MLz%PGK7f|Xnm8OQI!JTBuvdVCs_kMC8MTvWkv{K z(~xuzRZKF^$ke29>d{SpwKtJ%PF7YQd5~RQIWB`g3t{8kL79=G^Ez&$rChL{Bv+x( ze6Poa4brhnKNS2y=2_0-S&Zh24)ncDHoCEFz1#XdW*SwZf**KmmGloAzb$Xjo;`Q* z$b==xeX<0zHd>m009w=`95&`vwI4q(Yqm{&v6&cE*g3;6ho=9PZI zQoxb|xQ6wz;Z#DK1tsaR9(;V&RPdY+WYq=i-mK$82+yrVD5i^H%mCK5V$oD%a z|4DcIM#^zah&emupjhG;^6BjfPQ%Jy#<)gfA}z!y<0vKgQT-7KpYTq@!Wpk2Gu7B5 zI(5AqnH!nkBo8xJgGByRdnTUXQ@hs#%sb{C7fp)JKBQvmK$Tb|x?u;$=k1zADMy8J z^D~3H)@3{mFocYYhT05VTlf$B5Z)`iprEF2z3KNo+!SHDOmMGOymDl9&TQZFWsI^z zOsA)fqV=T~g=8B}dU558Usm}Q2qd=Hg$>Up0H z!Ee@>RJoc;+scI>#W0aAoWMO4pmy)f7R~J?`Ebikr`ozu%E>*C)Yj{GeeA0;#1=>$ z+PK1hoKm4etx-UkV^{YXFI(O5W#dfRYxx0Ca{8!j6HovVJMy|vJW3UBE;kKy2wZXV?d~MKK9aFN&EcLHaUOQ-2nraEx(BTho)+%YnR< zC~5<9bz5P(_U@0|oi0qw8hyb4d>W7LWJ zgE=C#T&Z@)xDKH8e9a8B0TrWTlfSri>eA=8g3}E8Efp*mZI|!axV|*3wNr}pT8wMs zmO5I9TPMfelh>*s>K7Pb%<#lka-YN4U=&ht%{F4;$uVvjZoM8AawC{mY4O)hc3zFD zb!i!iJ#QOSg}6q#f_pNhq!y+xmNf z1)@2$p}cvN=*7Ekc)v?Dy5S^!U;LoL+d4XxpNqQWFeD-ZXujYaCQrvuMBE+FH50s2 za)?YWdMb6ay#UReLfwx-qSsP?W0v7@eVFlkp>Y8|^nQ(_SN$LX74*JM@iufK zA+@5)9fFc2$%*XhiaN8G-FUx0If$2%Ul^a-Sm#S^=$Lt@uI6RIbTdT%AVi^c`4Tv{ zD;$LXZYk8U5u5X#6fSV|oNQrT)4z>~eKb(#%X z6)w&qi%`+?C+Di@tGXoHL`B4Ng5eO(zSR2jbf=)qIvU#^lyp$56;j}*;_sy>2-oFuEpyE}-J6bI`hiYxki8m&uk_RcZIhJOc#YLNoS;y*e}-S-#`HuXpu_+QHZHGjr;em z3!7|XXajQ z!ZWnq&xBKv`n8-jfWJR|`fBs|@vxo9e+k=lN%w`df z_X{tIfW7HaE^?42u;bj1S5U1h(NcBI znNaBM-<;dLYM0V*3T!v;Gwp^1`=D&21bzKnUE`8zR0+qJaVPkzZrR;SXM%Vz)gYIe zSC_G(!#mdrbj$*?p-bm97c&wno!Wei{7TdF|YepI3`(gD1fGMF^uD6h89h zQ>fzZ9Zv#wC+4yRu4HSPLg3mfQE15YOlbOMci4Fj11Nyn;dp!{8nBGEETW( zz<}1sej{La@Ae>;FID*TRfDgbRIjuWs`Up2{?B6t^kiF)WL+XDeCQpvS{ki@lQhxo(q5IUOOYI(Rb(Vr7 zXv<3~dEcB)I#J5peOWT+s-q<{<{L7!GCxNdH)}CHKgrTlGLvB*=t0MM)q(i=naPQU zKIMGDZeynZi?O$kit2mYhe>Hc0g)~VN$DO^P+BR;5d=YylFp$+2^ElLK%`4SI)+Aa z=oE$!hVB@c`i-B@_j%smv!3<7>-~eZ4tvhob7Idv_jTR(b?v|MIdAIx|G;ixh0bpG zDrM6iK5Ba9tHqDQ6A%81@V4)(Tz5MEh2Z)Bf#6~XDik;&b%v(pg>mc#yU6x^Y>w0P z-B`PHiEkc^cRe$JXW2r{63m)JsG1DBM4>z zI1o?Q|7Lt{`T2+5@u*GkGxIiA=9wFm*IC8U!rB>oRsd-M-hGc_ch4h2Z^ey|(2L9c zMb#PS-%r{<-v|W8(BNpiA$Hu{Oz3j7^5%<_q-F%R!H!I<9gU>+rop5M?#@4VdS}c| zqyZjVNb-;q*s0w<+ab+OI%Z_Ak-PJhs-OYTFWqyszhLxcJRjdx#KsC8^Thazkhz^R zsgk)*x91wH&0Nu0@t#>E-^q?g+3w-$au`jy@>Gcd^rB=WUp4Y=-d^BX zr1FuGiW1^4M{kp!n28WLSn1G9IO_tfuqHZPxHAZyK{UzHwriI?xWSzP1wO%-6c*Mi z*g7$;bJ80~I6Fyg5Yu~u<1Zg#j~9TsEk=o1NdPiwftoQ(r!3F}gf=xP^(j2ZnoGb) z&&S5IXbH4m>q@v|y;g(Wj%l*wUEgPHoj6e!tawo5;@zhM%qRyQ zcagloMXPc#&hz4u9zQ_Wzr0(n%PP)?m#)1i-*kKTpk>m{wTES-i^oPAx9;nMF&@UZ z^bG`zOI0q9K$k6Ve;+eE{4qdVy(94kLQ5~?n28OVS^m|15DT*aJpw~M5|on4#~RU> z@8x*Pn&dj#V3jYAirclR-aY8-`I$aK4x}U*T_y{%h7949oru&Wa7$e3m$A_Jva;Pa zw=GxY{{V5uwX?H&mw)6l&0cV;Gn_ngOS&o-)*j@yY?IQ4N~?GXVED6{Ww&{%lk_2+ zr>w`mI)Weu4aY7L&X=bBGSLm^{%cqssTE`F{8rKd zyTVX2IwWBk^W;y(1<>&M728kGVS}Hz(3|PeadgHhSn-oS%|C$P&WVA4g{`~O9J^zG`U z;!Bf#45+(?v0zDf%*WJ`q5*%Am-_UXV_~QrTK#PxlPD# z!_>ppz_c&IS$1_pkj>y*!V(_r-;S2{$ZcOEvt^p~-eM6TtQJ+LrQQ{vXt2Rs&0#0Z70J zi>vl2Rm3G}rRAnYbhhR7+KzIwW3PT#bUfoku6Nlgk;Ss#=2~egWA zQOvs39hbQ25~^N7v~0c74KEdYg#sKVj#~D$CWKFk)>3MF z;ARb=3Ni_J3y^(`4LspUkqA_mEN^G}IgJ%7Apw&OLf2A0t$8)K%Pwbnf0BMcU2L44 zxbD^5s{xPFg}+)UX72T>Cto}g_BX9G`XIhv^J!iPzT*>;1C+5!yu2U`kCf{<8ctS% z(LfoUNkR(#jVe z%7#mzmaG%9(+|t0I;)rFjUKJP{1&5E{w>MA6qKfT&w1-C@RCTfhdJ83Kw=IWj$bgv zEa5nkA1m+cO`P4GnQ7<$NwmGFAphoQ;~f|v`TfnSK(8J@yOk)<4JUiNf*A&Pn}Eo? zBEKl?9{!0pbU4YT1DHI<1}UlKjynAac%zn_8r<`YNA8lH$pizly{67_dE7Yu+Hq4N zKGX@zqNRNU*}U#MZ3rQWUvqTVW7tsqUOPx;;S3<;DOK9*Nh zyQ$51nOQma{l_rG5f(ayj*pLb3sI>$mS{GyO}sS7m0h@4vHXF(2*s+qMSy?&NPpf~ zTSyh!zs6WB9bPBs+OM|hvAkt>vzriIEYs!HCxI!{vkP<>UdR3CuA5yTY2dk!O*9)_ z#@3RBV#8s}Ta0UW@x4$gTALN87hFyN`5j*QG7Qw!9J4XK>wKB%2L&K2#gILgi1WK@ z;fKnaZx`8ler#RcQ*=N~#~2o_b`EwKCAs_2^T$3FhVAB!EKM8OPy=^g*|W02Zlohx9G@}s-J;rVG^ z|I1`Q8xrs7(&l0$NPaHkeZ4DhF-U$f!%bgDA_Q3>cZL1^Z0it^Dlg2*+Mdig0QI?hNI_b^i1ATWNF-2zzuquDY4VO4pD&BxWnMuY z3X@u}MpboM5~r${Osq{YFb{PUVf>QruLOLpDG+fBgyr+wTfU*SH8xeMPaA)^mXh|9 zew@2?83e>pX9<*9&1+Qz+7hp~TiAmyx>B|S?%X^%{jZBOEJR~&!Zf>)p#6EVSA^ST zMkTVxrCkPAeijL5igj^x%CVg#jGo`!rF<)ER~P}7Wos$f^P6N( zs-{_5F#a*5;CGp}X$J48!Fg++OCCR&sf;c5r@4(Lp`-~>aX71L#ASL5D6jC-_F|S$ zBB8(NS7)RBPjZ0CCo4oyx*T-Eecv~b=&@?^O@8vI1=QFtUT;8i+?$4O&$M_2K&JMz zn1Y9MWQmo`_?91zOZmmezQE85j{0^$IOI`3Wy!G_(yMo1T$A_em+V0O=uy%~q~$L@ zuC#}iX_pQxg+Z3fq8LT7n+J3i=*dz4R-%s+p$F2IYjCvaRisI%5)7M9z>n?8k@Mp9 zy!fCVyH6O_ncb0HD zzvQ_}a|tbo{*TJ0D~G@hQQbfhKjPdYbmkiW;G&X&hQj7r{7IsV`>b0@9ytU zMqeJm3<`3>dXm>@!{;H2fLzUbGxg1;+viUP`B-P@rGQG$yTveZft{Y$Gsh2SO?KKE zyfQGR-3C96bBufW82U;^ieG=7w8_XC9W?j!%OM8pCM;+v=fS;1ImVUwEED!mf< zm3&6^s&tnp-vdS=!tfg6@^tW#ckkTIpO=Gt48#OL3Q0N$YHk03#Jee7e<;*l4YZFd z30e2)Xk%!+FY}$619iN2KrImVE-kUb=5#n*&~8zbLe7=$SOLXysi@9NVqpF$VfKK8 zV|JCJk5h7fV0#Bn<6Hz*FEznDS?k}G;+HtntsY*&*2bI8v_4Kq7X{{>yMJPAm5TV#J>4Ja!nT5=nhtKVLfY7Kb6^q9S&Z~^U<(gP!${x zNaF%&5_(aa=TUf2&NHuq^)ELNhAT|REl|RZIvPbxuhIAK;aemQ5%3)&3xE5_c2WxCtU&EzXkiZVxjM48iyPf0{aqZoK5i9#BC#v*_3k* zvjFLyxXi0k6AKJh20T-NLs+LC>yf=^Rp-rAYk1hxiF2T=YOFx0(o~${%{wo zpDX_ughk7w30P{+K{3%1C24mZ1PuS0&WMO4k@wM`He-q^b-Zy?dCR*4?OrT1CC+(i zbo*NKtb@N?L>Yt$Hk2vExg8sB|9iLHY`es~j}g!&da|Df^ykA)nexoq6+6;5GF*Ut+(e9GE)aLgb z=$Gha=<4s)6NlBO<_~*^c=P{)=Q(h!1|eSUL=4p6OU<{-T!r@mi!@Baf6t60!9PCl zXjvhDK(ZYh`VOF(PBXN&v1w*=(mb|(hkN^%4#iGt?)DaY%ZGt&dbQPLSID2=?C{ds z8;Hjo*%w@*^Sw&hW;2qvNzVZN?m^8?mWXlb#{yV*PYk6u@xfCgwId{}2l08y(Y~={ z_4hf4IeG#97+kU0SJ)Nnw`{DU0UAkV{CaG%#z-C|hc1E20X!Ur(`9~Bt5lw?(xM-y zO-P^yX_%_;Gb*yOA&7{f6(r3C$TI`#Ty? zd7nP1y0>4yp64XOSv`TSM*W7Cu}w?GR1x7(kD>5Vo8~qq4vGm(k5<`&>*(9A8=X}C zHECGg>GkZ@#>2)o#w3^-qVidl_)Muy^yPu_gJN~60(_Ej0%ycEVk5a-gjwRmWU)OY z`#$_w;wVY;=S?F;ODI`?EjW9nrd0%VTRF(@?Xm`66029VVPOM%*psfIy76RG?TV`f zv!YV^V@td*YhI0Ynae5ijgt5F641`|hi_Aw*Ps#P#<9wn%UR5~tN|(pMk&AW# zDq5rd6Sl?sPz?!MDwAx#(4VOJTp}SMkygi-d>1-Zdkv@RMN0;-Ui=`xn)(xrS z5G^pXGdZI(`~xk^F212@3Xju?z7hW9c0_0KYxEUL)sX5Iy3fno1JXLYO~2%k-?YitS{?vTX2Ka-Wa33%<` zO0y=uS0hwzR>vl_(3)beQIlWIUaCBPyigs>9W1^#i{*$>94(McrC~ZZKjt&|HYK{` zXN2Pu&VL^lNWNU9C=SK11Fy|}mvF7v!7!x_P4x>a$Di=%e91TjUA3E^J8lJ}ryD4? z1Yg(Mb_i!n^NY44+HNXNX_hA|qg^m%g(Rik(av`KYj2tp%$uBkOnzI)wIz-Smw=eX z+z!c0D#c_+o>S*EzX&MATHE4$svM~u{%pj1uTDQ~Da0W=RH2qZxia}sob6?Dlz6qn zh~mW$;gt|kMQl(x=;N+(@cS&74NMCAqMu9vSXOyo+uuTjHWar{U=$oYv0=Hn(EBOX za~E&f0utamFXx#c@I_cO=5F4XVV30F5=#G?=<4wC-MaD2TLxqK2S=2@#6%ZQ=mC-D zd{$#3sNNuSMNp8@WzPavGeWczY=*X4{nW!dnic0+t$B!bjb#$|!eF+>19FAI@;{qJ z&EO2b{FKs!dTO+%{X<&%pne_MqkK=SZ$fWdn_`R~>fr??RvI5Ebp!~QY$NC`~c(M}%>MYuuvG_bB$eME`1?a}F zeP!LQJ$z43><`Cy+n}rDt}?dx1dB;#3TwbIJ2J12vtu zWRTS!--0{TDuHFs>CxqY-LqV|jbj4?=XI}TK1`ieCGeRR&X^MC z39RydgGM3eYB)*{`TxGWvx7C z3XUFw@&VP$b`!U+lv;aHu{PJA^^dS73Bv`?96JY`@wOrbff4rl*3*> z>j>UG4NiJF^b7tGI;id&kXMkG4bC11Vgn@7_<^~X?h7h?OTGnnAqU?IQy+GhXh<*3 z30mh#S3uR7L8L?O^tde0?J%p5kwh0~M03e#WK8?Z+hNqcPGA>2=|zxNr2KmFRpeg+ z2F5;#^K0O6*kYdYQKp%7nSWsnxeh`29B6CXbaY?#?_ZNchYys*x}nuqe30E4sI3VU zue`{1^ZogB7<^|ySb0*d1T_2Y>H8e5UD4OKD`qGcF}HjKo=;Axzfs>cIA2*R$Fj~~ zA%A!HsU9`soR)YpS3dtSF8~n#9E8gI477eiVfJ9DSTC#SS3tQ<)Qon_0lv$a+FXnw zqh#i^3|pZyb&|AVaNw;~X+9Q{Lv_(mr$D?0fhdbRp=|(1_7CV#g70gg6;}{^OsqV> zzSZL-;%*7=*Js>X6MHGZ5_l}Y07~thgXgnZ1KGX_o{P8baJhaL1%+Pn8HJni>?2@f%Qf9+_+u&UG92*)Zq@NLi*z#&sgB zA8>V7=^PPhyx)&X5`8kNNM@#b!FzX1EnW3^%&~YfTuSuA@xxe65@lDsYP)xMx9(`* zZY92P*x7?I8kx{;e`n=mpPN64b8oQKx#w4~2jzLc8&gCzju-)EhnY`_DeSRz$ZVY= z=?)dN!yN#;z9YTA<|ZnMZT`rEPGo)R=>F(C>%g78i^D3nD@jP?*hP~Xoq@5P2aD^| zrK4R2ZRg7ofi?d;oiX_Eq+*Q$1oGAsCa^Rns=yCx^T{}+M`~SO<{@Kds|7S-@}eF* z)z$UhBitQqu5&DV+x$ExMDuQL`qi&0a+jZ=-QK}!?WMdBq}~;>hf>)Ov>I|ew-%W? z-JEjTJI>IjSp7aL+&kb*rpmnyyLn=?bHG?LWl{oZ-Az9$tvoqGgRn}`pW%ANf(*vk zl-yJ{gZAw#t)uYpF!R?afcxy^nC=?=@m{mrGj^R781DWyqR~;?>VQ`xe}_I z(&A;{pLgfVMMR3uJq${erGn(Z!QST?g&&MtH4ija6_*~tc?$n{1)crni#!K6 zdwDVtx(KnSESl=b!1m7sn zm{4X*mvQ#jx6RmBZfN8K8yIU7*S~QG=G;y-MklX)!=RVy-%dH)o$AI`h=l?MORwA& zO1rO9rsE=ClQ{MnN$SxnF<>PXd z=oi%&U!2H(pC@1tU$pz|t0p$~CjEtT`3pYbNEJHb)oE}jIe(OMPsycNU^GoUBt`F> z66Z^n4{61O0>lQYo^Pw3*!5Y3Pf0`#tq$%TgB?j{xI|)8ho3$XQKrtd{RGF2IIfsr z-{8jTWhZ!zLRoK;td?KNnfXtzBYiXC^C>8xi1Ag-WSD1)QXc@_#f8go#*;^(6kD$F z9T0$TnzvMd|4p7L8=iNNhTsHe-KzCEn?9zPmkB|TIGV&_L zrg0tRye!|+=;JbgUy*iHeQ!>D(kgj^0#OJP?O``#Oz-$@Nz@P_v!ZPdDucBbeP~uI zCM`&1#ZgUq$Kw7&`9nR0C1aB`7bgQV@WAz+B9Yj}{E7=WX@MhjGP`c&+wM&H6zy_e zzOb^p=ki$`yIK1?ANlN^jGmeCL3hzY+_?ELS4{;zZ4MzmQ2B)8gm&*`F{oVqhn(tf zw~qL=o$~VAk^m^P*2EgwMUGVtI`_)n3W5Zk?U8{e#vB{GzFUD$S?iqxWE^Y|OQvm4 z0MW=G8-^?FzBO4e-Q&wpT0`|P&}U*EG7gP9j|uKl_iAw7T9Cq*iWn;J59fb27fJj@ zok-(_ryLzAlgbNKRVzt;f)8Q%obP^d-Xb92b>dL%e4uih!ya={ULvm~p_G!Tdv$KV z6@pUJ^E10Lv#u%M+cVRO%@i@C%f518|EN*A$ug?wzHcF0OdGwqb=0Ub7jzh-rI4Wq z#=aHbh$@7)MrQ+l8{3bqfK=`leDV58Fy=HMmdh_BV}BHTD0Z;6ehkX04!#1u&hePG z-_I_VNa4+(W&v=;8xG55oisWP4S0Y3{`-5{$$$iA?>@FB0ZX|7i99*7N0B5y;hKJz z^!n0$F)MjT!?xKKduw~LL*X|D`k|N|>r=$Y$8zCc7r(Pa<~S0Y#Inj|oKsjoXCOxg zk5(=sIlQU?-K9zK2v&{iK2e-E>)|@%2dHOjg?)jAGpws$dQfSn=k-y<93Lk)PhLu? z$G*rdOe5tA#ll5pP4Lz~sK()+fg(gP6IAbNz4qJk8}bZUXa#)wVi)@a7n<<1czk11 zfR*3lAn(RZXt8zbMr%_=;CDY>j72@DzVjX;W)nU7V&XSyS1exeDs;yW?g_3N4B@My@hm!aF*8}qqmceUwJGIaZnyM{OfO1Bk z7-hDMy9jvip>p*`{9eGjqolq%G#LeV?Nv6tJMn8z${x~Tvob|%!c^cZjt$`39teRP z9g2kYnEE{D->*zVF-C(QaWZk9u``jDqbzFho&N}(t7wr0t+}zR5CvWaWx30^cvj7v zq+Czlj0}LF8=m!1lZ3@|Yy{eC1&XnVc$kUeBK+CZ2{1XsbDjDj78gDQ^u;Jz`OKL3qSh^sQAW854DH|upbjY~V^C|I?2S~Y z1?f|R$E5`*!oB7T&SHg?e<49(PfxE_-NpRiun03khJ5Ka9=%7i z5{RNeMbs+9S1FR##7SW09mgsWpa3Ha_OnIit|@)o~*G-==QXaYl36ns2@;^jf_Q|UPh-(N=p z9)m@Ct)sv9;yXnU$c>16le5tq@^Kt(qxNDR*hE@Kbw`0YYRBR@4lDH2$+OB9MWkj; z6sV&hBu5O+BayI*1;0bDJi>6ozQ_7<6CQ$Q9Pp^FAIm6`kGX#lURN`Y3S9m3^v&lU zxS(mLPFdL_1!2A0cN&mv2UC9ssPMF;m=>w_j|N`yu>^J5lOIFc8Rf!-f5_8sI(C2L zGzZM;0M;)lP9~4|9M@$Yd70EW2!>iWn`w0(Uep7XoH}kq@d$$~f&g=&KISkV6;W&c zSm5og9;rKbgcM)Wb749M8NL*S4f!CXY{YTeFUD z2hpC)-PSfJkx|O$7cxwUGkj>6IuHj&EI;nrA&5&#+LC~Jp595qT1o7NKFO-R7vYx} zzGJlF8`v>O*Za7vbFZ+!Q$|RM0RoL+K8oK+`Q#xjKc@TlM|7vE@cNw&5ObwNfsH+G ziiZ5wR;=FQYVv!2!NwUDbhtzfOJE+pW)J;i8=#iL9qOmSpG0i31kB!RmbyjP8tj=< z;L7i@HNr?bd4jKj>OZ9=^|{m7-j*TyJehO78xAE>NpB7(Kw{An}S z84mXAITkVNK8!i}eiF-$(DkzVATb}Fo+63|G$!hUf8gwJQLH@h5Y+hYqO$nbRP5a! zhfg0XcrlHz;6hEz<5o;!rPS$0{X3UcKeH%j6NvTQd~irh@3dbh?Q663^{9;K9d@T1 zUxRKV`b|U1U#pchjR@6P4c3ocKJPUx{*mjhP`HbK}XN z#@5Ki>_x9rXyIxt3Ekt5pU8MHJP!oOh-C6}=xeMxc1F^2;~-zg)nB#x56vLqz4>?p54Od6?8gTs6L_`p-@_%i8#N(kM z{ip5!*`j$8cK6@5|FP8)AEn+ik}0DvVJ}C7Vj_vL2z8A_;3liR+X=y#zrA#E;4fBL zM##~M>wUd*UwZ#zz~WEl_Qm_&I-wadydI~Bb6|>#nd<5 zns~RDUoSs;K)I2)TC9s!q^*IVrQx!f*z7jzcWobKetqS#COskqpe{m>U%gTYI;Fdhn3nMHfQfXttH3%Ga}>}@Y_~(u^l`04v~7}s zspfl{8Hjl0kJll0R)R4c;^N{XQhiUKKAlivrPf>Ce#9!M_24reACmSL1|z64L1D}G z`DKTa^{Jx2dazx_#gxqp6gb*JS=Gs7|3)m+~!Y-<=%G zpmV%oIX0PY+%pXyIU?l-g3LoHK#nb9uM7$cA<*bp#w#ZlMBGI_~@-h?WTdS{j>$WQjWs_*|JY|JxRfJ7@;EBht*(wjOk&Ta% zLZfZ3Ed=6el=hXKKGrWkmfN0;-e)JhEV(&iCZKDli6n8%ZvXV;e0LvnY1veaB>X6E z_id`_jSUQ*qmWF>#(%0$P&(1Tku=Bti;1e5e95J~q6z28#)M0P_aSPwVsQS$lr=*TT$oulYhBvycIye)XX_FVo&J3`fK zI|LY@7X`Rk;5_TjtJ;KtuV(ysgH=`W-L34q-UzCESG6P1a8J!s80fL==2frZ6Us~G zRQH!%=jhD28hdky?z)wc4w*Kd8cTV#uL0Uw(D~@mV_ee_CaV+cnk7|_U1|S({6zoD zJ~+(;&DBjrx&VV7xLaZ$%jMqyD}t-j@J7eRq_uizJwmcIgO`ZzyoKHM($!5kjHY3R zm9PboV(Nl@X(t zJ$~6(IC*AtvS-Ss&r**T z+-)x#q!n#7ZbgaArFs`WgBFz|1HKRQ&!qtax51Gq*AC;yH?ke9li%d1abhSTinzu1 zG-6wNJJ(&v^y6k{d3ovNpE`9Ve}Au+e8|05pk&2-yy)Oo;-4p3B-0EWil7D?6)9Cs z6cI?>|1v=RI-10IwI5gO9;k9>y^8%Mv99GSWyZHJCWGb1%B2Lo+d-DlSaJK=iG)~# zmL~saOfYE=jw{Sls$=q%1K);iuH;4q|9dD&?wGTy`^v*ZMn;Rys#O|s83#f6$FzV3 zs#b=H9trz?&#|+KYR_$wI_&{^$BmbxfHz-hj_w}7*zK+kqZ?e8KBHY+KrG0(4K@bR ztrdv8Ep|jVtV!0YB(WrO|ETo>q933VLabfj5VcM29U9^J0@bg2ACY>4$+4zFO%j#| z?+uU~sZ&R*k_WAF`=+LK#qYlj`!M54o|Hx)IrW9TU10toE|2|faJsu%jUma4rt+MF zz0QV{XKW$`xWD~~LOLSGDrTXEX zFo)#z(YWO2qKD9)erZ77LWAfx_o3J^CCgum{@4`E6ziAKAU1K|{V?1L5No0H4~opc zF$`=)$9zUB{ZQWG+~V0P;}H#6!DQGxa~s3}tg(ZH79^@{h7or>)uo;i2*(J#`4QgERTVDTAoc6|Z@}(P<`x+(UmBA%A9UdzH_| z_Gr_`k6*D)aa7iALflP{g8GHZ5-gl#q~sv^O}|)vC8g6Ee#uP@5MATLfO9kDRdh8c z@t*jqOX#JG4Zbtb#@Y$&%-?FAFLZrQ zmg-CNHnJ#`s*3B|ZqnLfrNE0XTkX-?iT;>l&DGy>_p$p#PhjT-%S^#a{i5N~Wvt#C z_kjM-s=Z2MzI_9Dyqpu!>%i+_Sm_tV<{y6-a`e&yZ}?I?Qx5VK_@YXe8I<6Qy?ZppfN!l*yqo8Soa~SF=1*_lt#G@o?Xkr4`~pbqPd;1ZrdCrE`p{>| zq@!DB3f822g8U%z_Of+so_#98;Y++hEyR5e)JTkTi6g*rskp7w93#T`5FKK#wA8)# z_C^r&VIw2D%S;hl!j@;ZOeKH*Pe|X^4?Actc{wGB{iMErB?6haq<#>Je;&*QK)BPl z9Y6VKrUb^K;L4*-BU+)M0L8NriC`G6wAyorTH+9AfQ>1tpy_K2vbx&+8A!^msvJiTaM$xdEKP<(Vvn#oDpbdTM%6kis};?pl}%6c}IIL;k{HvPB%3H7M=H6IhGL+?&9rcV+^Y)sQQIG*~n`k~k)q*YkfgQjICZmI8c z^>|u*IePYLF0;gjefE3SeEXoy>$c))8mT`zZL30-fC<%!aoM|f>-8dOIFphpiU?EU z5*;sm86gaiTIEH?gG5?ak4kP4xu{N8Ux+ky{nm?mQo*DkZQBq@@xmpU?j&=zP0NDevFjjov?33fss+bkCDh zlj?t#wKgnkT|NmKnWs4x3()4|VtSBMRoRsxqm@YGMh!X>tD99ThP zXyIr-*|+~GXM-q5Q`JOEi9J@{5F5R`=YjUq341R?Aw|u17<4gXHagTu-JXAbet!+; z7K8cWNM5Dpe#X3p&x2$hNams)h$ugp%VuuR;eRxvnA7Bbxxeswjdg|z5d+#mfgh2O z%vg2+xH{AbII1Z8cTj-XJUj!=yo%GN%5lSh=cHhku%*hAu8sR<6>eHfx2%%M?$w9a zc{>Tq2hU=<58uC2xuoVmB302f5)>1nPqH1DQg3P*`Rq!i`neRF+!>N}{zmCH@rI<2 z;to6S@_BlEZ@02$Y zC@C)`ABVXKGhqy2%ll(VwpVQ{i684W0#{mH(=%k0RETPo7r^`OO?Z9rTFFY689lE8 zd$w$O+Bns6U1|TKWoqKmtnmkHxVC@L_PEJ^!*0?CDrEnFa+?2Zi|B6tKW)%2;`#rMjEL9r$6R3``=refsay%Bd`YbPK{b~+XLrY-%5C9n-iAvaZda^S~ zEZ*Q6nHo>a`RcdqlflvG`E@&#K#Cg|U7v%ouHr}#Uz)qt{}drf~RF zCLSxuKLU(n{=L&cixN5Lu(n(4z5Tmc;#-N%+H|t=t@|gkW$L1mfVoCD{5h@0 zsKRE*nX9{W#NXJ9T^6-%@*927=%IH-!r{~Vq{MToxT9x1l*;_ep(kinMjZR>SKIOW z2dRGb@biABF#h4Aje+DI60a?PA%f*KcIlRzMpG1Sm5Ta%`3eR}KfDIN>TI z4BUOpttMz-k3+r;=^Rnp>wS0|{U#KXf9yq6E;M(Vy%gJc-in_GcCTNvh)2b8-zFFd zILavwZV1>Bg0(*+Xmn6|4{so=*$4)ir1*lUp#Pu)v4)>)SwdPh9tf8dy1Zxs}!$;m{ zm*_{3`6dMp`%V=<<$SL{ERBP{NzfcQqdAfZWKC{NN#M_qN?b1nqz!(TyN32GBb3I>WsR?vp(JsCDAzk?U+%FrpVpL9W z=BWRG-ID(Wb{*5xN$Z2%{oC!+Kk|+S%zyWMwGdNJU(jI(;`v@HymV2A#w_7!^6ed6 zZ@TAIS(YAN-NQDVU0%V8AXkT=C8Af?iM1f735SduDEFhA2sAV14~U@Gubt)oCX@ro zoQoan1uJ;&3P41sK|GhxP)p}4AQPb`M`7-?bn&0J7fdA+P>{w%*GxIG$Nil${zYy) zbYGhEA=-BbqMXW%o%fjjooT`!CJEV;-QL!Yhsv<$-b{9l>NPE8+Ou*_2pXmyM`LVrT)r< z$WI}>Lnrme-LK<B z>fNWoUvAd>CST}LakKb16i3LihO`Px75+EYQnXK}=FC+NM!0!%eai8#r9&>Wi|a7J=XL$_$M0yL>* zoDH49J7>c_M)g9{Pq4348HsYsZ77;{cS91CqfTMaGv#sIGkk~*d4NrepaoI5Z_^$E z%Qf)@6m1#`{#+A2CGu%74f;(Ovm$yP6%*5qTh+B-Fl0kkT>}CK{FJMWjaS~24OH2Q zKDe@~e9z$f_cSft#i7HqLc{8696eMDGxzFiAr@IuM5Z0_JEMrZbh5M_ziBEHU;ziJ zDyUxN6A2#B{Y?r)L?V`9Uwg@6Oonk}1gvRp-QT5JThBP79OFWl z-~7ya&G?B}r3HP_F20d3ak_aF=~Wn~BoiTG^s^$OXpJIFqIM2)_tnJ(r-MH%$X#_M zhL~oGpEkb{fD;QInmg7YFB1L{Xl&d);haE5vD^Jhso4}3!O_2*LV@40F+O|w zNFdg^5pvp^b~~CsuTTaw#tl`V`)YBDe2!7LizY}us9G zBUk}myT@BT@QbtGza*cA#f##d_=xn_+JhN=DL$oN{)+tgQ9pQx^}Bcb`dvkf5GLBG zN0(t(oQ3IJ7nQRiP3*~5frc8K9lRE~xE@VQv&tRWO zCNpKmnAr@qtd9e6WF-$a`k2m;+`#YeWm+pZe%rw?z{KFWirdHbOVPh3&SHUFYHJT# zUOfv=eY1*F(j2jgkl63x&oHl3DBHQ}Td|QTg~}l*j^L%%N$UAvoq~*)n`oajCVM&AuLqHSMBECJJv<{W~_p2ViXu zE+WTK;~UVOs?70+0M*-KV_jb*LI>TAF@7Cq`m$!v3I2CJA02^<2_PMUT)h*XR?ei3 zL1$z#_wr{|?mTa|j^UbkWg^m{CJ8`1eFB9xo`$WJ37hw{L!T}>xf^Hb>Vx%n`0g%#p-9;Y~So_OLl@* zj>BY%2-8uSprSi}!(2?~Cc{_i@Ca(9&-}M=GOaeLEuo*TXH4fIufylAaW6nRSP5yK3Kj{ma4)|e8cd~r?F!Sx-FDpn!&9KpL(0Q}&p*R4%pXNh~n}p((A6*k` z$jFj+{3qSM(n-R;!BonOaCbjtPQ&sUXs5gd0DlnJXzN8Uym|93?)&nU6BrQMcLco# zLK@=VNl$3GOgvN!P9MXPd3iif+}u-N7u3L;e3767zmhvA3Pj;nQQJN7%tRDWVXA##OKMe@)IlYBTxh8q7jal zi&v?iq>uE`3pK`n7Nxfx^Pk;S_SwAFM#S*|>ink}N*o2fJ0&`rHI_6WOZQOYQsmxz zvynn6Y#;n)Lzg)1UdTe5>z{A^E)4uh7rU~u@46)igRMb7(`BjAZEn|PoYfdD4lc$& zz6ydufRLgA?B?YU0U+=65q7{v!V|bxn@U^BsJIALC+CR61b*Y5WBjAV59g4yS!nM} z8*B>)f^Fe~ym$C6WEsYU>kqi(rrivurO*L?Ug+O268!wKzzag>P1N&u{BMtxh(7)O z>VG`?kLL0JtD#K9nG4Oh9%jNpZf0gi%g%m@Dv(V!#>7~gIwT~-Y5zdwBV_L!0rU8i zSZN>#szZKf+JU-w{)|rD!-JMX_(o9G-TjqN4J0*nqrI z4J)fAZ8hBDcyf-cY5j>9LOLiVn)R1Lw6YqnvvT(yU{Cg!_FB_#b4JlF(%AW_E+S8V zi_M>|Cpt-^J(_nk=n4ga!~w(p5iwqFQPFg7PUNmv?KQ6jBC;}M<7((onuQqcmQ?G+ zu>;1dwUvrn21ek3^l9ix!q_Uq@=aFSpp)4t0;;g%?{~lsc08y`Q6kqOWMBx-c&7OF zvIu)K%T1-&BK~klIfg{-H^geL^2qqg(S%?4B}anpSk6$fzUlVOPMXwvNURz<3^osI z0Ls8#T3?u$df8|&SNDsquJ7%5+g)cnxIijp9r0R}!Qc;42LFg{uO_bDfm#t^VeZP; z(w|I(W#E*BZw^%a^jPtq=4gIS$NFvYTmTuA7*Ov+^unKF-weNE72~WGyiRyN6AaKE zkIuF+Rli`iN%xW19fgh^Iv_G+eCwF;OFA^`sv_Or&?tM1p6=CW#w;R8D7LefuiRZsN!C%u! zM6N{=NnNUohR%N4PPk7GH9ZJpG79|$C=lgHOnB=H0`%O?Td!x49G$Ce>LkKg!Ux_? zSUL^9cUM?g$al=AoSpSv>XY48bunAICE%7)M`_U=8MpkftxV(k%#=K9WwUAE-oq=* zQSoAY3(wqrF3T$>MznP_>;|s0IXo!igP}6G&_CImyO2*gD?&MdPt!IqlDVC^Sp}c= ziv$0RQdx;Y%kHHUITH(HP9UTf>EacutF=C3yGfhFr_TplfOp#;$WJ0 ztuQZCH}&310!qGYZ#y+4pR!&sUK4dUj(3`wiH@*IzM~E1u^YM}{B!kR~O20ZwV>g)Xj1J!9?9He1VFGm|$Uis`-8)72XeB1{T zhV_W)zzWv!>K__s?1>gx>lcPV3c`Z0lkz2SbOMkGn@+pAioTYm}mOsl5Ds8}HTyIg@bS+s!lx-IJKk?)lI{ zO%JD)!y%UlOOL!>kEKE?zl~Xu7%I9Nyd-~lAv<~cV^dhz!oq@N7C`V5b34qNbA&X) zX#RF&%0>~qICOF;v{jux-{5>JxB2LA(@w*B&_Gl%7DF(o#zae`r763p>OhB*^3U{E z)x}fl-Z=vE&$&AD$=F!j03kmWx#)R8S~5BEVXCd)chNBXbGe1Nu=K7b9|c22Rgv?- z72Q1_+!L>+#r0MbZEbN%B_1M7L0>j+vXlq){o2^jZc+tmZ};5*UQ9YgxC7lll7@1Y zjLVd&$)3RuW5PI`TsK_3NZgrgv5Y*H)rWyIP3bb18sXRDWg68pA$%~wjX8bQ0AlYV(_Zys)3NP7J9)Cw0NS$WtanZ*pI9*0d_U6;Nf0U~NO#Me;EM;u zWuKe!&z}?@fC}Yg1x5M~yic5Sn|^lKo`6@W5KKB}HQ{s*$A5sLZ_1pPO00evG{T4< zM*>5#c-8Ko(?g`ZFq#PyP4LRiA}RQ{=vS47hJBxu6Xvf^)@-r~9~M^jYPP7mRYZ}P zJ6nW>zdu^$0(E~IKLhNfdg~&4J{Bv)->E_?>HGFw2>;xW^7wl|GQp8A(^c0IJwla) z#N4=Ft3RVU)%&;;+H-t4Z-TcF5#APeu1KOIwL4tsV0GggAh8DS7~0?l+(I!t=rKpW zrlvMu!fC${<5=~%t5fz0^U!34Z-YR@Rj?+hCGp~<<2tLQFn)LS=T^c48a#Tf(eX*M z%!mV|G$-Y4b0E1AyrE=dE1YBTj#%5!rk5QX%qzH09CI1=CgWSv%}A1_`{aNBe_#P) z7+`kwe2aJP$@wE<4Q~RD({ZXT9#) zr%a3NvU}AhRZV#kV2k0rIxG;@($Bg=_vLApP}~N|c~!te#n#rRl_(V_<^1 z;^n#uVvL&g<%mBJ8yy}Th@jlQU>d)(oPnS$zQBpEwxy?v7t6sYZmX?fMLL7|5R2dy zbOGG9MHHmom0K^IVODiZ42vi(tI8%Obq^g&2Xt^voW(cYqwB1Y3 zdCnUF&OR|AIr>p%O8Z{|O$l-Fn$t@HrL`*@^!90jQ)IM*YaK9&b`zZX% zpZPj}N=rs4^smm&KP{R+Lp-l;{}kfn=M9qo?a};tqGYs0L-jRR))KH~FX$)1_a(j~ z(=+2BGXn~Cfe6DvsBmcFef0-}%t>Lr zncxSs7wW5UdG>OD%6sd}ylxZa_g1Y(9j;zKSDJzYc+0WwY&-RpJYCWC0V*4Zc|*s1 z3-V^IrNRRCEdyRSUadggm5a?kgA=FSdY!5j-1cRbHVHGz`e`;wfX89noUg^HpgYz z*+jth>aEW&Gt%7+$r( zL?uep(5P&)AJCi%;7*UF0F$LIC)CVs{TjQJg+-74S z(LbLLQvD#@S6W7|t;G$I4~wPMCg&L5SJKy))tmG1Xqskdav}_ddt@B!dAb&pyzosl zGeRboF|*GQxExZ>qXui!!V$LzlM;Vh<%^Vk-z5?k5rKE$A-gB>xiTLj%3TuYl>LC% z`!zYe*@>BNSMa_8h>`YMM?~|P2bfrXQWMY1(3EwqA3gSCGQ&{P(9}*jVpoCI-;d_k zJq^45>4=0oF=&zyDcr-C^fG3rE{$<{ea_q3&xzxlgPUlDW+0zl*e95~$lOjB@H^e6xJAvSOz7JS1@a z!Wd;?@chL$Ew5almljtF`&R237EhX%Otv`)>cd?7Yv<^?yA$S{Kq+ck)DuR6-Dl?L zLD3dx;VWUEZM&R>>okk7&>NO)moQo^ThYBK<5(M4pt(&#(i>$r*yO(Rf|dq>gaH|0 z;Aykhb%Hs~(Z9XMg)!(D)=M%i2k`mGi!PY<%EQhiljJJ>+m}yH#>aKn6mCnU;4*W) z?&v1X7J~F1HWhcy%0@tFGa-t6O3cv8i5dB8EVukJNf;9twRBzvn-dF1Mw;?HuwuAK zOGoZ>m9%Y7=Hb$%y{;23`Fx`^ciO&KXe8;R`+n*;ZG~&?HuVFf{sD2%-VV@w6MbSx zL%%OiN|AgEZbAyIXHX9H+w@bc8|~QyjqfekZy!K{rQ+!?FiTWQr-&=%z-fpj19V<6 z4WOO}PQE0P`CdQxnl9K{Z9AS!q*j-_?w zv@WsBYAh`d;?W!;iXZr9-=&$?ReMOk@@>5^880dRo7eC`TmJURRd*lJzEA%^y77Us zrnT-nH%RvzsGn)wAv;Y8Ii_waz9ZAZUn3zTn2dw_lfwia1KU9dtzv}k#(~_jly~!@ z2x=SNK;s22SvV&B{?SoeG1E?(oLq^tRv9sfBbTJdn!Qcmf!!!jJmddf;f@~C*{K(s zsD`l$IF_HVz$7XUxb5(!`9M* zg30FcaI*DT9wz*Nj@!HY(#yL&f#qN4X#HeKDYB9gjs8w-wHC?_9%)tt{n9%7iD}I6 zE=d^~xI?IJ)?tw+Vwvjjbph#G)}{-;lA!1fp2rMkKQFAU+#sWni=+0zhqXys4e>YF zjxUF_ORH45MM;|r{qn=OFbWVA>PH4%x!dG**J=A0s$}K+?Icl0SGf-g>${VA_wM$) z_g5d^Y=DL~@;zRc%$2&zF<Br08TQKh12ia_9uF=-ax3^+-T4TD8WVEcRXc zxE^}IPexPFV$b?ci38N#C?7n)Nu?s5V3F|`<6qn zMLHodp>Phe$V;Dc9JIN=Cp^kHeCtGb@^G>k|6D5|V@M>Od2MPAuur@>#Fef^5JFE- zw^m{pFn*inNy|;ShDTVM`#*ev(mnXa>IL-M^##JWy7)$IAbPb-WG|0EfVNS$l=uj< zlt{2+xs)*ZwOuZVieVJjsbPQSkn=pfL)_zTPfOIyF&*AU5@gpBy7?u|s2LZ2d9EZL zmLyiUB6z6otRf_zEh7EmuAdthaSpt(_bXKKq_5VNNCm!02N_?dLgVG3w9wHMEX znck@N4+lq#O7Z)193EiAQdR3MeN^ODY9*O;pA(|Jvcu>bCPYLeTpg`)>wnNv#tCLq z(4;yAoKkWkfJAiR5O_M9_>520VHdI`fOrq>@EfysfP=S~q#fQ_P;CT{&B+5#=h;ig zPb2UbhZiiby=viqbk<3{S#aiAjc;g0#+)K4QRtiag)$)Sgm?n~xHLXqa6`Ss~V5CC}KY!(>!eOY_GTN8ann8>8>nGNc6g1>5hS zXZV_!ON{L&%#YSLW^Q@cU?S5T7N?Uehkn1h{NXvKN6&x%=v*A$zZ0jph^J8Ba8!+BjTIahjE9_lRoeh<+K&*)R_VUekOO-SP*|h+w)%!?~@^ z+-Q%f@*?xr2U=FAY*vQAu4e7IuL*Ma*WKEx)!J=At&isU#H+`*8|YrGr!zM9{_XCR2||zuf4z*V>Pzc5)%uqxXJ0v$80)f zXs~{JxDsm=WKtA*@CMYlDM?cQRbhah3G_e@da5iVX6xbW&t;}W{l^Y`M_ym<)#a
IE$R< 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 AdjJ3c From 67e22cf0a6c4faf0126abecab1abe1c763894abc Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Feb 2018 00:53:12 -0600 Subject: [PATCH 10/30] Closets and Mechs no longer prevent death by freefall --- code/game/objects/effects/step_triggers.dm | 7 +- code/modules/mob/mob_defines.dm | 4 - code/modules/multiz/movement.dm | 131 ++++++++++----------- code/modules/organs/organ_external.dm | 3 +- html/changelogs/Anewbe - MechsFall.yml | 36 ++++++ 5 files changed, 104 insertions(+), 77 deletions(-) create mode 100644 html/changelogs/Anewbe - MechsFall.yml diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 5fec97b4f0..4d99afa8d0 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -185,10 +185,11 @@ var/global/list/tele_landmarks = list() // Terrible, but the alternative is loop return A.forceMove(T) - if(isliving(A)) // Someday, implement parachutes. For now, just turbomurder whoever falls. + // Living things should probably be logged when they fall... + if(isliving(A)) message_admins("\The [A] fell out of the sky.") - var/mob/living/L = A - L.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. + // ... because they're probably going to die from it. + A.fall_impact(T, 42, 90, FALSE, TRUE) //You will not be defibbed from this. else message_admins("ERROR: planetary_fall step trigger lacks a planet to fall onto.") return diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 8e796ca250..d8044da328 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -217,8 +217,4 @@ var/seedarkness = 1 //Determines mob's ability to see shadows. 1 = Normal vision, 0 = darkvision - // Falling things - var/hovering = FALSE // Is the mob floating or flying in some way? If so, don't fall normally. //Not implemented yet, idea is to let them ignore terrain slowdown and falling down floors - var/softfall = FALSE // Is the mob able to lessen their impact upon falling? - var/parachuting = FALSE // Is the mob able to jump out of planes and survive? Don't check this directly outside of CanParachute(). var/get_rig_stats = 0 //Moved from computer.dm diff --git a/code/modules/multiz/movement.dm b/code/modules/multiz/movement.dm index 59b0b2ebe8..ccd00753f8 100644 --- a/code/modules/multiz/movement.dm +++ b/code/modules/multiz/movement.dm @@ -347,9 +347,12 @@ /atom/movable/proc/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE) if(!silent) visible_message("\The [src] falls from above and slams into \the [hit_atom]!", "You hear something slam into \the [hit_atom].") + for(var/atom/movable/A in src.contents) + A.fall_impact(hit_atom, damage_min, damage_max, silent = TRUE) // Take damage from falling and hitting the ground -/mob/living/fall_impact(var/turf/landing, var/damage_min = 0, var/damage_max = 30, var/silent = FALSE, var/planetary = FALSE) +/mob/living/fall_impact(var/atom/hit_atom, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE) + var/turf/landing = get_turf(hit_atom) if(planetary && src.CanParachute()) if(!silent) visible_message("\The [src] glides in from above and lands on \the [landing]!", \ @@ -376,60 +379,32 @@ "You hear something slam into \the [landing].") playsound(loc, "punch", 25, 1, -1) - if(planetary) //Since the planetary fall damage is calibrated for humans, we need to up this a bit - damage_min *= 2 - damage_max *= 2 - - adjustBruteLoss(rand(damage_min, damage_max)) - return - return - -/mob/living/carbon/human/fall_impact(var/turf/landing, var/damage_min = 0, var/damage_max = 10, var/silent = FALSE, var/planetary = FALSE) - if(planetary && src.CanParachute()) - if(!silent) - visible_message("\The [src] glides in from above and lands on \the [landing]!", \ - "You land on \the [landing]!", \ - "You hear something land \the [landing].") - return - else if(!planetary && src.softfall) // Falling one floor and falling one atmosphere are very different things - if(!silent) - visible_message("\The [src] falls from above and lands on \the [landing]!", \ - "You land on \the [landing]!", \ - "You hear something land \the [landing].") - return - else - if(!silent) - if(planetary) - visible_message("\A [src] falls out of the sky and crashes into \the [landing]!", \ - " You fall out of the skiy and crash into \the [landing]!", \ - "You hear something slam into \the [landing].") - var/turf/T = get_turf(landing) - explosion(T, 0, 1, 2) - else - visible_message("\The [src] falls from above and slams into \the [landing]!", \ - "You fall off and hit \the [landing]!", \ - "You hear something slam into \the [landing].") - playsound(loc, "punch", 25, 1, -1) - - // Because wounds heal rather quickly, 10 should be enough to discourage jumping off but not be enough to ruin you, at least for the first time. - apply_damage(rand(damage_min, damage_max), BRUTE, BP_HEAD) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_TORSO) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_GROIN) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_LEG) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_LEG) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_FOOT) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_FOOT) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_ARM) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_ARM) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_L_HAND) - apply_damage(rand(damage_min, damage_max), BRUTE, BP_R_HAND) + // Because wounds heal rather quickly, 10 (the default for this proc) should be enough to discourage jumping off but not be enough to ruin you, at least for the first time. + // Hits 10 times, because apparently targeting individual limbs lets certain species survive the fall from atmosphere + for(var/i = 1 to 10) + adjustBruteLoss(rand(damage_min, damage_max)) Weaken(4) updatehealth() return return -//Checks if the mob is allowed to survive a fall from space -/mob/living/proc/CanParachute() +//Using /atom/movable instead of /obj/item because I'm not sure what all humans can pick up or wear +/atom/movable + var/parachute = FALSE // Is this thing a parachute itself? + var/hovering = FALSE // Is the thing floating or flying in some way? If so, don't fall normally. //Not implemented yet, idea is to let mobs/mechs ignore terrain slowdown and falling down floors + var/softfall = FALSE // Is the thing able to lessen their impact upon falling? + var/parachuting = FALSE // Is the thing able to jump out of planes and survive? Don't check this directly outside of CanParachute(). + +/atom/movable/proc/isParachute() + return parachute + +//This is what makes the parachute items know they've been used. +//I made it /atom/movable so it can be retooled for other things (mobs, mechs, etc), though it's only currently called in human/CanParachute(). +/atom/movable/proc/handleParachute() + return + +//Checks if the thing is allowed to survive a fall from space +/atom/movable/proc/CanParachute() return parachuting //For humans, this needs to be a wee bit more complicated @@ -454,19 +429,6 @@ else return parachuting -//For human falling code -//Using /obj instead of /obj/item because I'm not sure what all humans can pick up or wear -/obj - var/parachute = FALSE - -/obj/proc/isParachute() - return parachute - -//This is what makes the parachute items know they've been used. -//I made it /atom/movable so it can be retooled for other things (mobs, mechs, etc), though it's only currently called in human/CanParachute(). -/atom/movable/proc/handleParachute() - return - //Mech Code /obj/mecha/handle_fall(var/turf/landing) // First things first, break any lattice @@ -480,18 +442,49 @@ return ..() /obj/mecha/fall_impact(var/atom/hit_atom, var/damage_min = 15, var/damage_max = 30, var/silent = FALSE, var/planetary = FALSE) - // Tell the pilot that they just dropped down with a superheavy mecha. - if(occupant) - to_chat(occupant, "\The [src] crashed down onto \the [hit_atom]!") - // Anything on the same tile as the landing tile is gonna have a bad day. for(var/mob/living/L in hit_atom.contents) L.visible_message("\The [src] crushes \the [L] as it lands on them!") L.adjustBruteLoss(rand(70, 100)) L.Weaken(8) - // Now to hurt the mech. - take_damage(rand(damage_min, damage_max)) + var/turf/landing = get_turf(hit_atom) + + if(planetary && src.CanParachute()) + if(!silent) + visible_message("\The [src] glides in from above and lands on \the [landing]!", \ + "You land on \the [landing]!", \ + "You hear something land \the [landing].") + return + else if(!planetary && src.softfall) // Falling one floor and falling one atmosphere are very different things + if(!silent) + visible_message("\The [src] falls from above and lands on \the [landing]!", \ + "You land on \the [landing]!", \ + "You hear something land \the [landing].") + return + else + if(!silent) + if(planetary) + visible_message("\A [src] falls out of the sky and crashes into \the [landing]!", \ + " You fall out of the skiy and crash into \the [landing]!", \ + "You hear something slam into \the [landing].") + var/turf/T = get_turf(landing) + explosion(T, 0, 1, 2) + else + visible_message("\The [src] falls from above and slams into \the [landing]!", \ + "You fall off and hit \the [landing]!", \ + "You hear something slam into \the [landing].") + playsound(loc, "punch", 25, 1, -1) + + // Now to hurt everything in the mech (if the fall is planetary, the mech blows up, so we do this first) + for(var/atom/movable/A in src.contents) + A.fall_impact(hit_atom, damage_min, damage_max, silent = TRUE) + // And now the Mech + + if(!planetary) + take_damage(rand(damage_min, damage_max)) + else + qdel(src) // And hurt the floor. if(istype(hit_atom, /turf/simulated/floor)) diff --git a/code/modules/organs/organ_external.dm b/code/modules/organs/organ_external.dm index 0bfd3dfd0e..fe54e49461 100644 --- a/code/modules/organs/organ_external.dm +++ b/code/modules/organs/organ_external.dm @@ -323,7 +323,8 @@ // sync the organ's damage with its wounds src.update_damages() - owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called + if(owner) + owner.updatehealth() //droplimb will call updatehealth() again if it does end up being called //If limb took enough damage, try to cut or tear it off if(owner && loc == owner && !is_stump()) diff --git a/html/changelogs/Anewbe - MechsFall.yml b/html/changelogs/Anewbe - MechsFall.yml new file mode 100644 index 0000000000..af4d4acedb --- /dev/null +++ b/html/changelogs/Anewbe - MechsFall.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - bugfix: "You need a parachute to survive atmospheric reentry, closets, mechs, and other impromptu parachutes will not longer prevent splatting." From c28d64e91d85807f4ed79f32206c29d379054146 Mon Sep 17 00:00:00 2001 From: Cerebulon Date: Mon, 5 Feb 2018 06:56:24 +0000 Subject: [PATCH 11/30] Shantak Piss Fix --- code/modules/mob/living/simple_animal/aliens/alien.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/aliens/alien.dm b/code/modules/mob/living/simple_animal/aliens/alien.dm index d31efe6df8..a468a7c8cd 100644 --- a/code/modules/mob/living/simple_animal/aliens/alien.dm +++ b/code/modules/mob/living/simple_animal/aliens/alien.dm @@ -219,7 +219,7 @@ speak_chance = 5 speak = list("Shuhn","Shrunnph?","Shunpf") - emote_see = list("scratches the ground","shakes out it's mane","tinkles gently") + emote_see = list("scratches the ground","shakes out it's mane","clinks gently as it moves") /mob/living/simple_animal/yithian name = "yithian" From 63a1806b41e0e39f11db3dc53f7379411087a50c Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Feb 2018 13:13:37 -0500 Subject: [PATCH 12/30] Bitfields do not work that way. Fix attempt to use `in` on a non-list. --- code/controllers/subsystem.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/controllers/subsystem.dm b/code/controllers/subsystem.dm index bd9a2aeafb..437c10424b 100644 --- a/code/controllers/subsystem.dm +++ b/code/controllers/subsystem.dm @@ -166,7 +166,7 @@ - if(can_fire && !(SS_NO_FIRE in flags)) + if(can_fire && !(SS_NO_FIRE & flags)) msg = "[round(cost,1)]ms|[round(tick_usage,1)]%|[round(ticks,0.1)]\t[msg]" else msg = "OFFLINE\t[msg]" From 44dc4b72865ff7542152d833d2e88db274eab5d8 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 26 Jan 2018 20:35:13 -0500 Subject: [PATCH 13/30] Implement SSatoms * Moves proc/initialize() from being on /atom/movable, /are and /turf/simulated to being on /atom - Now turfs can initialize too * Added the SSatoms subsystem which controls initialization of atoms at roundstart and during normal conditions. * Disabled the old auto_init = 0 behavior, ALL atoms should get initialized() called on them now. * Refactored the way initialize() is called during /New() to utilize SSatoms instead of SScreation * Removed SScreation, as it was only a stop-gap until SSatoms could be ported. * Updated the maploader to inform SSatoms when it is loading maps instead of SScreation. * Updated the template map loader to use SSatoms to perform initTemplateBounds * Renamed 'initialized' var in seed_storage to deconflict. * Removed usage of auto_init = 0, replaced with a no-op initialize() proc for atoms that don't need initialization. --- code/__defines/subsystems.dm | 10 ++ code/controllers/master_controller.dm | 4 +- code/controllers/subsystems/atoms.dm | 145 ++++++++++++++++++ code/controllers/subsystems/floor_decals.dm | 28 ++++ code/controllers/subsystems/machines.dm | 27 +++- code/game/area/areas.dm | 6 +- code/game/atoms.dm | 44 +++++- code/game/atoms_movable.dm | 13 -- code/game/machinery/machinery.dm | 5 +- .../turfs/flooring/turf_overlay_holder.dm | 7 +- code/game/turfs/unsimulated.dm | 3 +- code/modules/hydroponics/seed_storage.dm | 6 +- code/modules/lighting/lighting_overlay.dm | 7 +- code/modules/maps/tg/map_template.dm | 68 +++----- code/modules/maps/tg/reader.dm | 8 +- code/modules/multiz/zshadow.dm | 2 +- code/world.dm | 1 + polaris.dme | 3 +- 18 files changed, 309 insertions(+), 78 deletions(-) create mode 100644 code/controllers/subsystems/atoms.dm create mode 100644 code/controllers/subsystems/floor_decals.dm diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index cf23deb2de..e4a3c243e2 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -1,4 +1,12 @@ +#define INITIALIZATION_INSSATOMS 0 //New should not call Initialize +#define INITIALIZATION_INNEW_MAPLOAD 1 //New should call Initialize(TRUE) +#define INITIALIZATION_INNEW_REGULAR 2 //New should call Initialize(FALSE) + +#define INITIALIZE_HINT_NORMAL 0 //Nothing happens +#define INITIALIZE_HINT_LATELOAD 1 //Call LateInitialize +#define INITIALIZE_HINT_QDEL 2 //Call qdel on the atom + // SS runlevels #define RUNLEVEL_INIT 0 // "Initialize Only" - Used for subsystems that should never be fired (Should also have SS_NO_FIRE set) @@ -15,6 +23,8 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G // Subsystem init_order, from highest priority to lowest priority // Subsystems shutdown in the reverse of the order they initialize in // The numbers just define the ordering, they are meaningless otherwise. +#define INIT_ORDER_DECALS 16 +#define INIT_ORDER_ATOMS 15 #define INIT_ORDER_MACHINES 10 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 6659f47b4a..d39d735a46 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -36,7 +36,7 @@ datum/controller/game_controller/New() datum/controller/game_controller/proc/setup() setup_objects() - setupgenetics() + // setupgenetics() Moved to SSatoms SetupXenoarch() transfer_controller = new @@ -59,6 +59,7 @@ datum/controller/game_controller/proc/setup_objects() //Set up spawn points. populate_spawn_points() +/* admin_notice("Initializing Floor Decals", R_DEBUG) var/list/turfs_with_decals = list() for(var/obj/effect/floor_decal/D in world) @@ -111,3 +112,4 @@ datum/controller/game_controller/proc/setup_objects() if(!QDELETED(lift)) lift.initialize() CHECK_SLEEP_MASTER + */ \ No newline at end of file diff --git a/code/controllers/subsystems/atoms.dm b/code/controllers/subsystems/atoms.dm new file mode 100644 index 0000000000..6b5669878c --- /dev/null +++ b/code/controllers/subsystems/atoms.dm @@ -0,0 +1,145 @@ +#define BAD_INIT_QDEL_BEFORE 1 +#define BAD_INIT_DIDNT_INIT 2 +#define BAD_INIT_SLEPT 4 +#define BAD_INIT_NO_HINT 8 + +SUBSYSTEM_DEF(atoms) + name = "Atoms" + init_order = INIT_ORDER_ATOMS + flags = SS_NO_FIRE + + var/initialized = INITIALIZATION_INSSATOMS + // var/list/created_atoms // This is never used, so don't bother. ~Leshana + var/old_initialized + + var/list/late_loaders + var/list/created_atoms + + var/list/BadInitializeCalls = list() + +/datum/controller/subsystem/atoms/Initialize(timeofday) + setupgenetics() //to set the mutations' place in structural enzymes, so initializers know where to put mutations. + initialized = INITIALIZATION_INNEW_MAPLOAD + to_world_log("Initializing objects") + admin_notice("Initializing objects", R_DEBUG) + InitializeAtoms() + return ..() + +/datum/controller/subsystem/atoms/proc/InitializeAtoms(list/atoms) + if(initialized == INITIALIZATION_INSSATOMS) + return + + initialized = INITIALIZATION_INNEW_MAPLOAD + + LAZYINITLIST(late_loaders) + + var/count + var/list/mapload_arg = list(TRUE) + if(atoms) + created_atoms = list() + count = atoms.len + for(var/I in atoms) + var/atom/A = I + if(!A.initialized) + if(InitAtom(I, mapload_arg)) + atoms -= I + CHECK_TICK + else + count = 0 + for(var/atom/A in world) + if(!A.initialized) + InitAtom(A, mapload_arg) + ++count + CHECK_TICK + + log_world("Initialized [count] atoms") + + initialized = INITIALIZATION_INNEW_REGULAR + + if(late_loaders.len) + for(var/I in late_loaders) + var/atom/A = I + A.LateInitialize() + CHECK_TICK + testing("Late initialized [late_loaders.len] atoms") + late_loaders.Cut() + + // Nothing ever checks return value of this proc, so don't bother. If this ever changes fix code in /atom/New() ~Leshana + // if(atoms) + // . = created_atoms + atoms + // created_atoms = null + +/datum/controller/subsystem/atoms/proc/InitAtom(atom/A, list/arguments) + var/the_type = A.type + if(QDELING(A)) + BadInitializeCalls[the_type] |= BAD_INIT_QDEL_BEFORE + return TRUE + + var/start_tick = world.time + + var/result = A.initialize(arglist(arguments)) + + if(start_tick != world.time) + BadInitializeCalls[the_type] |= BAD_INIT_SLEPT + + var/qdeleted = FALSE + + if(result != INITIALIZE_HINT_NORMAL) + switch(result) + if(INITIALIZE_HINT_LATELOAD) + if(arguments[1]) //mapload + late_loaders += A + else + A.LateInitialize() + if(INITIALIZE_HINT_QDEL) + qdel(A) + qdeleted = TRUE + else + BadInitializeCalls[the_type] |= BAD_INIT_NO_HINT + + if(!A) //possible harddel + qdeleted = TRUE + else if(!A.initialized) + BadInitializeCalls[the_type] |= BAD_INIT_DIDNT_INIT + + return qdeleted || QDELING(A) + +/datum/controller/subsystem/atoms/proc/map_loader_begin() + old_initialized = initialized + initialized = INITIALIZATION_INSSATOMS + +/datum/controller/subsystem/atoms/proc/map_loader_stop() + initialized = old_initialized + +/datum/controller/subsystem/atoms/Recover() + initialized = SSatoms.initialized + if(initialized == INITIALIZATION_INNEW_MAPLOAD) + InitializeAtoms() + old_initialized = SSatoms.old_initialized + BadInitializeCalls = SSatoms.BadInitializeCalls + +/datum/controller/subsystem/atoms/proc/InitLog() + . = "" + for(var/path in BadInitializeCalls) + . += "Path : [path] \n" + var/fails = BadInitializeCalls[path] + if(fails & BAD_INIT_DIDNT_INIT) + . += "- Didn't call atom/Initialize()\n" + if(fails & BAD_INIT_NO_HINT) + . += "- Didn't return an Initialize hint\n" + if(fails & BAD_INIT_QDEL_BEFORE) + . += "- Qdel'd in New()\n" + if(fails & BAD_INIT_SLEPT) + . += "- Slept during Initialize()\n" + +/datum/controller/subsystem/atoms/Shutdown() + var/initlog = InitLog() + if(initlog) + //text2file(initlog, "[GLOB.log_directory]/initialize.log") + var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") + text2file(initlog, "data/logs/[date_string]-initialize.log") + +#undef BAD_INIT_QDEL_BEFORE +#undef BAD_INIT_DIDNT_INIT +#undef BAD_INIT_SLEPT +#undef BAD_INIT_NO_HINT diff --git a/code/controllers/subsystems/floor_decals.dm b/code/controllers/subsystems/floor_decals.dm new file mode 100644 index 0000000000..39e4515d0d --- /dev/null +++ b/code/controllers/subsystems/floor_decals.dm @@ -0,0 +1,28 @@ +// +// Floor Decals Initialization Subsystem +// This is part of the giant decal hack that works around a BYOND bug where DreamDaemon will crash if you +// update overlays on turfs too much. +// The master_controller on Polaris used to init decals prior to initializing areas (which initilized turfs) +// Now that we switched to subsystems we still want to do the same thing, so this takes care of it. +// +SUBSYSTEM_DEF(floor_decals) + name = "Floor Decals" + init_order = INIT_ORDER_DECALS + flags = SS_NO_FIRE + +/datum/controller/subsystem/floor_decals/Initialize(timeofday) + if(floor_decals_initialized) + return ..() + to_world_log("Initializing Floor Decals") + admin_notice("Initializing Floor Decals", R_DEBUG) + var/list/turfs_with_decals = list() + for(var/obj/effect/floor_decal/D in world) + var/T = D.add_to_turf_decals() + if(T) turfs_with_decals |= T + CHECK_TICK + for(var/item in turfs_with_decals) + var/turf/T = item + if(T.decals) T.apply_decals() + CHECK_TICK + floor_decals_initialized = TRUE + return ..() diff --git a/code/controllers/subsystems/machines.dm b/code/controllers/subsystems/machines.dm index 7738544024..f8c353c43d 100644 --- a/code/controllers/subsystems/machines.dm +++ b/code/controllers/subsystems/machines.dm @@ -33,8 +33,9 @@ SUBSYSTEM_DEF(machines) var/list/current_run = list() /datum/controller/subsystem/machines/Initialize(timeofday) - SSmachines.makepowernets() - // TODO - Move world-creation time setup of atmos machinery and pipenets to here + makepowernets() + admin_notice("Initializing atmos machinery.", R_DEBUG) + setup_atmos_machinery(global.machines) fire() ..() @@ -53,13 +54,33 @@ SUBSYSTEM_DEF(machines) for(var/datum/powernet/PN in powernets) qdel(PN) powernets.Cut() + setup_powernets_for_cables(cable_list) - for(var/obj/structure/cable/PC in cable_list) +/datum/controller/subsystem/machines/proc/setup_powernets_for_cables(list/cables) + for(var/obj/structure/cable/PC in cables) if(!PC.powernet) var/datum/powernet/NewPN = new() NewPN.add_cable(PC) propagate_network(PC,PC.powernet) +/datum/controller/subsystem/machines/proc/setup_atmos_machinery(list/atmos_machines) + for(var/obj/machinery/atmospherics/machine in atmos_machines) + machine.atmos_init() + CHECK_TICK + + for(var/obj/machinery/atmospherics/machine in atmos_machines) + machine.build_network() + CHECK_TICK + + for(var/obj/machinery/atmospherics/unary/U in atmos_machines) + if(istype(U, /obj/machinery/atmospherics/unary/vent_pump)) + var/obj/machinery/atmospherics/unary/vent_pump/T = U + T.broadcast_status() + else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber)) + var/obj/machinery/atmospherics/unary/vent_scrubber/T = U + T.broadcast_status() + CHECK_TICK + /datum/controller/subsystem/machines/stat_entry() var/msg = list() msg += "C:{" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index 0c5fe0e7de..e70c7325e4 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -25,11 +25,15 @@ ..() -/area/proc/initialize() +/area/initialize() + . = ..() if(!requires_power || !apc) power_light = 0 power_equip = 0 power_environ = 0 + return INITIALIZE_HINT_LATELOAD + +/area/LateInitialize() power_change() // all machines set to current power level, also updates lighting icon /area/proc/get_contents() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index c8a9c1e1b5..b00bf09529 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -24,13 +24,53 @@ //Detective Work, used for the duplicate data points kept in the scanners var/list/original_atom + // Track if we are already had initialize() called to prevent double-initialization. + var/initialized = FALSE -//atom creation method that preloads variables at creation -/atom/New() +/atom/New(loc, ...) // Don't call ..() unless /datum/New() ever exists + + // During dynamic mapload (reader.dm) this assigns the var overrides from the .dmm file + // Native BYOND maploading sets those vars before invoking New(), by doing this FIRST we come as close to that behavior as we can. if(use_preloader && (src.type == _preloader.target_path))//in case the instanciated atom is creating other atoms in New() _preloader.load(src) + // Pass our arguments to InitAtom so they can be passed to initialize(), but replace 1st with if-we're-during-mapload. + var/do_initialize = SSatoms && SSatoms.initialized // Workaround our non-ideal initialization order: SSatoms may not exist yet. + //var/do_initialize = SSatoms.initialized + if(do_initialize > INITIALIZATION_INSSATOMS) + args[1] = (do_initialize == INITIALIZATION_INNEW_MAPLOAD) + if(SSatoms.InitAtom(src, args)) + // We were deleted. No sense continuing + return + + // Uncomment if anything ever uses the return value of SSatoms.InitializeAtoms ~Leshana + // If a map is being loaded, it might want to know about newly created objects so they can be handled. + // var/list/created = SSatoms.created_atoms + // if(created) + // created += src + +// Note: I removed "auto_init" feature (letting types disable auto-init) since it shouldn't be needed anymore. +// You can replicate the same by checking the value of the first parameter to initialize() ~Leshana + +// Called after New if the map is being loaded, with mapload = TRUE +// Called from base of New if the map is not being loaded, with mapload = FALSE +// This base must be called or derivatives must set initialized to TRUE +// Must not sleep! +// Other parameters are passed from New (excluding loc), this does not happen if mapload is TRUE +// Must return an Initialize hint. Defined in code/__defines/subsystems.dm +/atom/proc/initialize(mapload, ...) + if(QDELETED(src)) + crash_with("GC: -- [type] had initialize() called after qdel() --") + if(initialized) + crash_with("Warning: [src]([type]) initialized multiple times!") + initialized = TRUE + return INITIALIZE_HINT_NORMAL + +// Called after all object's normal initialize() if initialize() returns INITIALIZE_HINT_LATELOAD +/atom/proc/LateInitialize() + return + /atom/proc/reveal_blood() return diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 2dba31d578..0cd09b8a57 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -18,15 +18,6 @@ var/icon_scale = 1 // Used to scale icons up or down in update_transform(). var/old_x = 0 var/old_y = 0 - var/auto_init = 1 - -/atom/movable/New() - ..() - if(auto_init && ticker && ticker.current_state == GAME_STATE_PLAYING) - if(SScreation && SScreation.map_loading) // If a map is being loaded, newly created objects need to wait for it to finish. - SScreation.atoms_needing_initialize += src - else - initialize() /atom/movable/Destroy() . = ..() @@ -47,10 +38,6 @@ pulledby.pulling = null pulledby = null -/atom/movable/proc/initialize() - if(QDELETED(src)) - crash_with("GC: -- [type] had initialize() called after qdel() --") - /atom/movable/Bump(var/atom/A, yes) if(src.throwing) src.throw_impact(A) diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm index 2e881f6583..c616d1ee5b 100644 --- a/code/game/machinery/machinery.dm +++ b/code/game/machinery/machinery.dm @@ -118,10 +118,13 @@ Class Procs: ..(l) if(d) set_dir(d) - START_MACHINE_PROCESSING(src) if(circuit) circuit = new circuit(src) +/obj/machinery/initialize() + . = ..() + START_MACHINE_PROCESSING(src) + /obj/machinery/Destroy() STOP_MACHINE_PROCESSING(src) if(component_parts) diff --git a/code/game/turfs/flooring/turf_overlay_holder.dm b/code/game/turfs/flooring/turf_overlay_holder.dm index a0326b8240..c12f727a0b 100644 --- a/code/game/turfs/flooring/turf_overlay_holder.dm +++ b/code/game/turfs/flooring/turf_overlay_holder.dm @@ -16,7 +16,12 @@ var/global/floor_decals_initialized = FALSE icon = null icon_state = null mouse_opacity = 0 - auto_init = 0 + // auto_init = 0 + +/atom/movable/turf_overlay_holder/initialize() + // doesn't need special init + initialized = TRUE + return INITIALIZE_HINT_NORMAL /atom/movable/turf_overlay_holder/New(var/atom/newloc) ..() diff --git a/code/game/turfs/unsimulated.dm b/code/game/turfs/unsimulated.dm index bd85fe8be8..cbf492b081 100644 --- a/code/game/turfs/unsimulated.dm +++ b/code/game/turfs/unsimulated.dm @@ -1,4 +1,5 @@ /turf/unsimulated name = "command" oxygen = MOLES_O2STANDARD - nitrogen = MOLES_N2STANDARD \ No newline at end of file + nitrogen = MOLES_N2STANDARD + initialized = TRUE // Don't call init on unsimulated turfs (at least not yet) diff --git a/code/modules/hydroponics/seed_storage.dm b/code/modules/hydroponics/seed_storage.dm index 9d612f508d..ea7216dfd3 100644 --- a/code/modules/hydroponics/seed_storage.dm +++ b/code/modules/hydroponics/seed_storage.dm @@ -27,7 +27,7 @@ use_power = 1 idle_power_usage = 100 - var/initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction + var/seeds_initialized = 0 // Map-placed ones break if seeds are loaded right at the start of the round, so we do it on the first interaction var/list/datum/seed_pile/piles = list() var/list/starting_seeds = list() var/list/scanner = list() // What properties we can view @@ -135,7 +135,7 @@ if (..()) return - if (!initialized) + if (!seeds_initialized) for(var/typepath in starting_seeds) var/amount = starting_seeds[typepath] if(isnull(amount)) amount = 1 @@ -143,7 +143,7 @@ for (var/i = 1 to amount) var/O = new typepath add(O) - initialized = 1 + seeds_initialized = 1 var/dat = "

Seed storage contents

" if (piles.len == 0) diff --git a/code/modules/lighting/lighting_overlay.dm b/code/modules/lighting/lighting_overlay.dm index 094d781cf2..cade937bfb 100644 --- a/code/modules/lighting/lighting_overlay.dm +++ b/code/modules/lighting/lighting_overlay.dm @@ -10,7 +10,7 @@ //invisibility = INVISIBILITY_LIGHTING color = LIGHTING_BASE_MATRIX icon_state = "light1" - auto_init = 0 // doesn't need special init + //auto_init = 0 // doesn't need special init blend_mode = BLEND_OVERLAY var/lum_r = 0 @@ -19,6 +19,11 @@ var/needs_update = FALSE +/atom/movable/lighting_overlay/initialize() + // doesn't need special init + initialized = TRUE + return INITIALIZE_HINT_NORMAL + /atom/movable/lighting_overlay/New(var/atom/loc, var/no_update = FALSE) . = ..() verbs.Cut() diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index 096b5a7197..c502e447cb 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -44,62 +44,40 @@ var/list/global/map_templates = list() return bounds /datum/map_template/proc/initTemplateBounds(var/list/bounds) - var/list/obj/machinery/atmospherics/atmos_machines = list() + if (SSatoms.initialized == INITIALIZATION_INSSATOMS) + return // let proper initialisation handle it later + var/list/atom/atoms = list() var/list/area/areas = list() -// var/list/turf/turfs = list() - - for(var/L in block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), - locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ]))) + var/list/obj/structure/cable/cables = list() + var/list/obj/machinery/atmospherics/atmos_machines = list() + var/list/turf/turfs = block(locate(bounds[MAP_MINX], bounds[MAP_MINY], bounds[MAP_MINZ]), + locate(bounds[MAP_MAXX], bounds[MAP_MAXY], bounds[MAP_MAXZ])) + for(var/L in turfs) var/turf/B = L atoms += B + areas |= B.loc for(var/A in B) atoms += A -// turfs += B - areas |= get_area(B) - if(istype(A, /obj/machinery/atmospherics)) + if(istype(A, /obj/structure/cable)) + cables += A + else if(istype(A, /obj/machinery/atmospherics)) atmos_machines += A + atoms |= areas - var/i = 0 - -// Apparently when areas get initialize()'d they initialize their turfs as well. -// If this is ever changed, uncomment the block of code below. - -// admin_notice("Initializing newly created simulated turfs in submap.", R_DEBUG) -// for(var/turf/simulated/T in turfs) -// T.initialize() -// i++ -// admin_notice("[i] turf\s initialized.", R_DEBUG) -// i = 0 - - SScreation.initialize_late_atoms() - - admin_notice("Initializing newly created area(s) in submap.", R_DEBUG) - for(var/area/A in areas) - A.initialize() - i++ - admin_notice("[i] area\s initialized.", R_DEBUG) - i = 0 - + admin_notice("Initializing newly created atom(s) in submap.", R_DEBUG) + SSatoms.InitializeAtoms(atoms) + admin_notice("Initializing atmos pipenets and machinery in submap.", R_DEBUG) - for(var/obj/machinery/atmospherics/machine in atmos_machines) - machine.atmos_init() - i++ - - for(var/obj/machinery/atmospherics/machine in atmos_machines) - machine.build_network() - - for(var/obj/machinery/atmospherics/unary/U in machines) - if(istype(U, /obj/machinery/atmospherics/unary/vent_pump)) - var/obj/machinery/atmospherics/unary/vent_pump/T = U - T.broadcast_status() - else if(istype(U, /obj/machinery/atmospherics/unary/vent_scrubber)) - var/obj/machinery/atmospherics/unary/vent_scrubber/T = U - T.broadcast_status() - admin_notice("[i] pipe\s initialized.", R_DEBUG) + SSmachines.setup_atmos_machinery(atmos_machines) admin_notice("Rebuilding powernets due to submap creation.", R_DEBUG) - SSmachines.makepowernets() + SSmachines.setup_powernets_for_cables(cables) + + // Ensure all machines in loaded areas get notified of power status + for(var/I in areas) + var/area/A = I + A.power_change() admin_notice("Submap initializations finished.", R_DEBUG) diff --git a/code/modules/maps/tg/reader.dm b/code/modules/maps/tg/reader.dm index 484865ab81..fa730f574a 100644 --- a/code/modules/maps/tg/reader.dm +++ b/code/modules/maps/tg/reader.dm @@ -304,7 +304,7 @@ var/global/use_preloader = FALSE first_turf_index++ //turn off base new Initialization until the whole thing is loaded - SScreation.StartLoadingMap() + SSatoms.map_loader_begin() //instanciate the first /turf var/turf/T if(members[first_turf_index] != /turf/template_noop) @@ -323,7 +323,7 @@ var/global/use_preloader = FALSE for(index in 1 to first_turf_index-1) instance_atom(members[index],members_attributes[index],crds,no_changeturf) //Restore initialization to the previous value - SScreation.StopLoadingMap() + SSatoms.map_loader_stop() //////////////// //Helpers procs @@ -344,9 +344,9 @@ var/global/use_preloader = FALSE //custom CHECK_TICK here because we don't want things created while we're sleeping to not initialize if(TICK_CHECK) - SScreation.StopLoadingMap() + SSatoms.map_loader_stop() stoplag() - SScreation.StartLoadingMap() + SSatoms.map_loader_begin() /dmm_suite/proc/create_atom(path, crds) set waitfor = FALSE diff --git a/code/modules/multiz/zshadow.dm b/code/modules/multiz/zshadow.dm index 9155f193ef..173aa3ce8f 100644 --- a/code/modules/multiz/zshadow.dm +++ b/code/modules/multiz/zshadow.dm @@ -10,7 +10,7 @@ unacidable = 1 density = 0 opacity = 0 // Don't trigger lighting recalcs gah! TODO - consider multi-z lighting. - auto_init = FALSE // We do not need to be initialize()d + //auto_init = FALSE // We do not need to be initialize()d var/mob/owner = null // What we are a shadow of. /mob/zshadow/can_fall() diff --git a/code/world.dm b/code/world.dm index c4dbbf72b0..76a9a947d2 100644 --- a/code/world.dm +++ b/code/world.dm @@ -40,6 +40,7 @@ var/global/datum/global_init/init = new () #define RECOMMENDED_VERSION 501 /world/New() + world.log << "Map Loading Complete" //logs var/date_string = time2text(world.realtime, "YYYY/MM-Month/DD-Day") href_logfile = file("data/logs/[date_string] hrefs.htm") diff --git a/polaris.dme b/polaris.dme index da4169efe1..0bd64f42a9 100644 --- a/polaris.dme +++ b/polaris.dme @@ -174,7 +174,8 @@ #include "code\controllers\ProcessScheduler\core\processScheduler.dm" #include "code\controllers\subsystems\air.dm" #include "code\controllers\subsystems\airflow.dm" -#include "code\controllers\subsystems\creation.dm" +#include "code\controllers\subsystems\atoms.dm" +#include "code\controllers\subsystems\floor_decals.dm" #include "code\controllers\subsystems\garbage.dm" #include "code\controllers\subsystems\lighting.dm" #include "code\controllers\subsystems\machines.dm" From 58473194435231c3eed1f1cc5beb18a490b67696 Mon Sep 17 00:00:00 2001 From: Leshana Date: Fri, 26 Jan 2018 18:50:55 -0500 Subject: [PATCH 14/30] Update every initialize() proc to return an initialize hint. * Yes, all of them. * Also did a few corrections to redundant New() and broken Destroy() along the way * Renamed the turf_initializer.initialize() proc to InitializeTurf to avoid confusion. * Subsumed /area/proc/initialize into /atom/proc/initialize() - Made /area's LateInitialize to get same behavior as before. --- .../components/binary_devices/dp_vent_pump.dm | 2 +- .../components/binary_devices/passive_gate.dm | 2 +- .../components/binary_devices/pump.dm | 2 +- .../components/trinary_devices/filter.dm | 5 +++-- code/ATMOSPHERICS/components/tvalve.dm | 4 ++-- .../components/unary/outlet_injector.dm | 6 ++--- code/ATMOSPHERICS/components/valve.dm | 2 +- code/__defines/qdel.dm | 1 + code/controllers/master_controller.dm | 16 +++++++------- code/datums/mind.dm | 22 +++++++++---------- code/game/area/areas.dm | 3 +++ code/game/machinery/Sleeper.dm | 1 + code/game/machinery/alarm.dm | 2 ++ code/game/machinery/atmo_control.dm | 10 ++++++--- code/game/machinery/atmoalter/meter.dm | 9 +------- code/game/machinery/computer/camera.dm | 2 +- code/game/machinery/computer/cloning.dm | 2 +- code/game/machinery/computer/computer.dm | 1 + code/game/machinery/computer/message.dm | 2 +- code/game/machinery/computer/station_alert.dm | 2 +- code/game/machinery/cryopod.dm | 2 +- code/game/machinery/doors/airlock.dm | 1 + code/game/machinery/doors/airlock_control.dm | 22 +++---------------- code/game/machinery/doors/alarmlock.dm | 2 +- code/game/machinery/doors/blast_door.dm | 2 +- .../airlock_controllers.dm | 2 +- .../airlock_docking_controller.dm | 2 +- .../airlock_docking_controller_multi.dm | 4 ++-- .../embedded_controller_base.dm | 1 + .../simple_docking_controller.dm | 2 +- code/game/machinery/kitchen/icecream.dm | 2 +- code/game/machinery/status_display.dm | 2 +- .../machinery/telecomms/telecomunications.dm | 1 + code/game/machinery/teleporter.dm | 2 +- code/game/machinery/turret_control.dm | 2 +- code/game/machinery/vr_console.dm | 1 + code/game/mecha/mech_fabricator.dm | 1 + code/game/mecha/mech_prosthetics.dm | 1 + code/game/mecha/mech_sensor.dm | 1 + code/game/mecha/medical/medical.dm | 3 +-- code/game/mecha/working/working.dm | 3 +-- .../game/objects/effects/decals/contraband.dm | 1 + code/game/objects/effects/effect_system.dm | 2 +- code/game/objects/effects/landmarks.dm | 4 ++-- code/game/objects/effects/misc.dm | 3 ++- code/game/objects/effects/step_triggers.dm | 1 + code/game/objects/items/devices/PDA/cart.dm | 8 +++---- code/game/objects/items/devices/flashlight.dm | 2 +- code/game/objects/items/devices/gps.dm | 1 + .../objects/items/devices/radio/headset.dm | 2 +- .../game/objects/items/devices/radio/radio.dm | 2 +- code/game/objects/items/devices/tvcamera.dm | 2 +- code/game/objects/items/weapons/policetape.dm | 4 ++-- code/game/objects/random/random.dm | 2 +- code/game/objects/structures/alien_props.dm | 2 +- code/game/objects/structures/catwalk.dm | 3 ++- .../structures/crates_lockers/closets.dm | 2 +- .../structures/crates_lockers/largecrate.dm | 2 +- code/game/objects/structures/flora.dm | 4 ++-- .../structures/ghost_pods/ghost_pods.dm | 2 +- code/game/objects/structures/lattice.dm | 8 +++---- code/game/objects/structures/loot_piles.dm | 2 +- code/game/objects/structures/noticeboard.dm | 1 + code/game/objects/structures/railing.dm | 2 +- code/game/objects/structures/safe.dm | 6 ++--- .../game/objects/structures/window_spawner.dm | 2 +- code/game/shuttle_engines.dm | 2 +- code/game/turfs/flooring/flooring_decals.dm | 8 +++---- code/game/turfs/initialization/init.dm | 17 +++++--------- code/game/turfs/initialization/maintenance.dm | 2 +- code/game/turfs/simulated.dm | 3 --- code/game/turfs/simulated/floor_types.dm | 2 +- code/game/turfs/simulated/outdoors/grass.dm | 4 ++-- .../game/turfs/simulated/outdoors/outdoors.dm | 2 +- code/game/turfs/simulated/outdoors/sky.dm | 1 + code/game/turfs/simulated/wall_types.dm | 4 ++-- code/game/turfs/simulated/water.dm | 5 +---- code/modules/awaymissions/corpse.dm | 4 +++- code/modules/awaymissions/gateway.dm | 7 +++--- code/modules/awaymissions/loot.dm | 3 ++- code/modules/hydroponics/seed_packets.dm | 7 ++---- code/modules/hydroponics/trays/tray.dm | 9 +++++--- .../integrated_electronics/core/printer.dm | 2 +- .../integrated_electronics/subtypes/input.dm | 2 +- code/modules/library/lib_items.dm | 1 + code/modules/lore_codex/codex.dm | 2 +- code/modules/maps/tg/map_template.dm | 12 +++++----- code/modules/mining/mine_turfs.dm | 8 ++++++- code/modules/mob/living/bot/bot.dm | 2 +- .../mob/living/simple_animal/aliens/mimic.dm | 2 +- .../mob/living/simple_animal/animals/slime.dm | 2 +- code/modules/mob/new_player/login.dm | 1 + code/modules/multiz/open_space_controller.dm | 6 ----- code/modules/multiz/structures.dm | 2 ++ code/modules/multiz/turf.dm | 2 +- .../overmap/ships/computers/engine_control.dm | 1 + code/modules/overmap/ships/computers/helm.dm | 1 + .../overmap/ships/computers/shuttle.dm | 2 +- code/modules/overmap/ships/engines/thermal.dm | 2 +- code/modules/overmap/ships/ship.dm | 1 + code/modules/paperwork/filingcabinet.dm | 1 + code/modules/power/cells/device_cells.dm | 2 +- code/modules/power/port_gen.dm | 2 +- code/modules/power/singularity/emitter.dm | 2 +- code/modules/power/solar.dm | 2 +- code/modules/research/rdconsole.dm | 3 ++- code/modules/research/server.dm | 5 ++--- code/modules/shuttles/escape_pods.dm | 2 +- code/modules/tables/tables.dm | 2 +- code/modules/turbolift/turbolift_map.dm | 2 +- code/modules/vehicles/train.dm | 1 + .../xenoarcheaology/anomaly_container.dm | 2 +- .../tools/artifact_analyser.dm | 2 +- maps/southern_cross/turfs/outdoors.dm | 3 ++- 114 files changed, 195 insertions(+), 192 deletions(-) diff --git a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm index 5c5ff50299..840d2bdf8b 100644 --- a/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/dp_vent_pump.dm @@ -194,7 +194,7 @@ return 1 /obj/machinery/atmospherics/binary/dp_vent_pump/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm index 4c1863b133..b4f25459c1 100644 --- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm +++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm @@ -128,7 +128,7 @@ return 1 /obj/machinery/atmospherics/binary/passive_gate/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm index cddd9f9527..6320ddf8a3 100644 --- a/code/ATMOSPHERICS/components/binary_devices/pump.dm +++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm @@ -148,7 +148,7 @@ Thus, the two variables affect pump operation are set in New(): ui.set_auto_update(1) // auto update every Master Controller tick /obj/machinery/atmospherics/binary/pump/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/trinary_devices/filter.dm b/code/ATMOSPHERICS/components/trinary_devices/filter.dm index 951e5a03de..10708f4185 100755 --- a/code/ATMOSPHERICS/components/trinary_devices/filter.dm +++ b/code/ATMOSPHERICS/components/trinary_devices/filter.dm @@ -129,8 +129,9 @@ return 1 /obj/machinery/atmospherics/trinary/atmos_filter/initialize() - set_frequency(frequency) - ..() + . = ..() + if(frequency) + set_frequency(frequency) /obj/machinery/atmospherics/trinary/atmos_filter/attackby(var/obj/item/weapon/W as obj, var/mob/user as mob) if (!istype(W, /obj/item/weapon/wrench)) diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm index 09d2d5e424..9f7e80f97f 100644 --- a/code/ATMOSPHERICS/components/tvalve.dm +++ b/code/ATMOSPHERICS/components/tvalve.dm @@ -318,7 +318,7 @@ /obj/machinery/atmospherics/tvalve/digital/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) @@ -458,7 +458,7 @@ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/tvalve/mirrored/digital/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm index 84780da425..7c52cea895 100644 --- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm +++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm @@ -123,9 +123,9 @@ return 1 /obj/machinery/atmospherics/unary/outlet_injector/initialize() - ..() - - set_frequency(frequency) + . = ..() + if(frequency) + set_frequency(frequency) /obj/machinery/atmospherics/unary/outlet_injector/receive_signal(datum/signal/signal) if(!signal.data["tag"] || (signal.data["tag"] != id) || (signal.data["sigtype"]!="command")) diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm index 3cee872f8b..77aedf94e0 100644 --- a/code/ATMOSPHERICS/components/valve.dm +++ b/code/ATMOSPHERICS/components/valve.dm @@ -266,7 +266,7 @@ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/atmospherics/valve/digital/initialize() - ..() + . = ..() if(frequency) set_frequency(frequency) diff --git a/code/__defines/qdel.dm b/code/__defines/qdel.dm index f50c012ce3..82ec12a211 100644 --- a/code/__defines/qdel.dm +++ b/code/__defines/qdel.dm @@ -18,5 +18,6 @@ #define GC_QUEUED_FOR_HARD_DEL -2 #define GC_CURRENTLY_BEING_QDELETED -3 +#define QDELING(X) (X.gc_destroyed) #define QDELETED(X) (!X || X.gc_destroyed) #define QDESTROYING(X) (!X || X.gc_destroyed == GC_CURRENTLY_BEING_QDELETED) \ No newline at end of file diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index d39d735a46..2a0ae27d6d 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -42,16 +42,16 @@ datum/controller/game_controller/proc/setup() transfer_controller = new admin_notice("Initializations complete.", R_DEBUG) -#if UNIT_TEST -#define CHECK_SLEEP_MASTER // For unit tests we don't care about a smooth lobby screen experience. We care about speed. -#else -#define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); } -#endif +// #if UNIT_TEST +// #define CHECK_SLEEP_MASTER // For unit tests we don't care about a smooth lobby screen experience. We care about speed. +// #else +// #define CHECK_SLEEP_MASTER if(++initialized_objects > 500) { initialized_objects=0;sleep(world.tick_lag); } +// #endif datum/controller/game_controller/proc/setup_objects() - #if !UNIT_TEST - var/initialized_objects = 0 - #endif + // #if !UNIT_TEST + // var/initialized_objects = 0 + // #endif // Set up antagonists. populate_antag_type_list() diff --git a/code/datums/mind.dm b/code/datums/mind.dm index feef09b45e..1f7685def5 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -503,53 +503,53 @@ //slime /mob/living/simple_animal/slime/mind_initialize() - ..() + . = ..() mind.assigned_role = "slime" /mob/living/carbon/alien/larva/mind_initialize() - ..() + . = ..() mind.special_role = "Larva" //AI /mob/living/silicon/ai/mind_initialize() - ..() + . = ..() mind.assigned_role = "AI" //BORG /mob/living/silicon/robot/mind_initialize() - ..() + . = ..() mind.assigned_role = "Cyborg" //PAI /mob/living/silicon/pai/mind_initialize() - ..() + . = ..() mind.assigned_role = "pAI" mind.special_role = "" //Animals /mob/living/simple_animal/mind_initialize() - ..() + . = ..() mind.assigned_role = "Animal" /mob/living/simple_animal/corgi/mind_initialize() - ..() + . = ..() mind.assigned_role = "Corgi" /mob/living/simple_animal/shade/mind_initialize() - ..() + . = ..() mind.assigned_role = "Shade" /mob/living/simple_animal/construct/builder/mind_initialize() - ..() + . = ..() mind.assigned_role = "Artificer" mind.special_role = "Cultist" /mob/living/simple_animal/construct/wraith/mind_initialize() - ..() + . = ..() mind.assigned_role = "Wraith" mind.special_role = "Cultist" /mob/living/simple_animal/construct/armoured/mind_initialize() - ..() + . = ..() mind.assigned_role = "Juggernaut" mind.special_role = "Cultist" diff --git a/code/game/area/areas.dm b/code/game/area/areas.dm index e70c7325e4..734b09ae4f 100644 --- a/code/game/area/areas.dm +++ b/code/game/area/areas.dm @@ -27,6 +27,9 @@ /area/initialize() . = ..() + return INITIALIZE_HINT_LATELOAD // Areas tradiationally are initialized AFTER other atoms. + +/area/LateInitialize() if(!requires_power || !apc) power_light = 0 power_equip = 0 diff --git a/code/game/machinery/Sleeper.dm b/code/game/machinery/Sleeper.dm index 3de2943265..ab7100ce33 100644 --- a/code/game/machinery/Sleeper.dm +++ b/code/game/machinery/Sleeper.dm @@ -181,6 +181,7 @@ RefreshParts() /obj/machinery/sleeper/initialize() + . = ..() update_icon() /obj/machinery/sleeper/process() diff --git a/code/game/machinery/alarm.dm b/code/game/machinery/alarm.dm index 0f75d1efd0..28557928be 100644 --- a/code/game/machinery/alarm.dm +++ b/code/game/machinery/alarm.dm @@ -131,6 +131,7 @@ /obj/machinery/alarm/initialize() + . = ..() set_frequency(frequency) if(!master_is_operating()) elect_master() @@ -990,6 +991,7 @@ FIRE ALARM update_icon() /obj/machinery/firealarm/initialize() + . = ..() if(z in using_map.contact_levels) set_security_level(security_level? get_security_level() : "green") diff --git a/code/game/machinery/atmo_control.dm b/code/game/machinery/atmo_control.dm index ac1e21051a..cb73da0c32 100644 --- a/code/game/machinery/atmo_control.dm +++ b/code/game/machinery/atmo_control.dm @@ -64,12 +64,14 @@ radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/air_sensor/initialize() - set_frequency(frequency) + . = ..() + if(frequency) + set_frequency(frequency) obj/machinery/air_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) - ..() + . = ..() /obj/machinery/computer/general_air_control icon_keyboard = "atmos_key" @@ -128,7 +130,9 @@ obj/machinery/computer/general_air_control/Destroy() radio_connection = radio_controller.add_object(src, frequency, RADIO_ATMOSIA) /obj/machinery/computer/general_air_control/initialize() - set_frequency(frequency) + . = ..() + if(frequency) + set_frequency(frequency) /obj/machinery/computer/general_air_control/large_tank_control icon = 'icons/obj/computer.dmi' diff --git a/code/game/machinery/atmoalter/meter.dm b/code/game/machinery/atmoalter/meter.dm index cb149dcc54..71755cc246 100644 --- a/code/game/machinery/atmoalter/meter.dm +++ b/code/game/machinery/atmoalter/meter.dm @@ -12,17 +12,10 @@ use_power = 1 idle_power_usage = 15 -/obj/machinery/meter/New() - ..() - spawn(5) - target = select_target() - return 1 - /obj/machinery/meter/initialize() . = ..() if (!target) - spawn(5) - target = select_target() + target = select_target() /obj/machinery/meter/Destroy() pipes_on_turf.Cut() diff --git a/code/game/machinery/computer/camera.dm b/code/game/machinery/computer/camera.dm index 2f4832047f..2b8d069f51 100644 --- a/code/game/machinery/computer/camera.dm +++ b/code/game/machinery/computer/camera.dm @@ -224,7 +224,7 @@ var/obj/item/device/radio/radio = null /obj/machinery/computer/security/telescreen/entertainment/initialize() - ..() + . = ..() radio = new(src) radio.listening = TRUE radio.broadcasting = FALSE diff --git a/code/game/machinery/computer/cloning.dm b/code/game/machinery/computer/cloning.dm index 1e08ea6df2..4935a2a552 100644 --- a/code/game/machinery/computer/cloning.dm +++ b/code/game/machinery/computer/cloning.dm @@ -17,7 +17,7 @@ /obj/machinery/computer/cloning/initialize() - ..() + . = ..() updatemodules() /obj/machinery/computer/cloning/Destroy() diff --git a/code/game/machinery/computer/computer.dm b/code/game/machinery/computer/computer.dm index 7155886747..92f69a70e1 100644 --- a/code/game/machinery/computer/computer.dm +++ b/code/game/machinery/computer/computer.dm @@ -20,6 +20,7 @@ ..() /obj/machinery/computer/initialize() + . = ..() power_change() update_icon() diff --git a/code/game/machinery/computer/message.dm b/code/game/machinery/computer/message.dm index e50ad8cb92..fd82940b6d 100644 --- a/code/game/machinery/computer/message.dm +++ b/code/game/machinery/computer/message.dm @@ -76,7 +76,7 @@ if(!linkedServer) if(message_servers && message_servers.len > 0) linkedServer = message_servers[1] - return + return ..() /obj/machinery/computer/message_monitor/attack_hand(var/mob/living/user as mob) if(stat & (NOPOWER|BROKEN)) diff --git a/code/game/machinery/computer/station_alert.dm b/code/game/machinery/computer/station_alert.dm index d1c66b500d..d3ab69b869 100644 --- a/code/game/machinery/computer/station_alert.dm +++ b/code/game/machinery/computer/station_alert.dm @@ -20,7 +20,7 @@ /obj/machinery/computer/station_alert/initialize() alarm_monitor = new monitor_type(src) alarm_monitor.register_alarm(src, /obj/machinery/computer/station_alert/update_icon) - ..() + . = ..() /obj/machinery/computer/station_alert/Destroy() alarm_monitor.unregister_alarm(src) diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm index d254228795..11e9f0f94f 100644 --- a/code/game/machinery/cryopod.dm +++ b/code/game/machinery/cryopod.dm @@ -299,7 +299,7 @@ return ..() /obj/machinery/cryopod/initialize() - ..() + . = ..() find_control_computer() diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1dd74404dc..7f140b4b7f 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -1177,6 +1177,7 @@ About the new airlock wires panel: if(A.closeOtherId == src.closeOtherId && A != src) src.closeOther = A break + . = ..() /obj/machinery/door/airlock/Destroy() qdel(wires) diff --git a/code/game/machinery/doors/airlock_control.dm b/code/game/machinery/doors/airlock_control.dm index 871f42eb7b..1fd5eb34c6 100644 --- a/code/game/machinery/doors/airlock_control.dm +++ b/code/game/machinery/doors/airlock_control.dm @@ -130,18 +130,12 @@ obj/machinery/door/airlock/proc/set_frequency(new_frequency) obj/machinery/door/airlock/initialize() + . = ..() if(frequency) set_frequency(frequency) update_icon() - -obj/machinery/door/airlock/New() - ..() - - if(radio_controller) - set_frequency(frequency) - obj/machinery/door/airlock/Destroy() if(frequency && radio_controller) radio_controller.remove_object(src,frequency) @@ -210,13 +204,9 @@ obj/machinery/airlock_sensor/proc/set_frequency(new_frequency) radio_connection = radio_controller.add_object(src, frequency, RADIO_AIRLOCK) obj/machinery/airlock_sensor/initialize() + . = ..() set_frequency(frequency) -obj/machinery/airlock_sensor/New() - ..() - if(radio_controller) - set_frequency(frequency) - obj/machinery/airlock_sensor/Destroy() if(radio_controller) radio_controller.remove_object(src,frequency) @@ -280,15 +270,9 @@ obj/machinery/access_button/proc/set_frequency(new_frequency) obj/machinery/access_button/initialize() + . = ..() set_frequency(frequency) - -obj/machinery/access_button/New() - ..() - - if(radio_controller) - set_frequency(frequency) - obj/machinery/access_button/Destroy() if(radio_controller) radio_controller.remove_object(src, frequency) diff --git a/code/game/machinery/doors/alarmlock.dm b/code/game/machinery/doors/alarmlock.dm index 8b6ddb5834..1c384a651d 100644 --- a/code/game/machinery/doors/alarmlock.dm +++ b/code/game/machinery/doors/alarmlock.dm @@ -19,7 +19,7 @@ ..() /obj/machinery/door/airlock/alarmlock/initialize() - ..() + . = ..() radio_controller.remove_object(src, air_frequency) air_connection = radio_controller.add_object(src, air_frequency, RADIO_TO_AIRALARM) open() diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 870b080c79..54b5513cce 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -30,7 +30,7 @@ block_air_zones = 0 /obj/machinery/door/blast/initialize() - ..() + . = ..() implicit_material = get_material_by_name("plasteel") /obj/machinery/door/blast/get_material() diff --git a/code/game/machinery/embedded_controller/airlock_controllers.dm b/code/game/machinery/embedded_controller/airlock_controllers.dm index fb909dee55..3a79a686b0 100644 --- a/code/game/machinery/embedded_controller/airlock_controllers.dm +++ b/code/game/machinery/embedded_controller/airlock_controllers.dm @@ -13,7 +13,7 @@ var/tag_secure = 0 /obj/machinery/embedded_controller/radio/airlock/initialize() - ..() + . = ..() program = new/datum/computer/file/embedded_program/airlock(src) //Advanced airlock controller for when you want a more versatile airlock controller - useful for turning simple access control rooms into airlocks diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller.dm b/code/game/machinery/embedded_controller/airlock_docking_controller.dm index a78ac2be2d..a63874235f 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller.dm @@ -6,7 +6,7 @@ tag_secure = 1 /obj/machinery/embedded_controller/radio/airlock/docking_port/initialize() - ..() + . = ..() airlock_program = new/datum/computer/file/embedded_program/airlock/docking(src) docking_program = new/datum/computer/file/embedded_program/docking/airlock(src, airlock_program) program = docking_program diff --git a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm index 0cffb34dc6..9fb1b34900 100644 --- a/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm +++ b/code/game/machinery/embedded_controller/airlock_docking_controller_multi.dm @@ -10,7 +10,7 @@ var/datum/computer/file/embedded_program/docking/multi/docking_program /obj/machinery/embedded_controller/radio/docking_port_multi/initialize() - ..() + . = ..() docking_program = new/datum/computer/file/embedded_program/docking/multi(src) program = docking_program @@ -56,7 +56,7 @@ tag_secure = 1 /obj/machinery/embedded_controller/radio/airlock/docking_port_multi/initialize() - ..() + . = ..() airlock_program = new/datum/computer/file/embedded_program/airlock/multi_docking(src) program = airlock_program diff --git a/code/game/machinery/embedded_controller/embedded_controller_base.dm b/code/game/machinery/embedded_controller/embedded_controller_base.dm index 5a6b77931f..6833498b5f 100644 --- a/code/game/machinery/embedded_controller/embedded_controller_base.dm +++ b/code/game/machinery/embedded_controller/embedded_controller_base.dm @@ -58,6 +58,7 @@ obj/machinery/embedded_controller/radio/Destroy() unacidable = 1 /obj/machinery/embedded_controller/radio/initialize() + . = ..() set_frequency(frequency) /obj/machinery/embedded_controller/radio/update_icon() diff --git a/code/game/machinery/embedded_controller/simple_docking_controller.dm b/code/game/machinery/embedded_controller/simple_docking_controller.dm index f1001ada55..ed8b435fb6 100644 --- a/code/game/machinery/embedded_controller/simple_docking_controller.dm +++ b/code/game/machinery/embedded_controller/simple_docking_controller.dm @@ -5,7 +5,7 @@ var/datum/computer/file/embedded_program/docking/simple/docking_program /obj/machinery/embedded_controller/radio/simple_docking_controller/initialize() - ..() + . = ..() docking_program = new/datum/computer/file/embedded_program/docking/simple(src) program = docking_program diff --git a/code/game/machinery/kitchen/icecream.dm b/code/game/machinery/kitchen/icecream.dm index 448b252fd4..fab6319e26 100644 --- a/code/game/machinery/kitchen/icecream.dm +++ b/code/game/machinery/kitchen/icecream.dm @@ -52,7 +52,7 @@ return "vanilla" /obj/machinery/icecream_vat/initialize() - ..() + . = ..() create_reagents(100) while(product_types.len < 6) product_types.Add(5) diff --git a/code/game/machinery/status_display.dm b/code/game/machinery/status_display.dm index 527b5f1283..9a02fddfd2 100644 --- a/code/game/machinery/status_display.dm +++ b/code/game/machinery/status_display.dm @@ -61,7 +61,7 @@ // register for radio system /obj/machinery/status_display/initialize() - ..() + . = ..() if(radio_controller) radio_controller.add_object(src, frequency) diff --git a/code/game/machinery/telecomms/telecomunications.dm b/code/game/machinery/telecomms/telecomunications.dm index 7621b1f548..8f576b5d00 100644 --- a/code/game/machinery/telecomms/telecomunications.dm +++ b/code/game/machinery/telecomms/telecomunications.dm @@ -131,6 +131,7 @@ var/global/list/obj/machinery/telecomms/telecomms_list = list() else for(var/obj/machinery/telecomms/T in telecomms_list) add_link(T) + . = ..() /obj/machinery/telecomms/Destroy() telecomms_list -= src diff --git a/code/game/machinery/teleporter.dm b/code/game/machinery/teleporter.dm index 9353bb888c..7544c91bfe 100644 --- a/code/game/machinery/teleporter.dm +++ b/code/game/machinery/teleporter.dm @@ -18,7 +18,7 @@ return /obj/machinery/computer/teleporter/initialize() - ..() + . = ..() var/obj/machinery/teleport/station/station var/obj/machinery/teleport/hub/hub diff --git a/code/game/machinery/turret_control.dm b/code/game/machinery/turret_control.dm index 4f33f1703f..238030e3ac 100644 --- a/code/game/machinery/turret_control.dm +++ b/code/game/machinery/turret_control.dm @@ -62,7 +62,7 @@ control_area = null power_change() //Checks power and initial settings - return + . = ..() /obj/machinery/turretid/proc/isLocked(mob/user) if(ailock && issilicon(user)) diff --git a/code/game/machinery/vr_console.dm b/code/game/machinery/vr_console.dm index b013fb1dca..67c8719e8d 100644 --- a/code/game/machinery/vr_console.dm +++ b/code/game/machinery/vr_console.dm @@ -24,6 +24,7 @@ RefreshParts() /obj/machinery/vr_sleeper/initialize() + . = ..() update_icon() /obj/machinery/vr_sleeper/process() diff --git a/code/game/mecha/mech_fabricator.dm b/code/game/mecha/mech_fabricator.dm index 8914631ad0..3bbb9f34b4 100644 --- a/code/game/mecha/mech_fabricator.dm +++ b/code/game/mecha/mech_fabricator.dm @@ -40,6 +40,7 @@ /obj/machinery/mecha_part_fabricator/initialize() update_categories() + . = ..() /obj/machinery/mecha_part_fabricator/process() ..() diff --git a/code/game/mecha/mech_prosthetics.dm b/code/game/mecha/mech_prosthetics.dm index a151d0638f..45b9853881 100644 --- a/code/game/mecha/mech_prosthetics.dm +++ b/code/game/mecha/mech_prosthetics.dm @@ -40,6 +40,7 @@ return /obj/machinery/pros_fabricator/initialize() + . = ..() manufacturer = basic_robolimb.company update_categories() diff --git a/code/game/mecha/mech_sensor.dm b/code/game/mecha/mech_sensor.dm index a00e9d6594..87a9863ee8 100644 --- a/code/game/mecha/mech_sensor.dm +++ b/code/game/mecha/mech_sensor.dm @@ -70,6 +70,7 @@ icon_state = "airlock_sensor_off" /obj/machinery/mech_sensor/initialize() + . = ..() set_frequency(frequency) /obj/machinery/mech_sensor/proc/set_frequency(new_frequency) diff --git a/code/game/mecha/medical/medical.dm b/code/game/mecha/medical/medical.dm index 027c9f84af..e112f7a232 100644 --- a/code/game/mecha/medical/medical.dm +++ b/code/game/mecha/medical/medical.dm @@ -1,9 +1,8 @@ /obj/mecha/medical/initialize() - ..() + . = ..() var/turf/T = get_turf(src) if(isPlayerLevel(T.z)) new /obj/item/mecha_parts/mecha_tracking(src) - return /obj/mecha/medical/mechturn(direction) diff --git a/code/game/mecha/working/working.dm b/code/game/mecha/working/working.dm index 8ba99ad1c5..c890746e5b 100644 --- a/code/game/mecha/working/working.dm +++ b/code/game/mecha/working/working.dm @@ -4,11 +4,10 @@ var/cargo_capacity = 5 /obj/mecha/working/initialize() - ..() + . = ..() var/turf/T = get_turf(src) if(isPlayerLevel(T.z)) new /obj/item/mecha_parts/mecha_tracking(src) - return /obj/mecha/working/Destroy() for(var/mob/M in src) diff --git a/code/game/objects/effects/decals/contraband.dm b/code/game/objects/effects/decals/contraband.dm index 0d00d32830..695f8d3b79 100644 --- a/code/game/objects/effects/decals/contraband.dm +++ b/code/game/objects/effects/decals/contraband.dm @@ -110,6 +110,7 @@ pixel_y = 0 /obj/structure/sign/poster/initialize() + . = ..() if (poster_type) var/path = text2path(poster_type) var/datum/poster/design = new path diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index a3b3ab81cb..e92268f4da 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -104,7 +104,7 @@ steam.start() -- spawns the effect T.hotspot_expose(1000,100) /obj/effect/effect/sparks/initialize() - ..() + . = ..() schedule_task_in(5 SECONDS, /proc/qdel, list(src)) /obj/effect/effect/sparks/Destroy() diff --git a/code/game/objects/effects/landmarks.dm b/code/game/objects/effects/landmarks.dm index b8cb8006d2..50230eba17 100644 --- a/code/game/objects/effects/landmarks.dm +++ b/code/game/objects/effects/landmarks.dm @@ -84,9 +84,9 @@ delete_me = 1 /obj/effect/landmark/initialize() - ..() + . = ..() if(delete_me) - qdel(src) + return INITIALIZE_HINT_QDEL /obj/effect/landmark/Destroy(var/force = FALSE) if(delete_me || force) diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index 48026296d7..349400226a 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -34,6 +34,7 @@ pixel_y = -32 /obj/effect/temporary_effect/cleave_attack/initialize() // Makes the slash fade smoothly. When completely transparent it should qdel itself. + . = ..() animate(src, alpha = 0, time = time_to_die - 1) /obj/effect/temporary_effect/shuttle_landing @@ -44,4 +45,4 @@ /obj/effect/temporary_effect/shuttle_landing/initialize() flick("shuttle_warning", src) // flick() forces the animation to always begin at the start. - ..() \ No newline at end of file + . = ..() \ No newline at end of file diff --git a/code/game/objects/effects/step_triggers.dm b/code/game/objects/effects/step_triggers.dm index 5fec97b4f0..ace93bd750 100644 --- a/code/game/objects/effects/step_triggers.dm +++ b/code/game/objects/effects/step_triggers.dm @@ -129,6 +129,7 @@ var/landmark_id = null /obj/effect/step_trigger/teleporter/landmark/initialize() + . = ..() for(var/obj/effect/landmark/teleport_mark/mark in tele_landmarks) if(mark.landmark_id == landmark_id) the_landmark = mark diff --git a/code/game/objects/items/devices/PDA/cart.dm b/code/game/objects/items/devices/PDA/cart.dm index c53ba712db..b77d73a262 100644 --- a/code/game/objects/items/devices/PDA/cart.dm +++ b/code/game/objects/items/devices/PDA/cart.dm @@ -110,7 +110,7 @@ var/list/civilian_cartridges = list( /obj/item/weapon/cartridge/security/initialize() radio = new /obj/item/radio/integrated/beepsky(src) - ..() + . = ..() /obj/item/weapon/cartridge/detective name = "\improper D.E.T.E.C.T. cartridge" @@ -166,7 +166,7 @@ var/list/civilian_cartridges = list( /obj/item/weapon/cartridge/signal/initialize() radio = new /obj/item/radio/integrated/signal(src) - ..() + . = ..() /obj/item/weapon/cartridge/quartermaster name = "\improper Space Parts & Space Vendors cartridge" @@ -200,7 +200,7 @@ var/list/civilian_cartridges = list( /obj/item/weapon/cartridge/hos/initialize() radio = new /obj/item/radio/integrated/beepsky(src) - ..() + . = ..() /obj/item/weapon/cartridge/ce name = "\improper Power-On DELUXE" @@ -225,7 +225,7 @@ var/list/civilian_cartridges = list( /obj/item/weapon/cartridge/rd/initialize() radio = new /obj/item/radio/integrated/signal(src) - ..() + . = ..() /obj/item/weapon/cartridge/captain name = "\improper Value-PAK cartridge" diff --git a/code/game/objects/items/devices/flashlight.dm b/code/game/objects/items/devices/flashlight.dm index 151b762d7c..6d512981ae 100644 --- a/code/game/objects/items/devices/flashlight.dm +++ b/code/game/objects/items/devices/flashlight.dm @@ -18,7 +18,7 @@ var/power_use = 1 /obj/item/device/flashlight/initialize() - ..() + . = ..() update_icon() /obj/item/device/flashlight/New() diff --git a/code/game/objects/items/devices/gps.dm b/code/game/objects/items/devices/gps.dm index 4ae0ebc4b0..e4932ff0d2 100644 --- a/code/game/objects/items/devices/gps.dm +++ b/code/game/objects/items/devices/gps.dm @@ -18,6 +18,7 @@ var/list/GPS_list = list() var/can_hide_signal = FALSE // If it can toggle the above var. /obj/item/device/gps/initialize() + . = ..() GPS_list += src name = "global positioning system ([gps_tag])" update_icon() diff --git a/code/game/objects/items/devices/radio/headset.dm b/code/game/objects/items/devices/radio/headset.dm index 2b40faac66..3b703f703b 100644 --- a/code/game/objects/items/devices/radio/headset.dm +++ b/code/game/objects/items/devices/radio/headset.dm @@ -81,7 +81,7 @@ ks1type = /obj/item/device/encryptionkey/raider /obj/item/device/radio/headset/raider/initialize() - ..() + . = ..() set_frequency(RAID_FREQ) /obj/item/device/radio/headset/binary diff --git a/code/game/objects/items/devices/radio/radio.dm b/code/game/objects/items/devices/radio/radio.dm index 260c32cd57..b6f62f27dc 100644 --- a/code/game/objects/items/devices/radio/radio.dm +++ b/code/game/objects/items/devices/radio/radio.dm @@ -80,7 +80,7 @@ var/global/list/default_medbay_channels = list( /obj/item/device/radio/initialize() - + . = ..() if(frequency < RADIO_LOW_FREQ || frequency > RADIO_HIGH_FREQ) frequency = sanitize_frequency(frequency, RADIO_LOW_FREQ, RADIO_HIGH_FREQ) set_frequency(frequency) diff --git a/code/game/objects/items/devices/tvcamera.dm b/code/game/objects/items/devices/tvcamera.dm index b449a6ce3b..be2b4c18e7 100644 --- a/code/game/objects/items/devices/tvcamera.dm +++ b/code/game/objects/items/devices/tvcamera.dm @@ -27,7 +27,7 @@ to_chat(usr, "Audio feed is [radio.broadcasting ? "on" : "off"]") /obj/item/device/tvcamera/initialize() - ..() + . = ..() camera = new(src) camera.c_tag = channel camera.status = FALSE diff --git a/code/game/objects/items/weapons/policetape.dm b/code/game/objects/items/weapons/policetape.dm index ce0ee6b5e7..a355be251a 100644 --- a/code/game/objects/items/weapons/policetape.dm +++ b/code/game/objects/items/weapons/policetape.dm @@ -12,7 +12,7 @@ var/apply_tape = FALSE /obj/item/taperoll/initialize() - ..() + . = ..() if(apply_tape) var/turf/T = get_turf(src) if(!T) @@ -20,7 +20,7 @@ var/obj/machinery/door/airlock/airlock = locate(/obj/machinery/door/airlock) in T if(airlock) afterattack(airlock, null, TRUE) - qdel(src) + return INITIALIZE_HINT_QDEL var/list/image/hazard_overlays diff --git a/code/game/objects/random/random.dm b/code/game/objects/random/random.dm index 31483b48f0..d1b30da151 100644 --- a/code/game/objects/random/random.dm +++ b/code/game/objects/random/random.dm @@ -974,7 +974,7 @@ var/list/multi_point_spawns var/weight // Probability weight for this spawn point /obj/random_multi/initialize() - ..() + . = ..() weight = max(1, round(weight)) if(!multi_point_spawns) diff --git a/code/game/objects/structures/alien_props.dm b/code/game/objects/structures/alien_props.dm index cb791ec54b..eb8ae9d19f 100644 --- a/code/game/objects/structures/alien_props.dm +++ b/code/game/objects/structures/alien_props.dm @@ -69,7 +69,7 @@ var/static/list/possible_tech = list(TECH_MATERIAL, TECH_ENGINEERING, TECH_PHORON, TECH_POWER, TECH_BIO, TECH_COMBAT, TECH_MAGNET, TECH_DATA) /obj/item/prop/alien/junk/initialize() - ..() + . = ..() icon_state = pick(possible_states) var/list/techs = possible_tech.Copy() origin_tech = list() diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm index 9bceee8f6e..d9f3340bdd 100644 --- a/code/game/objects/structures/catwalk.dm +++ b/code/game/objects/structures/catwalk.dm @@ -11,12 +11,13 @@ anchored = 1.0 /obj/structure/catwalk/initialize() + . = ..() for(var/obj/structure/catwalk/O in range(1)) O.update_icon() for(var/obj/structure/catwalk/C in get_turf(src)) if(C != src) warning("Duplicate [type] in [loc] ([x], [y], [z])") - qdel(C) + return INITIALIZE_HINT_QDEL update_icon() /obj/structure/catwalk/Destroy() diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 690bba95f8..7e922e97bb 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -24,7 +24,7 @@ var/list/will_contain /obj/structure/closet/initialize() - ..() + . = ..() if(will_contain) create_objects_in_loc(src, will_contain) diff --git a/code/game/objects/structures/crates_lockers/largecrate.dm b/code/game/objects/structures/crates_lockers/largecrate.dm index c0d27cad1c..c4e9ece866 100644 --- a/code/game/objects/structures/crates_lockers/largecrate.dm +++ b/code/game/objects/structures/crates_lockers/largecrate.dm @@ -6,7 +6,7 @@ density = 1 /obj/structure/largecrate/initialize() - ..() + . = ..() for(var/obj/I in src.loc) if(I.density || I.anchored || I == src || !I.simulated) continue diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index e9aa267276..c95b5af2c9 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -306,7 +306,7 @@ /obj/structure/flora/sif/subterranean/initialize() icon_state = "[initial(icon_state)][rand(1,2)]" - ..() + . = ..() /obj/structure/flora/sif/eyes name = "mysterious bulbs" @@ -315,4 +315,4 @@ /obj/structure/flora/sif/eyes/initialize() icon_state = "[initial(icon_state)][rand(1,3)]" - ..() \ No newline at end of file + . = ..() \ No newline at end of file diff --git a/code/game/objects/structures/ghost_pods/ghost_pods.dm b/code/game/objects/structures/ghost_pods/ghost_pods.dm index 9eeefeee61..02c5f304f3 100644 --- a/code/game/objects/structures/ghost_pods/ghost_pods.dm +++ b/code/game/objects/structures/ghost_pods/ghost_pods.dm @@ -55,7 +55,7 @@ var/delay_to_try_again = 20 MINUTES // How long to wait if first attempt fails. Set to 0 to never try again. /obj/structure/ghost_pod/automatic/initialize() - ..() + . = ..() spawn(delay_to_self_open) if(src) trigger() diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index ac231eb947..c042b8fc9a 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -10,15 +10,15 @@ // flags = CONDUCT /obj/structure/lattice/initialize() - ..() + . = ..() if(!(istype(src.loc, /turf/space) || istype(src.loc, /turf/simulated/open) || istype(src.loc, /turf/simulated/mineral))) - qdel(src) - return + return INITIALIZE_HINT_QDEL for(var/obj/structure/lattice/LAT in src.loc) if(LAT != src) - qdel(LAT) + crash_with("Found multiple lattices at '[log_info_line(loc)]'") + return INITIALIZE_HINT_QDEL icon = 'icons/obj/smoothlattice.dmi' icon_state = "latticeblank" updateOverlays() diff --git a/code/game/objects/structures/loot_piles.dm b/code/game/objects/structures/loot_piles.dm index de9a803624..5a655b6673 100644 --- a/code/game/objects/structures/loot_piles.dm +++ b/code/game/objects/structures/loot_piles.dm @@ -119,7 +119,7 @@ Loot piles can be depleted, if loot_depleted is turned on. Note that players wh /obj/structure/loot_pile/maint/initialize() icon_state = pick(icon_states_to_use) - ..() + . = ..() // Has large amounts of possible items, most of which may or may not be useful. /obj/structure/loot_pile/maint/junk diff --git a/code/game/objects/structures/noticeboard.dm b/code/game/objects/structures/noticeboard.dm index 75052f7b86..0a26e568ec 100644 --- a/code/game/objects/structures/noticeboard.dm +++ b/code/game/objects/structures/noticeboard.dm @@ -26,6 +26,7 @@ I.loc = src notices++ icon_state = "nboard0[notices]" + . = ..() //attaching papers!! /obj/structure/noticeboard/attackby(var/obj/item/weapon/O as obj, var/mob/user as mob) diff --git a/code/game/objects/structures/railing.dm b/code/game/objects/structures/railing.dm index 1acafd5726..27bb902aea 100644 --- a/code/game/objects/structures/railing.dm +++ b/code/game/objects/structures/railing.dm @@ -24,7 +24,7 @@ verbs += /obj/structure/proc/climb_on /obj/structure/railing/initialize() - ..() + . = ..() if(src.anchored) update_icon(0) diff --git a/code/game/objects/structures/safe.dm b/code/game/objects/structures/safe.dm index b2c5e93cb8..7f78e8f0e7 100644 --- a/code/game/objects/structures/safe.dm +++ b/code/game/objects/structures/safe.dm @@ -31,13 +31,13 @@ FLOOR SAFES /obj/structure/safe/initialize() + . = ..() for(var/obj/item/I in loc) if(space >= maxspace) return if(I.w_class + space <= maxspace) space += I.w_class - I.loc = src - + I.forceMove(src) /obj/structure/safe/proc/check_unlocked(mob/user as mob, canhear) if(user && canhear) @@ -175,7 +175,7 @@ obj/structure/safe/ex_act(severity) layer = 2.5 /obj/structure/safe/floor/initialize() - ..() + . = ..() var/turf/T = loc if(istype(T) && !T.is_plating()) hide(1) diff --git a/code/game/objects/structures/window_spawner.dm b/code/game/objects/structures/window_spawner.dm index d0db6e7f08..e2714be757 100644 --- a/code/game/objects/structures/window_spawner.dm +++ b/code/game/objects/structures/window_spawner.dm @@ -26,7 +26,7 @@ return FALSE /obj/effect/wingrille_spawn/initialize() - ..() + . = ..() if(!win_path) return if(ticker && ticker.current_state < GAME_STATE_PLAYING) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 51ec43e32f..c76967545e 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -18,7 +18,7 @@ else return ..() /obj/structure/shuttle/window/initialize() - ..() + . = ..() auto_join() /obj/structure/shuttle/window/proc/auto_join() diff --git a/code/game/turfs/flooring/flooring_decals.dm b/code/game/turfs/flooring/flooring_decals.dm index 9c1968fd3c..7543d4037a 100644 --- a/code/game/turfs/flooring/flooring_decals.dm +++ b/code/game/turfs/flooring/flooring_decals.dm @@ -21,8 +21,8 @@ var/list/floor_decals = list() add_to_turf_decals() var/turf/T = get_turf(src) T.apply_decals() - qdel(src) - return + initialized = TRUE + return INITIALIZE_HINT_QDEL /obj/effect/floor_decal/reset name = "reset marker" @@ -32,8 +32,8 @@ var/list/floor_decals = list() if(T.decals && T.decals.len) T.decals.Cut() T.update_icon() - qdel(src) - return + initialized = TRUE + return INITIALIZE_HINT_QDEL /obj/effect/floor_decal/corner icon_state = "corner_white" diff --git a/code/game/turfs/initialization/init.dm b/code/game/turfs/initialization/init.dm index c1e8be47d1..6c2d8ead29 100644 --- a/code/game/turfs/initialization/init.dm +++ b/code/game/turfs/initialization/init.dm @@ -1,16 +1,11 @@ -/datum/turf_initializer/proc/initialize(var/turf/T) +/datum/turf_initializer/proc/InitializeTurf(var/turf/T) return /area var/datum/turf_initializer/turf_initializer = null -/area/initialize() - ..() - var/list/minerals = list() - for(var/turf/simulated/T in src) - if(T.initialize()) - minerals += T - if(turf_initializer) - turf_initializer.initialize(T) - for(var/turf/simulated/mineral/M in minerals) - M.MineralSpread() +/area/LateInitialize() + . = ..() + if(turf_initializer) + for(var/turf/simulated/T in src) + turf_initializer.InitializeTurf(T) diff --git a/code/game/turfs/initialization/maintenance.dm b/code/game/turfs/initialization/maintenance.dm index 558f638588..7347ec47db 100644 --- a/code/game/turfs/initialization/maintenance.dm +++ b/code/game/turfs/initialization/maintenance.dm @@ -1,4 +1,4 @@ -/datum/turf_initializer/maintenance/initialize(var/turf/simulated/T) +/datum/turf_initializer/maintenance/InitializeTurf(var/turf/simulated/T) if(T.density) return // Quick and dirty check to avoid placing things inside windows diff --git a/code/game/turfs/simulated.dm b/code/game/turfs/simulated.dm index aac979ff5c..789ec20a17 100644 --- a/code/game/turfs/simulated.dm +++ b/code/game/turfs/simulated.dm @@ -59,9 +59,6 @@ holy = 1 levelupdate() -/turf/simulated/proc/initialize() - return - /turf/simulated/proc/AddTracks(var/typepath,var/bloodDNA,var/comingdir,var/goingdir,var/bloodcolor="#A10808") var/obj/effect/decal/cleanable/blood/tracks/tracks = locate(typepath) in src if(!tracks) diff --git a/code/game/turfs/simulated/floor_types.dm b/code/game/turfs/simulated/floor_types.dm index 8789ddef80..07c686df99 100644 --- a/code/game/turfs/simulated/floor_types.dm +++ b/code/game/turfs/simulated/floor_types.dm @@ -194,7 +194,7 @@ block_tele = TRUE /turf/simulated/shuttle/floor/alien/initialize() - ..() + . = ..() icon_state = "alienpod[rand(1, 9)]" /turf/simulated/shuttle/floor/alienplating diff --git a/code/game/turfs/simulated/outdoors/grass.dm b/code/game/turfs/simulated/outdoors/grass.dm index d7926b526d..218291815f 100644 --- a/code/game/turfs/simulated/outdoors/grass.dm +++ b/code/game/turfs/simulated/outdoors/grass.dm @@ -32,7 +32,7 @@ var/list/grass_types = list( /turf/simulated/floor/outdoors/grass/sif/initialize() if(tree_chance && prob(tree_chance)) new /obj/structure/flora/tree/sif(src) - ..() + . = ..() /turf/simulated/floor/outdoors/grass/initialize() if(prob(50)) @@ -42,7 +42,7 @@ var/list/grass_types = list( if(grass_chance && prob(grass_chance)) var/grass_type = pick(grass_types) new grass_type(src) - ..() + . = ..() /turf/simulated/floor/outdoors/grass/forest name = "thick grass" diff --git a/code/game/turfs/simulated/outdoors/outdoors.dm b/code/game/turfs/simulated/outdoors/outdoors.dm index 941aa5abc9..86e6b117bb 100644 --- a/code/game/turfs/simulated/outdoors/outdoors.dm +++ b/code/game/turfs/simulated/outdoors/outdoors.dm @@ -22,7 +22,7 @@ var/list/outdoor_turfs = list() /turf/simulated/floor/outdoors/initialize() update_icon() - ..() + . = ..() /turf/simulated/floor/New() if(outdoors) diff --git a/code/game/turfs/simulated/outdoors/sky.dm b/code/game/turfs/simulated/outdoors/sky.dm index c7209f9fb3..c329fc2e4d 100644 --- a/code/game/turfs/simulated/outdoors/sky.dm +++ b/code/game/turfs/simulated/outdoors/sky.dm @@ -13,6 +13,7 @@ phoron = 0 /turf/simulated/sky/initialize() + . = ..() outdoor_turfs.Add(src) set_light(2, 2, "#FFFFFF") diff --git a/code/game/turfs/simulated/wall_types.dm b/code/game/turfs/simulated/wall_types.dm index c137822860..930cfb792b 100644 --- a/code/game/turfs/simulated/wall_types.dm +++ b/code/game/turfs/simulated/wall_types.dm @@ -132,7 +132,7 @@ name = true_name /turf/simulated/shuttle/wall/initialize() - ..() + . = ..() if(join_group) src.auto_join() @@ -213,7 +213,7 @@ stripe_color = "#00FF00" /turf/simulated/shuttle/wall/voidcraft/initialize() - ..() + . = ..() update_icon() /turf/simulated/shuttle/wall/voidcraft/update_icon() diff --git a/code/game/turfs/simulated/water.dm b/code/game/turfs/simulated/water.dm index e766b1bba3..a47578f102 100644 --- a/code/game/turfs/simulated/water.dm +++ b/code/game/turfs/simulated/water.dm @@ -11,11 +11,8 @@ outdoors = TRUE var/depth = 1 // Higher numbers indicates deeper water. -/turf/simulated/floor/water/New() - update_icon() - ..() - /turf/simulated/floor/water/initialize() + . = ..() update_icon() /turf/simulated/floor/water/update_icon() diff --git a/code/modules/awaymissions/corpse.dm b/code/modules/awaymissions/corpse.dm index e386590ec7..67bac3b773 100644 --- a/code/modules/awaymissions/corpse.dm +++ b/code/modules/awaymissions/corpse.dm @@ -24,9 +24,12 @@ var/corpseidaccess = null //This is for access. See access.dm for which jobs give what access. Again, put in quotes. Use "Captain" if you want it to be all access. var/corpseidicon = null //For setting it to be a gold, silver, CentCom etc ID var/species = "Human" + delete_me = TRUE /obj/effect/landmark/corpse/initialize() + ..() createCorpse() + return INITIALIZE_HINT_QDEL /obj/effect/landmark/corpse/proc/createCorpse() //Creates a mob and checks for gear in each slot before attempting to equip it. var/mob/living/carbon/human/M = new /mob/living/carbon/human (src.loc) @@ -76,7 +79,6 @@ W.assignment = corpseidjob M.set_id_info(W) M.equip_to_slot_or_del(W, slot_wear_id) - qdel(src) diff --git a/code/modules/awaymissions/gateway.dm b/code/modules/awaymissions/gateway.dm index d1070e5c32..41204baa72 100644 --- a/code/modules/awaymissions/gateway.dm +++ b/code/modules/awaymissions/gateway.dm @@ -10,9 +10,9 @@ /obj/machinery/gateway/initialize() update_icon() - if(dir == 2) + if(dir == SOUTH) density = 0 - + . = ..() /obj/machinery/gateway/update_icon() if(active) @@ -38,7 +38,7 @@ update_icon() wait = world.time + config.gateway_delay //+ thirty minutes default awaygate = locate(/obj/machinery/gateway/centeraway) - + . = ..() /obj/machinery/gateway/centerstation/update_icon() if(active) @@ -152,6 +152,7 @@ obj/machinery/gateway/centerstation/process() /obj/machinery/gateway/centeraway/initialize() update_icon() stationgate = locate(/obj/machinery/gateway/centerstation) + . = ..() /obj/machinery/gateway/centeraway/update_icon() diff --git a/code/modules/awaymissions/loot.dm b/code/modules/awaymissions/loot.dm index 5aeb9651d2..6ca57138b6 100644 --- a/code/modules/awaymissions/loot.dm +++ b/code/modules/awaymissions/loot.dm @@ -6,6 +6,7 @@ var/loot = "" //a list of possible items to spawn- a string of paths /obj/effect/spawner/lootdrop/initialize() + ..() var/list/things = params2list(loot) if(things && things.len) @@ -21,4 +22,4 @@ continue new loot_path(get_turf(src)) - qdel(src) + return INITIALIZE_HINT_QDEL diff --git a/code/modules/hydroponics/seed_packets.dm b/code/modules/hydroponics/seed_packets.dm index 719373f5d3..1b5318868b 100644 --- a/code/modules/hydroponics/seed_packets.dm +++ b/code/modules/hydroponics/seed_packets.dm @@ -13,10 +13,7 @@ var/global/list/plant_seed_sprites = list() /obj/item/seeds/initialize() update_seed() - ..() - -/obj/item/seeds/New() - ..() + . = ..() //Grabs the appropriate seed datum from the global list. /obj/item/seeds/proc/update_seed() @@ -79,7 +76,7 @@ var/global/list/plant_seed_sprites = list() /obj/item/seeds/random/initialize() seed = plant_controller.create_random_seed() seed_type = seed.name - update_seed() + . = ..() /obj/item/seeds/replicapod seed_type = "diona" diff --git a/code/modules/hydroponics/trays/tray.dm b/code/modules/hydroponics/trays/tray.dm index 4a924fdca3..7dc02dedc7 100644 --- a/code/modules/hydroponics/trays/tray.dm +++ b/code/modules/hydroponics/trays/tray.dm @@ -165,16 +165,19 @@ nymph.visible_message("[nymph] rolls around in [src] for a bit.","You roll around in [src] for a bit.") return -/obj/machinery/portable_atmospherics/hydroponics/New() - ..() +/obj/machinery/portable_atmospherics/hydroponics/initialize() + . = ..() temp_chem_holder = new() temp_chem_holder.create_reagents(10) create_reagents(200) if(mechanical) connect() update_icon() + return INITIALIZE_HINT_LATELOAD -/obj/machinery/portable_atmospherics/hydroponics/initialize() +// Give the seeds time to initialize itself +/obj/machinery/portable_atmospherics/hydroponics/LateInitialize() + . = ..() var/obj/item/seeds/S = locate() in loc if(S) plant_seeds(S) diff --git a/code/modules/integrated_electronics/core/printer.dm b/code/modules/integrated_electronics/core/printer.dm index 78deb6cf98..3f83f07ec4 100644 --- a/code/modules/integrated_electronics/core/printer.dm +++ b/code/modules/integrated_electronics/core/printer.dm @@ -20,7 +20,7 @@ can_clone = TRUE /obj/item/device/integrated_circuit_printer/initialize() - ..() + . = ..() if(!recipe_list.len) // Unfortunately this needed a lot of loops, but it should only be run once at init. diff --git a/code/modules/integrated_electronics/subtypes/input.dm b/code/modules/integrated_electronics/subtypes/input.dm index 8da4fad6d8..3ef22e0a5c 100644 --- a/code/modules/integrated_electronics/subtypes/input.dm +++ b/code/modules/integrated_electronics/subtypes/input.dm @@ -335,7 +335,7 @@ var/datum/radio_frequency/radio_connection /obj/item/integrated_circuit/input/signaler/initialize() - ..() + . = ..() set_frequency(frequency) // Set the pins so when someone sees them, they won't show as null set_pin_data(IC_INPUT, 1, frequency) diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index a45f5dba2d..10c1fb2a8e 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -20,6 +20,7 @@ opacity = 1 /obj/structure/bookcase/initialize() + . = ..() for(var/obj/item/I in loc) if(istype(I, /obj/item/weapon/book)) I.loc = src diff --git a/code/modules/lore_codex/codex.dm b/code/modules/lore_codex/codex.dm index ef6ddbe6ea..b440189021 100644 --- a/code/modules/lore_codex/codex.dm +++ b/code/modules/lore_codex/codex.dm @@ -9,7 +9,7 @@ /obj/item/weapon/book/codex/initialize() tree = new(src, root_type) - ..() + . = ..() /obj/item/weapon/book/codex/attack_self(mob/user) if(!tree) diff --git a/code/modules/maps/tg/map_template.dm b/code/modules/maps/tg/map_template.dm index c502e447cb..f4446c4cf9 100644 --- a/code/modules/maps/tg/map_template.dm +++ b/code/modules/maps/tg/map_template.dm @@ -81,7 +81,7 @@ var/list/global/map_templates = list() admin_notice("Submap initializations finished.", R_DEBUG) -/datum/map_template/proc/load_new_z(var/centered = FALSE, var/dont_init = FALSE) +/datum/map_template/proc/load_new_z(var/centered = FALSE) var/x = 1 var/y = 1 @@ -96,12 +96,11 @@ var/list/global/map_templates = list() // repopulate_sorted_areas() //initialize things that are normally initialized after map load - if(!dont_init) - initTemplateBounds(bounds) + initTemplateBounds(bounds) log_game("Z-level [name] loaded at at [x],[y],[world.maxz]") return TRUE -/datum/map_template/proc/load(turf/T, centered = FALSE, dont_init = FALSE) +/datum/map_template/proc/load(turf/T, centered = FALSE) var/old_T = T if(centered) T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z) @@ -123,8 +122,7 @@ var/list/global/map_templates = list() // repopulate_sorted_areas() //initialize things that are normally initialized after map load - if(!dont_init) - initTemplateBounds(bounds) + initTemplateBounds(bounds) log_game("[name] loaded at at [T.x],[T.y],[T.z]") loaded++ @@ -239,7 +237,7 @@ var/list/global/map_templates = list() admin_notice("Submap \"[chosen_template.name]\" placed at ([T.x], [T.y], [T.z])", R_DEBUG) // Do loading here. - chosen_template.load(T, centered = TRUE, dont_init = TRUE) // This is run before the main map's initialization routine, so that can initilize our submaps for us instead. + chosen_template.load(T, centered = TRUE) // This is run before the main map's initialization routine, so that can initilize our submaps for us instead. CHECK_TICK diff --git a/code/modules/mining/mine_turfs.dm b/code/modules/mining/mine_turfs.dm index a6a857c43b..2f81f1568a 100644 --- a/code/modules/mining/mine_turfs.dm +++ b/code/modules/mining/mine_turfs.dm @@ -97,10 +97,16 @@ var/list/mining_overlay_cache = list() return /turf/simulated/mineral/initialize() + . = ..() if(prob(20)) overlay_detail = "asteroid[rand(0,9)]" update_icon(1) - return density && mineral + if(density && mineral) + . = INITIALIZE_HINT_LATELOAD + +/turf/simulated/mineral/LateInitialize() + if(density && mineral) + MineralSpread() /turf/simulated/mineral/update_icon(var/update_neighbors) diff --git a/code/modules/mob/living/bot/bot.dm b/code/modules/mob/living/bot/bot.dm index e166573811..6e8805d17a 100644 --- a/code/modules/mob/living/bot/bot.dm +++ b/code/modules/mob/living/bot/bot.dm @@ -51,7 +51,7 @@ // Make sure mapped in units start turned on. /mob/living/bot/initialize() - ..() + . = ..() if(on) turn_on() // Update lights and other stuff diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm index b79b524875..77ba92ff6a 100644 --- a/code/modules/mob/living/simple_animal/aliens/mimic.dm +++ b/code/modules/mob/living/simple_animal/aliens/mimic.dm @@ -63,7 +63,7 @@ // Pickup loot /mob/living/simple_animal/hostile/mimic/crate/initialize() - ..() + . = ..() for(var/obj/item/I in loc) I.forceMove(src) diff --git a/code/modules/mob/living/simple_animal/animals/slime.dm b/code/modules/mob/living/simple_animal/animals/slime.dm index 7d5fa16dab..f7d23771a3 100644 --- a/code/modules/mob/living/simple_animal/animals/slime.dm +++ b/code/modules/mob/living/simple_animal/animals/slime.dm @@ -27,7 +27,7 @@ icon_dead = "rainbow baby slime dead" /mob/living/simple_animal/slime/science/initialize() - ..() + . = ..() overlays.Cut() overlays += "aslime-:33" diff --git a/code/modules/mob/new_player/login.dm b/code/modules/mob/new_player/login.dm index ff69867548..34a540ac45 100644 --- a/code/modules/mob/new_player/login.dm +++ b/code/modules/mob/new_player/login.dm @@ -19,6 +19,7 @@ var/obj/effect/lobby_image = new /obj/effect/lobby_image icon_state = pick(using_map.lobby_screens) else icon_state = known_icon_states[1] + . = ..() /mob/new_player var/client/my_client // Need to keep track of this ourselves, since by the time Logout() is called the client has already been nulled diff --git a/code/modules/multiz/open_space_controller.dm b/code/modules/multiz/open_space_controller.dm index fc6c7e5484..e790f476dc 100644 --- a/code/modules/multiz/open_space_controller.dm +++ b/code/modules/multiz/open_space_controller.dm @@ -61,12 +61,6 @@ add_turf(T) open_space_initialised = TRUE -/turf/simulated/open/initialize() - . = ..() - if(open_space_initialised) - // log_debug("[src] ([x],[y],[z]) queued for update for initialize()") - OS_controller.add_turf(src) - /turf/Entered(atom/movable/AM) . = ..() if(open_space_initialised && !AM.invisibility && isobj(AM)) diff --git a/code/modules/multiz/structures.dm b/code/modules/multiz/structures.dm index 18bb91a9e4..8b97ffdb35 100644 --- a/code/modules/multiz/structures.dm +++ b/code/modules/multiz/structures.dm @@ -18,6 +18,7 @@ var/const/climb_time = 2 SECONDS /obj/structure/ladder/initialize() + . = ..() // the upper will connect to the lower if(allowed_directions & DOWN) //we only want to do the top one, as it will initialize the ones before it. for(var/obj/structure/ladder/L in GetBelow(src)) @@ -131,6 +132,7 @@ anchored = 1 /obj/structure/stairs/initialize() + . = ..() for(var/turf/turf in locs) var/turf/simulated/open/above = GetAbove(turf) if(!above) diff --git a/code/modules/multiz/turf.dm b/code/modules/multiz/turf.dm index 9d07df4508..421d5639b2 100644 --- a/code/modules/multiz/turf.dm +++ b/code/modules/multiz/turf.dm @@ -34,7 +34,7 @@ update() /turf/simulated/open/initialize() - ..() + . = ..() ASSERT(HasBelow(z)) update() diff --git a/code/modules/overmap/ships/computers/engine_control.dm b/code/modules/overmap/ships/computers/engine_control.dm index 49b0f190b6..d700e38a81 100644 --- a/code/modules/overmap/ships/computers/engine_control.dm +++ b/code/modules/overmap/ships/computers/engine_control.dm @@ -9,6 +9,7 @@ var/obj/effect/map/ship/linked /obj/machinery/computer/engines/initialize() + . = ..() linked = map_sectors["[z]"] if (linked) if (!linked.eng_control) diff --git a/code/modules/overmap/ships/computers/helm.dm b/code/modules/overmap/ships/computers/helm.dm index b92eebbc7e..6c0ee20f1f 100644 --- a/code/modules/overmap/ships/computers/helm.dm +++ b/code/modules/overmap/ships/computers/helm.dm @@ -11,6 +11,7 @@ var/dy //coordinates /obj/machinery/computer/helm/initialize() + . = ..() linked = map_sectors["[z]"] if (linked) if(!linked.nav_control) diff --git a/code/modules/overmap/ships/computers/shuttle.dm b/code/modules/overmap/ships/computers/shuttle.dm index 05d1a6d8c6..8ebbbf20d1 100644 --- a/code/modules/overmap/ships/computers/shuttle.dm +++ b/code/modules/overmap/ships/computers/shuttle.dm @@ -9,7 +9,7 @@ var/obj/effect/map/home //current destination /obj/machinery/computer/shuttle_control/explore/initialize() - ..() + . = ..() home = map_sectors["[z]"] shuttle_tag = "[shuttle_tag]-[z]" if(!shuttle_controller.shuttles[shuttle_tag]) diff --git a/code/modules/overmap/ships/engines/thermal.dm b/code/modules/overmap/ships/engines/thermal.dm index b2f537bb96..323bc82906 100644 --- a/code/modules/overmap/ships/engines/thermal.dm +++ b/code/modules/overmap/ships/engines/thermal.dm @@ -54,7 +54,7 @@ var/datum/ship_engine/thermal/controller /obj/machinery/atmospherics/unary/engine/initialize() - ..() + . = ..() controller = new(src) /obj/machinery/atmospherics/unary/engine/Destroy() diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm index 9b8557363d..b7adf7319a 100644 --- a/code/modules/overmap/ships/ship.dm +++ b/code/modules/overmap/ships/ship.dm @@ -15,6 +15,7 @@ var/obj/machinery/computer/engines/eng_control /obj/effect/map/ship/initialize() + . = ..() for(var/obj/machinery/computer/engines/E in machines) if (E.z == map_z) eng_control = E diff --git a/code/modules/paperwork/filingcabinet.dm b/code/modules/paperwork/filingcabinet.dm index 89a0e5544a..940dac91e7 100644 --- a/code/modules/paperwork/filingcabinet.dm +++ b/code/modules/paperwork/filingcabinet.dm @@ -29,6 +29,7 @@ for(var/obj/item/I in loc) if(istype(I, /obj/item/weapon/paper) || istype(I, /obj/item/weapon/folder) || istype(I, /obj/item/weapon/photo) || istype(I, /obj/item/weapon/paper_bundle)) I.loc = src + . = ..() /obj/structure/filingcabinet/attackby(obj/item/P as obj, mob/user as mob) if(istype(P, /obj/item/weapon/paper) || istype(P, /obj/item/weapon/folder) || istype(P, /obj/item/weapon/photo) || istype(P, /obj/item/weapon/paper_bundle)) diff --git a/code/modules/power/cells/device_cells.dm b/code/modules/power/cells/device_cells.dm index 822370a6b1..9cacf67073 100644 --- a/code/modules/power/cells/device_cells.dm +++ b/code/modules/power/cells/device_cells.dm @@ -21,7 +21,7 @@ charge_amount = 20 /obj/item/weapon/cell/device/weapon/empty/initialize() - ..() + . = ..() charge = 0 update_icon() diff --git a/code/modules/power/port_gen.dm b/code/modules/power/port_gen.dm index 6a40cf3b8e..5a20aaeaeb 100644 --- a/code/modules/power/port_gen.dm +++ b/code/modules/power/port_gen.dm @@ -111,7 +111,7 @@ var/overheating = 0 //if this gets high enough the generator explodes /obj/machinery/power/port_gen/pacman/initialize() - ..() + . = ..() if(anchored) connect_to_network() diff --git a/code/modules/power/singularity/emitter.dm b/code/modules/power/singularity/emitter.dm index e5dead7ee5..f4f6579420 100644 --- a/code/modules/power/singularity/emitter.dm +++ b/code/modules/power/singularity/emitter.dm @@ -42,7 +42,7 @@ return 1 /obj/machinery/power/emitter/initialize() - ..() + . = ..() if(state == 2 && anchored) connect_to_network() diff --git a/code/modules/power/solar.dm b/code/modules/power/solar.dm index dd5c5336bd..360cad96bf 100644 --- a/code/modules/power/solar.dm +++ b/code/modules/power/solar.dm @@ -348,7 +348,7 @@ var/list/solars_list = list() /obj/machinery/power/solar_control/initialize() - ..() + . = ..() if(!powernet) return set_panels(cdir) connect_to_network() diff --git a/code/modules/research/rdconsole.dm b/code/modules/research/rdconsole.dm index db06449d18..a6f6b89069 100644 --- a/code/modules/research/rdconsole.dm +++ b/code/modules/research/rdconsole.dm @@ -110,11 +110,12 @@ won't update every console in existence) but it's more of a hassle to do. Also, files = new /datum/research(src) //Setup the research data holder. if(!id) for(var/obj/machinery/r_n_d/server/centcom/S in machines) - S.initialize() + S.update_connections() break /obj/machinery/computer/rdconsole/initialize() SyncRDevices() + . = ..() /obj/machinery/computer/rdconsole/attackby(var/obj/item/weapon/D as obj, var/mob/user as mob) //Loading a disk into it. diff --git a/code/modules/research/server.dm b/code/modules/research/server.dm index 946910ce23..f38d2798d3 100644 --- a/code/modules/research/server.dm +++ b/code/modules/research/server.dm @@ -22,7 +22,6 @@ component_parts += new /obj/item/stack/cable_coil(src) component_parts += new /obj/item/stack/cable_coil(src) RefreshParts() - initialize(); /obj/machinery/r_n_d/server/Destroy() griefProtection() @@ -35,6 +34,7 @@ idle_power_usage /= max(1, tot_rating) /obj/machinery/r_n_d/server/initialize() + . = ..() if(!files) files = new /datum/research(src) var/list/temp_list @@ -123,8 +123,7 @@ name = "Central R&D Database" server_id = -1 -/obj/machinery/r_n_d/server/centcom/initialize() - ..() +/obj/machinery/r_n_d/server/centcom/proc/update_connections() var/list/no_id_servers = list() var/list/server_ids = list() for(var/obj/machinery/r_n_d/server/S in machines) diff --git a/code/modules/shuttles/escape_pods.dm b/code/modules/shuttles/escape_pods.dm index b832e94dbd..5555e68fe9 100644 --- a/code/modules/shuttles/escape_pods.dm +++ b/code/modules/shuttles/escape_pods.dm @@ -84,7 +84,7 @@ name = "escape pod berth controller" /obj/machinery/embedded_controller/radio/simple_docking_controller/escape_pod_berth/initialize() - ..() + . = ..() docking_program = new/datum/computer/file/embedded_program/docking/simple/escape_pod(src) program = docking_program diff --git a/code/modules/tables/tables.dm b/code/modules/tables/tables.dm index 13fe755751..003535a590 100644 --- a/code/modules/tables/tables.dm +++ b/code/modules/tables/tables.dm @@ -58,7 +58,7 @@ take_damage(100) /obj/structure/table/initialize() - ..() + . = ..() // One table per turf. for(var/obj/structure/table/T in loc) diff --git a/code/modules/turbolift/turbolift_map.dm b/code/modules/turbolift/turbolift_map.dm index 8930bf34d6..effd03e8a6 100644 --- a/code/modules/turbolift/turbolift_map.dm +++ b/code/modules/turbolift/turbolift_map.dm @@ -23,7 +23,7 @@ ..() /obj/turbolift_map_holder/initialize() - + . = ..() // Create our system controller. var/datum/turbolift/lift = new() diff --git a/code/modules/vehicles/train.dm b/code/modules/vehicles/train.dm index c59ffe7e64..74ef6075fd 100644 --- a/code/modules/vehicles/train.dm +++ b/code/modules/vehicles/train.dm @@ -22,6 +22,7 @@ // Standard procs //------------------------------------------- /obj/vehicle/train/initialize() + . = ..() for(var/obj/vehicle/train/T in orange(1, src)) latch(T) diff --git a/code/modules/xenoarcheaology/anomaly_container.dm b/code/modules/xenoarcheaology/anomaly_container.dm index 616b04b10d..6372405300 100644 --- a/code/modules/xenoarcheaology/anomaly_container.dm +++ b/code/modules/xenoarcheaology/anomaly_container.dm @@ -8,7 +8,7 @@ var/obj/machinery/artifact/contained /obj/structure/anomaly_container/initialize() - ..() + . = ..() var/obj/machinery/artifact/A = locate() in loc if(A) diff --git a/code/modules/xenoarcheaology/tools/artifact_analyser.dm b/code/modules/xenoarcheaology/tools/artifact_analyser.dm index 553b6674df..e169a62061 100644 --- a/code/modules/xenoarcheaology/tools/artifact_analyser.dm +++ b/code/modules/xenoarcheaology/tools/artifact_analyser.dm @@ -15,7 +15,7 @@ var/report_num = 0 /obj/machinery/artifact_analyser/initialize() - ..() + . = ..() reconnect_scanner() /obj/machinery/artifact_analyser/proc/reconnect_scanner() diff --git a/maps/southern_cross/turfs/outdoors.dm b/maps/southern_cross/turfs/outdoors.dm index 443e243518..6c0e2b9035 100644 --- a/maps/southern_cross/turfs/outdoors.dm +++ b/maps/southern_cross/turfs/outdoors.dm @@ -162,4 +162,5 @@ // Step trigger to fall down to planet Sif /obj/effect/step_trigger/teleporter/planetary_fall/sif/initialize() - planet = planet_sif \ No newline at end of file + planet = planet_sif + . = ..() From a33792e5e5fcfcf42fba3f3292263c27d9f935c6 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 3 Feb 2018 02:44:51 -0500 Subject: [PATCH 15/30] Make scheduler and Master init order predictable and make unit tests wait until init is done before starting. --- code/unit_tests/unit_test.dm | 8 ++++---- code/world.dm | 8 +++++--- 2 files changed, 9 insertions(+), 7 deletions(-) diff --git a/code/unit_tests/unit_test.dm b/code/unit_tests/unit_test.dm index 605cf8fcac..7537f14022 100644 --- a/code/unit_tests/unit_test.dm +++ b/code/unit_tests/unit_test.dm @@ -34,11 +34,11 @@ var/total_unit_tests = 0 world.Del() var/said_msg = 0 - while(ticker.pregame_timeleft && ticker.pregame_timeleft > 160) // Make sure the initial startup is complete. - if(ticker.pregame_timeleft < 175 && !said_msg) + while(!Master.current_runlevel) // Make sure the initial startup is complete. + if(!said_msg) said_msg = 1 - log_unit_test("Pregame Count down has started, giving it 20 seconds to finish.") - sleep(1) + log_unit_test("Waiting for subystems initilization to finish.") + stoplag(10) world.save_mode("extended") diff --git a/code/world.dm b/code/world.dm index 76a9a947d2..14cc49a3fb 100644 --- a/code/world.dm +++ b/code/world.dm @@ -116,10 +116,12 @@ var/global/datum/global_init/init = new () processScheduler = new master_controller = new /datum/controller/game_controller() + + processScheduler.deferSetupFor(/datum/controller/process/ticker) + processScheduler.setup() Master.Initialize(10, FALSE) - spawn(1) - processScheduler.deferSetupFor(/datum/controller/process/ticker) - processScheduler.setup() + + spawn(1) master_controller.setup() #if UNIT_TEST initialize_unit_tests() From 8bec38ee00643a8bc249d748431bfa2f2bb1f910 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 3 Feb 2018 17:35:40 -0500 Subject: [PATCH 16/30] Implement SSshuttles subsystem * Replaces the shuttle_controller and shuttle process with the shuttles subsystem. Instead of docking ports being initialized by the game ticker, its part of the StonedMC Master init order. * The main advantage of this is control over the initialization order, as well as letting Master be aware of CPU we're using up with shuttle processing. * By being part of the Master init order, we reduce the uncertainty about "are objects initialized yet?" which is nice, since shuttle docks break if machines aren't finished initializing! --- code/__defines/subsystems.dm | 1 + code/controllers/Processes/Shuttle.dm | 9 ---- code/controllers/shuttle_controller.dm | 39 -------------- code/controllers/subsystems/shuttles.dm | 68 +++++++++++++++++++++++++ code/game/gamemodes/gameticker.dm | 2 - code/modules/shuttles/shuttle.dm | 4 +- polaris.dme | 3 +- 7 files changed, 72 insertions(+), 54 deletions(-) delete mode 100644 code/controllers/Processes/Shuttle.dm delete mode 100644 code/controllers/shuttle_controller.dm create mode 100644 code/controllers/subsystems/shuttles.dm diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index e4a3c243e2..f300ba14fd 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -26,5 +26,6 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_DECALS 16 #define INIT_ORDER_ATOMS 15 #define INIT_ORDER_MACHINES 10 +#define INIT_ORDER_SHUTTLES 3 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 diff --git a/code/controllers/Processes/Shuttle.dm b/code/controllers/Processes/Shuttle.dm deleted file mode 100644 index a10586d76d..0000000000 --- a/code/controllers/Processes/Shuttle.dm +++ /dev/null @@ -1,9 +0,0 @@ -/datum/controller/process/Shuttle/setup() - name = "shuttle controller" - schedule_interval = 20 // every 2 seconds - - if(!shuttle_controller) - shuttle_controller = new - -/datum/controller/process/Shuttle/doWork() - shuttle_controller.process() diff --git a/code/controllers/shuttle_controller.dm b/code/controllers/shuttle_controller.dm deleted file mode 100644 index f68957ddb5..0000000000 --- a/code/controllers/shuttle_controller.dm +++ /dev/null @@ -1,39 +0,0 @@ - -var/global/datum/shuttle_controller/shuttle_controller - - -/datum/shuttle_controller - var/list/shuttles //maps shuttle tags to shuttle datums, so that they can be looked up. - var/list/process_shuttles //simple list of shuttles, for processing - -/datum/shuttle_controller/proc/process() - //process ferry shuttles - for (var/datum/shuttle/shuttle in process_shuttles) - if(istype(shuttle, /datum/shuttle/ferry)) - var/datum/shuttle/ferry/F = shuttle - if(F.process_state || F.always_process) - F.process() - else - shuttle.process() - - -//This is called by gameticker after all the machines and radio frequencies have been properly initialized -/datum/shuttle_controller/proc/setup_shuttle_docks() -// for(var/shuttle_tag in shuttles) -// var/datum/shuttle/shuttle = shuttles[shuttle_tag] - for(var/shuttle_type in subtypesof(/datum/shuttle)) - var/datum/shuttle/shuttle = shuttle_type - if(initial(shuttle.category) == shuttle_type) - continue - shuttle = new shuttle() - shuttle.init_docking_controllers() - shuttle.dock() //makes all shuttles docked to something at round start go into the docked state - - for(var/obj/machinery/embedded_controller/C in machines) - if(istype(C.program, /datum/computer/file/embedded_program/docking)) - C.program.tag = null //clear the tags, 'cause we don't need 'em anymore - -/datum/shuttle_controller/New() - shuttles = list() - process_shuttles = list() - diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm new file mode 100644 index 0000000000..2037857dce --- /dev/null +++ b/code/controllers/subsystems/shuttles.dm @@ -0,0 +1,68 @@ +// +// SSshuttles subsystem - Handles initialization and processing of shuttles. +// + +// This global variable exists for legacy support so we don't have to rename every shuttle_controller to SSshuttles yet. +var/global/datum/controller/subsystem/shuttles/shuttle_controller + +SUBSYSTEM_DEF(shuttles) + name = "Shuttles" + wait = 2 SECONDS + priority = 5 + init_order = INIT_ORDER_SHUTTLES + flags = SS_KEEP_TIMING|SS_NO_TICK_CHECK + runlevels = RUNLEVEL_GAME|RUNLEVEL_POSTGAME + + var/list/shuttles = list() // Maps shuttle tags to shuttle datums, so that they can be looked up. + var/list/process_shuttles = list() // Simple list of shuttles, for processing + var/list/current_run = list() // Shuttles remaining to process this fire() tick + +/datum/controller/subsystem/shuttles/Initialize(timeofday) + global.shuttle_controller = src + setup_shuttle_docks() + return ..() + +/datum/controller/subsystem/shuttles/fire(resumed = 0) + do_process_shuttles(resumed) + +/datum/controller/subsystem/shuttles/stat_entry() + var/msg = list() + msg += "AS:[shuttles.len]|" + msg += "PS:[process_shuttles.len]|" + ..(jointext(msg, null)) + +/datum/controller/subsystem/shuttles/proc/do_process_shuttles(resumed = 0) + if (!resumed) + src.current_run = process_shuttles.Copy() + + var/list/current_run = src.current_run // Cache for sanic speed + while(current_run.len) + var/datum/shuttle/S = current_run[current_run.len] + current_run.len-- + if(istype(S) && !QDELETED(S)) + if(istype(S, /datum/shuttle/ferry)) // Ferry shuttles get special treatment + var/datum/shuttle/ferry/F = S + if(F.process_state || F.always_process) + F.process() + else + S.process() + else + process_shuttles -= S + if(MC_TICK_CHECK) + return + +// This should be called after all the machines and radio frequencies have been properly initialized +/datum/controller/subsystem/shuttles/proc/setup_shuttle_docks() + // Find all declared shuttle datums and initailize them. + for(var/shuttle_type in subtypesof(/datum/shuttle)) + var/datum/shuttle/shuttle = shuttle_type + if(initial(shuttle.category) == shuttle_type) + continue + shuttle = new shuttle() + shuttle.init_docking_controllers() + shuttle.dock() //makes all shuttles docked to something at round start go into the docked state + CHECK_TICK + + for(var/obj/machinery/embedded_controller/C in machines) + if(istype(C.program, /datum/computer/file/embedded_program/docking)) + C.program.tag = null //clear the tags, 'cause we don't need 'em anymore diff --git a/code/game/gamemodes/gameticker.dm b/code/game/gamemodes/gameticker.dm index 85ae732989..15113de8ab 100644 --- a/code/game/gamemodes/gameticker.dm +++ b/code/game/gamemodes/gameticker.dm @@ -132,8 +132,6 @@ var/global/datum/controller/gameticker/ticker callHook("roundstart") - shuttle_controller.setup_shuttle_docks() - // TODO - Leshana - Dear God Fix This. Fix all of this. Not just this line, this entire proc. This entire file! spawn(0)//Forking here so we dont have to wait for this to finish mode.post_setup() diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 56fc64c016..374f7b38e5 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -1,5 +1,5 @@ -//These lists are populated in /datum/shuttle_controller/New() -//Shuttle controller is instantiated in master_controller.dm. +//These lists are populated in /datum/controller/subsystem/shuttles/proc/setup_shuttle_docks() +//Shuttle subsystem is instantiated in shuttles.dm. //shuttle moving state defines are in setup.dm diff --git a/polaris.dme b/polaris.dme index 0bd64f42a9..2bee39be99 100644 --- a/polaris.dme +++ b/polaris.dme @@ -147,7 +147,6 @@ #include "code\controllers\hooks.dm" #include "code\controllers\master.dm" #include "code\controllers\master_controller.dm" -#include "code\controllers\shuttle_controller.dm" #include "code\controllers\subsystem.dm" #include "code\controllers\verbs.dm" #include "code\controllers\voting.dm" @@ -164,7 +163,6 @@ #include "code\controllers\Processes\planet.dm" #include "code\controllers\Processes\radiation.dm" #include "code\controllers\Processes\scheduler.dm" -#include "code\controllers\Processes\Shuttle.dm" #include "code\controllers\Processes\sun.dm" #include "code\controllers\Processes\supply.dm" #include "code\controllers\Processes\ticker.dm" @@ -180,6 +178,7 @@ #include "code\controllers\subsystems\lighting.dm" #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\orbits.dm" +#include "code\controllers\subsystems\shuttles.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" From 95b9e67660a0804d7cea4d96d98dac09fa485195 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 3 Feb 2018 18:01:27 -0500 Subject: [PATCH 17/30] Ports callback datum from TG * A callback datum system was created, a common framework that handles all of the nuts and bolts so anyone can implement callbacks easily without worrying about how to invoke procs. * Adapted from tgstation/tgstation#22476 by MrStonedOne --- code/__defines/callbacks.dm | 4 + code/datums/callback.dm | 172 ++++++++++++++++++++++++++++++++++++ polaris.dme | 2 + 3 files changed, 178 insertions(+) create mode 100644 code/__defines/callbacks.dm create mode 100644 code/datums/callback.dm diff --git a/code/__defines/callbacks.dm b/code/__defines/callbacks.dm new file mode 100644 index 0000000000..126ef1ea1c --- /dev/null +++ b/code/__defines/callbacks.dm @@ -0,0 +1,4 @@ +#define GLOBAL_PROC "some_magic_bullshit" + +#define CALLBACK new /datum/callback +#define INVOKE_ASYNC world.ImmediateInvokeAsync diff --git a/code/datums/callback.dm b/code/datums/callback.dm new file mode 100644 index 0000000000..a92a715ece --- /dev/null +++ b/code/datums/callback.dm @@ -0,0 +1,172 @@ +/* + USAGE: + + var/datum/callback/C = new(object|null, /proc/type/path|"procstring", arg1, arg2, ... argn) + var/timerid = addtimer(C, time, timertype) + OR + var/timerid = addtimer(CALLBACK(object|null, /proc/type/path|procstring, arg1, arg2, ... argn), time, timertype) + + Note: proc strings can only be given for datum proc calls, global procs must be proc paths + Also proc strings are strongly advised against because they don't compile error if the proc stops existing + See the note on proc typepath shortcuts + + INVOKING THE CALLBACK: + var/result = C.Invoke(args, to, add) //additional args are added after the ones given when the callback was created + OR + var/result = C.InvokeAsync(args, to, add) //Sleeps will not block, returns . on the first sleep (then continues on in the "background" after the sleep/block ends), otherwise operates normally. + OR + INVOKE_ASYNC() to immediately create and call InvokeAsync + + PROC TYPEPATH SHORTCUTS (these operate on paths, not types, so to these shortcuts, datum is NOT a parent of atom, etc...) + + global proc while in another global proc: + .procname + Example: + CALLBACK(GLOBAL_PROC, .some_proc_here) + + proc defined on current(src) object (when in a /proc/ and not an override) OR overridden at src or any of it's parents: + .procname + Example: + CALLBACK(src, .some_proc_here) + + when the above doesn't apply: + .proc/procname + Example: + CALLBACK(src, .proc/some_proc_here) + + proc defined on a parent of a some type: + Example: /some/type/.proc/some_proc_here + + Other wise you will have to do the full typepath of the proc (/type/of/thing/proc/procname) +*/ + +/datum/callback + var/datum/object = GLOBAL_PROC + var/delegate + var/list/arguments + var/weakref/user + +/datum/callback/New(thingtocall, proctocall, ...) + if (thingtocall) + object = thingtocall + delegate = proctocall + if (length(args) > 2) + arguments = args.Copy(3) + if(usr) + user = weakref(usr) + +/world/proc/ImmediateInvokeAsync(thingtocall, proctocall, ...) + set waitfor = FALSE + + if (!thingtocall) + return + + var/list/calling_arguments = length(args) > 2 ? args.Copy(3) : null + + if (thingtocall == GLOBAL_PROC) + call(proctocall)(arglist(calling_arguments)) + else + call(thingtocall, proctocall)(arglist(calling_arguments)) + +/datum/callback/proc/Invoke(...) + if(!usr) + var/weakref/W = user + if(W) + var/mob/M = W.resolve() + if(M) + return world.PushUsr(M, src) + + if (!object) + return + + var/list/calling_arguments = arguments + if (length(args)) + if (length(arguments)) + calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean + else + calling_arguments = args + if (object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) + +//copy and pasted because fuck proc overhead +/datum/callback/proc/InvokeAsync(...) + set waitfor = FALSE + + if(!usr) + var/weakref/W = user + if(W) + var/mob/M = W.resolve() + if(M) + return world.PushUsr(M, src) + + if (!object) + return + + var/list/calling_arguments = arguments + if (length(args)) + if (length(arguments)) + calling_arguments = calling_arguments + args //not += so that it creates a new list so the arguments list stays clean + else + calling_arguments = args + if (object == GLOBAL_PROC) + return call(delegate)(arglist(calling_arguments)) + return call(object, delegate)(arglist(calling_arguments)) + + +/datum/callback_select + var/list/finished + var/pendingcount + var/total + +/datum/callback_select/New(count, savereturns) + total = count + if (savereturns) + finished = new(count) + +/datum/callback_select/proc/invoke_callback(index, datum/callback/callback, list/callback_args, savereturn = TRUE) + set waitfor = FALSE + if (!callback || !istype(callback)) + //This check only exists because the alternative is callback_select would block forever if given invalid data + CRASH("invalid callback passed to invoke_callback") + if (!length(callback_args)) + callback_args = list() + pendingcount++ + var/rtn = callback.Invoke(arglist(callback_args)) + pendingcount-- + if (savereturn) + finished[index] = rtn + +//runs a list of callbacks asynchronously, returning once all of them return. +//callbacks can be repeated. +//callbacks-args is an optional list of argument lists, in the same order as the callbacks, +// the inner lists will be sent to the callbacks when invoked() as additional args. +//can optionly save and return a list of return values, in the same order as the original list of callbacks +//resolution is the number of byond ticks between checks. +/proc/callback_select(list/callbacks, list/callback_args, savereturns = TRUE, resolution = 1) + if (!callbacks) + return + var/count = length(callbacks) + if (!count) + return + if (!callback_args) + callback_args = list() + + callback_args.len = count + + var/datum/callback_select/CS = new(count, savereturns) + for (var/i in 1 to count) + CS.invoke_callback(i, callbacks[i], callback_args[i], savereturns) + + while(CS.pendingcount) + sleep(resolution*world.tick_lag) + return CS.finished + +// Makes a call in the context of a different usr +// Use sparingly +/world/proc/PushUsr(mob/M, datum/callback/CB) + var/temp = usr + testing("PushUsr() in use") + usr = M + . = CB.Invoke() + usr = temp diff --git a/polaris.dme b/polaris.dme index 2bee39be99..d5f489f8be 100644 --- a/polaris.dme +++ b/polaris.dme @@ -24,6 +24,7 @@ #include "code\__defines\admin.dm" #include "code\__defines\appearance.dm" #include "code\__defines\atmos.dm" +#include "code\__defines\callbacks.dm" #include "code\__defines\chemistry.dm" #include "code\__defines\construction.dm" #include "code\__defines\damage_organs.dm" @@ -183,6 +184,7 @@ #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" #include "code\datums\browser.dm" +#include "code\datums\callback.dm" #include "code\datums\category.dm" #include "code\datums\computerfiles.dm" #include "code\datums\datacore.dm" From 2c90995dcc1149878f245080fe5c89ee8c3f7b44 Mon Sep 17 00:00:00 2001 From: Leshana Date: Sat, 3 Feb 2018 18:48:37 -0500 Subject: [PATCH 18/30] Let objects register to be informed when shuttles have been setup. * Switch /obj/shuttle_connector to use it instead of the icky process hack. --- code/controllers/subsystems/shuttles.dm | 15 +++++++++++++++ code/modules/shuttles/shuttles_web.dm | 11 ++--------- 2 files changed, 17 insertions(+), 9 deletions(-) diff --git a/code/controllers/subsystems/shuttles.dm b/code/controllers/subsystems/shuttles.dm index 2037857dce..8751e0ffd7 100644 --- a/code/controllers/subsystems/shuttles.dm +++ b/code/controllers/subsystems/shuttles.dm @@ -16,10 +16,17 @@ SUBSYSTEM_DEF(shuttles) var/list/shuttles = list() // Maps shuttle tags to shuttle datums, so that they can be looked up. var/list/process_shuttles = list() // Simple list of shuttles, for processing var/list/current_run = list() // Shuttles remaining to process this fire() tick + var/list/docks_init_callbacks // List of callbacks to run when we finish setting up shuttle docks. + var/docks_initialized = FALSE /datum/controller/subsystem/shuttles/Initialize(timeofday) global.shuttle_controller = src setup_shuttle_docks() + for(var/I in docks_init_callbacks) + var/datum/callback/cb = I + cb.InvokeAsync() + LAZYCLEARLIST(docks_init_callbacks) + docks_init_callbacks = null return ..() /datum/controller/subsystem/shuttles/fire(resumed = 0) @@ -66,3 +73,11 @@ SUBSYSTEM_DEF(shuttles) for(var/obj/machinery/embedded_controller/C in machines) if(istype(C.program, /datum/computer/file/embedded_program/docking)) C.program.tag = null //clear the tags, 'cause we don't need 'em anymore + docks_initialized = TRUE + +// Register a callback that will be invoked once the shuttles have been initialized +/datum/controller/subsystem/shuttles/proc/OnDocksInitialized(datum/callback/cb) + if(!docks_initialized) + LAZYADD(docks_init_callbacks, cb) + else + cb.InvokeAsync() diff --git a/code/modules/shuttles/shuttles_web.dm b/code/modules/shuttles/shuttles_web.dm index c55aba9c39..a8ca493470 100644 --- a/code/modules/shuttles/shuttles_web.dm +++ b/code/modules/shuttles/shuttles_web.dm @@ -426,18 +426,13 @@ /obj/shuttle_connector name = "shuttle connector" var/shuttle_name //Text name of the shuttle to connect to - var/start_time = 60 SECONDS //After round start (needs to be some time, to let other destinations set up) var/list/destinations //Make sure this STARTS with a destination that builds a route to one that always exists as an anchor. /obj/shuttle_connector/initialize() . = ..() + SSshuttles.OnDocksInitialized(CALLBACK(src, .proc/setup_routes)) - processing_objects += src - -/obj/shuttle_connector/process() - if(world.time < start_time) - return - +/obj/shuttle_connector/proc/setup_routes() if(destinations && shuttle_name) var/datum/shuttle/web_shuttle/ES = shuttle_controller.shuttles[shuttle_name] var/datum/shuttle_web_master/WM = ES.web_master @@ -450,8 +445,6 @@ var/travel_delay = D.routes_to_make[type_to_link] D.link_destinations(WM.get_destination_by_type(type_to_link), D.preferred_interim_area, travel_delay) - processing_objects -= src - qdel(src) //A sensor for detecting air outside shuttles! Handy, that. From 52398aa0cf9bc89811755ef3b7da64e4de1e64a4 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Feb 2018 17:53:12 -0600 Subject: [PATCH 19/30] Adds Phase Pistols --- .../projectiles/guns/energy/special.dm | 10 ++++++++++ code/modules/projectiles/projectile/energy.dm | 8 +++++++- icons/obj/gun.dmi | Bin 84173 -> 84942 bytes .../southern_cross/structures/closets/misc.dm | 12 ++++++++++++ 4 files changed, 29 insertions(+), 1 deletion(-) diff --git a/code/modules/projectiles/guns/energy/special.dm b/code/modules/projectiles/guns/energy/special.dm index 84697e668d..70138487e3 100644 --- a/code/modules/projectiles/guns/energy/special.dm +++ b/code/modules/projectiles/guns/energy/special.dm @@ -25,6 +25,16 @@ charge_cost = 480 projectile_type = /obj/item/projectile/ion +/obj/item/weapon/gun/energy/phasegun + name = "phase pistol" + desc = "The NT Mk26 EW Apollo is an energy handgun, specifically designed for use against wildlife." + icon_state = "phase" + item_state = "taser" //I don't have an in-hand sprite, taser will be fine + slot_flags = SLOT_BELT|SLOT_HOLSTER + charge_cost = 300 + projectile_type = /obj/item/projectile/energy/phase + + /obj/item/weapon/gun/energy/decloner name = "biological demolecularisor" desc = "A gun that discharges high amounts of controlled radiation to slowly break a target into component elements." diff --git a/code/modules/projectiles/projectile/energy.dm b/code/modules/projectiles/projectile/energy.dm index d3bc093cac..8138146163 100644 --- a/code/modules/projectiles/projectile/energy.dm +++ b/code/modules/projectiles/projectile/energy.dm @@ -195,4 +195,10 @@ light_color = "#0000FF" embed_chance = 0 - muzzle_type = /obj/effect/projectile/pulse/muzzle \ No newline at end of file + muzzle_type = /obj/effect/projectile/pulse/muzzle + +/obj/item/projectile/energy/phase + kill_count = 4 + damage = 5 + SA_bonus_damage = 55 // 60 total on animals. + SA_vulnerability = SA_ANIMAL \ No newline at end of file diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index a9c1789bf4eede81136696a9307a0fecb85a87e9..2ea4f3c31cad1a1f952a92ad4071842f3191fcf3 100644 GIT binary patch delta 6250 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 diff --git a/maps/southern_cross/structures/closets/misc.dm b/maps/southern_cross/structures/closets/misc.dm index d3a8e34f53..77ecb795f3 100644 --- a/maps/southern_cross/structures/closets/misc.dm +++ b/maps/southern_cross/structures/closets/misc.dm @@ -26,6 +26,18 @@ new /obj/item/weapon/gun/projectile/shotgun/pump/rifle(src) return +/obj/structure/closet/secure_closet/guncabinet/phase + name = "phase pistol cabinet" + req_one_access = list(access_explorer,access_brig) + +/obj/structure/closet/secure_closet/guncabinet/phase/New() + ..() + new /obj/item/weapon/gun/energy/phasegun(src) + new /obj/item/weapon/gun/energy/phasegun(src) + // One spare cell per gun + new /obj/item/weapon/cell/device/weapon(src) + new /obj/item/weapon/cell/device/weapon(src) + //Explorer Lockers /obj/structure/closet/secure_closet/explorer From c30d1ca57b464da72cf52e3a0577cbe3d2a549a5 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Feb 2018 18:01:11 -0600 Subject: [PATCH 20/30] Tweaks the Explorer suit --- code/modules/clothing/suits/miscellaneous.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 9b88496119..bc2f1b82ea 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -782,7 +782,7 @@ obj/item/clothing/suit/storage/toggle/peacoat hooded = TRUE hoodtype = /obj/item/clothing/head/hood/explorer siemens_coefficient = 0.9 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50) // Inferior to sec vests in bullet/laser but better for environmental protection. + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) // Inferior to sec vests in bullet/laser but better for environmental protection. allowed = list( /obj/item/device/flashlight, /obj/item/weapon/gun, From 94a3a3b9edc522964e8a9cf579b28b8145102cd1 Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Feb 2018 18:21:51 -0600 Subject: [PATCH 21/30] Maps in the proper Explorer gun cabinet --- maps/southern_cross/southern_cross-3.dmm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/maps/southern_cross/southern_cross-3.dmm b/maps/southern_cross/southern_cross-3.dmm index fb27f43910..84dd6a6049 100644 --- a/maps/southern_cross/southern_cross-3.dmm +++ b/maps/southern_cross/southern_cross-3.dmm @@ -110,8 +110,8 @@ "cf" = (/obj/effect/floor_decal/industrial/warning{dir = 10},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel_dirty,/area/surface/outpost/mining_main) "cg" = (/obj/effect/floor_decal/industrial/warning{dir = 6},/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled/steel_dirty,/area/surface/outpost/mining_main) "ch" = (/obj/machinery/deployable/barrier,/obj/effect/floor_decal/industrial/hatch/yellow,/obj/machinery/alarm{dir = 4; icon_state = "alarm0"; pixel_x = -22},/turf/simulated/floor/tiled,/area/surface/outpost/main/security) -"ci" = (/obj/machinery/light{dir = 1},/obj/structure/closet/secure_closet/guncabinet/rifle,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/turf/simulated/floor/tiled,/area/surface/outpost/main/security) -"cj" = (/obj/structure/closet/secure_closet/guncabinet/rifle,/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/turf/simulated/floor/tiled,/area/surface/outpost/main/security) +"ci" = (/obj/machinery/light{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/effect/floor_decal/industrial/warning{icon_state = "warning"; dir = 8},/obj/structure/closet/secure_closet/guncabinet/phase,/turf/simulated/floor/tiled,/area/surface/outpost/main/security) +"cj" = (/obj/effect/floor_decal/borderfloor{dir = 1},/obj/effect/floor_decal/corner/red/border{dir = 1},/obj/structure/closet/secure_closet/guncabinet/phase,/turf/simulated/floor/tiled,/area/surface/outpost/main/security) "ck" = (/obj/item/device/radio/intercom{dir = 1; name = "Station Intercom (General)"; pixel_y = 21},/obj/structure/table/standard,/obj/item/weapon/book/codex/corp_regs,/obj/effect/floor_decal/borderfloor{dir = 5},/obj/effect/floor_decal/corner/red/border{dir = 5},/turf/simulated/floor/tiled,/area/surface/outpost/main/security) "cl" = (/obj/machinery/status_display,/turf/simulated/wall,/area/surface/outpost/main/gateway) "cm" = (/obj/machinery/gateway{dir = 9},/turf/simulated/floor/tiled/techfloor,/area/surface/outpost/main/gateway) From 441bb3430ec56548b1d88c0e124ad5763da4427b Mon Sep 17 00:00:00 2001 From: Anewbe Date: Mon, 5 Feb 2018 19:06:22 -0600 Subject: [PATCH 22/30] Corrects some small mistakes --- code/modules/clothing/suits/miscellaneous.dm | 2 +- icons/obj/gun.dmi | Bin 84942 -> 84933 bytes 2 files changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index bc2f1b82ea..5ecef18d7d 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -807,7 +807,7 @@ obj/item/clothing/suit/storage/toggle/peacoat flags_inv = HIDEEARS | BLOCKHAIR min_cold_protection_temperature = SPACE_SUIT_MIN_COLD_PROTECTION_TEMPERATURE siemens_coefficient = 0.9 - armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 50, bio = 100, rad = 50) + armor = list(melee = 30, bullet = 20, laser = 20, energy = 20, bomb = 35, bio = 75, rad = 35) /obj/item/clothing/suit/varsity name = "black varsity jacket" diff --git a/icons/obj/gun.dmi b/icons/obj/gun.dmi index 2ea4f3c31cad1a1f952a92ad4071842f3191fcf3..4bb7b955a0d63f24e227762615f3854e215babb8 100644 GIT binary patch delta 6168 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 Date: Mon, 5 Feb 2018 19:34:46 -0600 Subject: [PATCH 23/30] Changelog --- html/changelogs/Anewbe - ExplorerGear.yml | 37 +++++++++++++++++++++++ 1 file changed, 37 insertions(+) create mode 100644 html/changelogs/Anewbe - ExplorerGear.yml diff --git a/html/changelogs/Anewbe - ExplorerGear.yml b/html/changelogs/Anewbe - ExplorerGear.yml new file mode 100644 index 0000000000..19eba8cbfb --- /dev/null +++ b/html/changelogs/Anewbe - ExplorerGear.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Anewbe + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Lessens the bomb, bio, and rad protection on the Explorer Suit." + - tweak: "Replaces the Hunting Rifle cabinets with a Phase Pistol cabinet. Same general purpose, shoot animals, kill animals. Shoot people, get laughed at." From d04faba6c48d4fd49704af4fde0fd4e7308717ce Mon Sep 17 00:00:00 2001 From: mistyLuminescence <32139558+mistyLuminescence@users.noreply.github.com> Date: Tue, 6 Feb 2018 04:29:37 +0000 Subject: [PATCH 24/30] Machetes now fit on belts (#4725) * Knives and machetes now fit on belts * just machetes --- .../objects/items/weapons/material/knives.dm | 1 + icons/mob/belt.dmi | Bin 16759 -> 17018 bytes 2 files changed, 1 insertion(+) diff --git a/code/game/objects/items/weapons/material/knives.dm b/code/game/objects/items/weapons/material/knives.dm index 9c6fbd911f..f2528f5786 100644 --- a/code/game/objects/items/weapons/material/knives.dm +++ b/code/game/objects/items/weapons/material/knives.dm @@ -100,6 +100,7 @@ force_divisor = 0.3 // 18 when hardness 60 (steel) attack_verb = list("slashed", "chopped", "gouged", "ripped", "cut") var/should_cleave = TRUE //Now hatchets inherit from the machete, and thus knives. Tables turned. + slot_flags = SLOT_BELT // This cannot go into afterattack since some mobs delete themselves upon dying. /obj/item/weapon/material/knife/machete/pre_attack(var/mob/living/target, var/mob/living/user) diff --git a/icons/mob/belt.dmi b/icons/mob/belt.dmi index 6b0397c9e111cddb0194b29c93e00818de5d6e1e..54b20e01650adf60905f02317f30498aeb93bb7c 100644 GIT binary patch literal 17018 zcmc(G2Ut_vwr&s=g{{a|K}CpyTWo-efYO4}tRTG;5h>Cl(i0#kA`t{s1O%jubVBbC z1rezM={5A0KxiS5kmSv{_pR@qbKiZp@qJ-stu-^-=>Hh=)qPEkecZ>mArQ#ETQ^m8 zAdnqN;N!n%H+Z7*rg;tAkdS&tZmQOi9=iD3OMH{=k;M|h z!7JCbDt;4xDLiO+@yM$J{jPT>npO(a3CSuX$9clxrI;>5Qd-dY#mZ13dUfA`|Udes2CS=EmG_=C@C=05Hrsm-cBkdza9j_SO| zcX&j5Z>1F~dH7*>m{01vw^mc{twb1C%BFIUZlDrw| z6!kNKXCFmSC*J-Lo^MLftsk9} zT2}2P33~2wuFpScuuH||dG%c3Err3UH;sd@b3HH5#eLwJcq5WeE|S(c@{BrjxAW9) z^<^{5Ft_-zA0n1|e^@<4tn+w0D)3)B9q6I~k$qoxmT2~brXmt_{pnr{$=Efh<86qX z-H*35YNh=}?l0HP)otZyyRPta%bc;(UJkh1r$Z18bj}Rl?}c;M`*HAoOwIk1j~-6F z<-QoS-h8j9x$51Hh&2_`x|;$VX&4Z>3gF>D~$!^0GL5W4aXSjm}FTSVW^CwQ)VI zH%}juN=?cJn(;V zN9^TrJCjc{{pbAto_RTfZqF>kuZGqWuiNIGu;xQw%|z%+m#C-mK_G9M9h!m6`P=g; zb3kt1hU|izILmPe;{R#qeF)^;@Bi6{M-MMhkOtVkqC$EG_uB3Ur*_`2j6I>3*Ikr& z**dsH_{-gl=Ti7B`~d5N?`JIK^oUZ#rTVR@qf$1HfJ1J|zv3(E5s=0^-H$&A^`QIw-DX>st9nwtH!5icpiOVuG z%=meieJ5;sNycw`5-LWICA#UyHa)LG3-FtHveh2r?w8xvu(@8~i6)op{t4#aZ&-daC<^;ZdiEl{3mPHE3 zMs{lDb=q~S*ULVVy;VW?-lFzm$^G_@8zrA^OEqDoPe+a1ngz>1B9SRrES4lA*KGIU zmZ2io6<%18P21p<0O3JnaDIi{St!y*_bjJ&Poy*vmtgX2vDPxH`>wNi)wBJ2&tj(H z1j7|K%?5JaUUy!M$m32@F7b8M+*L|{nR#34sQku|byI3bY354ry9Sn2i>FjsMB3=2IXLP6t;@HP(&Nfv_hR3xsgjB(gG*&P+On=hoHKXG{-?{fNqGEK z8n#4VKlYYiZX(QT9scWeN?yq{1i98G+b1GYiZVAPdX}7PJB91@rAkyqv}>ouO!XmK zzZJ^QAOH13bhXt$yj$3>Ch5_CkvF)q*Alm9zCi4IX<2}F(ru~7!^ZKy=KHkGGs`tM zH|yu!EVqAt8T8Gq-=9QZl%kcz1!dos%KTYUn)Np>kEtcS$3oRjwe~0sUogHT&kXw6!H9z&o|L8-#KCTX{uxqE|6uh4rctFqIO;ETNciH;(A9=raH}c=O zG}%@6Ub2?GsB_*R2UB3x7&W5)yRWbBFTVZPl=_QqonE=-HJoyfe}1|kGO=cxbEYb? zu7^muz_jxjaB_S9w|K__YwOY)-RzvYSSjZ}>a*5Xg2DVE)Cv$nkN;4^Sk>a3nhG?4qM{<77Ne3RGnkjnX}1(he$5OTn+3WcM8D;)CTz{p&`t--(8&CG zm#rs4Jnx;Y3Judqi_x2Rr~zEoWLMLx&8JKqvR#Mmg!1v>#V=F^wCkqDY)>S%EG4ah zfnZ8l(tbIuf1J%_Zfr@f-IeAg4v0VZ(Zlk9v~Ilrg_htyF20$3Tpesps{8qF(_rV_ z^z6UGr)(a!|0H!(>gR46ji!za&eQ&TLJQvY+_b%%BGiGbNocqPKc>w&lJb{U07N89 zRK3~{c1v&G#8m%ZTzbM{UZ3&bSYKCFpb+^=JB0ocEkNIgRfTbL7lEMuOCHqH(%O?G z=+Jmq{gCo6I>u9lEO|zf{~Ybn(r`t|w6$!fCD0ZXuCu*aE0Lp>=h}Wf=Zzjw4f>13 zDAd3`w+|kzkEXECSu5V6N@{%>?ESbQwdFmq&n@X(+mwT~Y{xUuO;?L^5~u#-)B2UY z2BB`Jft~LRQ-VN}{$TF^UlQ7XrZU|1A@M+TWvrXu=a7`-ZvDxBkui=JAOAe%dhX*Q9+1^h)BwpwW2DOaDRpZ%~k$nU;gsC%PtS;v}`k3(rqyJ zv5HOMSF|6!*^3B`98q)sAbat5Krw9(UWn7BSrSslJu3c{UaMgLpBmS_E#wUZazyCA z#yk6u$Yj5WYkQup=_&yzeaC{)(NS^Qbk}@|-MyMx>v7J(-<5qi@}eK^*H5HON5d`V ziD>CmU!_zAP5m6j2Z=%znS9#&@~lH=ED$)gD19bXN5Ab_Rf5y}lC5go4m&NaaLF&2 zO(>Rp^suztz zY*fyPxE{MJIckCT;(Idg#g|OOIi2<ul?5^FjHBDnKbh|z`(aDKB?U30&!>AFUn*Be`}H;96nmuDiL%KmJ(oh{&OzFBO| zwQei9UNU*b9Pv}U>=3hUGaB~Mvye{(W8ebzo`^+0uKTbzS=qo_1-?WsN$F-wrD3$YZ4%huNQ%3* z%_4?E;I+0+>b#Ho#?j4t3X<`;^T3NzJ^gymD*LkOlbdICKNnA4aXagIBde*>Fv2~3 zz;4eC)2yuVDk~3VQIYnmlfS{IxNXwoZ*1bzFgw<6RO;S7Ubnifv zBlWzwib=wiHKo5?nEzIF*fE`8Ub0YGh)PlzDQ5z2$*qF1F_2E;Kcg+1hXdoAJI zrx87Hc8SjBXkch7hjqghRt>GG%HEYOj9vF3b2=lHbTyRQ8ZG>66$j*jS8RZW?2_N5 z%c+*XUW<5d&h?Ic{qZ`Af*4X+rXUp^`YI}uJ$mxW4%#C$5eUR%-$?B$`@W&QCCLY; z(9Y>Y^<1VlS8~y&JM4gJ6=`YadH%}5a1kk=yfL%Bv0+nkMsm;RJo6Ib;)_A-XM0cX zY>%4w`zT+=D9J&}*3XMP;z@rJvO&xoZf_?Ml5W$!t@d&B#wN} zk^Uf<&Pr}wb?T`V>M*&6J9soy4_<@TfaYTai>Aa#{Dd$ z?R_V?>qo2JS(9Ic@jH3*>Gb#=(fe~X?<+(N)EBeN5n|nb(!hbp)cf=1W#@MwI7gDD z+OMV-KQa5O$;(c4$S!|p7k#!ReJ^#1RhlV%EVK{>fjp36Zod+xC!%OABM2gG#0!lP zh9uR8zU&xiRayS;@P3`vNm=@Rksy3hPCuwTWQX(JI9s&~;vXjFU)t1;@D3T#g81|A zNpf2677gFlA5a8-njA;*K9b)KNU`%>u!5qQvB%VdkR<6HbNtQq>0^5#7Zt$Q^6{5~ zg=ck@e&^%E`Y!eZ$96i}u=}bf}KU?K9 zqqF8d#dzvSj(l>GPvXM)XqFb5i#a6sj$mstiiH{hxlbA>DX!zPGq{OpR;pIx0#5M{ z)RTcMjAVRNyj+P`UTl{DzB>Q1rXPN@e75s&U@yx+ckvz)Woezm9MUa3$ZG84iEAm_ zeT`MNyEPR-HV(|YgIBS&ZIeQzH6F^Vo(%Ik=iV7i{1hX5Ozi#0jcG71t+^zN%3G!$ z$}Rnog_Hf)vWl6Kxn_cVe0QR;qjSCsgPep|gk&Le7B5$TUP^=!zd4R6=-B1;RMX|? zMdtIZnZ*WrF{>)pp%W1@YEHnxg1TidIr;!0{USJ&QAu9Ftf z=12JWbPx6jdkx)h49S4$Y5A)0qtytbMfRMweysC~42CsfRl(6;LK~=kQKcrfNR=*X za(!=3C%=L(`I#o;cIxyVYuzV1{6-vJs{nw6sw11s^2xC5DakMAa$%5*Po0K1%(vDR z7v=OddXCK@2riGWa3zKA&^~Tx0=Ld?rg1_<`=TJRPsOqhderRRos`9ulEwbvWhd`F z!VrkbG;0^{|6)+rjoC3*F`E!qlKuAW!Y7NYln9&ATQz!WVr|tC$jo5PSZ^_k&S7i( zHmL~T9!rSOtg=x`fgo>8zVKM@;1|2#@E2_bQPR!M$xr1T&x9UymaGbFp8pgBe|jU8 z#D6ZG6oZeI&h}WyOt%5(M^@zE&0XTAr8(lWD+d(*A(Yks)9^x+1N;A%t?Mt_{$6`> zb21#y4#~XScbw^v)>NeEd0y_nsa2Ce=_b}ns8`sAfBc|`n)-IK&)c=EGlq?Iz?hpP z_Ro;cD{To!VVI z14XvBe0-tmq9GVkB=r(%gXH-A_0jq~#T-bb^GId+LRPjMGwx#KWH?MoiZ|(?-lY!+ z*6p#%vN5?39woHAyDrvr;>|T2cHc%+iihhQ@x@qtVPcGwZC>KaV@~I*PG1)5?*n>@ zqgP!Tg`!8E)bHETcRq~0J8rCreH^tAI@v*sP6_<15<4+S# zN>qh+E+iurhpOs5uZNIU21Lbd z)B67{CgGpV%%Jr#3R33d)E53uXr_1ij_K0~> zb`Nmt1{90cYRY6CTH~Tm{q`xRCnqxgy9lTD0EMe-ST}3Xx|_5UMJmwnU@@qT@}nzZ z*AX}tlRmi*;iY0d)47*lVa=?R0A;<6F?>(KmO8^({~QNaRV9@X{9IbZ%f6uq^iiYy z2iMu0*R6XA(C$2wSI#dO5<(TpM#&^;{QBilFsYn0WD&~Xcxy+nv3ast5 z0rtp0RL1c9jFbBZDeioHE|Wr3Rn>2aj3%f+uPHmmG%64Q5W?;n--h7BD=%fMlQUKe z8ii4hfM9t!jTQLpmmPJ{O74ReSngYm4WLLZ8)?scG{=8#x9`^39!_1GA`*bR(stfb z<;7D9mZd^*9373PR#hCXNAB^PX^kmKPe7haKrUpKPe+-Gh)hJ8I=|XBT3C*u9^&Im z|KkF3(0}lavM_U%x`r+~1EvDdTgj-}{0j+4TEz{bqAViJVq`lN=dk9y_tcKYNgsP9{9Mb3=V=JP zc(ccdd!GrjcB@oj&pm}F2zYeru-(>leN+LnM<%ux-OY|MD+3I_a{dovey@#yb6UAF z{9Xk(W&C?@OkbjRs)59WdJYI6f|be+$RYP6K{|Gfr<(;q{k&9FeO5x?#rsqJA>0># zV=+hO2XJUlPFMesPocPF0JgE{i37Q6smln5&t586&y;py@yG)<6UZz7 zoKI6}n*B+o6TVmBX%@*8wBNw{oY{Mb5X?hc#SdyB{MNcK51ZBs4-Zl$F|TR1bvN+r zTSO)Tpqt7*3%ZH+bd&Xs?jlho)9@k5$Dq^d+KB{{`~jud9gB7IJd-PpP^ba4Mv;uJso0Ddv>B!IR*fH@Ot^ zMja@P)v`j=$|+30&s z?3)j(c?~YBty+x_N(gKM2F*AI~te(k%PA9e8)S#!LJE?;OT$^co` zaf;ntL#!yM0~%Umd_2F_PXg=iLH@`ro2iu<2(4a-BpywkS&o6WXquy$q;3jJ80P2m z8VXbT9Bz8V6=^cGS6J%j_bkWu0gB^7j(YCsP@MEkNz~@NU#PlO1R@Wpz8)T*9ZJ(g zIs-Aea7RRwNy;rCYhy!dO%WkA9s~&kiArf3Un}Ex!tL}qT=i<_ewRA2(qK>0GWilw zpcBVw@+ksFuiTto2o0C!TJ>a5=pugGsW(t_FWYBghzN4qJri=oJ7w*I48Q9L!V#cPAt7T--otP;P0evp6=7ZoR3qg z^=#2R>F=DZ;1e~%H4h+d6IE3!hR_P7@daL66799Ma7Siz+LRV5eQCaq$OC811oesS zD|Z^h4ThpD z=AwYPo3=;$wb^2K{%8y2V-E(UuaVLRPdvOe8)edSTq%wzcYWx_Ty?E_E_KwfT|SS( z%A+QaURVnKAnX39;=yRQcL_6SJm@6)NNxPMYj1UC$=Mo#M+DQWibzx+obZ5O!t83! ztUq^>>6dn~FUYehaAS@lQxBM^h;!}M%;2Y65rwYp*V3J4TkCCA3(!Q@J0N~E0cs58 zh}a{vlwCb^K#5MAJ-J>}zfI=$>eLgyAu3WUyHs!lO-^8xi65sLnLRaxc; z9^7QFsP`Vnm4}S_WsT!5s>N0U#a;EbMLuHdoKAl3K0sTwz^8@yTv~pvFrYZk;W}n` zBm82m)3|FY%@tV`*d^N?bD8;^8ICJ^LVHQOL%pzgm~L7J5a9e*&fJN74NEU%aOJk- z{^gZPUqL1EN@lnQ-^{&uLx*!mi-Z#^lWkljJI{Rb)80OM8gfJx;123J=p)RHAw+nH zM5W!=sD#v^I$H@cg+|0mZin|sT?QD(Zxb65tfD)B`t(GnCUjr!xRlrn4=y}#rbSZd zVEQQu2XCX;zO~3hMxLcAH3*Lh^}I2!;PDI6`u~QfyFU~PLj2!eCFT?r=9UhgtKFWK z?8`F3T}a$&wJj`h==%^)N_W(pGK zm7~9+ay)nCave{Rv_mgjAgwk?18F;x6)=(duoBG=*HQx@U{Ec^)gN#W+CLUIE58W5 z-GiG8iN_!is3N--03gY)cqFSY-Z4iH7C#;UP%{X=;hN@^SFG_LJAo~%j2*$-{~AO; z+n^yeT@3M(!n8JPXyQ89(mlf zc;EDR*OG0?6fY;aq|c&&(rX(1`wLANW8Ja!!zH1WVZ4v9+IiH>YY7kKXL()66$0@K zTXh1p_gkR5M}4Uycjhgpn+G`;M`93mX5Sr_7!DG zR4>;#j@Jbi^ca{nELD*$nl*=uA9ocxm5sIwZ$x;$H3j(#joMybszR5OEach>kt=aK0aB&8c0S(_Yhix-0PUNY(p$Ep z&n78hdq(!ozK5K%+Qo%nzq)_!pZl0F>PRaOyyUmNxsQwY$hIqxAmrVn=<9+eL)}@C z*;X43T}9grDq_2Av!ftronTO0{hbt&&P!7%pA)u$D=5mZxe9de77oFbQ=2p<{YOTR zb0Q>Df~pNv9d!`-!b8@8^aI;lYm*%+yrElbvyFflf>3&YBk%^W9I&_*vj~0t})A4AN?sL?Wq9`g@jJmoF(Xdku`Mxd2LG7Kh4+u9i2@wjm4ne&J`LO&Dcy*ib%HCgS^ zEF9~wpJZD;n*}toA>-3M4`r>8P)}uYCbEbGi+Q+;V*wPkW8MdjwaF*t@G7C4O7s<~J)9f~c1FaT@)4J3(QHh?p)W5K z;WH_imV+7qdO1Vr6H^g)`KO5Ijt@h42#94xnG+0>x55IJEZNgZ*die~YHTu~|gk zFLR}HG0_v_cvAc{d94hCF^97%`zaKx;KntL8x9nB-G9+P!ZzYrQyZc%rz zXxKvLZ(GNMdmk4$ueW6jy~#zx!R#GKBZiy5>2x0nOOwB1kM*6TQLU*urC^}qYwUn; zBY|2i7A0XmsO=khvf;Ppgf(qKoBbAjTU=yWa{ z1^(WHLKYRG`agCvA{E06iJW?Y5N>O^6%}jGeD6&9d6e)gq9=09oonZrUh>UPwomq;et_n9T_q1C(ra zNZ`ADhdp!xJMPS2n>+?snDW*BzIEJUA&XCCLtm94_!)YX$8WO-gE3mJ$DYRGT9_J+ zZlss<8mF_N zH^=f?;Vf(X*~ov$#B*#5tFR#*S5vd6(fo<&M~}(Meli2y#fpkU_oQ>@ny+ucL*-BW z+09LTvj3i>j_aeyedyHRsdua=69| z`4fB%gzHzOtI|8xaIskgj-$GB1J9zQx$u{F+&4~k7?Z3>3m3<@pq2z&u?&;rPn!+7 zbK})i7YDHoQ{lc(BZyinEwZvJroN1mpNi#AxO`J*<-Kd*9TslmtvA@(e^V^8$G+3< z3b!I_DuyLD=VU#?;k_1SW%cmN2*8%K?YhU@RH;h2kpv%WdyP-Sn% zGfTu$2|NUlC)Rph`S>Fzh9V)ot2< zE3e}8WaIu`!?z`(GQ%9+PkLQe0@LW<11J525HR}7unNw1SUQ+B!$I z!PJHf1nW#I!Ts=KNlH!JYsA0a_HAC4GTNgLyT@SjvhYWDGnP>JdrxH%8P<)&!UfjQ zw*0$cjwa$PW%s#C<^$}PaFCabRw_;E5dI9OhvaOX+h!$_PoLsVj+Y5}FYLpj7hy2hYHA|muSZgPiM_bGRWj>63;$HE(awlv zsmQg?*32VCjr55xjp*Vgr>&Km+U@(6T4uhRQYc$aJS;z51S~;B#IL;m8(VLOWZIfn z--4-8o^;)lwLU1O`I<}E>p{m*^abPJHK4w3mVIdU3$`_sy;ci!BM4bJc@^&4@q$&r zH}X7d98z6j>m4cstJ5uXmg4e;2-1#8{eldj7`=GLN*v2>-+FRIf))2j%Ou^b7dM!L zE(wjIKzpGna2j1;l3AkFn1HV?Z*o!*LZqkR2a9^YHY1=`Bn_uib_|6P1!8^=u z0le!!GOu+!hx$pEqPIWye`anO^=#5Hb7#|dn=KjHZ8XCnJ7chQJ6S&m|6q{0YNZJl z@1uJqUf~nnAEH-T+s0zR&%v=8Bn3=hA``$itg822n=QmssB017-GwQ(2lxtro3-!Q z4&8pU&Aa1Uvx($Hs?3mM#A0!m<}EBN8qU7!B4{n7b6yyloHL^JKQ}6E>@@c#N52L5 zoDBf=uH>-tJ(R;~&IVPBIX}W^&ZSKa``xSKS82H$dV0KkL@f2sAVw6T1vcNMSx0m(pk0v{fajk!xjI93l(WxFM;}AcJYKDr2DA2~a1ZsY3<-mw3(F z#?OPcYyzey`c=MPt^ytDB%r_#zUC)z-mVB!qRkE7lO6e0sM)1iz}OgS1bxsFJwHs0 z69D60@fduZjxmDDt%XB<*E=8a!e%W!2MVoM=2F8ypQ#uSj%DqGRLkKx7H@d(X-o4P z9sfehL>Gfp1&fE#j==GK}$CIEXvw*edUW$xl>k%#kEJTh|S>jk?mIpY}*e`$Bkt=q}_ z*rw>$Z4;C}bvoJg0UV^SaR6UEvL2|!l3|6hCpqyvyr!tXambmKgZGNi}iQlv}gnH19 z?H{jMT-4{ISmm|w4>RCaxByl%%V@F@ZOu48F;ykp>i2{+zVcNNJ%}bP>_wC@53j_W z*KDn&5N5u=V!1wL6-a8)qbOKR1nkOL`t`}#m9Mladbl}*5tqy2Ul#df`9aRzo^_tW znvi6sur}j8M+aCgZ?6|uFz*LvCH4t>F}J;3Pe@h<*{D!-Re8Zgh*;KloI*8g^Bt?| zB<9dj)i@$=S_aK~@!2dsT$XD!1!X6r2UA;rvTDw|(MND5FlgbDEXqrqq1mGYPI<8R zDGReDTnRAP={;xTVub=RDe&)lqJ_%(3pdBC|Qjwz^@nES@T&tj#s;C1Jo6?>=PvB6Ts-$rB zis!EHw_|)D7Am}v+`_@culRq?ShHUh>ImN^$pVyoAtwEN4JQ(;$j18woJrgjxVz(! zyT!d)PUM0i3?#}WB~8ueg*xzNE)T&70*PioJ>S!w?U|BKvh~TA6%pZA#HIX{PZC4h z>3{}R%v6L?(eiNs7}~af90asJ4B(l&)AhDXA@J>o+e@Cf^VRKSKWfz}cbW8+NnF;V z=Q2z+$JAtNIfmY6j0pc@4SJ!v{oNMt>CB>QhFV^z#Q<666$8aJH+CmOsM?bTu%b`P za@mQ-?>@E9_;?SN*^4ppO)IN~J(0YL71#tX^Bf-+_i=ZF+H$#D@og0}x@@145!&+t z(oc=u$H#0$xL8!4;0D^3>wT%6pO->|%JL1g?c;yv8`3`rIPr5v!q2(>eTDL$KB)2k z5H5UwKk_BYYfg|t>cC54w$L~@tDpwfnGxCl`(8yF+%KwzuA$M0CwS_z3S?R2fE=`% z4`UAc2);Sc*E_3ND}Rw<=0qsyy#^+42UffD=*ONi+O5(GXGubh0G> z1)~nMW3;(P0n64!HLC6IoS~_l&GNHA zjR718z}j=dvHNzkUuXgDAD z)l=e(%s&Vh!Dl%g2$$pH>TR;W5}Oj!&)93_-j{TCp*j|bZ_7dEB@q#WTvL4@Tv#Y0 z-~#Uy9&2IpkHWRad+n5nNR+j48h}QwZS;fpIP2|V^6m^2yf=pp10Bg751iR9ZwEoF5i477w6i151M1{)zMR6KavI73_tet zyJ%o5DPUpizVVdZU@TO&m(4sES_;|kfe9BDdW#Pyhu&^q;ay_BUSk1WWD})BWBF1mG)))vnFj+bQGoUt~TP#joIDUovWva ztYKF?rO&Z(>m`LwtqHC5Fp>y2sKi|sHJHydNlO4_u5S4h^DDA%g~mQi=!YUiSUo&+(|9M zIkuC$@B=*PN}zxi38Pz&} zSXU^rQ=Valg0pHt+3gzKwN08qy-EgI*Yb(r^V|%j4>C?B zQFsNB2>?G1W{k2s*o>>;$sBo1WEEAR`MHFA?yDNHLXpMHz@9Q@d=axP2dx`!Ud*g# z&vQ7xMt&)fCHZ}k)d)~?GAAB@#s6TtdEI@tR%Vnf+<4nwE~I0G!@wCO45lAI$WbS;>s(l1DVMr7ak)chqfsQ`t*o%XjbF59!_bF@X zY6UZf7o?8q8Vb~>CriMlh0ndFgk!GGjRj2Dda@iR*$9X~MH0aft)uaFI1ynvkl3JD zYu?_XH2LjBuPs?R;;HG|=3#50tc?u>qB}~_2*0ZA2c~{#u#w|lGCDsY_+w`{dV7*0 zy?dCG*6vx`<-?niu_}1{MQ3Q>d>hgzy&Cz`jsgC+p?abdN>-%eAX+u{@A8I$tC z*-ngHw5n|mdMPP@H@IBhT#<+XPw2hq5crGkYC%Iv5MeF-RP}ZoV=^s4an2a$`mtFf!I>3U4(bk&{d8g-dvwuOuYAchJp>j!t^-%fI}3nq$s(q=Z21%13nf?hO0NRgUKs(r~1T^91E63xo zamZas@)t~s&kT7CIZXnyC0-TTECMqM)xf;K6L5~|pHH5*oA8jnjE1Caz{>YdgM_aEg*d~t}f14k&XG^*tW!_h`We^rT zY6^QRjl(O_=2DHBy&EZJ5lnFmPF)crj~EB$?GrqJLW#P zQo}cUD%%JaNnhL1b$i9u(LVi_L5JCJf@>n(%*$Hr+fRr*94>cZ zob;OinHEXoxavGyo}-JsrjO{wNntB~j7n6_rCbns2sTW7V%_nX2z*)ZFwlqb4?s?I zfUS!|`n{-9DQK?ZKNZB?4;N3?uEmq5f(m^E+}Mp^wW%GeE1?x#lLuX{`&ccle@+bv z5vK)*uvUsU&CHGpuqGeJ4M#y?b4e2m@Rb1k_hK>F+qSsPP?K-8pi%556+9_FmACoT zR&*k`-!{=V*x`goEi={CVry;yV}ui}0q{$Yh={P?<~V6Q2>+^P<6LndP`~6cG-j74 zt8ap*^DW!KIPTtOZe4c$#y=J`K#`}xS(t+HU;IN&AomRYa2>=a^Z*Gd|B5qn?mf>v_x`t>`~N&oNcP%m?^V9<{rZa3)z;+Qe|$d# z0^z-JT}>YX*_91Gp+D>eE!UoPuY-%ZKtoe+H9IfchfWW?ojlwj5dZYVHYjKOo}pHYUf0J954$fs4@tFH!ynvf4q0q?RG)O?=B>=H+Xt>( zdH?3s=L|i)(+O3wXw2>A^O~p09SV;p;i^OXb4Bi==X$KJfBxP5fp=J*%L%06Kw*^X zJy}y7x4q;ptPQ+butdy%V)#0>Z;vW3Zjb6O-~-3)3HDRrAk2bWjp zcP(R6a&H`b`nlo#iEoOn&(+@--0Wzdm={?5c#msNYrm})L?Pk5IQh;4`Zdw;UmxzX zl1W`(cD)Hvbo}_dS-p0o%IC?3rG|qdecz>{`{mC%>aAqlCg@L|4s$Pzi)g2&-b4X-{{t=>PElVwPHh+kKi8XpA#C?$Gs0#cYCHA@3t`%bhF`?*3Skb zGG~4+t~2;CdQYD=U;6pYjHYXRclMnoJABmjxLTR+o9t>SC6E*rJ6ucmtz)SLWVq@~ zz)q*Qn;b~dX2UK{KMHbqpR=m+WrTTQ^}V5awx^i-^{+IS`% z!OQK`ZCL)zG64cP3Av&6tD%27g%p%-=@THsa=4{>u#I0R>Nnlr1kUOfbW8P5xuT9W z>?u7~yxW>bd*;Py-Kc_R=^}fAv_r2N_O|ZI<=Kfh6~`a=BAU<^dqQ7V_2+wg4(xtp z6Z)X%=d12y20y;9@BW#T9;?Zkt&*)BYAWG2o{t=WU(e_b#``S`I>%_72J=WHB$5CS zhebnoL7pW*_Cr+lcb$bmZtMdf{rQ*wY2(E+Lu6`+Rk?%Rmfn$B-gk~aWP8i~T5zY( z0pYV?=t7E1(cR;azMfUZzA$$%i!9ZMJTv`dJ=vizJ%v&~9lJWKfVtv3ayPtyKpt?s zG?n6z8Tretr1n7_gm9HTw&=+4;>NeZst?fuol29mzHO{WNL8yXtpdiJ*9;qGf965F zp+3Ai9f%g3yBk%CT9x#KbBYV?!siZq77WjANIMa8|~ zqKB3_H)XGYt0318+x4p*Lh;BxpT=|8`(H?ymk%S8#C0Dv@4B2K_m@;ne z%Pm~6OSVfvK_qB}R%!9=nC;y&mPb?{Iq%Gl?|0qeHAu9-7{aLQanG4Hv^$fm-d<+e zGEHzNsl=P-4V*>uKp^MZ`TlvV^xtJqUWrf12+`UOqGz24tlxpgT?ELjRO9{DX z{e5h8OY$@Bd91?Zo#=>>Szfo&$zd=thWXZL-lDdmCWnw@z4)HLScUav)6VbHmG51$ z%*=hoGV*T9iZ7UlGp}8bgI{QA7JkYFMw{+ixbyw>Ca8SHKL-8#B~x1PcX|4envy{o#EC)4uz z2#2I3(v8)?z(CR3(Kn0oiZ}lagXrk!w3qQDkTf(4Ki%eZ%w!o6-Ks53c>2eOCk1zO zT5)L#Kx13_`D4ZQbnF9Px35C8v5Yz<-6 z{M#unv@#UsTr_1f%Kl`^zvt(F1!1|-l&3;&+(;xc53Wuq_Ed2R-9H&^pzjq2 z!vjDlAB>#j{wHhs|AuG=isUb{N}%Jk|3p*wZM+hYq`jw3ty?X7kbSBOo^f<3H4vV5 z(Jsmd7FM=D8&Gz&TcZ3=sBp+-cSg6x+5>~UohDz}e|}1%%8RpwzQm0PJNA%?uY_f( z%Pz-eE1a~%9~;b(5Z$-s?KMTE)~y_hOKYQsCwCs?$XWR@JNH8y4w9UbHC=aBGb_jD zoh=V>$UN2huZY^aTd}P>QNngyv&GsmrlvEvu76!NxY(pz8XZ<9U$(gSi8F^%Jk5Rf z+<$Tp=Mf)*rHRl1xnqqQd3WI&g}ooTe=Uxu8)} zSLdfT8LZfR^qN6=oMf=7#jXOKcRu>PISW-SiP^_M6 z^RklDoly0$vKwVxRMg-=sCvE>qERg#y1B8jz58hdd$l9;f?i&HhVQ6T%{mT&S<7;H ze1%dy=xlrCl^I*>Rx@jT4p$z7TK!-+bB_@%)4`yvyL9cZyb+_(W^OoAO^g|>CZ1-W zaJ&V9`$b1!M(#!XrWX}csPxhfwHR$*7H!VKdi%XV@PJS|Z7wT|Gmx#X3LZ76Uykzd z@Td(&Q}h#~XU5zdc&Z-*VIb+ux^nU2^r+{HW-E-*_~6zK=Y7nL4=tB-KOe^g`q(i7 zTICdn?UF6e1iQXB&BB>tS_aP9s)+lYrUd(nC}ls@u<%ty(eGI+X%A9k>t~YQvoEk{ z&^eT{9U7{=nLAiW^C;+1E~2i&*O~=Y0sQ1mxk|?oaB!F)_>hdF4(V^58&xr ze%8_f{SUM^hFbXM)Dk6rGPjN3uLZrM8U1ah1(q(Cj=MSUgA}|tw;Y;8x>iRx$}wTO zm%08IZJ5S!F9{PX3twnLz7WA0vL{r!4wo5}MB4SsLI+hql`A`%vb|a7M_Lk~43?5* zLU*Yq2hpEvvMLuv&gv+XVSqXDEzx zT=`f=MJ3BEXnzYZKq!hP3PWY1RNt!j!mTw zz@{#Co2wt((fF%X0}#mF(~ijN zot+?ifnECt0wEBaL#&O+w$ySs^MiDq57WKLS`7;6|I%@F-gQRY|9`<4?w1dApXqk# zS>l3Z5AMr$tNw#&AgY~*RLAaj)?r9XVvu(~{*djqv2i+%VMl~RAl`~x)x3)#yC4Ti zz}B6&FKr#h`*cFMPU|6vjsNa`{(2UjTvcd*ILgmoj$&?0icSrim<-)?+YiaU zRZW%4=8)1%31?y)gB@nmnzuS&?9SHJg<=V36a&W7iAq~-__VXI+ZM^3v!WAAsK})$ znas=?kHWxX3#*5_3o@K1uK7#^%=z4wF&elbyZp+kC^z1I;zqM~d@UtZWMkn9QG%jK z{Lz`jq(|Qz^K81?u{@pVu$S$1#ON+_8MTpOO05%ffJ$2ku7(*@8N8vkCwlEn5e2Lx z<0lXomIA!hbEueM{h+)FtKeUZnUpT#KK3*@3_D}NozAvk&JNUdE?yWy?iop}oF2JSRLzpXRGtwPO_H{* zY26vB*}>GPSlwshG6Jr8EoCXK|6amY)^{u&Zro9vlSL&SfpbGf+gwxyYXto=8KauZ zv2m#2#i8RL1(SoTHXCGhKK9jrO{-~%xIF#B=hwv|l;vT5{=uJym)IjVozVpdQyrxG zQIyuCNRz+Ud8NtRU-F{ zT#iw(XbBE*t-{I=u$dP+PZ)H0gc_NnAT}GLwcPY>*{y1_p|DXg27@G+8Gqa)k~!^%$%`AmXevs zp_zUY0cPmqf~DFEug@tu&1MYUG6LjMDoie#f0g2=FJq*)*^5)zSuCN#zg4@;=Izh! zl#6xIgt~c-S85QY47J6uO%*|Ti$~Ap1HQYwv{`9UkglCd`=wK^+db!DcP4F-SmlzR z{_v)J(B`6fVT@sarCrbHLlK=;?!Q7{H5z$(zEB9nFhcnMtE>B`?`_)HlL} zfG}Tj^HJ~Uk^w$sjE0-pqpFXOCooz;w`!>g%yUOrd-spfsB=|k8^f{K=8tKiDY6ds zUbDSjqN2xRG>-BUU6yV8(ytJEQ)I&}gTSzq(HhU0L=#^I;=Lhf2YQu5wRJz(v`}0g zktcp5OGWM7u-gx7ZXja_K~&oyZj=0 zmTXG`3#@RP^DCD9qCvq+Z@Y+_btLni$t{$mXfE5cBQvmB!R68{VeiiRgM$*l9DCH0KQl{6Z%P>8rYnat6lUKej;P!5XAc&SHj&wh2u4> zyTy9t4pfcPH?~idgkOB!5(1g`-F4Qo(BNvp%05V&Sm;I9(l0s?Zpf2c5IePn7!Asa zFNYwX#3mm&R@yLF$GQk}N61EkJ;j|(&!izzcF_rZ1H!0cWo?P)YG z9dJw_U9%Vp3aSDo`HlCg-R7lFDhEyPpFD?VshS7fG(ta3&9EU@`eBzaY?eO(Jt6mb zdTSDeYWk+-QPiuf*!tcf3%5yYL!4ias$>o0DP)BEWmLdyZwfJ1Y3Ue0KZuFyj6dv= zT73i!K6zC74rtOrFui+Ilpi>o+$t^i zK1BHsrcD?c(nf$6SJeqaHR0K&D&ay)_4)neI8)5t0PG|BH&n@4j%ze%uiz}+vNRB| zMqQ>*u(Qc;PhD+DC9`$mX&B8pq=!h%fbhVj22`aUh`175jEghf~tv0q{5VRS_wf_8m9*gR`$94 zx>T5-**!tW*WuT;O5`y{#!SuG7Y+eCd7dw1Kj5?fr?Eeq zp#>n}V&>kQ06B?+&rcePRKYBOOtcvS@}hL!>p+feI53c}on$1Co0pLuYHGo(^{hHR z+fc~<^9R{1k{}U-^3&L?x|MHF>$KZaTg?nyD0C&4*2TJ%HN06gK1YtWX56E2o@IO$ zLqwJb&q#!^&}2%XLo>V${bfF5%;LHZda2Q+6B*MrCp#`!Qv{qc`P$v*!%~o-p=^-BtH$ciYk$h20HLWEhW~|mqFNcf3n47 zYH(kP3GkaGMO7FAD1Ows0%~xxW*$s-dFM9V9rKExpMQNPD#)qz%#P!}>S%k(D8Q@1 zrpS%Wp(g>GC{DAu1tK_1u8r`E$8i71*-s5 zdhjBwy%Vu|f1Ew#>)E&HmNzH0{Im)|>)2-Fq&E%DPp%5jZ{Miuiz-|;J0T`gqjhk@ zZ*;~XSsSaZ?40(Jp83J^Q%Tjm?2Nf!lg0@8U@YRa^J>!yk*hMIK>hF`l{tJ>{l(NT zvYQqHUwuhFgxRrc@Mdfs!*pk79(xbtL-h(MtqPixpETbYbyQgECX_iOn728ENGjQp zXjKMyX24W?E_Lmp#>h)3tN3~b#2jq?I{sJy_Vxr^%$}uu)iQsrip58fJK&T3Q zB=asm7>U`@y5n=B{YF-U+@>OfcfgPARJ)-It#I$njTkh}q%Louwab{x@{m*Oqj z(X~5UFPZC(OQA=fX22B(jOD`5ALFAiMULHFfs5+6wYrijW9q;l-rKj~}D)oXsG7@rW?VY?Lc&{JO=xd1y7QmH=P)_;_k_ z%p)$%qorY*odNS~=Qq}TUDvQ_c@=V`^08AzI9Rg+)H*Yebn@kc;dmVPff8*M(T%{$AqG( z(Su)eqouq1uFR#^_DxAx({64)hA~cttUQL@S7$Z8&T;0=lEP$UyPfh5vChK>ExXKR zoZn!VZRJczF2%e=xOq3&u&QY_vx6&b&k($meJfXjSkM zdC79wyXJowq3t#mvzwQYu<`9#a!_mMWO6tW%u27mEBS77y=@L^6&SMDD~`CbDxZVb zD*Vp3mESb>qe>ce{YUzvyDYywjDACrtEWZF(pF4wH~H1g+D4yIJ}NLS#D8I9Mes}h zXD%CE0ZVT^ycXA`d!)gY<)F!(Tw!!}hKP#Aj8YD2U^Xju8HfOyPJpJ`c%}Ef^=asB z(;UR>B&bt1deZvGT=bwS`m`Q2TiT;9`54(*NkUpz3( z&HDM==%cY4CrC$CyaLJ*+pW<3Y&+`HSRj|V>zjK}luwkpNtPH07&giU&;H)O^jR(& zqN?VN+IBS>a=GdR1(Q%!D;bk}I?q}WtoWjRHly=<+K~9)4$B-j@#Th`KkkqjU|;*; zs6~5n%f@T-Bjn_n!7P?{tvxo?pE_(Zz1AaBK2#$c=&SnZ!k30biE=44Pj`hcWz@9d zp1K`5`O8z;zK_5NI2C;H-mbIf&n#BWW!lxL?vrj>dG9)0WK=PeWRaxL2EESKgb12D zNC#g8vDtpAZ}83-CB(QtOu*`8sa3P$8SV6Az{nN<<%gMHOG@a4KJR-4g?8)O-1eu( z`Bj)gAR-7(Ex;c!pX)9Ix#}0($Lmd-1AXrJe+e^Npo7dW&baK3V0jDOdEwJ*@u1nK z!eF4`#Sr7c?}OZFxF~|$7&xZjekVO>siDhnn$vx{BPLp+ys2^{P(KmeTVJZl zuU$(tx-d5-XvSg%DKIR8zs^5Si#sA!&S~Qg;g@a9HAZPXc#|#_=$(t)zpA( z>(U$InGX8l+4QykG~DZXvWMm4h?qIJZX9J3>Nn006)?*_K=B{BORW68CbNZ7tIx`i zGOu3R>0cNwo_6yHvRM1hNca-7Llz#*K5LVxfT>6^dlPFUb+4QOF7Ii|+#8*&OgQap zJU{Sx@-}6HwR6xr7Fd*%ZRdYHnJ7NpsbHSqM zwOkLv+7=TQ9Wjq;B2g8LY_nUgpN3ww4d6-eX?56=s*MOIltj7-@wx~*Iq1(abgs-K zxB`cHHO3=2FTqC!9Wv3DWZ^E@lPnWgT045Kdx=NG_Bz+4T*n zWT<<|Ij+OU0Dufu2I;c|>4*te4aq2At&qwbq8UC}@5OXqfuY3FVX^TK&&)!r+n)IW z!#rDi^-Lb#>BB>mxUS6&rd zxPwP!6qO+$wqpjkmJ?7^V4Nf>3!|>qM2+!?sB2l}ZBv;m;GVCc2KxFX8L9k!$D-Up z$Nody=Ptf9Drns_G5H~ffF~1CnA~kec5|D(Bl zilHrs`M0bBJen?z9`b1j=2ItEn_&*~?@%=~sfJHD*B{N6t$n#OP7Pz&+G{=5n&V0+ z(oWH>3y-za*MTH9^*!+O+FI%_*saMOMsg}jq)?BiKVB$iG+dj6(00G%oCh~i=$X^4 z)=r~#0Vi9Aby=|}|KeA#v*!8O#sLLPt#$1ZlGvP3TA^wEMfSR$?d2qQLP0YNOP)yn zV-bV1P2S%=jqXgcS*DHNPMTDsCx>Ov2K9xb6pCk-*Xtr8idjB-<6xm}D%QXoudcfW z$~JZ*_CWuOgKM?coOMY1NYU%!JHZkIgNi=ik}DIgyiv>lHeAujee}BWv=w zJr-EqnVLjuu?8gU1@BQ`{jmO9M@#yAN4Jok9|p=@S}4`aJ9{a`5p)9XvgA?LN-;lw z#Y(ufmK7==Ia$|QL3TKiR1)&L(6jD|P+g}C5&!5V9Z1+uT31*G&%?7Ubmk+$hxmCl z7sJ1aU>7QskP0xO*!tNyB2|{pg+=>(jgK_HnoEXyGlqol9iUO73B2w{g_G{8G_QaY2(*ID4gW~FnKcl1<7EZrjWm&aB_M-T!D{|F3fD}xOp?hTWGUqP{rkfS8t-ZBDdUD=FXWh-cbhVms}G)R26TO z8b^b0=sYdImrmel%2-{qQ6DKyezX6wB++t#5Wt;lqcy$)BKoDrY7hE|%1P-u4q{+~eK4x?JYA;PhsXHG7kHJx*rn zfUXq=HIn9sB}@VGNHvADhbWu~{+OdVN8P(n{%%U>0e2+}SLm+Fr$Xzwfa8teY&HLL z7H6MdAZMR>)_CcpXIT1EiJnW5RnvZv?;YIV{@D1LJlS$L#C9{`;(|h(Lo0Po!CuEq z7ZEgZN(?nM|A>CB(zl&1^o+*=c4$tTBq5!?QarM=NLHHN`?C?V)m`<)P~6Ay(0VRU z?iVVdgsAa}y*BIich=Vz{n!^}IScwYnST($9i~ei9O7{QVk@!pl83VXM5vl8od?-n z#P&F_bp0Xs3j&TzHSuOX3fYCYhlJdrkG#Jc^wJZHtHS4h-jQf*0T%Nw54rV8bfXq7 zejwOy>JM``0mNJwB7X>Dr?j0VG>(lBfQ*!Y0xp^t+x^|M3nQGg3vyLJ2Pe&%`qo9B z0Op)o{+{Nh{2TFSeu3s>$VVrLF#5wmfm%azb7ID?iBvopk9og_VvDo0X1rr7-m=;P zdFR`*CQhRr2+$5z9NRIkb8Q-p`j+$Fs-C`*zx9!xg+b}4<8fqlHO2#U*D7A2<mj}2KKc2Mn8Ry1*l!|1CxztHOX8baJ;ig=(4KTZUE6M zGq$sk1Q}6ct%l*qZl+6SBqnW)mhk7uf0S8ePWLB-1zt zE@@V&GM;o~7f(?d#)DG+!>uIANRscElySLLMvax%!jC5^22NCRYUSL~l%swmACnh! zag^qXjK9XLWQ9N-1-h)c=^szWwS#0#mELv}6>o6>#XJACEB^Go>5Trv)OC?FTB(P} z+|h1NVF;BZNwc3gzm-?safe}8vK*(wu2iS3+_XY8Ny_5;Fyb=5LPFiA3Fm!M?0S;a z+dGt=(^d~tdG==&F4Q@bsFHzOHAYs&Pcuv)#}4f7mmWU8D;c~Nr@VgqMI-0Gtar_m zazm;`3>YvoU^Yen{W3`I+zgxw%$Hlj8eEb#C-m@?SeLk-%Go-I=3A|)#Koh2=_b?t_%@Tx+D3^0lt_J*o zeH}u&%cd6w9V-aw7U?d7LP*-*OCrnvGv4dy*-*UB&O#{WzEWZ(nH!=j37lcb&%+0^ zlO;_vuoR_B(Gf4l{2YC|ejC2wC%XP!m%bk2ft-vXsFxf-{k?LG$=F0%zuNzZ^DIYy z%3tC=OIJU7tiyW9x%{qz4lC|# z?SZIn6@$ZG=Cr8au z=hcUCE};HAq)G0X0O?wBD_uM{oUTWZCu3;1$uZ@Yuk13YsQTUkJpHkFQHT|qOFNMA-sJem`?tffv>1RXvbaOcrAJ-_~!%cg^-ig1;?HHw)7QY-C zvY3yFjfhCZsTh0{?vGyzJP&%TSxf!-JdJN&+?x47O|7ZX)d&oLK+^V^iF~vUe5jto zbxAz~+vTUK!+rpw{L0k#QDBVBjpwH;m7j5@-If|g2#tL=-r(gD4h!*D1`;U|n$>_q zvDR0|CRw#BiWnxvBYudO&=G?&8v|sIFhy6deUaTNuiA?J<$#D}Q{Rg{&@+Wq;wD<7 z=*=%eAwNlEA>VL%P)HMpi!&|t{WFYk(l_)S3^+VcbBHyU;O|2$>JG<^o9NWbTLm~7 zeevP^f1#N6aCpnT3|Swd%9$yr#}yNjh>oPC(jvQ$@2uMZeZxO0|8p3t@6-R~*BXSA zmF}-l{x2Kw|Fkn4f1k^bkw8Cs?msU?U3`XWh1izg34hu=Hhr(=3xO5f1~x0E(PQW-J~6^3Cj=;Ay}?X--u7`+{Ap@ zOSa~Z7Le)NBsyf7)<3wrKBBEexz9xF0ypL$O(u&&Y*uF(eF9tah^5V*rmXZUEMVzD z7$kF*2WH0heEw^74a+8~D2uR!Vln((PRcZf8$YHRs6pdc$yxH`<;g0K^=&v3dI=$Y zF`^a^yRAoEA7$dQU>>|*)wlYc--blZe<5pzU_gnXg|?#z>hAET+0K6-X5(HP16ca< z_`T@a)yWdG!T$(m;Eaj_c^Mc%*l8$&@nC&g^s%E0v-PkMqMXEL&{pxPR^HIky<~?1 z_(7#m?LbW(HMMcT*kQl-=6v*1&B{beKY(xEukllb(KX;ZRRsCR%Xds&AzFG4UTebr z)~IbU;3BzV*8nb5=++^r0GgRCJo|aG#TQ()Te#`3Z?HkCRDw`evcWe`h+~8#@vI3L zOG*8KU4Xsc9zy{*?aYh;HiKeS6ah9p@Fn7ZyAQHaM*#Q{>|lUR0U4`wFv6E`nDnL4 zT6EuAU<$N7yC8Nx zYjLIvz;VZI$znQZ5>ZLRT)qiqvY!9!BR}&sP2~=H zt#Pj~LcmhP+^D(3NI4gBA?yghUa!Go+bQp|E%TF;i-X*hm63R|%bNm)V>w>Ugk1qI zsMfXi0af-eNBO?sEPP1qzh2|ZmgXC2dw*|6al z9gDuB-E@ykY8?xYX)Zx|Y8+NghMVHfwD{eXq<5)cZO4{KG^exyP)ec=EILZ3Sn`tqbcS5f=HZ8;imNjH!6E&uY>t2!EcOs?9AbF9z{V zaN)BayIzJ~it3TUH1(r+IHC8o6iu~s|EWl!Aq(ULH$SRb^HhzJ8xs|{r8E8RG2hc4 z$e3T_@R+xBJjM%;Nu+vwtBA&5v9_(R&~qAf#;N%?tq* z5%sg3;Ua;KIn>jlDmz4+yo1U!&pC?FDx)}TsFsCCK&>qlj}7*wG~SE!5Po^)hrK;mV zo{_BzKXN5c$fL>AGA6`N6&$+rGhYskI){10`f@t)ir4IYnxz$)YnBtH$ts_nx0Ix!*+YkxSkO;Mkr8j*zj;-cu-`Sl#-#&8Q&pd(bNxS2A=gH? z_S^-b=#>+C+_`Sr{?krP9ruKA4y&;6eNW_#WYjZ!=igXyLG*`R`Kng$sy)pj?EtH(5*i9>;;oWiwt9PB1rhXmxv?0E@t3-V5%Ud?840{*-Ur7Fvh zA}|wqZ|NXlfcwLD=6#O?7U&&Q>^OjIIth69tD2|{O`$#I=;anA<5KfPW1CY6#w}%8H4WX}K)jyzz+(2J@R};m2XjO__O{JLHHx{5#8QtFskp z?uw^kRp|5EA7n!GOi2+DwtUJG_q5g0D^_iTu$F$ota6N=DHAHP@hzq=3wM`osUosE z%Z>o`(E`Q*v$)BCd%y

=c^@Ww9t_P|qi%9Mb#9;fUhnh=_fM&Rn{-^6B+0i6g#Z zw_iTpAAT0BNC+H`AZXNJv6c`1_IJ~PR_t#(HQBncfndDYqpDDOTO7+ip# z?E9(?#5v5>+S{OrbU0(>O2y7nSnZFXn(M>{v|?q6Z616|@l%|bR#e+^WAUOqM8nmT zYr`QNh&vih#}23+k*EmarSV^CG1HL+!_MFNFiV(Tb9IU3Tw@+gvqc?`pC10$=Fr}u zgUSNZT0LR%-J8rQ#Pm~H=Q!qy0kJf??kS>hI2Xjkn^{T|tFh+FM~R$odl<*+EUTXa z($^nk*T*(f8@Qp$Z;#elJr@Q6Eg_uE+iADzxy&H^RM*G7inZX^8DhW)U^P%MfrD?| z@dXLHui;e@5!d*x{Cop?D_Odfx!l87@YVg6n6+2YM3S_ndD;qwl}ueepD`}vojZE{ znm$=4Ab1OWsMZOH3xM)~Fc#1TsttewEzb?@~J R9|-unp{}h~cGc#${{#58Lumj2 From 676efe73e5b5403b8e71dd3d6512cb29cdfeb40e Mon Sep 17 00:00:00 2001 From: Leshana Date: Mon, 5 Feb 2018 13:56:50 -0500 Subject: [PATCH 25/30] Move Xenoarcheology globals and initialization into a subsystem * Move the global spawning_turfs lists from master_controller into SSxenoarch. Rename all references. * Move the call to SetupXenoarch from master_controller.setup() to SSxenoarch.Initialize() Put SSxenoarch init order near the end to match current behavior. --- code/__defines/subsystems.dm | 1 + code/controllers/master_controller.dm | 2 +- .../subsystems/xenoarch.dm} | 31 ++++++++++++++++--- code/modules/xenoarcheaology/sampling.dm | 6 ++-- code/modules/xenoarcheaology/tools/tools.dm | 10 +++--- polaris.dme | 2 +- 6 files changed, 37 insertions(+), 15 deletions(-) rename code/{modules/xenoarcheaology/master_controller.dm => controllers/subsystems/xenoarch.dm} (79%) diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm index f300ba14fd..faddb9d917 100644 --- a/code/__defines/subsystems.dm +++ b/code/__defines/subsystems.dm @@ -29,3 +29,4 @@ var/global/list/runlevel_flags = list(RUNLEVEL_LOBBY, RUNLEVEL_SETUP, RUNLEVEL_G #define INIT_ORDER_SHUTTLES 3 #define INIT_ORDER_LIGHTING 0 #define INIT_ORDER_AIR -1 +#define INIT_ORDER_XENOARCH -20 diff --git a/code/controllers/master_controller.dm b/code/controllers/master_controller.dm index 2a0ae27d6d..98ca642c82 100644 --- a/code/controllers/master_controller.dm +++ b/code/controllers/master_controller.dm @@ -37,7 +37,7 @@ datum/controller/game_controller/proc/setup() setup_objects() // setupgenetics() Moved to SSatoms - SetupXenoarch() + // SetupXenoarch() - Moved to SSxenoarch transfer_controller = new admin_notice("Initializations complete.", R_DEBUG) diff --git a/code/modules/xenoarcheaology/master_controller.dm b/code/controllers/subsystems/xenoarch.dm similarity index 79% rename from code/modules/xenoarcheaology/master_controller.dm rename to code/controllers/subsystems/xenoarch.dm index a6689e36b6..eb6c97ea75 100644 --- a/code/modules/xenoarcheaology/master_controller.dm +++ b/code/controllers/subsystems/xenoarch.dm @@ -1,14 +1,35 @@ -/datum/controller/game_controller - var/list/artifact_spawning_turfs = list() - var/list/digsite_spawning_turfs = list() - #define XENOARCH_SPAWN_CHANCE 0.5 #define DIGSITESIZE_LOWER 4 #define DIGSITESIZE_UPPER 12 #define ARTIFACTSPAWNNUM_LOWER 6 #define ARTIFACTSPAWNNUM_UPPER 12 -/datum/controller/game_controller/proc/SetupXenoarch() +// +// Xenoarch subsystem handles initialization of Xenoarcheaology artifacts and digsites. +// +SUBSYSTEM_DEF(xenoarch) + name = "Xenoarch" + init_order = INIT_ORDER_XENOARCH + flags = SS_NO_FIRE + var/list/artifact_spawning_turfs = list() + var/list/digsite_spawning_turfs = list() + +/datum/controller/subsystem/xenoarch/Initialize(timeofday) + SetupXenoarch() + ..() + +/datum/controller/subsystem/xenoarch/Recover() + if (istype(SSxenoarch.artifact_spawning_turfs)) + artifact_spawning_turfs = SSxenoarch.artifact_spawning_turfs + if (istype(SSxenoarch.digsite_spawning_turfs)) + digsite_spawning_turfs = SSxenoarch.digsite_spawning_turfs + +/datum/controller/subsystem/xenoarch/stat_entry(msg) + if (!Debug2) + return // Only show up in stat panel if debugging is enabled. + . = ..() + +/datum/controller/subsystem/xenoarch/proc/SetupXenoarch() for(var/turf/simulated/mineral/M in world) if(!M.density) continue diff --git a/code/modules/xenoarcheaology/sampling.dm b/code/modules/xenoarcheaology/sampling.dm index e79957ba28..ae7c203fa3 100644 --- a/code/modules/xenoarcheaology/sampling.dm +++ b/code/modules/xenoarcheaology/sampling.dm @@ -70,15 +70,15 @@ artifact_distance = rand() artifact_id = container.artifact_find.artifact_id else - if(master_controller) //Sanity check due to runtimes ~Z - for(var/turf/simulated/mineral/T in master_controller.artifact_spawning_turfs) + if(SSxenoarch) //Sanity check due to runtimes ~Z + for(var/turf/simulated/mineral/T in SSxenoarch.artifact_spawning_turfs) if(T.artifact_find) var/cur_dist = get_dist(container, T) * 2 if( (artifact_distance < 0 || cur_dist < artifact_distance)) artifact_distance = cur_dist + rand() * 2 - 1 artifact_id = T.artifact_find.artifact_id else - master_controller.artifact_spawning_turfs.Remove(T) + SSxenoarch.artifact_spawning_turfs.Remove(T) /obj/item/device/core_sampler name = "core sampler" diff --git a/code/modules/xenoarcheaology/tools/tools.dm b/code/modules/xenoarcheaology/tools/tools.dm index 1d79a89449..17412b4a8b 100644 --- a/code/modules/xenoarcheaology/tools/tools.dm +++ b/code/modules/xenoarcheaology/tools/tools.dm @@ -57,8 +57,8 @@ var/nearestSimpleTargetDist = -1 var/turf/cur_turf = get_turf(src) - if(master_controller) //Sanity check due to runtimes ~Z - for(var/A in master_controller.artifact_spawning_turfs) + if(SSxenoarch) //Sanity check due to runtimes ~Z + for(var/A in SSxenoarch.artifact_spawning_turfs) var/turf/simulated/mineral/T = A if(T.density && T.artifact_find) if(T.z == cur_turf.z) @@ -67,9 +67,9 @@ nearestTargetDist = cur_dist + rand() * 2 - 1 nearestTargetId = T.artifact_find.artifact_id else - master_controller.artifact_spawning_turfs.Remove(T) + SSxenoarch.artifact_spawning_turfs.Remove(T) - for(var/A in master_controller.digsite_spawning_turfs) + for(var/A in SSxenoarch.digsite_spawning_turfs) var/turf/simulated/mineral/T = A if(T.density && T.finds && T.finds.len) if(T.z == cur_turf.z) @@ -77,7 +77,7 @@ if(nearestSimpleTargetDist < 0 || cur_dist < nearestSimpleTargetDist) nearestSimpleTargetDist = cur_dist + rand() * 2 - 1 else - master_controller.digsite_spawning_turfs.Remove(T) + SSxenoarch.digsite_spawning_turfs.Remove(T) if(nearestTargetDist >= 0) user << "Exotic energy detected on wavelength '[nearestTargetId]' in a radius of [nearestTargetDist]m[nearestSimpleTargetDist > 0 ? "; small anomaly detected in a radius of [nearestSimpleTargetDist]m" : ""]" diff --git a/polaris.dme b/polaris.dme index d5f489f8be..81502edfc1 100644 --- a/polaris.dme +++ b/polaris.dme @@ -180,6 +180,7 @@ #include "code\controllers\subsystems\machines.dm" #include "code\controllers\subsystems\orbits.dm" #include "code\controllers\subsystems\shuttles.dm" +#include "code\controllers\subsystems\xenoarch.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\beam.dm" @@ -2316,7 +2317,6 @@ #include "code\modules\xenoarcheaology\boulder.dm" #include "code\modules\xenoarcheaology\effect.dm" #include "code\modules\xenoarcheaology\manuals.dm" -#include "code\modules\xenoarcheaology\master_controller.dm" #include "code\modules\xenoarcheaology\misc.dm" #include "code\modules\xenoarcheaology\sampling.dm" #include "code\modules\xenoarcheaology\artifacts\artifact.dm" From f352cf2ccc1b8f3c70793b63f0a983672d581db4 Mon Sep 17 00:00:00 2001 From: elgeonmb Date: Mon, 5 Feb 2018 22:42:11 -0800 Subject: [PATCH 26/30] very small grammar fix it's -> it is, it has its -> belonging to it, of it --- code/modules/mob/living/simple_animal/aliens/alien.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/simple_animal/aliens/alien.dm b/code/modules/mob/living/simple_animal/aliens/alien.dm index a468a7c8cd..3836a6abd2 100644 --- a/code/modules/mob/living/simple_animal/aliens/alien.dm +++ b/code/modules/mob/living/simple_animal/aliens/alien.dm @@ -219,7 +219,7 @@ speak_chance = 5 speak = list("Shuhn","Shrunnph?","Shunpf") - emote_see = list("scratches the ground","shakes out it's mane","clinks gently as it moves") + emote_see = list("scratches the ground","shakes out its mane","clinks gently as it moves") /mob/living/simple_animal/yithian name = "yithian" From 66c36b6beb6f3df3f4683f84d6ce83200feb35b7 Mon Sep 17 00:00:00 2001 From: elgeonmb Date: Mon, 5 Feb 2018 23:21:20 -0800 Subject: [PATCH 27/30] moves us out of the kara system, pt 1 --- code/modules/events/rogue_drones.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/events/rogue_drones.dm b/code/modules/events/rogue_drones.dm index b597837d17..768628f8fb 100644 --- a/code/modules/events/rogue_drones.dm +++ b/code/modules/events/rogue_drones.dm @@ -26,13 +26,13 @@ var/rng = rand(1,5) switch(rng) if(1) - msg = "A combat drone wing operating near various asteroids in the Kara subsystem has failed to return from a anti-piracy sweep. If any are sighted, \ + msg = "A combat drone wing operating in close orbit above Sif has failed to return from a anti-piracy sweep. If any are sighted, \ approach with caution." if(2) - msg = "Contact has been lost with a combat drone wing operating out in the asteroid field near Kara. If any are sighted in the area, approach with \ + msg = "Contact has been lost with a combat drone wing in Sif orbit. If any are sighted in the area, approach with \ caution." if(3) - msg = "Unidentified hackers have targeted a combat drone wing deployed in the Kara subsystem. If any are sighted in the area, approach with caution." + msg = "Unidentified hackers have targeted a combat drone wing deployed around Sif. If any are sighted in the area, approach with caution." if(4) msg = "A passing derelict ship's drone defense systems have just activated. If any are sighted in the area, use caution." if(5) From b0fd486e277ee1fabc00811938db1723730e773f Mon Sep 17 00:00:00 2001 From: elgeonmb Date: Mon, 5 Feb 2018 23:22:45 -0800 Subject: [PATCH 28/30] moves us out of kara, pt 2 --- code/game/objects/items/devices/communicator/phone.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/objects/items/devices/communicator/phone.dm b/code/game/objects/items/devices/communicator/phone.dm index d120bac21a..8c93b6187d 100644 --- a/code/game/objects/items/devices/communicator/phone.dm +++ b/code/game/objects/items/devices/communicator/phone.dm @@ -42,7 +42,7 @@ comm.visible_message("\icon[src] Connecting to [src].") to_chat(user, "\icon[src] Attempting to call [comm].") sleep(10) - to_chat(user, "\icon[src] Dialing internally from [station_name()], Kara Subsystem, [system_name()].") + to_chat(user, "\icon[src] Dialing internally from [station_name()], [system_name()].") sleep(20) //If they don't have an exonet something is very wrong and we want a runtime. to_chat(user, "\icon[src] Connection re-routed to [comm] at [comm.exonet.address].") sleep(40) From 12957a655268f934a054adb4cf38b54ac7a9bf43 Mon Sep 17 00:00:00 2001 From: ThoughtSynapsis <1429echoesrefurb@gmail.com> Date: Tue, 6 Feb 2018 02:26:25 -0500 Subject: [PATCH 29/30] POI Bugfixes --- .../surface_submaps/mountains/CaveTrench.dmm | 63 ++-- .../wilderness/Blackshuttledown.dmm | 217 +++++++------ .../surface_submaps/wilderness/DoomP.dmm | 234 +++++++------- .../surface_submaps/wilderness/Lab1.dmm | 59 ++-- .../surface_submaps/wilderness/MCamp1.dmm | 92 +++--- .../surface_submaps/wilderness/Rockybase.dmm | 295 +++++++++--------- 6 files changed, 497 insertions(+), 463 deletions(-) diff --git a/maps/submaps/surface_submaps/mountains/CaveTrench.dmm b/maps/submaps/surface_submaps/mountains/CaveTrench.dmm index a12f799868..9fac74ac0e 100644 --- a/maps/submaps/surface_submaps/mountains/CaveTrench.dmm +++ b/maps/submaps/surface_submaps/mountains/CaveTrench.dmm @@ -3,37 +3,38 @@ "c" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/CaveTrench) "d" = (/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) "e" = (/turf/simulated/floor/outdoors/rocks,/area/submap/CaveTrench) -"f" = (/turf/simulated/floor/water,/area/submap/CaveTrench) -"g" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"h" = (/mob/living/simple_animal/fish/trout{faction = "malf_drone"},/turf/simulated/floor/water,/area/submap/CaveTrench) +"f" = (/turf/simulated/floor/water{outdoors = 0},/area/submap/CaveTrench) +"g" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"h" = (/mob/living/simple_animal/fish/trout{faction = "malf_drone"},/turf/simulated/floor/water{outdoors = 0},/area/submap/CaveTrench) "i" = (/obj/effect/decal/remains/human,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) "j" = (/turf/simulated/wall,/area/submap/CaveTrench) "k" = (/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"l" = (/mob/living/simple_animal/fish/trout,/turf/simulated/floor/water,/area/submap/CaveTrench) +"l" = (/mob/living/simple_animal/fish/trout,/turf/simulated/floor/water{outdoors = 0},/area/submap/CaveTrench) "m" = (/turf/simulated/wall/wood,/area/submap/CaveTrench) -"n" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lantern,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"o" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"p" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"q" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"r" = (/obj/structure/table/steel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"s" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "Rellek's telling me that we're in deep shit if the townies found out I'm cooking up drones out here. Like I give a fuck, We're minning our asses off only to dig into some bug nest to get our legs chewed. Well I'm not looking a gift horse in the mouth. Those drone dudes out in the wild hooked us up with these machines so long as they get some of the metal we dig up. Win win for us, Guess we're retiring early after all."; name = "Note"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"t" = (/obj/structure/table/steel,/obj/item/robot_parts/robot_component/actuator,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"u" = (/obj/effect/decal/cleanable/blood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"v" = (/obj/structure/simple_door/wood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"w" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"x" = (/obj/structure/table/steel,/obj/item/device/robotanalyzer,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"y" = (/obj/structure/table/steel,/obj/item/weapon/storage/toolbox,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"z" = (/obj/structure/table/bench/steel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"A" = (/obj/effect/decal/remains,/obj/item/clothing/under/rank/miner,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"B" = (/turf/simulated/shuttle/plating,/area/submap/CaveTrench) -"C" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/storage/hooded/wintercoat/miner,/obj/item/clothing/suit/storage/hooded/wintercoat/miner,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"D" = (/obj/structure/coatrack,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"E" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"F" = (/obj/item/weapon/storage/box/shotgunammo,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) -"G" = (/obj/structure/table/steel,/obj/item/robot_parts/l_leg,/obj/item/robot_parts/head,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"H" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) -"I" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/shuttle/plating,/area/submap/CaveTrench) -"J" = (/obj/machinery/drone_fabricator,/turf/simulated/shuttle/plating,/area/submap/CaveTrench) +"n" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"o" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lantern,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"p" = (/obj/structure/table/woodentable,/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"q" = (/obj/structure/table/woodentable,/obj/item/weapon/reagent_containers/food/drinks/bottle/whiskey,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"r" = (/obj/item/weapon/stool/padded,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"s" = (/obj/structure/table/steel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"t" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "Rellek's telling me that we're in deep shit if the townies found out I'm cooking up drones out here. Like I give a fuck, We're minning our asses off only to dig into some bug nest to get our legs chewed. Well I'm not looking a gift horse in the mouth. Those drone dudes out in the wild hooked us up with these machines so long as they get some of the metal we dig up. Win win for us, Guess we're retiring early after all."; name = "Note"},/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"u" = (/obj/structure/table/steel,/obj/item/robot_parts/robot_component/actuator,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"v" = (/obj/effect/decal/cleanable/blood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"w" = (/obj/structure/simple_door/wood,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"x" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"y" = (/obj/structure/table/steel,/obj/item/device/robotanalyzer,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"z" = (/obj/structure/table/steel,/obj/item/weapon/storage/toolbox,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"A" = (/obj/structure/table/bench/steel,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"B" = (/obj/effect/decal/remains,/obj/item/clothing/under/rank/miner,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"C" = (/turf/simulated/shuttle/plating,/area/submap/CaveTrench) +"D" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/obj/item/clothing/suit/storage/hooded/wintercoat/miner,/obj/item/clothing/suit/storage/hooded/wintercoat/miner,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"E" = (/obj/structure/coatrack,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"F" = (/obj/structure/closet/secure_closet/miner,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"G" = (/obj/item/weapon/storage/box/shotgunammo,/turf/simulated/floor/holofloor/wood,/area/submap/CaveTrench) +"H" = (/obj/structure/table/steel,/obj/item/robot_parts/l_leg,/obj/item/robot_parts/head,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"I" = (/obj/effect/decal/cleanable/blood/gibs/robot,/turf/simulated/mineral/floor/ignore_mapgen,/area/submap/CaveTrench) +"J" = (/obj/machinery/power/port_gen/pacman,/turf/simulated/shuttle/plating,/area/submap/CaveTrench) +"K" = (/obj/machinery/drone_fabricator,/turf/simulated/shuttle/plating,/area/submap/CaveTrench) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa @@ -51,9 +52,9 @@ abeeeeeeeeffkkfffeeeeeeeeeeeddddddeeeedddddda abbbdddddeeekkeeeddddddddddddddddddddddddddca abbcdddddddjkkjddddddddddddddddddddddddddddca abcccdddddddddddddddmmmmmmmmddddddddddddidbca -abbbcidddddddgdddddnmopkkqkmmdddddddddddbbbca -abbbcccccrstudddddddvkkkqwqmmdddddddddddbbbba -abbbbbbccccxyzdABBddmCDEkqFmmdddddddccccbbbba -abbbbbbbccccGHuIJBBdmmmmmmmmdddddccccccbcbbba +abbbcidddddddndddddompqkkrkmmdddddddddddbbbca +abbbcccccstuvdddddddwkkkrxrmmdddddddddddbbbba +abbbbbbccccyzAdBCCddmDEFkrGmmdddddddccccbbbba +abbbbbbbccccHIvJKCCdmmmmmmmmdddddccccccbcbbba aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm index aa331159b7..37b3484d14 100644 --- a/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm +++ b/maps/submaps/surface_submaps/wilderness/Blackshuttledown.dmm @@ -9,106 +9,143 @@ "ai" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"; tag = "icon-dark6"},/area/submap/Blackshuttledown) "aj" = (/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown) "ak" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"; tag = "icon-dark10"},/area/submap/Blackshuttledown) -"al" = (/obj/machinery/door/airlock/external{density = 1; frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"am" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown) -"an" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"},/turf/template_noop,/area/submap/Blackshuttledown) -"ao" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"ap" = (/obj/structure/dispenser/oxygen,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aq" = (/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"ar" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"as" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"at" = (/obj/machinery/organ_printer/flesh,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"au" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown) -"av" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/p90,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aw" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"ax" = (/obj/machinery/optable,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"ay" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"az" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown) -"aA" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"; tag = "icon-dark6"},/area/submap/Blackshuttledown) -"aB" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aC" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aD" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual."; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aE" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aF" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aG" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aH" = (/obj/structure/table/standard,/obj/item/weapon/tank/anesthetic,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aI" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile,/obj/item/clothing/gloves/sterile,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aJ" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aK" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/masks,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aL" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aM" = (/obj/structure/bed/chair/office/dark{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aN" = (/obj/machinery/door/airlock/security{locked = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aO" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aP" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"; tag = "icon-dark10"},/area/submap/Blackshuttledown) -"aQ" = (/obj/machinery/computer/communications,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aR" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aS" = (/obj/structure/table/steel,/obj/item/weapon/material/knife,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aT" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aU" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aV" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aW" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) -"aX" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"aY" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) -"aZ" = (/obj/structure/table/steel,/obj/item/pizzabox,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"ba" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bb" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) -"bc" = (/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/hyper; dir = 4; name = "Unknown APC"; pixel_x = 24},/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown) -"bd" = (/obj/machinery/computer/area_atmos,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"be" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "We need to take a short stop. The engine's are in need of minor repairs due to turbulence, should be a week's time. We've got reserve food supplies but pleanty of locale fauna to subsist on too if need be. PCRC is keeping most of there assets near New Reykjavik and locale authorities are more mindful then most to travel in this kind of weather. Our outfit should be at the rendezvous point in less then ten days assuming the upper ecehelon hasn't dropped ties with us yet."; name = "Operation Progress/M-53"},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bf" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bg" = (/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bh" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bi" = (/obj/machinery/portable_atmospherics/canister/empty/oxygen,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bj" = (/obj/machinery/atmospherics/pipe/tank/oxygen,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bk" = (/obj/structure/bed/chair/office/dark,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bl" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bm" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bn" = (/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bo" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bp" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/bed,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bq" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"br" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bs" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bt" = (/obj/machinery/light,/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bu" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bv" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) -"bw" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown) -"bx" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown) +"al" = (/obj/structure/shuttle/engine/heater{icon_state = "heater"; dir = 4},/turf/simulated/shuttle/wall/dark{icon_state = "dark0"; name = "Unknown Shuttle"; tag = "icon-dark0"},/area/submap/Blackshuttledown) +"am" = (/obj/structure/shuttle/engine/propulsion{dir = 4; icon_state = "propulsion_l"},/turf/template_noop,/area/submap/Blackshuttledown) +"an" = (/obj/machinery/light{dir = 1},/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ao" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ap" = (/obj/machinery/door/airlock/external{density = 1; frequency = 1331; id_tag = "merc_shuttle_outer"; name = "Ship External Access"; req_access = list(150)},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aq" = (/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"ar" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"as" = (/obj/machinery/organ_printer/flesh,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"at" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown) +"au" = (/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"av" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/wt550,/obj/item/weapon/gun/projectile/automatic/p90,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"aw" = (/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ax" = (/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ay" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"az" = (/obj/machinery/optable,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aA" = (/obj/machinery/bodyscanner{dir = 8},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aB" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown) +"aC" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark6"; name = "Unknown Shuttle"; tag = "icon-dark6"},/area/submap/Blackshuttledown) +"aD" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"aE" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"aF" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aG" = (/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aH" = (/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aI" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aJ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aK" = (/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor/full,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aL" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"aM" = (/obj/effect/floor_decal/borderfloor/corner,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aN" = (/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aO" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 6},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aP" = (/obj/structure/table/standard,/obj/item/weapon/storage/firstaid/surgery,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aQ" = (/obj/structure/table/standard,/obj/item/weapon/tank/anesthetic,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aR" = (/obj/structure/table/standard,/obj/item/clothing/gloves/sterile,/obj/item/clothing/gloves/sterile,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aS" = (/obj/structure/table/standard,/obj/item/weapon/reagent_containers/spray/sterilizine,/obj/item/weapon/reagent_containers/spray/sterilizine,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aT" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/masks,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aU" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aV" = (/obj/structure/bed/chair/office/dark{dir = 1},/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aW" = (/obj/machinery/door/airlock/security{locked = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"aX" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/white,/area/submap/Blackshuttledown) +"aY" = (/turf/simulated/floor/tiled/steel,/turf/simulated/shuttle/wall/dark{icon_state = "dark10"; name = "Unknown Shuttle"; tag = "icon-dark10"},/area/submap/Blackshuttledown) +"aZ" = (/obj/machinery/computer/communications,/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ba" = (/obj/effect/floor_decal/borderfloor/corner{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bb" = (/obj/effect/floor_decal/borderfloor{dir = 9},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bc" = (/obj/structure/closet/secure_closet/freezer/fridge,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bd" = (/obj/structure/table/steel,/obj/item/weapon/material/knife,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"be" = (/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bf" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bg" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bh" = (/obj/structure/table/steel,/obj/random/toolbox,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bi" = (/obj/structure/table/steel,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) +"bk" = (/obj/structure/table/steel,/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bl" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bm" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bn" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bo" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bp" = (/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bq" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 4},/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) +"br" = (/obj/machinery/door/airlock/glass,/obj/effect/floor_decal/borderfloor{dir = 1},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bs" = (/obj/effect/floor_decal/corner/grey,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bt" = (/obj/machinery/door/airlock/glass,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bu" = (/obj/structure/table/steel,/obj/item/pizzabox,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bv" = (/obj/structure/table/steel,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bw" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bx" = (/obj/machinery/door/airlock/glass,/obj/effect/floor_decal/borderfloor,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"by" = (/obj/effect/floor_decal/borderfloor/corner{dir = 8},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bz" = (/obj/structure/grille,/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 8},/obj/structure/window/reinforced{dir = 4},/turf/simulated/floor/plating,/area/submap/Blackshuttledown) +"bA" = (/obj/machinery/power/apc{dir = 8; name = "BSD APC"; pixel_x = -24},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bB" = (/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bC" = (/obj/machinery/computer/area_atmos,/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bD" = (/obj/effect/floor_decal/borderfloor{dir = 4},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Dosen't look friendly in the slightest."; name = "Unknown Individual"; say_got_target = list("Looks like trouble!","Contact!","We've got company!","Perimeter Breached!!"); speak = list("One day the'll fix that damn engine..","Next time, We're hidding on the tropical beach planet.","Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Hate this blocky ass ship.")},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bE" = (/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bF" = (/obj/effect/floor_decal/borderfloor{dir = 4},/obj/effect/floor_decal/borderfloor{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bG" = (/obj/structure/table/steel,/obj/item/weapon/paper{info = "We need to take a short stop. The engine's are in need of minor repairs due to turbulence, should be a week's time. We've got reserve food supplies but pleanty of locale fauna to subsist on too if need be. PCRC is keeping most of there assets near New Reykjavik and locale authorities are more mindful then most to travel in this kind of weather. Our outfit should be at the rendezvous point in less then ten days assuming the upper ecehelon hasn't dropped ties with us yet."; name = "Operation Progress/M-53"},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bH" = (/obj/structure/table/steel,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bI" = (/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bJ" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bK" = (/obj/machinery/portable_atmospherics/canister/empty/oxygen,/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bL" = (/obj/machinery/atmospherics/pipe/tank/oxygen,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/yellow,/area/submap/Blackshuttledown) +"bM" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bN" = (/obj/structure/bed/chair/office/dark,/obj/effect/floor_decal/borderfloor{dir = 6},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bO" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"bP" = (/obj/effect/floor_decal/borderfloor/corner{dir = 4},/obj/effect/floor_decal/borderfloor/corner{dir = 4},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bQ" = (/obj/machinery/light{dir = 4; icon_state = "tube1"; pixel_x = 0},/obj/effect/floor_decal/borderfloor{dir = 5},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bR" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bS" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/hydro,/area/submap/Blackshuttledown) +"bT" = (/turf/simulated/floor/tiled/hydro,/area/submap/Blackshuttledown) +"bU" = (/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"bV" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"bW" = (/obj/effect/floor_decal/borderfloor{dir = 6},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bX" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/structure/bed,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"bY" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Blackshuttledown) +"bZ" = (/mob/living/simple_animal/hostile/viscerator,/mob/living/simple_animal/hostile/viscerator,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"ca" = (/obj/structure/table/steel,/obj/item/weapon/gun/projectile/pistol,/obj/item/weapon/gun/projectile/shotgun/pump,/turf/simulated/floor/tiled/steel_grid,/area/submap/Blackshuttledown) +"cb" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled/hydro,/area/submap/Blackshuttledown) +"cc" = (/obj/machinery/light,/obj/structure/table/rack,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/head/helmet/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/item/clothing/suit/space,/obj/effect/floor_decal/borderfloor{dir = 10},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"cd" = (/obj/structure/dispenser/oxygen,/obj/effect/floor_decal/borderfloor{dir = 6},/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ce" = (/obj/structure/table/woodentable,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"cf" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/machinery/light,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"cg" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled/steel,/area/submap/Blackshuttledown) +"ch" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark5"; name = "Unknown Shuttle"; tag = "icon-dark5"},/area/submap/Blackshuttledown) +"ci" = (/turf/template_noop,/turf/simulated/shuttle/wall/dark{icon_state = "dark9"; name = "Unknown Shuttle"; tag = "icon-dark9"},/area/submap/Blackshuttledown) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa aaabababababacababababababababadadabacabababababacabababababababababaa aaababababababaeabababababababadadababababababababababababadafababacaa -aaabababababababababababababadadababababababababababaeababadadabababaa +aaabababababababababababababadadabababafabababafababaeababadadabababaa aaababafabadadadababababafababababababababababababababababadadabababaa aaabababababadadadabacababababagagagagagagabababababacabafabadabababaa -aaababababababadadababababababagahabababagabababababababababababababaa +aaababababababadadabafababababagahabababagabababababababababababababaa aaabababababababaiajajajakababagabababahagabababafaiajajajajakabababaa -aaabababababababajajajajajajajajajalalajajajajajajajajajajajamanababaa -aaababababafababajajajajajajaoapajaqarajaqaqasaqatajajajajajamanababaa -aaabababababababauajajaqavajaqaqajawawajaqaxaqaqaqaqayajajazababababaa -aaabababababababaAajajaBaCajaqaqaqaqaqajaqaqaqaqaDaqaEajazabababababaa -aaabafababababaAajaFajaqaFajaqaqaqaqaEajaGaHaqaqaIaJaKajababababafabaa -aaabababababaAajaLaMajaNajajaqaqajajajajajajaOajajajajajaPabababababaa -aaabababababajaQaqaqajaqaqaqaqaqajaRaSaqasaqaTaqajaUaUaVajaPababababaa -aaabababababaWaFaqaqajaLaqaqaqaEajaqaqaXaXaXaqaqajaFaqaqaqamanabababaa -aaabababababaYaFaqaqaOaqaqaqaqaqaOaqaqaZaFaFaqaqbaaqaqaqaqamanabababaa -aaabababababaYaFaqaqaOaqaqaqaqaqaOaqaqaFaFaFaqaqbaaqaqaqaqamanabababaa -aaabababababbbaFaqaqajaLaqaqaqaEajaqaqaXaXaXaqaqbcaqaqaqaTamanabababaa -aaabababababajbdaqaTajaqaqaqaqaqajbebfaqbgaTaqaqajbhbibjajazababababaa -aaabababababauajaLbkajaNajajaqaqajajajajajajaOajajajajajazabababababaa -aaababababababauajaFajaqblajaqaqaqaqaEajbmaqaqaqaqbaaqajababababababaa -aaabafabababababauajajbnboajaqaqaqaqaqajbpaqbmaqbmajarajaPabafabababaa -aaabababababababaAajajbqbrajaqaTajawawajbmaqbmaqbmajbsajajaPababababaa -aaabababababababajajajajajajbtapajaqarajbmaqbuaqbvajajajajamanabababaa -aaabababababababajajajajajajajajajalalajajajajajajajajajajamanabababaa -aaababafababababbwajajajbxababagahabababagabababbwajajajajbxababababaa -aaabababadabababababafababababagabababahagababababafabababadadadababaa -aaababadadabacababababababababagagagagagagababababacababadadadadababaa +aaabababababababajajajajajajajajajababajajajajajajajajajajajalamababaa +aaababababafababajajajajajajanaoajapapajaqaqaraqasajajajajajalamababaa +aaabababababababatajajauavajawaxajayayajaqazaqaqaqaqaAajajaBababababaa +aaabababababababaCajajaDaEajawaFaGaGaHajaqaqaqaqaIaqaJajaBabababababaa +aaabafababababaCajaKajauaLajawaMaNaNaOajaPaQaqaqaRaSaTajababababafabaa +aaabababababaCajaUaVajaWajajawaxajajajajajajaXajajajajajaYabababababaa +aaabababababajaZbaaxajbbaGaGbaaxajbcbdbebfbebgbeajbhbhbiajaYababababaa +aaabababababbjbkbeaxajblbebebebmajbebebnbnbnbebeajbobebebpalamabababaa +aaabababababbqbkbeaFbrbabebsbebebtbebebubvbvbebebwbebebebpalamabababaa +aaabababababbqbkbeaMbxbybebebebebtbebebvbvbvbebebwbebebebpalamabababaa +aaabababababbzbkbeaxajblbebebebmajbebebnbnbnbebeajbAbebebBalamabababaa +aaabababababajbCbybDajbEaNaNbybFajbGbHbebIbgbebeajbJbKbLajaBababababaa +aaabababababatajbMbNajaWajajawaxajajajajajajbtajajajajajaBabababababaa +aaababababababatajaKajaubOajawbPaGaGbQajbRbebebebebSbTajababababababaa +aaabafabababababatajajbUbVajawaMaNaNbWajbXbebRbebRajbYajaYabafabababaa +aaabababababababaCajajbZcaajawbDajayayajbRbebRbebRajcbajajaYababababaa +aaabababababababajajajajajajcccdajapapajbRcecfcecgajajajajalamabababaa +aaabababababababajajajajajajajajajababajajajajajajajajajajalamabababaa +aaababafababababchajajajciababagahabababagabababchajajajajciababababaa +aaabababadabababababafababababagabababahagababafabafabababadadadababaa +aaababadadabacababababafabababagagagagagagababababacababadadadadababaa aaabadadadabababababababaeababababababababababadadabababadadadadababaa aaababadadababacabadababababababababababababadadadababababadadabababaa -aaabababababababadadafababababababababacabadadadafabababababababababaa -aaabababafababadadadababababababababababadadadadabababababababafababaa +aaabababababababadadafabababafababababacabadadadafabababababababababaa +aaabababafababadadadababababababababafabadadadadabababababababafababaa aaabababababababadadabacabababababababababababadaeabacafababababababaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/submaps/surface_submaps/wilderness/DoomP.dmm b/maps/submaps/surface_submaps/wilderness/DoomP.dmm index 1ff13f5eaa..d18916efc0 100644 --- a/maps/submaps/surface_submaps/wilderness/DoomP.dmm +++ b/maps/submaps/surface_submaps/wilderness/DoomP.dmm @@ -3,126 +3,124 @@ "ac" = (/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP) "ad" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) "ae" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/template_noop,/area/submap/DoomP) -"af" = (/turf/template_noop,/area/space) -"ag" = (/turf/simulated/floor/water,/area/submap/DoomP) -"ah" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/DoomP) -"ai" = (/obj/effect/mine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"aj" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"ak" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"al" = (/turf/simulated/floor/water/deep,/area/submap/DoomP) -"am" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"an" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"ao" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) -"ap" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor/plating,/area/submap/DoomP) -"aq" = (/turf/simulated/wall/r_wall,/area/submap/DoomP) -"ar" = (/turf/simulated/floor/plating,/area/submap/DoomP) -"as" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/submap/DoomP) -"at" = (/turf/simulated/floor/tiled,/area/submap/DoomP) -"au" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/submap/DoomP) -"av" = (/obj/structure/bed/chair,/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aw" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) -"ax" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/submap/DoomP) -"ay" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP) -"az" = (/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aA" = (/obj/machinery/power/apc{dir = 1; name = "PAPC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aB" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aC" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aD" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aE" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aF" = (/obj/structure/lattice,/obj/machinery/porta_turret/stationary,/turf/simulated/floor/plating,/area/submap/DoomP) -"aG" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP) -"aH" = (/obj/structure/bed/chair{dir = 4},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aI" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aJ" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aK" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aL" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 32; d2 = 8; icon_state = "32-8"},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aM" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/submap/DoomP) -"aN" = (/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aO" = (/obj/structure/lattice,/turf/simulated/floor/water,/area/submap/DoomP) -"aP" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aQ" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aR" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aS" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aT" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aU" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aV" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/spy,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aW" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/smokes,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aX" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aY" = (/obj/structure/table/rack,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled,/area/submap/DoomP) -"aZ" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser/mounted,/turf/simulated/floor/tiled,/area/submap/DoomP) -"ba" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/contender,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/turf/simulated/floor/tiled,/area/submap/DoomP) -"bb" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled,/area/submap/DoomP) -"bc" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled,/area/submap/DoomP) -"bd" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/submap/DoomP) -"be" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor/tiled,/area/submap/DoomP) -"bf" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) -"bg" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/DoomP) -"bh" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled,/area/submap/DoomP) -"bi" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) -"bj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/DoomP) -"bk" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP) -"bl" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP) -"bm" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"af" = (/turf/simulated/floor/water,/area/submap/DoomP) +"ag" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/DoomP) +"ah" = (/obj/effect/mine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"ai" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"aj" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"ak" = (/turf/simulated/floor/water/deep,/area/submap/DoomP) +"al" = (/obj/effect/decal/remains/mouse,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"am" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"an" = (/obj/machinery/light/small,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) +"ao" = (/obj/machinery/porta_turret,/turf/simulated/floor/plating,/area/submap/DoomP) +"ap" = (/turf/simulated/wall/r_wall,/area/submap/DoomP) +"aq" = (/turf/simulated/floor/plating,/area/submap/DoomP) +"ar" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/plating,/area/submap/DoomP) +"as" = (/turf/simulated/floor/tiled,/area/submap/DoomP) +"at" = (/obj/structure/bed/chair,/turf/simulated/floor/tiled,/area/submap/DoomP) +"au" = (/obj/structure/bed/chair,/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP) +"av" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aw" = (/obj/machinery/vending/cigarette,/turf/simulated/floor/tiled,/area/submap/DoomP) +"ax" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/DoomP) +"ay" = (/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor/tiled,/area/submap/DoomP) +"az" = (/obj/machinery/power/apc{dir = 1; name = "PAPC"; pixel_x = 0; pixel_y = 24},/obj/structure/cable{d2 = 2; icon_state = "0-2"; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aA" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aB" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aC" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aD" = (/obj/structure/closet/secure_closet/engineering_electrical,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aE" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/rocks,/area/submap/DoomP) +"aF" = (/obj/structure/bed/chair{dir = 4},/mob/living/simple_animal/hostile/syndicate/ranged{desc = "Even less friendly than he looks."; speak = list("Wish I had better equipment...","I knew I should have been a line chef...","Fuckin' helmet keeps fogging up.","Anyone else smell that?")},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aG" = (/obj/structure/table/standard,/obj/item/pizzabox,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aH" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aI" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aJ" = (/obj/machinery/power/terminal{icon_state = "term"; dir = 1},/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/structure/cable{d1 = 32; d2 = 8; icon_state = "32-8"},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aK" = (/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/submap/DoomP) +"aL" = (/obj/machinery/light/small,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aM" = (/obj/structure/lattice,/turf/simulated/floor/water,/area/submap/DoomP) +"aN" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aO" = (/obj/machinery/door/airlock/external,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aP" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aQ" = (/obj/machinery/door/airlock/hatch,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aR" = (/obj/machinery/door/airlock/highsecurity,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aS" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aT" = (/obj/structure/table/standard,/obj/item/weapon/storage/box/syndie_kit/spy,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aU" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/smokes,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aV" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/handcuffs,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aW" = (/obj/structure/table/rack,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/obj/item/weapon/cell/device/weapon,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aX" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/laser/mounted,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aY" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/contender,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/obj/item/ammo_magazine/s357,/turf/simulated/floor/tiled,/area/submap/DoomP) +"aZ" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/tiled,/area/submap/DoomP) +"ba" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/tiled,/area/submap/DoomP) +"bb" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled,/area/submap/DoomP) +"bc" = (/obj/structure/table/standard,/obj/structure/bedsheetbin,/turf/simulated/floor/tiled,/area/submap/DoomP) +"bd" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) +"be" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/DoomP) +"bf" = (/obj/machinery/shower{dir = 1},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled,/area/submap/DoomP) +"bg" = (/obj/structure/toilet{dir = 1},/turf/simulated/floor/tiled,/area/submap/DoomP) +"bh" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/obj/structure/window/reinforced{dir = 8},/turf/simulated/floor/plating,/area/submap/DoomP) +"bi" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP) +"bj" = (/obj/structure/grille,/obj/structure/window/reinforced{dir = 1},/obj/structure/window/reinforced,/obj/structure/window/reinforced{dir = 4},/obj/machinery/door/firedoor/border_only,/turf/simulated/floor/plating,/area/submap/DoomP) +"bk" = (/obj/structure/lattice,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/DoomP) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa -aaabababababababababababababababababababababababababababababababababababacacacacacacacacabababababababadadadabababaeabaf -aaaeabababababababababababababababababababababababababababababababababacacagagagagagagacacacacababacadadadadadacacacabaf -aaababacacacacacacacabababababababahababababacacacacacacacacababacacacacagagagagagagagagagagacacacacadadaiadacagagacabaf -aaabacacagagagagagacacacacacacababaeabacacacacagagagagacacacacacagagagagagagagagagagagagagacacadadadadadacacacagagacabaf -aaabacagagagagagagagagagagagacacacacacacagagagagagagagagagagagagagagagagagagagagagagagagacacadajadadakacacagagagagacacaf -aaabacagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagacacacadadadadadadacagagagagagagacaf -aaabacagagagagalalalalalalagagagagagagagagagagagagagalalalalalalalagagagagagagagagacacadakadadaiadadadacagagagagagagacaf -aaabacagagagagagalalalalalagagagagagagagagagalalalalalalalalalalalalalalagagagagagacadaiadadadadadadacacagagagagagagacaf -aaabacacagagagagagalalalalagagagagagagagagagalalalalalalalalalalalalalagagagagagacacamadadadadadaiacacagagagagagagagacaf -aaababacagagagagagagalalalalalagagagalalalalalalalalalalalalalalalalalalalalalagagacacadadadadadacacagagagagagagagagacaf -aaababacagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagagacadadadajadacacagagagagagagagacacaf -aaababacacagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagacacadaiadadacacagagagagagagagagacabaf -aaabababacagagagagagagagalalalalalalalalalalalalagagalalalalalalalalalagagagagagagacacadadadadacagagagagagagagagagacabaf -aaabababacacagagagagagagagalalalalalalalalalalagagagagalalalalalalalalalagagagagagacacadadamacacagagagagagagagacacacabaf -aaababababacagagagagagagalalalalalalalalalagagagagagagagagagagagagagagagagagagacacacadadadadacagagagagalagagagacacababaf -aaababababacacagagagagagagalalalalalalagagagagagagagagagagagagagagagagagagagacacadadadadadacacagagagalalagagagagacababaf -aaababababacacagagagagagalalalalalagagagagagagagagagagagagagagagagagagagagacacadadadadacacacagagagagalalalagagagacacabaf -aaababababaeacagagagagalalalalalagagagagagagagagagagagagagagagagagagagagacacadadadacacacagagagagagagalalalagagagagacabaf -aaababababacacagagalalalalalalalalagagagagagagagagagacacacacacacacagagacacadadacacacagagagagagagagagalalalagagagagacabaf -aaababababacagagagalalalalalalalalalalagagagagagacacacadadadadadacacacacadadacacagagagagagagagalagalalalagagagagagacabaf -aaabababacacagagagagalalalalalalalagagagagagagacacadadanadadadadadadadadadadacagagagagagagagagalalalalalagagagagagacabaf -aaabababacagagagagagagalalalalalagagagagagagacacadadadadadadanadadadadadadadacagagagagagagagalalalalalalagagagagacacabaf -aaabababacagagagagagagalalalalalagagagagagacacadadadadadadadadadadadadadadacacagagagagagagagalalalalalalalalagagacacabaf -aaabababacagagagagagagagalalalalagagagagacacadadadadadadadadadadadadadadadadacacagagagagagagalalalalalalalalagagagacabaf -aaabababacagagagagagagagalalalagagagagagacadadadadadadadadadadadadadadadadadadacacagagagagagagalalalalalalagagagagacabaf -aaabababacagagagagagagagalalalalalagagagacadadadadadadadaoadadadadadaoadadadadadacacagagagagagagalalalalagagagagagacabaf -aaabababacagagagagagagagalalalalalagagagacadadapadadapadaqaqarararaqaqadapadadapadacagagagagagagalalalalagagagagagacabaf -aaabababacagagagagagagagalalalalalalagagacaqaqaqaqaqaqaqaqaqaqasaqaqaqaqaqaqaqaqaqaqaqagagagagagalalalalagagagagacacabaf -aaabababacacagagagagagagalalalalalalagagacaqatauatavawavataxaqayaqazazazazaAaBaCaDaEaqagagagagagalalalalagagagagacacabaf -aaabababacacacagagagagalalalalalalalagaFaGaqaHaDaIaDaDaDataJaqataqaKaLaLaLaMatataNataqaOaFagagagalalalagagagagagagacabaf -aaabababababacacagagagalalalalalalalagagagaqayaDaDaDaDaDataPaqaQaqaqaqaqaqaqaRaqaqaqaqagagagagagalalalagagagagagagacabaf -aaababababababacagagagalalalalalalalalagagaqatatataNatatatataSatatawatatatatatawatataqagagagagagalalalagagagagagagagacaf -aaabababahabababacagagalalalalalalalalaFaOaqaTaqaqaqaqaqaqaqaqaqaqaqaqaqaqaUaqaqaqaqaqaOaFagagagalalalagagagagagagagacaf -aaababababababacacagagagalalalalalalalalagaqataDaVaWaXaYaZbaaqbbaDbcbdbcbeataUawaUbfaqagagagagagalalalagagagagagagagacaf -aaababababababacagagagagalalalalalalalalagaqatataNatataNatataqayatatatatatbgaqbhaqbiaqagagagagalalalalalagagagagagagacaf -aaababababababacagagagagalalalalalalalalalaqaqaqaqaqaqaqaqaqaqaqaqbjbkbkbkblaqaqaqaqaqagagagagalalalalagagagagagagagacaf -aaabababababacacagagagalalalalalalalalalalagagagagaGacacadadadadbmadadadadadbmacacagagagagagagalalalalagagagagagagagacaf -aaabababababacagagagagalalalalalalalalalalalalagagaFagacacacacacaFadadadadadaFacagagagagagagalalalalalagagagagagagacacaf -aaababababacacagagagagalalalalalalalalalalalalalagagagagagagagacacadadadadadacacagagagagagalalalalalalagagagagagagacabaf -aaababababacagagagagagagalalalalalalalalalalalalagagagagagagagagacacacacacacacagagagagagagagalalalalalagagagagagacacabaf -aaabababacacagagagagagagalalalalalalalalalalalalalagagagagagagagagagagagagagagagagagagagagagagalalalagagagagagagacababaf -aaabababacacagagagagagalalalalalalalalalalalalalalagagagagagagagagagagagagagagagagagagagagagagalalalagagagagagagacababaf -aaabababacacagagagagagalalalalalalalalalalalalalalalalalalagagagagagagagagagagagagagagagagagagalalalagagagagagacacababaf -aaababacacagagagagagagagalalalalalalalalalalalalalalalalalalagagagagagagagagagagagagagagagagalalalalagagagagagacabababaf -aaababacagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalalagagalalalalalalagagagagagacacababaf -aaababacagagagagagalalalalalalalalagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagacababaf -aaabacacagagagagagalagalalalalalagagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagacababaf -aaabacagagagagagagagagalalalalalalalagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagacababaf -aaabacagagagagagagagagagagagagalalalagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagagacababaf -aaabacagagagagagagagagagagagagagagagagagagagagagagalalalalalalalalalalalalalalalalalalalalalalalalalalagagagagacacababaf -aaabacagagagagagagagagacacacacacacacacagagagagagagalalalalalalalalalalalalalalalagalalalalalalalalalalagagagagacabababaf -aaabacagagagagagagacacacababababababacacacagagagagagagalalagagagagagagagagagalagagagagagalalalalalalagagagagagacabababaf -aaabacacagagagagacacababababababababababacagagagagagagagagagagagagagagagagagagagagagagagagagagalalalalagagagacacababaeaf -aaababacagagagacacababababababababababacacagagagagagagagagagagagagagagagagagagagagagagagagagagagagalalagagagacababahabaf -aaababacagagacacabababababababababahabacagagagagagagagagagagagagagagacacacacacacagagagagagagagagagagagagagacacababababaf -aaabacacagacacababababababababababababacagagagagagagagagagagacacacacacabacacacacacacagagagagagagagagagagacacabababababaf -aaabacagacacababababaeabababababababacacagagagagagacacacacacacababababababababababacacacacacacacagagagacacacabababababaf -aaabacacacababababababababababababacacacacacacacacacabababababababababababababababababababababacacacacacabababababababaf +aaabababababababababababababababababababababababababababababababababababacacacacacacacacabababababababadadadabababaeabaa +aaaeabababababababababababababababababababababababababababababababababacacafafafafafafacacacacababacadadadadadacacacabaa +aaababacacacacacacacabababababababagababababacacacacacacacacababacacacacafafafafafafafafafafacacacacadadahadacafafacabaa +aaabacacafafafafafacacacacacacababaeabacacacacafafafafacacacacacafafafafafafafafafafafafafacacadadadadadacacacafafacabaa +aaabacafafafafafafafafafafafacacacacacacafafafafafafafafafafafafafafafafafafafafafafafafacacadaiadadajacacafafafafacacaa +aaabacafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafacacacadadadadadadacafafafafafafacaa +aaabacafafafafakakakakakakafafafafafafafafafafafafafakakakakakakakafafafafafafafafacacadajadadahadadadacafafafafafafacaa +aaabacafafafafafakakakakakafafafafafafafafafakakakakakakakakakakakakakakafafafafafacadahadadadadadadacacafafafafafafacaa +aaabacacafafafafafakakakakafafafafafafafafafakakakakakakakakakakakakakafafafafafacacaladadadadadahacacafafafafafafafacaa +aaababacafafafafafafakakakakakafafafakakakakakakakakakakakakakakakakakakakakakafafacacadadadadadacacafafafafafafafafacaa +aaababacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafafacadadadaiadacacafafafafafafafacacaa +aaababacacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacacadahadadacacafafafafafafafafacabaa +aaabababacafafafafafafafakakakakakakakakakakakakafafakakakakakakakakakafafafafafafacacadadadadacafafafafafafafafafacabaa +aaabababacacafafafafafafafakakakakakakakakakakafafafafakakakakakakakakakafafafafafacacadadalacacafafafafafafafacacacabaa +aaababababacafafafafafafakakakakakakakakakafafafafafafafafafafafafafafafafafafacacacadadadadacafafafafakafafafacacababaa +aaababababacacafafafafafafakakakakakakafafafafafafafafafafafafafafafafafafafacacadadadadadacacafafafakakafafafafacababaa +aaababababacacafafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacadadadadacacacafafafafakakakafafafacacabaa +aaababababaeacafafafafakakakakakafafafafafafafafafafafafafafafafafafafafacacadadadacacacafafafafafafakakakafafafafacabaa +aaababababacacafafakakakakakakakakafafafafafafafafafacacacacacacacafafacacadadacacacafafafafafafafafakakakafafafafacabaa +aaababababacafafafakakakakakakakakakakafafafafafacacacadadadadadacacacacadadacacafafafafafafafakafakakakafafafafafacabaa +aaabababacacafafafafakakakakakakakafafafafafafacacadadamadadadadadadadadadadacafafafafafafafafakakakakakafafafafafacabaa +aaabababacafafafafafafakakakakakafafafafafafacacadadadadadadamadadadadadadadacafafafafafafafakakakakakakafafafafacacabaa +aaabababacafafafafafafakakakakakafafafafafacacadadadadadadadadadadadadadadacacafafafafafafafakakakakakakakakafafacacabaa +aaabababacafafafafafafafakakakakafafafafacacadadadadadadadadadadadadadadadadacacafafafafafafakakakakakakakakafafafacabaa +aaabababacafafafafafafafakakakafafafafafacadadadadadadadadadadadadadadadadadadacacafafafafafafakakakakakakafafafafacabaa +aaabababacafafafafafafafakakakakakafafafacadadadadadadadanadadadadadanadadadadadacacafafafafafafakakakakafafafafafacabaa +aaabababacafafafafafafafakakakakakafafafacadadaoadadaoadapapaqaqaqapapadaoadadaoadacafafafafafafakakakakafafafafafacabaa +aaabababacafafafafafafafakakakakakakafafacapapapapapapapapapaparapapapapapapapapapapapafafafafafakakakakafafafafacacabaa +aaabababacacafafafafafafakakakakakakafafacapasatasauavauasawapaxapayayayayazaAaBaCaDapafafafafafakakakakafafafafacacabaa +aaabababacacacafafafafakakakakakakakafaoaEapaFaCaGaCaCaCasaHapasapaIaJaJaJaKasasaLasapaMaoafafafakakakafafafafafafacabaa +aaabababababacacafafafakakakakakakakafafafapaxaCaCaCaCaCasaNapaOapapapapapapaPapapapapafafafafafakakakafafafafafafacabaa +aaababababababacafafafakakakakakakakakafafapasasasaLasasasasaQasasavasasasasasavasasapafafafafafakakakafafafafafafafacaa +aaabababagabababacafafakakakakakakakakaoaMapaRapapapapapapapapapapapapapapaSapapapapapaMaoafafafakakakafafafafafafafacaa +aaababababababacacafafafakakakakakakakakafapasaCaTaUaVaWaXaYapaZaCbabbbabcasaSavaSbdapafafafafafakakakafafafafafafafacaa +aaababababababacafafafafakakakakakakakakafapasasaLasasaLasasapaxasasasasasbeapbfapbgapafafafafakakakakakafafafafafafacaa +aaababababababacafafafafakakakakakakakakakapapapapapapapapapapapapbhbibibibjapapapapapafafafafakakakakafafafafafafafacaa +aaabababababacacafafafakakakakakakakakakakafafafafaEacacadadadadbkadadadadadbkacacafafafafafafakakakakafafafafafafafacaa +aaabababababacafafafafakakakakakakakakakakakakafafaoafacacacacacaoadadadadadaoacafafafafafafakakakakakafafafafafafacacaa +aaababababacacafafafafakakakakakakakakakakakakakafafafafafafafacacadadadadadacacafafafafafakakakakakakafafafafafafacabaa +aaababababacafafafafafafakakakakakakakakakakakakafafafafafafafafacacacacacacacafafafafafafafakakakakakafafafafafacacabaa +aaabababacacafafafafafafakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafacababaa +aaabababacacafafafafafakakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafafafafafakakakafafafafafafacababaa +aaabababacacafafafafafakakakakakakakakakakakakakakakakakakafafafafafafafafafafafafafafafafafafakakakafafafafafacacababaa +aaababacacafafafafafafafakakakakakakakakakakakakakakakakakakafafafafafafafafafafafafafafafafakakakakafafafafafacabababaa +aaababacafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakakakakakakakafafakakakakakakafafafafafacacababaa +aaababacafafafafafakakakakakakakakafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacababaa +aaabacacafafafafafakafakakakakakafafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacababaa +aaabacafafafafafafafafakakakakakakakafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacababaa +aaabacafafafafafafafafafafafafakakakafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafafacababaa +aaabacafafafafafafafafafafafafafafafafafafafafafafakakakakakakakakakakakakakakakakakakakakakakakakakakafafafafacacababaa +aaabacafafafafafafafafacacacacacacacacafafafafafafakakakakakakakakakakakakakakakafakakakakakakakakakakafafafafacabababaa +aaabacafafafafafafacacacababababababacacacafafafafafafakakafafafafafafafafafakafafafafafakakakakakakafafafafafacabababaa +aaabacacafafafafacacababababababababababacafafafafafafafafafafafafafafafafafafafafafafafafafafakakakakafafafacacababaeaa +aaababacafafafacacababababababababababacacafafafafafafafafafafafafafafafafafafafafafafafafafafafafakakafafafacababagabaa +aaababacafafacacabababababababababagabacafafafafafafafafafafafafafafacacacacacacafafafafafafafafafafafafafacacababababaa +aaabacacafacacababababababababababababacafafafafafafafafafafacacacacacabacacacacacacafafafafafafafafafafacacabababababaa +aaabacafacacababababaeabababababababacacafafafafafacacacacacacababababababababababacacacacacacacafafafacacacabababababaa +aaabacacacababababababababababababacacacacacacacacacabababababababababababababababababababababacacacacacabababababababaa aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/submaps/surface_submaps/wilderness/Lab1.dmm b/maps/submaps/surface_submaps/wilderness/Lab1.dmm index 1256e3930b..724043a9ff 100644 --- a/maps/submaps/surface_submaps/wilderness/Lab1.dmm +++ b/maps/submaps/surface_submaps/wilderness/Lab1.dmm @@ -23,28 +23,29 @@ "w" = (/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) "x" = (/obj/structure/table/standard,/obj/item/weapon/paper{desc = "Gladstone for the last fucking time, We have crowbars for a REASON. Stop breaking in through the goddamn windows! We big red shiny doors for god's sakes!"},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) "y" = (/obj/structure/table/standard,/obj/item/device/flashlight/lamp,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"z" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"A" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"B" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"C" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"D" = (/obj/structure/table/standard,/obj/fiftyspawner/steel,/obj/fiftyspawner/glass,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"E" = (/obj/structure/table/standard,/obj/item/device/multitool,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"F" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"G" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"H" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"I" = (/obj/item/weapon/cell/super,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"J" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"K" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"L" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"M" = (/obj/item/weapon/storage/bag/circuits,/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"N" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"O" = (/obj/item/robot_parts/chest,/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"P" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"Q" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"R" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"S" = (/obj/machinery/vending/robotics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"T" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) -"U" = (/obj/machinery/optable,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"z" = (/turf/simulated/floor,/area/submap/Lab1) +"A" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"B" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"C" = (/obj/machinery/light/small{dir = 4},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"D" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"E" = (/obj/structure/table/standard,/obj/fiftyspawner/steel,/obj/fiftyspawner/glass,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"F" = (/obj/structure/table/standard,/obj/item/device/multitool,/obj/item/clothing/glasses/welding,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"G" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"H" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"I" = (/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"J" = (/obj/item/weapon/cell/super,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"K" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"L" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 8},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"M" = (/obj/machinery/light{dir = 4; icon_state = "tube1"},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"N" = (/obj/item/weapon/storage/bag/circuits,/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"O" = (/obj/machinery/light/small{dir = 1},/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"P" = (/obj/item/robot_parts/chest,/obj/item/robot_parts/l_arm,/obj/item/robot_parts/r_arm,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"Q" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"R" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"S" = (/obj/structure/table/standard,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"T" = (/obj/machinery/vending/robotics,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"U" = (/obj/structure/table/standard,/obj/machinery/cell_charger,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) +"V" = (/obj/machinery/optable,/turf/simulated/floor/tiled/steel_dirty,/area/submap/Lab1) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaa @@ -56,14 +57,14 @@ acmhncbbchhcbbcohpca acqhrcbbcshcbbcthtca acuvwcbbchhcbbcxhyca acdefcbbcllcbbcdefca -abbbbbbbbbbbbbbbbbba -abbbbbbbbbbbbbbbbbba +abbbbbbbbzzbbbbbbbba +abbbbbbbbzzbbbbbbbba acdefcbbcllcbbcdefca -achzAcbbchBcbbcCDEca -acFhGcbbchhcbbcHIJca -acKhLcdfcllcdfchhMca -acFhhihhNhhNhhihhOca -acPQRcdeeeeeefcSTUca +achABcbbchCcbbcDEFca +acGhHcbbchhcbbcIJKca +acLhMcdfcllcdfchhNca +acGhhihhOhhOhhihhPca +acQRScdeeeeeefcTUVca acdefcbbbbbbbbcdefca abbbbbbbbbbbbbbbbbba aaaaaaaaaaaaaaaaaaaa diff --git a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm index 19a9ceeda7..3033ffdf62 100644 --- a/maps/submaps/surface_submaps/wilderness/MCamp1.dmm +++ b/maps/submaps/surface_submaps/wilderness/MCamp1.dmm @@ -1,55 +1,53 @@ "a" = (/turf/template_noop,/area/template_noop) "b" = (/turf/template_noop,/area/submap/MilitaryCamp1) "c" = (/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1) -"d" = (/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"e" = (/obj/effect/mine,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"f" = (/obj/structure/flora/bush,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"g" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"h" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1) -"i" = (/obj/structure/flora/tree/sif,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"j" = (/obj/item/stack/rods,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"k" = (/obj/effect/mine,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1) -"l" = (/turf/simulated/wall,/area/submap/MilitaryCamp1) -"m" = (/turf/simulated/floor,/area/submap/MilitaryCamp1) -"n" = (/obj/item/weapon/material/shard,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"o" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"p" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"q" = (/obj/machinery/computer/communications,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"r" = (/obj/structure/table/standard,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"s" = (/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"t" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"u" = (/obj/machinery/computer/security,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"v" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"w" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"x" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) -"y" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"z" = (/obj/structure/table,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"A" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"B" = (/obj/machinery/door/airlock,/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"C" = (/obj/structure/flora/tree/dead,/turf/simulated/floor/outdoors/grass/sif/forest,/area/submap/MilitaryCamp1) -"D" = (/obj/structure/table/standard,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"E" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor,/area/submap/MilitaryCamp1) -"F" = (/obj/effect/mine,/turf/template_noop,/area/submap/MilitaryCamp1) +"d" = (/obj/effect/mine,/turf/template_noop,/area/submap/MilitaryCamp1) +"e" = (/obj/structure/flora/bush,/turf/template_noop,/area/submap/MilitaryCamp1) +"f" = (/obj/effect/decal/cleanable/blood,/turf/template_noop,/area/submap/MilitaryCamp1) +"g" = (/obj/effect/decal/remains,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1) +"h" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/MilitaryCamp1) +"i" = (/obj/item/stack/rods,/turf/template_noop,/area/submap/MilitaryCamp1) +"j" = (/obj/effect/mine,/turf/simulated/floor/outdoors/dirt,/area/submap/MilitaryCamp1) +"k" = (/turf/simulated/wall,/area/submap/MilitaryCamp1) +"l" = (/turf/simulated/floor,/area/submap/MilitaryCamp1) +"m" = (/obj/item/weapon/material/shard,/turf/template_noop,/area/submap/MilitaryCamp1) +"n" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"o" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"p" = (/obj/machinery/computer/communications,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"q" = (/obj/structure/table/standard,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"r" = (/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"s" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"t" = (/obj/machinery/computer/security,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"u" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"v" = (/obj/machinery/door/airlock,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"w" = (/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/simulated/floor,/area/submap/MilitaryCamp1) +"x" = (/mob/living/simple_animal/hostile/viscerator{returns_home = 1},/turf/template_noop,/area/submap/MilitaryCamp1) +"y" = (/obj/structure/table,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"z" = (/obj/structure/table/standard,/obj/random/firstaid,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"A" = (/obj/machinery/door/airlock,/obj/effect/mine,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"B" = (/obj/structure/flora/tree/dead,/turf/template_noop,/area/submap/MilitaryCamp1) +"C" = (/obj/structure/table/standard,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor,/area/submap/MilitaryCamp1) +"D" = (/obj/structure/table/standard,/obj/item/weapon/gun/energy/gun,/turf/simulated/floor,/area/submap/MilitaryCamp1) (1,1,1) = {" aaaaaaaaaaaaaaaaaaaa -abbcdedfgedddbbbbbba -achcdddddddgedchbbba -adccddeddijdddcckiba -adiddjllmmllmlncddda -abdddlllmmllllldedea -abbellommplqrolldfda -abbdllopstluvvllddda -abdnllwllxlllwlpyeda -adddmlommtmoxtllddda -agedmlommzAottlldeda -adddplwBllllwwlpdCda -addyllomptttoollddda -aCddllDElmmooollndga -addfdllllwmlllldedda -abedddllltmllldcceda -abcddddlldnlldkcddba -achcedddeedjddchibba -abccfbFdigddeccdbbba +abbcbdbefdbbbbbbbbba +acgcbbbbbbbfdbcgbbba +abccbbdbbhibbbccjhba +abhbbikkllkklkmcbbba +abbbbkkkllkkkkkbdbda +abbdkknllokpqnkkbeba +abbbkknorsktuukkbbba +abbmkkvkkwkkkvkoxdba +abbblknllslnwskkbbba +afdblknllyznsskkbdba +abbbokvAkkkkvvkobBba +abbxkknlosssnnkkbbba +aBbbkkCDkllnnnkkmbfa +abbebkkkkvlkkkkbdbba +abdbbbkkkslkkkbccdba +abcbbbbkkbmkkbjcbbba +acgcdbbbddbibbcghbba +abccebdbhfbbdccbbbba aaaaaaaaaaaaaaaaaaaa "} diff --git a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm index 738b4f8a08..aac376d999 100644 --- a/maps/submaps/surface_submaps/wilderness/Rockybase.dmm +++ b/maps/submaps/surface_submaps/wilderness/Rockybase.dmm @@ -3,8 +3,8 @@ "ac" = (/obj/effect/decal/remains,/turf/template_noop,/area/submap/Rockybase) "ad" = (/turf/template_noop,/area/submap/Rockybase) "ae" = (/obj/structure/flora/tree/sif,/turf/template_noop,/area/submap/Rockybase) -"af" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/template_noop,/area/submap/Rockybase) -"ag" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Rockybase) +"af" = (/turf/simulated/mineral/ignore_mapgen,/area/submap/Rockybase) +"ag" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/template_noop,/area/submap/Rockybase) "ah" = (/turf/simulated/floor,/area/submap/Rockybase) "ai" = (/obj/machinery/porta_turret/stationary,/turf/simulated/floor,/area/submap/Rockybase) "aj" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase) @@ -16,102 +16,102 @@ "ap" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) "aq" = (/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) "ar" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/item/weapon/soap,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"as" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"at" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"au" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"av" = (/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"aw" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"ax" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"ay" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"az" = (/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aA" = (/mob/living/bot/cleanbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aB" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aC" = (/obj/item/weapon/storage/belt/janitor,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aD" = (/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aE" = (/obj/structure/table/standard,/obj/item/device/laptop,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aF" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aG" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aH" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aI" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aJ" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aK" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aL" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aM" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aN" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"aO" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"aP" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aQ" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aR" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aS" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aT" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aU" = (/obj/machinery/vending/security,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aV" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aW" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"aX" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"aY" = (/obj/item/mecha_parts/part/gygax_left_leg,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"aZ" = (/obj/machinery/light,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"ba" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) -"bb" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bc" = (/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bd" = (/obj/structure/table/standard,/obj/item/weapon/storage/bag/trash,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"be" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bf" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bg" = (/obj/machinery/door/airlock/security{icon_state = "door_locked"; locked = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bh" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bi" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bj" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bk" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bl" = (/mob/living/bot/farmbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bm" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bn" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bo" = (/obj/structure/door_assembly,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bp" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bq" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"br" = (/obj/effect/decal/remains,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bs" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"bt" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bu" = (/obj/item/stack/rods,/obj/structure/girder,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bv" = (/obj/structure/sign/securearea{desc = "A warning sign which reads 'HIGH VOLTAGE'"; icon_state = "shock"; name = "HIGH VOLTAGE"; pixel_y = -32},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bw" = (/obj/item/mecha_parts/part/gygax_right_arm,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bx" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"by" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bz" = (/turf/simulated/wall,/area/submap/Rockybase) -"bA" = (/obj/structure/table/standard,/obj/item/device/kit/paint/gygax/darkgygax,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bB" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "I've decided to go forward and start some small scale tests of the Vicerator delivery grenades, Might as wall make sure they work like the real ones. There are a few Fauna areas nearbye and we're working to make sure the kinks in the code are worked out. Once we've made sure they stay flying we'll work on the IFF signals."; name = "V-Grenade Notice 2"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bC" = (/obj/structure/table/standard,/obj/random/toolbox,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bD" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bE" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "We've finally been able to get the Vicerator delivery grenades working, Took awhile to make sure the latching mechanism didn't fail but we're sure we've got it this time. Vel'Shem's worried about the miners having there own drone fab now but I say it's a small price to pay to keep the metal flowing, Especially since there telling us NT's starting to monopolize the metal rich parts."; name = "V-Grenade Notice 1"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bF" = (/obj/structure/table/standard,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bG" = (/obj/structure/table/standard,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bH" = (/obj/structure/table/standard,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bI" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/circuitboard/mecha/gygax/main,/obj/item/weapon/circuitboard/mecha/gygax/peripherals,/obj/item/weapon/circuitboard/mecha/gygax/targeting,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bJ" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase) -"bK" = (/obj/structure/table/standard,/obj/fiftyspawner/rods,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bL" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bM" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bN" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bO" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bP" = (/obj/item/mecha_parts/part/gygax_torso,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bQ" = (/obj/machinery/light{dir = 1},/obj/structure/closet/crate/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bR" = (/obj/structure/table/standard,/obj/structure/table/standard,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bS" = (/obj/structure/table/standard,/obj/item/clothing/mask/breath/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bT" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bU" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bV" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"bW" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"bX" = (/obj/structure/table/standard,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bY" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"bZ" = (/obj/effect/decal/cleanable/dirt,/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase) -"ca" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase) -"cb" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/turf/simulated/floor,/area/submap/Rockybase) -"cc" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase) -"cd" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"ce" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"cf" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cg" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"ch" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"ci" = (/obj/structure/table/standard,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cj" = (/obj/structure/cable{d1 = 2; d2 = 4; icon_state = "2-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"as" = (/obj/structure/table/woodentable,/obj/effect/decal/cleanable/cobweb,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"at" = (/obj/structure/table/woodentable,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"au" = (/obj/structure/table/woodentable,/obj/item/device/flashlight/lamp,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"av" = (/obj/structure/closet{icon_closed = "cabinet_closed"; icon_opened = "cabinet_open"; icon_state = "cabinet_closed"},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"aw" = (/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"ax" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"ay" = (/obj/structure/table/woodentable,/obj/machinery/light{dir = 1},/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"az" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/toy/plushie/spider,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"aA" = (/obj/structure/closet/l3closet/janitor,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aB" = (/mob/living/bot/cleanbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aC" = (/obj/item/weapon/stool,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aD" = (/obj/item/weapon/storage/belt/janitor,/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aE" = (/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aF" = (/obj/structure/table/standard,/obj/item/device/laptop,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aG" = (/obj/structure/table/standard,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aH" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aI" = (/obj/structure/table/rack,/obj/item/weapon/gun/energy/gun/taser,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aJ" = (/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aK" = (/obj/machinery/vending/coffee,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aL" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/obj/item/weapon/gun/projectile/shotgun/pump/combat,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aM" = (/obj/machinery/vending/hydronutrients,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aN" = (/obj/structure/closet/crate/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aO" = (/obj/machinery/shower{dir = 4; icon_state = "shower"; pixel_x = 5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"aP" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"aQ" = (/obj/structure/janitorialcart,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aR" = (/obj/structure/table/standard,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/item/weapon/grenade/chem_grenade/cleaner,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aS" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aT" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "Carl's absolutly fucked in the head. He's trying to squeeze as much drone production out as he can since he's worried we're gonna get found out but he's getting sloppier with each batch. Now's he's telling us he can speed the time on the IFF encoding. I already have a hard enough time getting these damn things not to stare at walls and now he's gonna shortchange the only part of these tincans that tells em not to turn us into paste on a wall. I told Richter to get out while he can, We're counting days before either some Sif task force shows up at our door or these things decide we aren't there friends anymore."; name = "Note"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aU" = (/obj/structure/bed/chair{dir = 8},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aV" = (/obj/machinery/vending/security,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aW" = (/obj/structure/table/rack,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/weapon/storage/box/shotgunshells,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/obj/item/ammo_magazine/m10mm,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aX" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"aY" = (/obj/machinery/shower{dir = 8; icon_state = "shower"; pixel_x = -5; pixel_y = 0},/obj/structure/curtain/open/shower,/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"aZ" = (/obj/item/mecha_parts/part/gygax_left_leg,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"ba" = (/obj/machinery/light,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"bb" = (/obj/structure/bed,/obj/item/weapon/bedsheet,/obj/item/weapon/gun/projectile/pistol,/turf/simulated/floor/holofloor/lino,/area/submap/Rockybase) +"bc" = (/obj/structure/closet/crate/trashcart,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bd" = (/obj/structure/loot_pile/maint/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"be" = (/obj/structure/table/standard,/obj/item/weapon/storage/bag/trash,/obj/item/weapon/storage/bag/trash,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bf" = (/obj/structure/table/standard,/obj/item/weapon/paper_bin,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bg" = (/obj/machinery/light,/obj/structure/table/standard,/obj/item/weapon/pen,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bh" = (/obj/machinery/door/airlock/security{icon_state = "door_locked"; locked = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bi" = (/obj/machinery/light,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bj" = (/obj/structure/table/rack,/obj/item/weapon/gun/projectile/automatic/c20r,/obj/item/weapon/gun/projectile/automatic/c20r,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bk" = (/obj/machinery/portable_atmospherics/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bl" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bm" = (/mob/living/bot/farmbot{faction = "malf_drone"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bn" = (/obj/machinery/portable_atmospherics/hydroponics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bo" = (/obj/machinery/vending/cola,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bp" = (/obj/structure/door_assembly,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bq" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"br" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/cobweb2,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bs" = (/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bt" = (/obj/effect/decal/cleanable/blood,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bu" = (/obj/effect/decal/remains,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bv" = (/obj/machinery/door/airlock,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"bw" = (/obj/machinery/vending/snack,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bx" = (/obj/item/stack/rods,/obj/structure/girder,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"by" = (/obj/item/mecha_parts/part/gygax_right_arm,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bz" = (/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"bA" = (/obj/machinery/door/airlock/engineering,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bB" = (/turf/simulated/wall,/area/submap/Rockybase) +"bC" = (/obj/structure/table/standard,/obj/item/device/kit/paint/gygax/darkgygax,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bD" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "I've decided to go forward and start some small scale tests of the Vicerator delivery grenades, Might as wall make sure they work like the real ones. There are a few Fauna areas nearbye and we're working to make sure the kinks in the code are worked out. Once we've made sure they stay flying we'll work on the IFF signals."; name = "V-Grenade Notice 2"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bE" = (/obj/structure/table/standard,/obj/random/toolbox,/obj/machinery/light{dir = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bF" = (/obj/structure/table/standard,/obj/random/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bG" = (/obj/structure/table/standard,/obj/item/weapon/paper{info = "We've finally been able to get the Vicerator delivery grenades working, Took awhile to make sure the latching mechanism didn't fail but we're sure we've got it this time. Vel'Shem's worried about the miners having there own drone fab now but I say it's a small price to pay to keep the metal flowing, Especially since there telling us NT's starting to monopolize the metal rich parts."; name = "V-Grenade Notice 1"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bH" = (/obj/structure/table/standard,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/obj/item/stack/material/diamond,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bI" = (/obj/structure/table/standard,/obj/item/weapon/grenade/spawnergrenade/manhacks,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bJ" = (/obj/structure/table/standard,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bK" = (/obj/structure/table/standard,/obj/machinery/light{dir = 1},/obj/item/weapon/circuitboard/mecha/gygax/main,/obj/item/weapon/circuitboard/mecha/gygax/peripherals,/obj/item/weapon/circuitboard/mecha/gygax/targeting,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bL" = (/obj/item/weapon/material/shard,/turf/simulated/floor,/area/submap/Rockybase) +"bM" = (/obj/structure/table/standard,/obj/fiftyspawner/rods,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bN" = (/obj/machinery/vending/engivend,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bO" = (/obj/machinery/vending/tool,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bP" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bQ" = (/obj/structure/table/standard,/obj/item/weapon/storage/toolbox/mechanical,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bR" = (/obj/item/mecha_parts/part/gygax_torso,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bS" = (/obj/machinery/light{dir = 1},/obj/structure/closet/crate/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bT" = (/obj/structure/table/standard,/obj/structure/table/standard,/obj/effect/decal/cleanable/dirt,/obj/item/weapon/reagent_containers/hypospray/autoinjector/biginjector/burn,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bU" = (/obj/structure/table/standard,/obj/item/clothing/mask/breath/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bV" = (/obj/structure/closet/secure_closet/medical2,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bW" = (/obj/structure/toilet{dir = 4},/obj/machinery/light/small{dir = 8},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"bX" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"bY" = (/obj/structure/table/standard,/obj/item/device/mmi/digital/robot,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"bZ" = (/obj/item/stack/rods,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"ca" = (/obj/effect/decal/cleanable/dirt,/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase) +"cb" = (/obj/effect/decal/cleanable/dirt,/turf/simulated/floor,/area/submap/Rockybase) +"cc" = (/obj/effect/decal/cleanable/dirt,/obj/structure/table,/turf/simulated/floor,/area/submap/Rockybase) +"cd" = (/obj/structure/girder,/turf/simulated/floor,/area/submap/Rockybase) +"ce" = (/obj/structure/closet/secure_closet/medical1,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cf" = (/obj/machinery/light/small{dir = 4; pixel_y = 0},/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"cg" = (/obj/machinery/drone_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"ch" = (/obj/machinery/mecha_part_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"ci" = (/obj/machinery/pros_fabricator,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cj" = (/obj/structure/table/standard,/obj/item/mecha_parts/mecha_equipment/repair_droid,/turf/simulated/floor/tiled,/area/submap/Rockybase) "ck" = (/obj/machinery/power/terminal{dir = 4},/obj/structure/cable{d2 = 8; icon_state = "0-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase) "cl" = (/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor,/area/submap/Rockybase) "cm" = (/obj/machinery/vending/medical,/turf/simulated/floor/tiled,/area/submap/Rockybase) @@ -126,59 +126,58 @@ "cv" = (/obj/machinery/vending/robotics,/obj/machinery/light{icon_state = "tube1"; dir = 4},/turf/simulated/floor/tiled,/area/submap/Rockybase) "cw" = (/obj/structure/cable{icon_state = "0-4"; d2 = 4},/obj/machinery/light{dir = 8},/obj/machinery/power/apc{cell_type = /obj/item/weapon/cell/super; dir = 8; name = "Unknown APC"; pixel_x = -24},/turf/simulated/floor/tiled,/area/submap/Rockybase) "cx" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cy" = (/obj/structure/cable{d1 = 4; d2 = 8; icon_state = "4-8"; pixel_x = 0},/obj/structure/cable{d1 = 2; d2 = 8; icon_state = "2-8"},/obj/structure/cable{d1 = 1; d2 = 8; icon_state = "1-8"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cz" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor,/area/submap/Rockybase) -"cA" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase) -"cB" = (/obj/item/mecha_parts/part/gygax_right_leg,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cC" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/mecha_parts/part/gygax_left_arm,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) -"cD" = (/obj/machinery/vending,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cE" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cF" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cG" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cH" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cI" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cJ" = (/obj/structure/table/standard,/obj/item/stack/material/plasteel,/obj/item/stack/material/glass/reinforced,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cK" = (/obj/structure/table/standard,/obj/item/stack/material/glass,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cL" = (/obj/structure/table/standard,/obj/item/mecha_parts/part/gygax_head,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cM" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cN" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cO" = (/obj/item/weapon/surgical/surgicaldrill,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cP" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cQ" = (/obj/item/clothing/suit/space/void/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cR" = (/obj/effect/decal/cleanable/dirt,/mob/living/bot/medbot,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cS" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cT" = (/obj/structure/closet/crate/secure/hydrosec,/turf/simulated/floor/tiled,/area/submap/Rockybase) -"cU" = (/obj/effect/decal/remains,/turf/template_noop,/area/template_noop) +"cy" = (/obj/machinery/light{icon_state = "tube1"; dir = 4},/obj/machinery/power/smes/buildable/point_of_interest,/turf/simulated/floor,/area/submap/Rockybase) +"cz" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/blood,/turf/simulated/floor,/area/submap/Rockybase) +"cA" = (/obj/item/mecha_parts/part/gygax_right_leg,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cB" = (/obj/structure/sink{dir = 4; icon_state = "sink"; pixel_x = 11; pixel_y = 0},/obj/item/mecha_parts/part/gygax_left_arm,/turf/simulated/floor/tiled/hydro,/area/submap/Rockybase) +"cC" = (/obj/machinery/vending,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cD" = (/obj/structure/cable{d1 = 1; d2 = 4; icon_state = "1-4"},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cE" = (/obj/machinery/light{dir = 8},/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cF" = (/obj/effect/decal/cleanable/dirt,/obj/effect/decal/cleanable/dirt,/mob/living/simple_animal/hostile/malf_drone{desc = "An automated combat drone with an aged apperance."; returns_home = 1},/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cG" = (/obj/structure/closet/secure_closet/hydroponics,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cH" = (/obj/machinery/mech_recharger,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cI" = (/obj/structure/table/standard,/obj/item/stack/material/plasteel,/obj/item/stack/material/glass/reinforced,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cJ" = (/obj/structure/table/standard,/obj/item/stack/material/glass,/obj/item/stack/material/steel,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cK" = (/obj/structure/table/standard,/obj/item/mecha_parts/part/gygax_head,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cL" = (/obj/structure/closet/toolcloset,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cM" = (/obj/structure/closet/secure_closet/medical3,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cN" = (/obj/item/weapon/surgical/surgicaldrill,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cO" = (/obj/structure/loot_pile/maint/technical,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cP" = (/obj/item/clothing/suit/space/void/medical,/obj/effect/decal/cleanable/dirt,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cQ" = (/obj/effect/decal/cleanable/dirt,/mob/living/bot/medbot,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cR" = (/obj/machinery/vending/hydroseeds,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cS" = (/obj/structure/closet/crate/secure/hydrosec,/turf/simulated/floor/tiled,/area/submap/Rockybase) +"cT" = (/obj/effect/decal/remains,/turf/template_noop,/area/template_noop) (1,1,1) = {" aaabababababababababababababababababababaaababababababababababababababababababababababababababababaa abacadadadaeadadadadaeadadadadadadadadadadadadadadadadadadadaeadadadadadadadadadadadadacadadadadadab abadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadab -abadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadafadadadadab -abadadadadadadadadadadafadadadadaeadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadab -abadadagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadadadadadadadadadadab -abadadagagagagagagadadadadagagagagagadadadadadadadadahahahahahahadadadadadadadadadagagagadadadadadab -abadagagagagagagagagagagagagagagagagagadadadadadaiahahajahahahahahaiadadadadadagagagagagagagagagadab -akadagagagagagagagagagagagagagagagagagagagagagahahalahahahahahajalahahagagagagagagagagagagagagagadab -abadagagamamamamamamamamamamamamamamamamamamamamamamamanaoaoanamamamamamamamamamamamamamagagagagadab -abadagamamapaqaramasasatauavavasawaxawasayamamazaAaBaCamaDaDamaEaFaGaHaIaJamaDaKamaLaMamamagagagadab -abagagamamaNaqaOamavavavavavavavavavavavavamamaPaDaDaQamaRaDamaSaTaDaDaDaUamaDaVamaDaWamamagagagadab -abagagamamaNaqaXamavaYavavaZavasbaasawasawamambbaDbcbdamaDaDambebfaDaDaDaDbgbhbiamaDbjamamagagagadab -abagagamamaqaqaqamamambkamamamamamamamamamamamambkamamamaoaoamamamamambkamamamamamblbmamamagagagadab -abagagamamambkamambnaDaDaDaDaIaDaDaDaDboaDaIaDaDaDaDaDaDaDaDaDaDaIaDaDaDaDaDaIaDamaDbjamamagagagadab -abagagamamaRaDaDaDaDaDaDbpaDaDaDbqbraDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDaDbpaDaDbkaDbjamamagagagadab -abadagamamambsamambtaDaDbhaDaDaDaDaDbuaDahbrbhaDbqaDbvaDaDaDaDaDaDaDbhaDaDaDaDbwamaDbmamamagagagadab -abadagamambxaqaqamamamamamamamamamamamahahamamamambyamamamamaDamamamamamamamamamamaDbjamamagagagadab -abadagamambzbzaqambAbBbCbDbEbFbGbHbIboahbJbKambLbMaDbNbOambPaDaDbQbRbSbTaDaDaDbUamaDbjamamagagagadab -abadagamambVbsbWamaDaDaDaDaDaDaDaDaDaDaDahbXamaDaDaDaDaDamboaDbTbTbYbZcacbccaDcdamaDbmamamagagagaeab -abadagamambzbzceamaDcfaDaDcfaDaDcgaDchaDahciamaDaDcjckclamcmaDbTcncocpcqcocrahaDamaDbjamamagagadadab -abadagamambVbsaqamcsaDaDctaDcuaDaDaDaDaDaDcvamcwcxcyckczamaDaDbTcAcqcqcocbahbJaDamaDcBamamagagadadab -abadagamambzbzcCamaDcfaDaDahahaDaDaDaDaDaDcDamaDaDcEckclamcFaDaDcGcocacacacaahbTamaDcHamamagadadadab -abadagamambVbsaqamaDaDaDaDaDaDbhcIaDcIaDaDbMamcJcKcLcMaDamcNaDcOaDaDcPcccPcQbTcRamcScTamamagagadadab -abadagagamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamagagadadafab -abadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadadadab -abadagagagagagagagagagagagagagagagagagagagagagagagagagagagagagadagagagadadadagagagagagagagadadadadab -abadadagagagagagagagagagagagagafadadadagagagagagagadadadadadadadadadadadadadadadadadadadadadadadadab -abadaeadadadadadadagagagagagadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadab -aaabcUababababababababababababababababababaaababababababababababababababababakababababababcUabakabab +abadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadab +abadadadadadadadadadadadadadadadaeadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadab +abadadafafafafafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadaeadadadadadadadadadadab +abadadafafafafafafagadadadafafafafafadadadadadadadadahahahahahahadadadadadadadadadafafafagadadadadab +abadafafafafafafafafafafafafafafafafafadadadadadaiahahajahahahahahaiadadadadadafafafafafafafafafadab +akadafafafafafafafafafafafafafafafafafafafafafahahalahahahahahajalahahafafafafafafafafafafafafafadab +abadafafamamamamamamamamamamamamamamamamamamamamamamamanaoaoanamamamamamamamamamamamamamafafafafadab +abadafamamapaqaramasatauavawawataxayaxatazamamaAaBaCaDamaEaEamaFaGaHaIaJaKamaEaLamaMaNamamafafafadab +abafafamamaOaqaPamawawawawawawawawawawawawamamaQaEaEaRamaSaEamaTaUaEaEaEaVamaEaWamaEaXamamafafafadab +abafafamamaOaqaYamawaZawawbaawatbbataxataxamambcaEbdbeamaEaEambfbgaEaEaEaEbhbibjamaEbkamamafafafadab +abafafamamaqaqaqamamamblamamamamamamamamamamamamblamamamaoaoamamamamamblamamamamambmbnamamafafafadab +abafafamamamblamamboaEaEaEaEaJaEaEaEaEbpaEaJaEaEaEaEaEaEaEaEaEaEaJaEaEaEaEbqbqbramaEbkamamafafafadab +abafafamamaSaEaEaEaEaEaEbsbqbqaEbtbuaEaEaEaEaEaEaEaEaEaEbqaEaEaEaEaEaEaEaEbsbqbqblaEbkamamafafafadab +abadafamamambvamambwaEaEbqbqbqaEaEaEbxaEahbubiaEbtaEbqbqbqaEaEaEaEaEbiaEaEaEaEbyamaEbnamamafafafadab +abadafamambzaqaqamamamamamamamamamamamahahamamamambAamamamamaEamamamamamamamamamamaEbkamamafafafadab +abadafamambBbBaqambCbDbEbFbGbHbIbJbKbpahbLbMambNbOaEbPbQambRaEaEbSbTbUbqaEaEaEbVamaEbkamamafafafadab +abadafamambWbvbXamaEaEaEaEaEaEaEaEaEaEaEahbYamaEaEaEaEaEambpaEbqbqbZcacbcccdaEceamaEbnamamafafafaeab +abadafamambBbBcfamaEcgaEaEcgaEaEchaEciaEahcjamaEbqbqckclamcmaEbqcncocpcqcocrahaEamaEbkamamafafadadab +abadafamambWbvaqamcsaEaEctaEcuaEbqbqaEaEaEcvamcwcxbqckcyamaEaEbqczcqcqcoccahbLaEamaEcAamamafafadadab +abadafamambBbBcBamaEcgaEaEahahbqbqbqbqaEaEcCamaEaEcDckclamcEaEaEcFcocbcbcbcbahbqamaEcGamamafagadadab +abadafamambWbvaqamaEaEaEaEaEaEbicHaEcHaEaEbOamcIcJcKcLaEamcMaEcNaEaEcOcdcOcPbqcQamcRcSamamafafadadab +abadafafamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamamafafadadadab +abadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadadadab +abadafafafafafafafafafafafafafafafafafafafafafafafafafafafafafadafafafadadadafafafafafafafadadadadab +abadadafafafafafafafafafafafafagadadadafafafafafafadadadadadadadadadadadadadadadadadadadadadadadadab +abadaeadadadadadadafafafafafadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadadab +aaabcTababababababababababababababababababaaababababababababababababababababakababababababcTabakabab "} From 42e896da0d28b269e72fc323f12cc13c1e3364c8 Mon Sep 17 00:00:00 2001 From: Marina Gryphon Date: Tue, 6 Feb 2018 11:28:26 -0600 Subject: [PATCH 30/30] Should fix #4740. --- code/modules/shuttles/shuttle.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/shuttles/shuttle.dm b/code/modules/shuttles/shuttle.dm index 374f7b38e5..b956f3528d 100644 --- a/code/modules/shuttles/shuttle.dm +++ b/code/modules/shuttles/shuttle.dm @@ -200,7 +200,7 @@ throwy = T.y for(var/turf/T in dstturfs) - var/turf/D = locate(T.x, throwy - 1, 1) + var/turf/D = locate(T.x, throwy - 1, T.z) for(var/atom/movable/AM as mob|obj in T) AM.Move(D)