diff --git a/mods/anomaly/_anomaly.dm b/mods/anomaly/_anomaly.dm
index 860cde45c4c32..ca36a7b4af990 100644
--- a/mods/anomaly/_anomaly.dm
+++ b/mods/anomaly/_anomaly.dm
@@ -1,4 +1,4 @@
/singleton/modpack/colony_types
name = "Интерактивные аномалии"
desc = "Добавляет в игру полноценные аномалии, вдохновлённые Ашаном, пикником на обочине и сталкером."
- author = "Shegar"
+ author = "Shegar(Код), HonkByEmo(Спрайты), AK200(Спрайты)"
diff --git a/mods/anomaly/_anomaly.dme b/mods/anomaly/_anomaly.dme
index ad56133c75f4a..a5d5fba074bd8 100644
--- a/mods/anomaly/_anomaly.dme
+++ b/mods/anomaly/_anomaly.dme
@@ -56,7 +56,11 @@
#include "code\artefacts\artefact_flyer.dm"
//#include "code\artefacts\artefact_zjemchug.dm"
-
+//Код больших артефактов
+#include "code\big_artefacts\_core.dm"
+#include "code\big_artefacts\gravi_concetration.dm"
+#include "code\big_artefacts\electra_gem.dm"
+#include "code\big_artefacts\fire_ball.dm"
//Детекторы и прочее оборудование
#include "code\detectors_and_etc\bolt.dm"
@@ -66,15 +70,9 @@
#include "code\detectors_and_etc\deployer.dm"
#include "code\detectors_and_etc\beacon.dm"
#include "code\detectors_and_etc\research_machine.dm"
-
-
-
-//Погода и эффекты на мониторе
-#include "code\monitor_effects\monitor_core.dm"
-#include "code\monitor_effects\monitor_vars.dm"
-#include "code\monitor_effects\snow_monitor_effect.dm"
-#include "code\monitor_effects\swamp_monitor_effect.dm"
-#include "code\monitor_effects\vulcan_monitor_effect.dm"
+#include "code\detectors_and_etc\artefact_detector.dm"
+#include "code\detectors_and_etc\rig_detector.dm"
+#include "code\detectors_and_etc\flux_detector.dm"
//Размещение аномалий в игре
@@ -82,6 +80,7 @@
#include "code\spawn_anomalies_protocol\spawn_anomaly_with_big_artefact.dm" //Код, отвечающий за спавн аномалий вокруг больших артефактов
#include "code\spawn_anomalies_protocol\spawn_with_ruins.dm"
#include "code\spawn_anomalies_protocol\bsd_event_protocol.dm"
+#include "code\spawn_anomalies_protocol\planet_big_artefacts.dm"
//Планетарный спавн
#include "code\spawn_anomalies_protocol\planet_spawn_protocol\_planet_spawn_core.dm"
//Летающие острова[WIP]
@@ -90,16 +89,17 @@
//Ледяная планета[WIP]
#include "code\spawn_anomalies_protocol\planet_spawn_protocol\ice.dm"
//Вулкан
-#include "code\spawn_anomalies_protocol\planet_spawn_protocol\vulcanic.dm"
//Саргасово болото [WIP-WIP]
// #include "code\spawn_anomalies_protocol\planet_spawn_protocol\sargas.dm"
#include "code\spawn_anomalies_protocol\spawn_on_planet.dm" //Спавн на планетах
-
-
+#include "code\spawn_anomalies_protocol\planet_spawn_protocol\another_planets.dm"
//Карты, диреликты и прочее
-#include "maps\electra_ruins\electra_ruins.dm"
-#include "maps\zharka_ruins\zharka_ruins.dm"
+//#include "maps\electra_ruins\electra_ruins.dm"
+//#include "maps\zharka_ruins\zharka_ruins.dm"
+//#include "maps\electra_ruins\garage.dm"
+//#include "maps\electra_ruins\bunker.dm"
+//#include "maps\electra_ruins\deployed_generator.dm"
//Код островов
#include "maps\flying_islands\flying_island.dm"
#include "maps\flying_islands\flying_island_ball.dm"
diff --git a/mods/anomaly/code/anomalies/single/electra.dm b/mods/anomaly/code/anomalies/single/electra.dm
index e082792d8a38b..d8c557f683607 100644
--- a/mods/anomaly/code/anomalies/single/electra.dm
+++ b/mods/anomaly/code/anomalies/single/electra.dm
@@ -79,6 +79,7 @@
anomaly.activate_anomaly(FALSE)
/obj/anomaly/electra/get_effect_by_anomaly(atom/movable/target)
+ set waitfor = FALSE
//Понадобится нам, если обьект по какой-либо причине будет удалён из-за удара, дабы "лучу" было куда идти
var/target_turf = get_turf(target)
if(!isturf(target.loc))
@@ -87,7 +88,10 @@
return
//Если цель подходит под критерии удара, мы рисуем молнию
var/create_line = FALSE
-
+ if(isaurora(target))
+ var/obj/structure/aurora/aurora = target
+ aurora.wake_up(rand(5 SECONDS, 10 SECONDS))
+ create_line = TRUE
@@ -128,7 +132,7 @@
var/mob/living/carbon/human/victim = target
if(victim.health == 0)
SSanom.add_last_gibbed(target, "Электра")
- anything_in_remains(victim)
+ victim.dust()
return
if(victim.lying) //Если цель лежит нам не нужно просчитывать путь до земли. Просто делаем удар в любую конечность
@@ -158,7 +162,7 @@
create_line = TRUE
var/mob/living/victim = target
if(victim.health == 0)
- anything_in_remains(victim)
+ victim.dust()
return
victim.electoanomaly_act(100, src)
diff --git a/mods/anomaly/code/anomaly_controller.dm b/mods/anomaly/code/anomaly_controller.dm
index 14a9c1991d2db..6890a46131fd6 100644
--- a/mods/anomaly/code/anomaly_controller.dm
+++ b/mods/anomaly/code/anomaly_controller.dm
@@ -43,7 +43,8 @@ PROCESSING_SUBSYSTEM_DEF(anom)
var/interactions_with_artefacts_by_players_ammount = 0
var/bad_interactions_with_artefacts_by_players_ammount = 0
var/good_interactions_with_artefacts_by_players_ammount = 0
-
+ //Большие артефакты
+ var/list/big_anomaly_artefacts = list()
//[ИНФА ПО АНОМАЛИЯМ]
diff --git a/mods/anomaly/code/artefacts/_anomaly_artefacts.dm b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm
index e80db411c8967..abb407274e3ea 100644
--- a/mods/anomaly/code/artefacts/_anomaly_artefacts.dm
+++ b/mods/anomaly/code/artefacts/_anomaly_artefacts.dm
@@ -31,11 +31,13 @@
if(AnomaliesAmmountInTurf(get_turf(src)) == 0)
connected_to_anomaly = FALSE
input_collector.try_insert_artefact(user, src)
+ SSanom.collected_artefacts_by_player++
else
for(var/obj/anomaly/anomka in src.loc.contents)
if(prob(25 * user.get_skill_value(SKILL_SCIENCE)))
to_chat(user, SPAN_GOOD("Вы аккуратно, при помощи специальных щупов, помещаете обьект в контейнер."))
connected_to_anomaly = FALSE
+ SSanom.collected_artefacts_by_player++
input_collector.try_insert_artefact(user, src)
else
to_chat(user, SPAN_WARNING("Обьект уплывает из хвата щупов"))
diff --git a/mods/anomaly/code/big_artefacts/_core.dm b/mods/anomaly/code/big_artefacts/_core.dm
new file mode 100644
index 0000000000000..36bd037c84aaf
--- /dev/null
+++ b/mods/anomaly/code/big_artefacts/_core.dm
@@ -0,0 +1,66 @@
+/obj/structure/big_artefact
+ name = "Something"
+ desc = "A large something."
+ icon = 'mods/anomaly/icons/big_artefacts.dmi'
+ density = TRUE
+ waterproof = FALSE
+ var/min_anomalies_ammout = 100
+ var/max_anomalies_ammout = 200
+ var/min_artefacts_ammount = 1
+ var/max_artefacts_ammount = 2
+ var/range_spawn = 30
+ var/list/possible_anomalies = list()
+
+/obj/structure/big_artefact/Initialize()
+ . = ..()
+ born_anomalies()
+
+///Функция, которая заспавнит вокруг большого артефакта аномалии
+/obj/structure/big_artefact/proc/born_anomalies()
+ set background = 1
+ var/started_in = world.time
+ var/list/turfs_for_spawn = list()
+ //У нас нет турфа?
+ if(!src.loc)
+ return
+ //Собираем все турфы в определённом радиусе
+ for(var/turf/turfs in RANGE_TURFS(src.loc, range_spawn))
+ if(!TurfBlocked(turfs) || TurfBlockedByAnomaly(turfs))
+ LAZYADD(turfs_for_spawn, turfs)
+ generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, min_anomalies_ammout, max_anomalies_ammout, min_artefacts_ammount, max_artefacts_ammount, null, null, "big artefact generation", started_in)
+
+/obj/structure/big_artefact/shuttle_land_on()
+ delete_artefact()
+
+/obj/structure/big_artefact/proc/delete_artefact()
+ LAZYREMOVE(SSanom.big_anomaly_artefacts, src)
+ qdel(src)
+
+/obj/structure/big_artefact/MouseDrop(obj/machinery/anomaly_container/over_object, mob/user)
+ if(istype(over_object) && CanMouseDrop(over_object, usr))
+ if (over_object.health_dead())
+ visible_message(SPAN_WARNING("\The [over_object]'s containment is broken shut."))
+ return
+ if (!over_object.allowed(usr))
+ visible_message(SPAN_WARNING("\The [over_object] blinks red, refusing to open."))
+ return
+ user.visible_message(
+ SPAN_NOTICE("\The [usr] begins placing \the [src] into \the [over_object]."),
+ SPAN_NOTICE("You begin placing \the [src] into \the [over_object].")
+ )
+ if(!do_after(usr, 4 SECONDS, over_object, DO_PUBLIC_UNIQUE))
+ return
+ user.visible_message(SPAN_NOTICE("The bolts on \the [over_object] drop with an hydraulic hiss, sealing its contents."))
+ playsound(loc, 'sound/mecha/hydraulic.ogg', 40)
+ Bumped(usr)
+ over_object.contain(src)
+ return
+
+/obj/structure/big_artefact/forceMove()
+ ..()
+ if(is_processing)
+ if(get_turf(src) != loc)
+ STOP_PROCESSING(SSanom, src)
+ else
+ if(get_turf(src) == loc)
+ START_PROCESSING(SSanom, src)
diff --git a/mods/anomaly/code/big_artefacts/electra_gem.dm b/mods/anomaly/code/big_artefacts/electra_gem.dm
new file mode 100644
index 0000000000000..4dea608ab69c1
--- /dev/null
+++ b/mods/anomaly/code/big_artefacts/electra_gem.dm
@@ -0,0 +1,40 @@
+/obj/structure/big_artefact/electra
+ icon_state = "electra_anomalies"
+ min_anomalies_ammout = 70
+ max_anomalies_ammout = 150
+ range_spawn = 30
+ possible_anomalies = list(
+ /obj/anomaly/electra/three_and_three = 1,
+ /obj/anomaly/electra/three_and_three/tesla = 2,
+ /obj/anomaly/electra/three_and_three/tesla_second = 3,
+ /obj/anomaly/cooler/two_and_two = 1,
+ /obj/anomaly/cooler/three_and_three = 1
+ )
+ //
+ var/datum/beam = null
+ var/last_electra_attack
+ var/electra_attack_cooldown
+
+/obj/structure/big_artefact/electra/Initialize()
+ .=..()
+ if(!is_processing)
+ START_PROCESSING(SSanom, src)
+ electra_attack_cooldown = rand(20 SECONDS, 50 SECONDS)
+ last_electra_attack = world.time
+
+//Пусть кусается молниями в пределах 3 турфов.
+/obj/structure/big_artefact/electra/Process()
+ if(world.time - last_electra_attack > electra_attack_cooldown)
+ electra_attack()
+
+/obj/structure/big_artefact/electra/proc/electra_attack()
+ set waitfor = FALSE
+ last_electra_attack = world.time
+ var/turf/picked_turf
+ picked_turf = pick(RANGE_TURFS(src, 3))
+ for(var/mob/living/picked_living in picked_turf)
+ picked_living.electoanomaly_act(50, src)
+ for(var/obj/structure/aurora/picked_aurora in picked_turf)
+ picked_aurora.wake_up(5 SECONDS)
+ beam = src.Beam(BeamTarget = picked_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS)
+ playsound(src, 'mods/anomaly/sounds/electra_blast.ogg', 100, FALSE )
diff --git a/mods/anomaly/code/big_artefacts/fire_ball.dm b/mods/anomaly/code/big_artefacts/fire_ball.dm
new file mode 100644
index 0000000000000..017f8a45ba047
--- /dev/null
+++ b/mods/anomaly/code/big_artefacts/fire_ball.dm
@@ -0,0 +1,9 @@
+/obj/structure/big_artefact/hot
+ icon_state = "hot_anomalies"
+ min_anomalies_ammout = 100
+ max_anomalies_ammout = 200
+ range_spawn = 30
+ possible_anomalies = list(
+ /obj/anomaly/zharka/short_effect = 1,
+ /obj/anomaly/zharka/long_effect = 2,
+ )
diff --git a/mods/anomaly/code/big_artefacts/gravi_concetration.dm b/mods/anomaly/code/big_artefacts/gravi_concetration.dm
new file mode 100644
index 0000000000000..497e9268db95b
--- /dev/null
+++ b/mods/anomaly/code/big_artefacts/gravi_concetration.dm
@@ -0,0 +1,32 @@
+/obj/structure/big_artefact/gravi
+ icon_state = "gravi_anomalies"
+ min_anomalies_ammout = 60
+ max_anomalies_ammout = 120
+ range_spawn = 30
+ possible_anomalies = list(
+ /obj/anomaly/thamplin/random = 2,
+ /obj/anomaly/rvach/three_and_three = 1
+ )
+ var/last_gravi_attack
+ var/gravi_attack_cooldown
+
+/obj/structure/big_artefact/gravi/Initialize()
+ .=..()
+ if(!is_processing)
+ START_PROCESSING(SSanom, src)
+ gravi_attack_cooldown = rand(20 SECONDS, 50 SECONDS)
+ last_gravi_attack = world.time
+
+/obj/structure/big_artefact/gravi/Process()
+ if(world.time -last_gravi_attack > gravi_attack_cooldown)
+ gravi_attack()
+
+/obj/structure/big_artefact/gravi/proc/gravi_attack()
+ set waitfor = FALSE
+ last_gravi_attack = world.time
+ for(var/turf/picked_turf in RANGE_TURFS(src, 5))
+ for(var/mob/living/picked_living in picked_turf)
+ picked_living.Weaken(3)
+ picked_living.stun_effect_act(3,1)
+ to_chat(picked_living, SPAN_WARNING("Что-то с силой прижимает вас к земле."))
+ shake_camera(picked_living, 3, 1)
diff --git a/mods/anomaly/code/detectors_and_etc/artefact_detector.dm b/mods/anomaly/code/detectors_and_etc/artefact_detector.dm
new file mode 100644
index 0000000000000..37dbdb85f954c
--- /dev/null
+++ b/mods/anomaly/code/detectors_and_etc/artefact_detector.dm
@@ -0,0 +1,89 @@
+/obj/item/artefact_detector
+ name = "artefact detector"
+ desc = "Newest advanced device, which can find artefacts."
+ icon = 'mods/anomaly/icons/artefact_detector.dmi'
+ icon_state = "medv_turned_off"
+ item_state = "on_floor_off"
+ //on_turf_icon = 'mods/anomaly/icons/artefact_detector_on_floor.dmi'
+ var/capturing_method = "RANDOM" //RANDOM - любой на Z уровне. CLOSEST - ближайший на Z уровне. LONGEST - дальнейший на Z уровне.
+ var/status = FALSE
+ var/showing_artefact = FALSE //Детектор уже указывает куда-то
+ var/obj/item/artefact/captured_artefact
+
+/obj/item/artefact_detector/examine(mob/user, distance, is_adjacent)
+ . = ..()
+ to_chat(user, SPAN_GOOD("Используйте КНТРЛ + ЛКМ для включения/выключения детектора."))
+
+//Переключения//
+/obj/item/artefact_detector/AltClick()
+ if(!status)
+ turn_on()
+ else
+ turn_off()
+ return
+
+/obj/item/artefact_detector/proc/turn_on()
+ to_chat(usr, SPAN_NOTICE("Вы включили детектор"))
+ flick("medv_turning_on", src)
+ status = TRUE
+ icon_state = "medv_turned_on"
+ item_state = "on_floor_on"
+
+/obj/item/artefact_detector/proc/turn_off()
+ to_chat(usr, SPAN_NOTICE("Вы выключили детектор"))
+ flick("medv_turning_off", src)
+ if(status)
+ forgive_artefact()
+ status = FALSE
+ icon_state = "medv_turned_off"
+ item_state = "on_floor_off"
+
+/obj/item/artefact_detector/attack_self(mob/living/user)
+ . = ..()
+ if(status)
+ find_and_capture_artefact_in_Z()
+ //Начинаем захват артефакта
+ else
+ to_chat(usr, SPAN_NOTICE("Детектор выключен."))
+
+//Процессинг//
+/obj/item/artefact_detector/Process()
+ var/dir = get_dir(get_turf(src), get_turf(captured_artefact))
+ if(!dir)
+ forgive_artefact()
+ var/text_dir = dir2text(dir)
+ icon_state = "medv_[text_dir]"
+
+///Отдельные функции///
+/obj/item/artefact_detector/proc/find_and_capture_artefact_in_Z()//Задача - найти артефакт в на Z уровне и запомнить его.
+ if(!LAZYLEN(SSanom.artefacts_list_in_world)) //Артефактов в мире попросту нет
+ to_chat(usr, SPAN_NOTICE("Похоже, [src] ничего не улавливает."))
+ return FALSE
+
+ var/list/good_z_artefacts_list = list()
+ for(var/obj/item/artefact/choosed_artefact in SSanom.artefacts_list_in_world)
+ if(get_z(src) == get_z(choosed_artefact))
+ LAZYADD(good_z_artefacts_list,choosed_artefact)
+
+ if(!LAZYLEN(good_z_artefacts_list)) //Артефакты то есть в мире, но не на нашем Z уровне
+ to_chat(usr, SPAN_NOTICE("Похоже, [src] ничего не улавливает."))
+ return FALSE
+
+ if(capturing_method == "RANDOM")
+ capture_artefact(pick(good_z_artefacts_list))
+ else if(capturing_method == "CLOSEST")
+ return
+ else if(capturing_method == "LONGEST")
+ return
+
+
+/obj/item/artefact_detector/proc/capture_artefact(obj/item/artefact/input_artefact) //Функция захватывает и запоминает артефакт.
+ to_chat(usr, SPAN_NOTICE("Похоже, [src] Что-то улавливает."))
+ captured_artefact = input_artefact
+ START_PROCESSING(SSanom, src)
+
+/obj/item/artefact_detector/proc/forgive_artefact() //Функция забывает артефакт
+ to_chat(usr, SPAN_NOTICE("[src] умолкает."))
+ captured_artefact = null
+ STOP_PROCESSING(SSanom, src)
+ icon_state = "medv_turned_on"
diff --git a/mods/anomaly/code/detectors_and_etc/beacon.dm b/mods/anomaly/code/detectors_and_etc/beacon.dm
index 0459f26c8d839..11ad5b09bf00a 100644
--- a/mods/anomaly/code/detectors_and_etc/beacon.dm
+++ b/mods/anomaly/code/detectors_and_etc/beacon.dm
@@ -12,6 +12,7 @@
for(var/obj/item/storage/bolt_bag/bag in usr)
if(bag.autocollect)
bag.can_be_inserted(src, usr, 0)
+ src.forceMove(bag)
/obj/item/advanced_bolt/Move()
. = ..()
@@ -56,3 +57,12 @@
/obj/item/advanced_bolt,
/obj/item/advanced_bolt
)
+
+/datum/design/item/bluespace/beacon
+ name = "electrostatis beacon"
+ desc = "Small metal beacon with simple electronic inside which can detect powerfull electrostatic field."
+ id = "electro_beacon"
+ req_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2)
+ build_path = /obj/item/advanced_bolt
+ materials = list(MATERIAL_ALUMINIUM = 500, MATERIAL_STEEL = 500, MATERIAL_PLASTIC = 500)
+ sort_string = "VAWAB"
diff --git a/mods/anomaly/code/detectors_and_etc/bolt.dm b/mods/anomaly/code/detectors_and_etc/bolt.dm
index 088585a89d7da..1147c11912392 100644
--- a/mods/anomaly/code/detectors_and_etc/bolt.dm
+++ b/mods/anomaly/code/detectors_and_etc/bolt.dm
@@ -12,13 +12,14 @@
for(var/obj/item/storage/bolt_bag/bag in usr)
if(bag.autocollect)
bag.can_be_inserted(src, usr, 0)
-
+ src.forceMove(bag)
/obj/item/storage/bolt_bag
name = "Bag with bolts"
desc = "Sturdy bolt storage bag."
icon = 'mods/anomaly/icons/bolts.dmi'
icon_state = "bolt_bag"
+ action_button_name = "Pull out from bag"
allow_quick_gather = TRUE
allow_quick_empty = TRUE
w_class = ITEM_SIZE_SMALL
@@ -26,6 +27,10 @@
max_storage_space = 10
var/autocollect = FALSE
+/obj/item/storage/bolt_bag/attack_self(mob/living/user)
+ usr.put_in_hands(pick(contents))
+
+
/obj/item/storage/bolt_bag/examine(mob/user, distance, is_adjacent)
. = ..()
to_chat(user, SPAN_GOOD("Use RBM and use Toggle autocollect to toggle autocollect."))
diff --git a/mods/anomaly/code/detectors_and_etc/collector.dm b/mods/anomaly/code/detectors_and_etc/collector.dm
index 51414347afbf7..535d7aec5e9c2 100644
--- a/mods/anomaly/code/detectors_and_etc/collector.dm
+++ b/mods/anomaly/code/detectors_and_etc/collector.dm
@@ -8,7 +8,7 @@
/obj/item/collector/examine(mob/user, distance, is_adjacent)
. = ..()
- to_chat(user, SPAN_GOOD("Click with collector on object to capture."))
+ to_chat(user, SPAN_GOOD("Кликните коллектором на обьект для захвата."))
/obj/item/collector/attack_hand(mob/user)
@@ -126,3 +126,4 @@
materials = list(MATERIAL_ALUMINIUM = 1000, MATERIAL_STEEL = 5000, MATERIAL_GLASS = 2500, MATERIAL_PLASTEEL = 2500, MATERIAL_PLASTIC = 1000)
build_path = /obj/item/collector
sort_string = "VAWAB"
+
diff --git a/mods/anomaly/code/detectors_and_etc/deployer.dm b/mods/anomaly/code/detectors_and_etc/deployer.dm
index 18fbc318c4544..93d30d0a3cb77 100644
--- a/mods/anomaly/code/detectors_and_etc/deployer.dm
+++ b/mods/anomaly/code/detectors_and_etc/deployer.dm
@@ -12,33 +12,30 @@
///Отвечает за то, какого цвета будет размещён маячок
var/current_beacon_type = "Green"
-///Осмот
+/obj/item/stack/flag
+ icon = 'mods/anomaly/icons/marking_beacon.dmi'
+
+/obj/item/stack/flag/set_up()
+ upright = 1
+ dir = usr.dir
+ anchored = TRUE
+ update_icon()
+
+///Осмотр
/obj/item/beacon_deployer/examine(mob/user, distance, is_adjacent)
. = ..()
- to_chat(user, SPAN_NOTICE("Its [stored_beacon_amount] inside."))
- to_chat(user, SPAN_GOOD("Use Alt + LBM to swap flag color."))
- to_chat(user, SPAN_GOOD("User Cntrl + LBM to unload some flags."))
+ to_chat(user, SPAN_NOTICE("Внутри [stored_beacon_amount] маячков."))
+ to_chat(user, SPAN_GOOD("Используйте Альт + левая кнопка мыши для изменения цвета флага."))
+ to_chat(user, SPAN_GOOD("Используйте Кнтрл + левая кнопка мыши для разрядки устройства."))
/obj/item/beacon_deployer/AltClick()
- current_beacon_type = input(usr, "Choose flag color","Choose") as null|anything in list("Green", "Red", "Yellow", "Blue")
+ current_beacon_type = input(usr, "Выберите цвет флага","Выборы-выборы...") as null|anything in list("Зелёный", "Красный", "Жёлтый", "Зелёный")
return TRUE
/obj/item/beacon_deployer/CtrlClick()
deploy_beacon(usr, FALSE, 10)
return TRUE
-
-///Кнопка слева сверху для деплоера
-/obj/item/beacon_deployer/verb/use_deployer()
- set category = "Object"
- set name = "Use flag deployer"
- set src in usr
-
- if(!usr.incapacitated())
- check_current_turf(usr)
- usr.update_action_buttons()
-
-
/obj/item/beacon_deployer/use_tool(obj/item/item, mob/living/user, list/click_params)
. = ..()
if(istype(item,/obj/item/stack/flag))
@@ -101,6 +98,7 @@
stored_beacon_amount -= deploy_amount
if(deploy)
spawned_flag.set_up()
+ spawned_flag.dir = user.dir
playsound(src, 'sound/items/shuttle_beacon_complete.ogg', 50)
diff --git a/mods/anomaly/code/detectors_and_etc/detector.dm b/mods/anomaly/code/detectors_and_etc/detector.dm
index cca3e9fd7d440..d66cb6d231b32 100644
--- a/mods/anomaly/code/detectors_and_etc/detector.dm
+++ b/mods/anomaly/code/detectors_and_etc/detector.dm
@@ -12,6 +12,7 @@
desc = "A complex technological device designed taking into account all possible dangers of anomalies."
icon = 'mods/anomaly/icons/detector.dmi'
icon_state = "detector_idle"
+ var/destroyed = FALSE // Детектор убит из-за ЭМИ и уже никогда не проснётся.
//Базовое название детектора используемое в коде смена иконок.
var/detector_basic_name = "detector"
action_button_name = "Scan anomalies"
@@ -22,10 +23,25 @@
var/in_scanning = FALSE
var/last_scan_time = 0
var/result_tesla = FALSE
+ //Круги обнаружения
+ var/start_garanted_detection_radius = 3 //Гарантированный радиус обнаружения присутствия аномалии
+ var/garanted_detection_per_skill = 2
+ var/start_chance_detection_radius = 4
+ var/chance_detection_per_skill = 4
//Некоторые детекторы могут вовсе не замечать некоторые аномалии. Укажите их теги, если потребутеся (Переменная anomaly_tag)
var/list/blacklisted_amomalies = list()
+/obj/item/clothing/gloves/anomaly_detector/emp_act(severity)
+ SHOULD_CALL_PARENT(FALSE)
+ if(!destroyed)
+ destroyed = TRUE
+ STOP_PROCESSING(SSanom, src)
+ SSanom.processing_ammount--
+
/obj/item/clothing/gloves/anomaly_detector/proc/switch_toggle()
+ if(destroyed)
+ to_chat(usr, SPAN_NOTICE("Устройство не реагирует на нажатие кнопки. Похоже, оно уже не включится."))
+ return
if(!is_processing)
to_chat(usr, SPAN_NOTICE("Вы включили детектор"))
START_PROCESSING(SSanom, src)
@@ -107,8 +123,7 @@
//Мы проверили, есть ли у пользователя базовый навык НАУКИ.
// Снижаем 1.2 секунды сканирования за каждый пункт науки у персонажа
var/user_science_lvl = user.get_skill_value(SKILL_SCIENCE)
- var/time_to_scan = (20 - (2 * user_science_lvl)) SECONDS
- var/scan_radius = (4 + user_science_lvl) //макс радиус - 9 "квадратов"
+ var/time_to_scan = (10 - (1 * user_science_lvl)) SECONDS
in_scanning = TRUE
update_icon()
usr.update_action_buttons()
@@ -117,6 +132,15 @@
update_icon()
usr.update_action_buttons()
//Время прошло, пользователь простоял нужное нам время.
+ //1.Расчитаем гарантированный круг обнаружения
+ //2.Расчитаем шансовый круг обнаружения
+ var/garant_radius = calculate_garanted_radius(user)
+ var/chance_radius = calculate_chance_radius(user)
+ var/scan_radius
+ if(chance_radius > garant_radius)
+ scan_radius = chance_radius
+ else
+ scan_radius = garant_radius
var/list/victims = list()
var/list/objs = list()
var/turf/T = get_turf(src)
@@ -124,19 +148,8 @@
//Собрали все обьекты рядом
//Список разрешённых для показа игроку аномалий
var/list/allowed_anomalies = list()
- for(var/obj/anomaly/choosed_anomaly in objs)
- //Если аномалия в блэклисте детектора - игнорируем аномалию
- if(choosed_anomaly.anomaly_tag in blacklisted_amomalies)
- continue
- if(!choosed_anomaly.is_helper) //Вспомогательные части аномалий нас не интересуют
- var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected)
- if(prob(chance_to_find))
- LAZYADD(allowed_anomalies, choosed_anomaly) //Добавляем саму аномалию
- //Если у неё есть вспомогательные части - добавляем её вспомогательные части
- if(choosed_anomaly.multitile)
- for(var/obj/anomaly/choosed_part in choosed_anomaly.list_of_parts)
- LAZYADD(allowed_anomalies, choosed_part)
- show_anomalies(user, time_to_scan, allowed_anomalies)
+ allowed_anomalies = calculate_allowed_anomalies(objs, garant_radius, user_science_lvl)
+ show_anomalies(user, 15 SECONDS, allowed_anomalies)
if(LAZYLEN(allowed_anomalies))
flick("detector_detected_anomalies", src)
usr.update_action_buttons()
@@ -145,7 +158,38 @@
update_icon()
usr.update_action_buttons()
+/obj/item/clothing/gloves/anomaly_detector/proc/calculate_allowed_anomalies(list/input_anomalies_list, garant_radius, user_science_lvl)
+ var/list/result_anomalies_list = list()
+ for(var/obj/anomaly/choosed_anomaly in input_anomalies_list)
+ //Если аномалия в блэклисте детектора - игнорируем аномалию
+ if(choosed_anomaly.anomaly_tag in blacklisted_amomalies)
+ continue
+ //Если в зоне гарант круга
+ if(get_dist(src, choosed_anomaly) <= garant_radius)
+ LAZYADD(result_anomalies_list, choosed_anomaly) //Добавляем саму аномалию
+ //Если у неё есть вспомогательные части - добавляем её вспомогательные части
+ if(choosed_anomaly.multitile)
+ for(var/obj/anomaly/choosed_part in choosed_anomaly.list_of_parts)
+ LAZYADD(result_anomalies_list, choosed_part)
+ //Если в зоне шансового круга
+ else
+ if(!choosed_anomaly.is_helper) //Вспомогательные части аномалий нас не интересуют
+ var/chance_to_find = (user_science_lvl * 20) - (100 - choosed_anomaly.chance_to_be_detected)
+ if(prob(chance_to_find))
+ LAZYADD(result_anomalies_list, choosed_anomaly) //Добавляем саму аномалию
+ //Если у неё есть вспомогательные части - добавляем её вспомогательные части
+ if(choosed_anomaly.multitile)
+ for(var/obj/anomaly/choosed_part in choosed_anomaly.list_of_parts)
+ LAZYADD(result_anomalies_list, choosed_part)
+ return result_anomalies_list
+
+/obj/item/clothing/gloves/anomaly_detector/proc/calculate_garanted_radius(mob/living/user)
+ var/skill_num = user.get_skill_value(SKILL_SCIENCE) - 1
+ return start_garanted_detection_radius + (garanted_detection_per_skill * skill_num)
+/obj/item/clothing/gloves/anomaly_detector/proc/calculate_chance_radius(mob/living/user)
+ var/skill_num = user.get_skill_value(SKILL_SCIENCE) - 1
+ return start_chance_detection_radius + (chance_detection_per_skill * skill_num)
///Показывает игроку аномалии, которые он обнаружил детектером
/proc/show_anomalies(mob/living/viewer, flick_time, allowed_anomalies)
@@ -159,7 +203,7 @@
if(user_science_lvl >= in_turf_atom.detection_skill_req)
I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.get_detection_icon())
else
- I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = in_turf_atom.detection_icon_state)
+ I = image(icon = 'mods/anomaly/icons/detection_icon.dmi',loc = T, icon_state = "any_anomaly")
I.layer = EFFECTS_ABOVE_LIGHTING_PLANE
list_of_showed_anomalies += I
@@ -172,3 +216,12 @@
info = "NSV SierraНовые опасностиОдна из последних экспедиций вернулась с новой информацией, и ранениями. Согласно последнему отчёту, экспедиционный отряд наткнулся на некую аномальную активность на одной из планет. Научно исследовательский отдел выделил вашему отряду дополнительное снаряжение в виде маячков, коллекторов аномальных образований, детектора аномальной активности и раздатчика флагов. Советуем проявлять огромную осторожность при работе на планетах. Удачи.
This paper has been stamped by the Research&Development department."
icon = 'maps/sierra/icons/obj/uniques.dmi'
icon_state = "paper_words"
+
+/datum/design/item/bluespace/detector
+ name = "anomaly detector"
+ desc = "Experiment anomaly detector, which can detect anomalies."
+ id = "anomaly_detector"
+ req_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 4, TECH_BLUESPACE = 4, TECH_POWER = 4)
+ build_path = /obj/item/clothing/gloves/anomaly_detector
+ materials = list(MATERIAL_ALUMINIUM = 4000, MATERIAL_STEEL = 4000, MATERIAL_PLASTIC = 4000)
+ sort_string = "VAWAB"
diff --git a/mods/anomaly/code/detectors_and_etc/flux_detector.dm b/mods/anomaly/code/detectors_and_etc/flux_detector.dm
new file mode 100644
index 0000000000000..740a9afa669dd
--- /dev/null
+++ b/mods/anomaly/code/detectors_and_etc/flux_detector.dm
@@ -0,0 +1,9 @@
+/obj/item/clothing/gloves/anomaly_detector/flux
+ name = "Flux-detector"
+ desc = "An extremely complex device created by the Skrell civilization."
+ icon = 'mods/anomaly/icons/flux_detector.dmi'
+ icon_state = "flux_undeployed"
+ detector_basic_name = "flux"
+ action_button_name = "Scan anomalies"
+ //Устройство не лезет на кисть.
+ slot_flags = SLOT_DENYPOCKET
diff --git a/mods/anomaly/code/detectors_and_etc/rig_detector.dm b/mods/anomaly/code/detectors_and_etc/rig_detector.dm
new file mode 100644
index 0000000000000..7a13a923f2086
--- /dev/null
+++ b/mods/anomaly/code/detectors_and_etc/rig_detector.dm
@@ -0,0 +1,39 @@
+/obj/item/rig_module/device/anomaly_detector
+ name = "Anomaly detector module"
+ desc = "Anomaly detection device."
+ icon_state = "eldersasparilla"
+ interface_name = "Anomaly detection module"
+ interface_desc = "Anomaly detector developed by R&D, installed in this module."
+ engage_string = "Begin Scan"
+
+ activate_string = "Turn on detector"
+ deactivate_string = "Turn off detector"
+
+ use_power_cost = 200
+ usable = TRUE
+ selectable = TRUE
+ device = /obj/item/clothing/gloves/anomaly_detector
+
+/obj/item/rig/exploration/equipped
+ initial_modules = list(
+ /obj/item/rig_module/maneuvering_jets,
+ /obj/item/rig_module/device/flash,
+ /obj/item/rig_module/device/anomaly_scanner,
+ /obj/item/rig_module/grenade_launcher/light,
+ /obj/item/rig_module/cooling_unit,
+ /obj/item/rig_module/device/anomaly_detector)
+
+/obj/item/rig_module/device/anomaly_detector/select()
+ if(!device.is_processing)
+ START_PROCESSING(SSanom, device)
+ ..()
+
+/obj/item/rig_module/device/anomaly_detector/activate()
+ device.CtrlClick(usr)
+
+/obj/item/rig_module/device/anomaly_detector/deactivate()
+ device.CtrlClick(usr)
+
+/obj/item/rig_module/device/anomaly_detector/engage(atom/target)
+ . = ..()
+ device.attack_self(usr)
diff --git a/mods/anomaly/code/monitor_effects/monitor_core.dm b/mods/anomaly/code/monitor_effects/monitor_core.dm
deleted file mode 100644
index a6678346d2448..0000000000000
--- a/mods/anomaly/code/monitor_effects/monitor_core.dm
+++ /dev/null
@@ -1,47 +0,0 @@
-GLOBAL_LIST_EMPTY(effected_by_weather)
-GLOBAL_VAR_INIT(ambience_channel_weather, GLOB.sound_channels.RequestChannel("AMBIENCE_WEATHER"))
-#define ismonitorhere(A) locate(/obj/monitor_effect_triger) in A
-///Кто-то или что-то вошло в монитор-эффект
-/obj/monitor_effect_triger/Crossed(O)
- react_at_enter_monitor(O)
-
-/obj/monitor_effect_triger/Uncrossed(O)
- react_at_leave_monitor(O)
-
-/obj/monitor_effect_triger/proc/add_monitor_effect(mob/living/input_mob)
- LAZYADD(input_mob,GLOB.effected_by_weather)
-
-/obj/monitor_effect_triger/proc/remove_monitor_effect(mob/living/input_mob)
- LAZYREMOVE(input_mob,GLOB.effected_by_weather)
-
-/obj/monitor_effect_triger/proc/react_at_enter_monitor(atom/movable/atom)
- if(!must_react_at_enter)
- return
- //Незачем накладывать эффект тому, кто уже с этим эффектом
- if(atom in GLOB.effected_by_weather)
- return
- if(isliving(atom))
- var/mob/living/detected_mob = atom
- //Если у моба есть клиент, значит есть на кого накладывать эффект на экран
- if(detected_mob.client)
- if(LAZYLEN(sound_type))
- var/sound = sound(pick(sound_type), repeat = TRUE, wait = 0, volume = 50, channel = GLOB.ambience_channel_weather)
- detected_mob.playsound_local(get_turf(detected_mob), sound)
- add_monitor_effect(detected_mob)
- LAZYADD(GLOB.effected_by_weather, atom)
- //Если прошло достаточно времени с предыдущего пука в чат игроку - пукнем.
- if(detected_mob.last_monitor_message < world.time)
- to_chat(detected_mob, SPAN_BAD(pick(trigger_messages_list)))
- //Добавим время от КД
- detected_mob.last_monitor_message = detected_mob.last_monitor_message + trigger_message_cooldown
-
-/obj/monitor_effect_triger/proc/react_at_leave_monitor(atom/movable/atom)
- if(!must_react_at_enter)
- return
- var/mob/detected_mob = atom
- if(!ismonitorhere(get_turf(atom)))
- if(atom in GLOB.effected_by_weather)
- LAZYREMOVE(GLOB.effected_by_weather, atom)
- remove_monitor_effect(detected_mob)
- if(LAZYLEN(sound_type))
- sound_to(detected_mob, sound(null, channel = GLOB.ambience_channel_weather))
diff --git a/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm b/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm
deleted file mode 100644
index 7c645cb55a72c..0000000000000
--- a/mods/anomaly/code/monitor_effects/snow_monitor_effect.dm
+++ /dev/null
@@ -1,38 +0,0 @@
-//Эффект снежной вьюги
-/obj/monitor_effect_triger/snow
- icon_state = "snow_storm"
- icon = 'mods/anomaly/icons/weather_effects.dmi'
- must_react_at_enter = TRUE
- sound_type = list(
- 'mods/anomaly/sounds/snowstorm.ogg'
- )
-
-/obj/monitor_effect_triger/snow
- trigger_messages_list = list(
- "Мрачные облака, толстый слой инея на земле и стремительные порывы ветра делают каждый шаг испытанием.",
- "Белое пространство, прерываемое лишь силуэтами ледяных скал, напоминающих причудливые формации.",
- "Бесконечный буран, да и только. Паршивая планета.",
- "Куда ни глянь — пустота. Ядовито-белый мрак простирается до самого горизонта, как бесконечный океан.",
- "Холод, кажется, проникает не только внутрь, но и в самые глубокие уголки твоей души сквозь скафандр. Каждое движение даётся через силу, а мысли теряются среди непрекращающегося гула ветра.",
- "Рокот небес, напряженный до предела, сопровождает каждое твое движение.",
- "Ледяная пыль начинает шевелиться, и этот далекий гул намекает на опасность.",
- "Ты поднимаешь голову, наблюдая, как пурга хлещет по ледяным вершинам.",
- "Каждый шорох и треск вокруг как будто вызывают у тебя певучее предчувствие опасности.",
- "Тьма нависла над тобой, как тяжелый саван. Кажется, что даже звезды в небе отдалились от этого ледяного кошмара."
- )
-
-//Эффект снега на экране
-/obj/screen/fullscreen/snow_effect
- icon = 'mods/anomaly/icons/snow_screen.dmi'
- icon_state = "snow"
- layer = BLIND_LAYER
- scale_to_view = TRUE
-
-
-
-/obj/monitor_effect_triger/snow/add_monitor_effect(mob/living/input_mob)
- input_mob.overlay_fullscreen("snow_monitor", /obj/screen/fullscreen/snow_effect)
- //Логируем пользователя в глобальный список
-
-/obj/monitor_effect_triger/snow/remove_monitor_effect(mob/living/input_mob)
- input_mob.clear_fullscreen("snow_monitor")
diff --git a/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm b/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm
deleted file mode 100644
index b7906c1aad193..0000000000000
--- a/mods/anomaly/code/monitor_effects/swamp_monitor_effect.dm
+++ /dev/null
@@ -1,2 +0,0 @@
-/obj/monitor_effect_triger/swamp
- name = "bam"
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm b/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm
index e71859d248713..059b949b93981 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/core_spawn_protocol.dm
@@ -92,8 +92,10 @@ source - Источник(Причина) генерации аномалий н
set background = 1
//Расчитываем мин и макс количество аномалий
var/result_anomalies_ammout = 1
- min_anomalies_ammout = calculate_min_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, LAZYLEN(all_turfs_for_spawn))
- max_anomalies_ammout = calculate_max_anomalies_ammout(min_anomaly_size, max_anomaly_size, max_anomalies_ammout, LAZYLEN(all_turfs_for_spawn))
+ if(!min_anomalies_ammout)
+ min_anomalies_ammout = calculate_min_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, LAZYLEN(all_turfs_for_spawn))
+ if(!max_anomalies_ammout)
+ max_anomalies_ammout = calculate_max_anomalies_ammout(min_anomaly_size, max_anomaly_size, max_anomalies_ammout, LAZYLEN(all_turfs_for_spawn))
result_anomalies_ammout = calculate_result_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, max_anomalies_ammout, result_anomalies_ammout, LAZYLEN(all_turfs_for_spawn))
@@ -224,6 +226,8 @@ source - Источник(Причина) генерации аномалий н
/proc/calculate_min_anomalies_ammout(min_anomaly_size, max_anomaly_size, min_anomalies_ammout, all_turfs_for_spawn_len)
+ if(!min_anomaly_size)
+ min_anomaly_size = 1
if((!min_anomalies_ammout) || (min_anomalies_ammout * min_anomaly_size > all_turfs_for_spawn_len))
min_anomalies_ammout = 1
return min_anomalies_ammout
@@ -231,6 +235,8 @@ source - Источник(Причина) генерации аномалий н
/proc/calculate_max_anomalies_ammout(min_anomaly_size, max_anomaly_size, max_anomalies_ammout, all_turfs_for_spawn_len)
+ if(!max_anomaly_size)
+ max_anomaly_size = 1
if(!max_anomalies_ammout)
max_anomalies_ammout = all_turfs_for_spawn_len
max_anomalies_ammout /= max_anomaly_size
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_big_artefacts.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_big_artefacts.dm
new file mode 100644
index 0000000000000..998f1cf92c8ed
--- /dev/null
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_big_artefacts.dm
@@ -0,0 +1,70 @@
+/obj/overmap/visitable/sector/exoplanet
+ var/big_anomaly_artefacts_min_amount = 4 //Минимальное количество больших артефактов
+ var/big_anomaly_artefacts_max_amount = 6 //Максимальное количество больших артефактов
+ var/big_anomaly_artefacts_amount = 0 //Фиксированное количество больших артефактов
+ //Какие большие артефакты будут заспавнены
+ var/list/big_artefacts_types = list(
+ )
+ var/big_artefacts_zones_can_overlap = TRUE
+ var/big_artefacts_can_be_close = TRUE
+ var/big_artefacts_range_spawn = 30
+
+/obj/overmap/visitable/sector/exoplanet/proc/generate_big_anomaly_artefacts()
+ set background = 1
+ var/started_in = world.time
+ var/result_big_artefacts_amount = calculate_result_big_artefacts()
+
+ if(result_big_artefacts_amount <= 0)
+ return
+
+ var/list/all_turfs = collect_good_turfs() //Все хорошие турфы на планете
+
+ if(!LAZYLEN(all_turfs)) //если каким-то чудом у нас нет хороших турфов
+ log_and_message_admins("ОШИБКА. Аномальная планета не смогла разместить аномальные артефакты.")
+ CRASH("ОШИБКА. Аномальная планета не смогла разместить аномальные артефакты.")
+
+
+ var/i = 1
+ var/false_counter = 0
+ var/spawned_big_artefacts = 0
+ while(i <= result_big_artefacts_amount)
+
+ if(!LAZYLEN(all_turfs))
+ break
+
+ var/status = TRUE
+ var/turf/picked_turf = pick(all_turfs) //Выбираем турф
+ if(!big_artefacts_can_be_close)
+ for(var/obj/structure/big_artefact/artefact in range(big_artefacts_range_spawn))
+ status = FALSE
+ false_counter++
+ LAZYREMOVE(all_turfs, picked_turf)
+ break
+
+ if(status)
+ var/big_artefact_type_for_spawn = pick(big_artefacts_types)
+ var/obj/structure/big_artefact/spawned_big_artefact = new big_artefact_type_for_spawn(picked_turf)
+ LAZYADD(SSanom.big_anomaly_artefacts,spawned_big_artefact)
+ spawned_big_artefacts++
+
+ if(false_counter >= 100)
+ break
+
+ i++
+
+ report_progress("Spawned [spawned_big_artefacts] big anomaly artefacts (Tryed to spawn [result_big_artefacts_amount]) for anomaly planet. Spended [world.time - started_in] ticks ")
+
+
+/obj/overmap/visitable/sector/exoplanet/proc/collect_good_turfs()
+ var/list/temp_list = list()
+ for(var/turf/choosed_turf in planetary_area)
+ //Фильтруем
+ if(!TurfBlocked(choosed_turf) && !TurfBlockedByAnomaly(choosed_turf))
+ LAZYADD(temp_list, choosed_turf)
+ return temp_list
+
+/obj/overmap/visitable/sector/exoplanet/proc/calculate_result_big_artefacts()
+ if(!big_anomaly_artefacts_amount && big_anomaly_artefacts_min_amount && big_anomaly_artefacts_max_amount)
+ return rand(big_anomaly_artefacts_min_amount, big_anomaly_artefacts_max_amount)
+ else
+ return big_anomaly_artefacts_amount
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm
index 7632195bdccdc..d497a48c97517 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/_planet_spawn_core.dm
@@ -21,11 +21,10 @@
for (var/datum/exoplanet_theme/T in themes)
T.after_map_generation(src)
//Спавним аномалии
- if(can_spawn_anomalies)
- generate_anomalies()
+ if(LAZYLEN(big_artefacts_types))
+ generate_big_anomaly_artefacts()
+ deploy_weather()
//Если у планеты есть погода - спавним погоду
- if(monitor_effect_type)
- generate_monitor_effects()
generate_landing(2)
update_biome()
generate_daycycle()
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/another_planets.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/another_planets.dm
new file mode 100644
index 0000000000000..7fc888060a2c4
--- /dev/null
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/another_planets.dm
@@ -0,0 +1,20 @@
+/obj/overmap/visitable/sector/exoplanet/desert
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/barren
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/chlorine
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/grass
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/shrouded
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/snow
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
+
+/obj/overmap/visitable/sector/exoplanet/volcanic
+ ruin_tags_blacklist = RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm
index fb65cdd421fdf..a6d56b5ac905a 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/flying_planet/flying.dm
@@ -3,18 +3,18 @@
desc = "A cluster of floating islands moving around an unknown object. WARNING: large gravity-anomalous activity detected. Extreme caution is required."
color = "#ebe3e3"
rock_colors = list(COLOR_WHITE)
- can_spawn_anomalies = TRUE
- anomalies_type = list(
- /obj/anomaly/tramplin = 2,
- /obj/anomaly/rvach/three_and_three = 1
+ //Большие артефакты
+ big_anomaly_artefacts_min_amount = 4
+ big_anomaly_artefacts_max_amount = 6
+ big_artefacts_types = list(
+ /obj/structure/big_artefact/gravi
)
+ big_artefacts_can_be_close = FALSE
+ big_artefacts_range_spawn = 30
+ //
possible_themes = list(
/datum/exoplanet_theme = 100
)
- min_anomaly_size = 1
- max_anomaly_size = 9
- min_anomalies_ammout = 500
- max_anomalies_ammout = 700
planetary_area = /area/exoplanet/flying
map_generators = list(/datum/random_map/noise/exoplanet/flying)
ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
@@ -60,8 +60,9 @@
//Основные изменения
for (var/datum/exoplanet_theme/T in themes)
T.after_map_generation(src)
- if(can_spawn_anomalies)
- generate_anomalies()
+ if(LAZYLEN(big_artefacts_types))
+ generate_big_anomaly_artefacts()
+ deploy_weather()
generate_landing(2)
update_biome()
generate_daycycle()
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm
index dadf4498cadd1..cedcbf30e44fd 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/ice.dm
@@ -3,28 +3,24 @@
desc = "A distant, abandoned and cold world, rich in artefacts and anomalous activity."
color = "#ebe3e3"
rock_colors = list(COLOR_WHITE)
- can_spawn_anomalies = TRUE
- monitor_effect_type = /obj/monitor_effect_triger/snow
- anomalies_type = list(
- /obj/anomaly/electra/three_and_three = 2,
- /obj/anomaly/electra/three_and_three/tesla = 7,
- /obj/anomaly/electra/three_and_three/tesla_second = 6,
- /obj/anomaly/cooler/two_and_two = 3,
- /obj/anomaly/cooler/three_and_three = 3
+ //Большие артефакты
+ big_anomaly_artefacts_min_amount = 4
+ big_anomaly_artefacts_max_amount = 6
+ big_artefacts_types = list(
+ /obj/structure/big_artefact/electra
)
+ big_artefacts_can_be_close = FALSE
+ big_artefacts_range_spawn = 30
+ weather_manager_type = /obj/weather_manager/snow
+ //
possible_themes = list(
/datum/exoplanet_theme = 45,
- /datum/exoplanet_theme/radiation_bombing = 10,
- /datum/exoplanet_theme/ruined_city = 5,
- /datum/exoplanet_theme/robotic_guardians = 10
+ /datum/exoplanet_theme/radiation_bombing = 10
)
- min_anomaly_size = 4
- max_anomaly_size = 9
- min_anomalies_ammout = 600
- max_anomalies_ammout = 800
planetary_area = /area/exoplanet/ice
map_generators = list(/datum/random_map/automata/cave_system/mountains/ice, /datum/random_map/noise/exoplanet/ice)
ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES
+ ruin_tags_whitelist = RUIN_ELECTRA_ANOMALIES
surface_color = "#ffffff"
water_color = "#0700c7"
habitability_weight = HABITABILITY_EXTREME
@@ -58,7 +54,7 @@
color = COLOR_WHITE
/obj/overmap/visitable/sector/exoplanet/ice/generate_map()
- .=..()
+ ..()
//После создания карты, разместим камушки
var/list/list_of_turfs = get_area_turfs(planetary_area)
//Соберём все подходящие для нас турфы льда
@@ -246,6 +242,7 @@
icon = 'mods/anomaly/icons/icerocks.dmi'
icon_state = "rock_1"
anchored = TRUE
+ density = TRUE
var/icon_state_list = list("rock_1", "rock_2", "rock_3")
/obj/structure/ice_rock/Initialize()
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm
index b29fa45667931..0595735cd0c07 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/sargas.dm
@@ -5,7 +5,7 @@
color = "#054515"
rock_colors = list(COLOR_WHITE)
can_spawn_anomalies = TRUE
- monitor_effect_type = /obj/monitor_effect_triger/swamp
+ monitor_effect_type = /obj/weather/swamp
anomalies_type = list()
min_anomaly_size = 4
max_anomaly_size = 9
@@ -13,7 +13,7 @@
max_anomalies_ammout = 400
planetary_area = /area/exoplanet/swamp
map_generators = list(/datum/random_map/noise/exoplanet/swamp)
- ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES
+ ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_HOT_ANOMALIES|RUIN_ELECTRA_ANOMALIES
surface_color = "#ffffff"
water_color = "#263908"
habitability_weight = HABITABILITY_EXTREME
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm b/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm
deleted file mode 100644
index 19cd927e4cee6..0000000000000
--- a/mods/anomaly/code/spawn_anomalies_protocol/planet_spawn_protocol/vulcanic.dm
+++ /dev/null
@@ -1,14 +0,0 @@
-/obj/overmap/visitable/sector/exoplanet/volcanic
- can_spawn_anomalies = TRUE
- anomalies_type = list(
- /obj/anomaly/zharka = 4,
- /obj/anomaly/zharka/short_effect = 2,
- /obj/anomaly/zharka/long_effect = 1,
- /obj/anomaly/heater/three_and_three = 3,
- /obj/anomaly/heater/two_and_two = 3
- )
- min_anomalies_ammout = 250
- max_anomalies_ammout = 400
- min_anomaly_size = 1
- max_anomaly_size = 9
- ruin_tags_blacklist = RUIN_HABITAT|RUIN_WATER|RUIN_ELECTRA_ANOMALIES
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm b/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm
index 90b0458867f0e..0ece92ab90daf 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/spawn_anomaly_with_big_artefact.dm
@@ -3,34 +3,37 @@
//Генерирует ли при спавне данный артефакт вокруг себя артефакты?
var/can_born_anomalies = TRUE
///Минимальное количество аномалий, которое заспавнит артефакт
- var/min_anomalies_ammout = 10
+ var/min_anomalies_ammout = 1
///Максимальное количество аномалий, которое заспавнит артефакт
- var/max_anomalies_ammout = 20
- //Честно указываем какой максимальный и минимальный размер аномалий, что могут быть заспавнены артефактом
- var/max_anomaly_size = 9
- var/min_anomaly_size = 1
- var/min_artefacts_ammount = 1
- var/max_artefacts_ammount = 2
+ var/max_anomalies_ammout = 2
+ var/min_artefacts_ammount = 0
+ var/max_artefacts_ammount = 0
///Область в которой будет спавнить аномалии
- var/range_spawn = 6
+ var/range_spawn = 3
//Лист возможных аномалий для спавна
var/list/possible_anomalies = list(
- /obj/anomaly/electra/three_and_three = 5,
- /obj/anomaly/electra/three_and_three/tesla = 1,
- /obj/anomaly/thamplin/random = 5,
- /obj/anomaly/zharka/short_effect = 3,
- /obj/anomaly/zharka/long_effect = 2,
- /obj/anomaly/rvach/three_and_three = 4
+ /obj/anomaly/zharka,
+ /obj/anomaly/zharka/short_effect,
+ /obj/anomaly/zharka/long_effect,
+ /obj/anomaly/electra/three_and_three,
+ /obj/anomaly/electra/three_and_three/tesla,
+ /obj/anomaly/electra/three_and_three/tesla_second,
+ /obj/anomaly/vspishka,
+ /obj/anomaly/rvach/three_and_three,
+ /obj/anomaly/heater/three_and_three,
+ /obj/anomaly/heater/two_and_two,
+ /obj/anomaly/cooler/two_and_two,
+ /obj/anomaly/cooler/three_and_three
)
-/*
+
//Выведено из ротации, большой артефакт ничего не спавнит
/obj/machinery/artifact/Initialize()
. = ..()
if(icon_num == 0 || icon_num == 1 || icon_num == 7 || icon_num == 11)
if(can_born_anomalies)
born_anomalies()
-*/
+
/obj/machinery/artifact/no_anomalies
can_born_anomalies = FALSE
@@ -46,4 +49,4 @@
for(var/turf/turfs in RANGE_TURFS(src.loc, range_spawn))
if(!TurfBlocked(turfs) || TurfBlockedByAnomaly(turfs))
LAZYADD(turfs_for_spawn, turfs)
- generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, min_anomalies_ammout, max_anomalies_ammout, min_artefacts_ammount, max_artefacts_ammount, min_anomaly_size, max_anomaly_size, "big artefact generation", started_in)
+ generate_anomalies_in_turfs(possible_anomalies, turfs_for_spawn, min_anomalies_ammout, max_anomalies_ammout, min_artefacts_ammount, max_artefacts_ammount, null, null, "big artefact generation", started_in)
diff --git a/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm b/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm
index 51c868c2a0062..ded06a0d5d56e 100644
--- a/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm
+++ b/mods/anomaly/code/spawn_anomalies_protocol/spawn_on_planet.dm
@@ -1,9 +1,8 @@
/datum/map/build_exoplanets()
//Игра заспавнит 1 обычную планету и 1 аномальную
var/list/anomaly_planets_list = list(
- /obj/overmap/visitable/sector/exoplanet/ice,
- /obj/overmap/visitable/sector/exoplanet/volcanic,
- /obj/overmap/visitable/sector/exoplanet/flying
+ /obj/overmap/visitable/sector/exoplanet/ice,
+ /obj/overmap/visitable/sector/exoplanet/flying
)
var/list/all_planets_list = subtypesof(/obj/overmap/visitable/sector/exoplanet)
//Я не придумал как обьяснять игре какая планета обычная, а какая аномальная без
@@ -27,7 +26,7 @@
var/can_spawn_anomalies = FALSE
var/list/anomalies_type = list(
)
- var/obj/monitor_effect_triger/monitor_effect_type
+ var/obj/weather/monitor_effect_type
var/min_anomaly_size = 1
var/max_anomaly_size = 3
///Минимальное количество заспавненных артов
@@ -78,10 +77,20 @@
return FALSE
return TRUE
-/obj/overmap/visitable/sector/exoplanet/proc/generate_monitor_effects()
- set background = 1
- for(var/turf/choosed_turf in planetary_area)
- new monitor_effect_type(choosed_turf)
+/obj/overmap/visitable/sector/exoplanet/proc/full_clear_from_anomalies()//Функция очищает планету от аномалий и аномальных больших артефактов
+ set waitfor = FALSE
+ var/deleted_anomalies = 0
+ var/deleted_big_artefacts = 0
+ var/list/planet_turfs = get_area_turfs(planetary_area)
+ for(var/obj/anomaly/picked_anomaly in SSanom.all_anomalies_cores)
+ if(!picked_anomaly.is_helper && planet_turfs.Find(get_turf(picked_anomaly)))
+ picked_anomaly.delete_anomaly()
+ deleted_anomalies++
+ for(var/obj/structure/big_artefact/picked_big_artefact in SSanom.big_anomaly_artefacts)
+ if(planet_turfs.Find(get_turf(picked_big_artefact)))
+ qdel(picked_big_artefact)
+ deleted_big_artefacts++
+ report_progress("Выполнена очистка планеты [name]. Удалено аномалий: [deleted_anomalies]. Удалено больших артефактов: [deleted_big_artefacts]. ")
diff --git a/mods/anomaly/icons/artefact_detector.dmi b/mods/anomaly/icons/artefact_detector.dmi
new file mode 100644
index 0000000000000..de400b084549b
Binary files /dev/null and b/mods/anomaly/icons/artefact_detector.dmi differ
diff --git a/mods/anomaly/icons/artefact_detector_on_floor.dmi b/mods/anomaly/icons/artefact_detector_on_floor.dmi
new file mode 100644
index 0000000000000..e59d48c11deee
Binary files /dev/null and b/mods/anomaly/icons/artefact_detector_on_floor.dmi differ
diff --git a/mods/anomaly/icons/big_artefacts.dmi b/mods/anomaly/icons/big_artefacts.dmi
new file mode 100644
index 0000000000000..38451f86b1dad
Binary files /dev/null and b/mods/anomaly/icons/big_artefacts.dmi differ
diff --git a/mods/anomaly/icons/detection_icon.dmi b/mods/anomaly/icons/detection_icon.dmi
index 2c0dd4cd7da1c..eae6579359b49 100644
Binary files a/mods/anomaly/icons/detection_icon.dmi and b/mods/anomaly/icons/detection_icon.dmi differ
diff --git a/mods/anomaly/icons/effects.dmi b/mods/anomaly/icons/effects.dmi
index 2695acfbebc6d..b7bee015415f7 100644
Binary files a/mods/anomaly/icons/effects.dmi and b/mods/anomaly/icons/effects.dmi differ
diff --git a/mods/anomaly/icons/flux_detector.dmi b/mods/anomaly/icons/flux_detector.dmi
new file mode 100644
index 0000000000000..fb531ce8d5138
Binary files /dev/null and b/mods/anomaly/icons/flux_detector.dmi differ
diff --git a/mods/anomaly/icons/gurza_detector.dmi b/mods/anomaly/icons/gurza_detector.dmi
index f576983e10580..b597a1879c03e 100644
Binary files a/mods/anomaly/icons/gurza_detector.dmi and b/mods/anomaly/icons/gurza_detector.dmi differ
diff --git a/mods/anomaly/icons/marking_beacon.dmi b/mods/anomaly/icons/marking_beacon.dmi
new file mode 100644
index 0000000000000..7fe2efd486f05
Binary files /dev/null and b/mods/anomaly/icons/marking_beacon.dmi differ
diff --git a/mods/anomaly/maps/electra_ruins/bunker.dm b/mods/anomaly/maps/electra_ruins/bunker.dm
new file mode 100644
index 0000000000000..8908ee2ce82fb
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/bunker.dm
@@ -0,0 +1,14 @@
+/datum/map_template/ruin/exoplanet/electra_bunker
+ name = "science bunker"
+ id = "planetsite_anomalies_bunker"
+ description = "anomalies lol."
+ mappaths = list('mods/anomaly/maps/electra_ruins/bunker.dmm')
+ spawn_cost = 1
+ ruin_tags = RUIN_ELECTRA_ANOMALIES
+ apc_test_exempt_areas = list(
+ /area/map_template/bunker = NO_SCRUBBER|NO_VENT|NO_APC
+ )
+
+/area/map_template/bunker
+ name = "\improper Science bunker"
+ icon_state = "A"
diff --git a/mods/anomaly/maps/electra_ruins/bunker.dmm b/mods/anomaly/maps/electra_ruins/bunker.dmm
new file mode 100644
index 0000000000000..5307fa3e296f5
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/bunker.dmm
@@ -0,0 +1,2481 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"ab" = (
+/obj/decal/cleanable/ash,
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"as" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"az" = (
+/obj/structure/aurora/cable,
+/turf/simulated/floor,
+/area/map_template/bunker)
+"aJ" = (
+/obj/structure/grille/broken,
+/obj/structure/ice_rock,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"bd" = (
+/obj/structure/grille/broken,
+/obj/structure/aurora/cable,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"bi" = (
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"bI" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/crumpled,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"cd" = (
+/obj/structure/table/rack,
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"dl" = (
+/obj/item/storage/mirror{
+ pixel_y = 32
+ },
+/obj/structure/hygiene/sink{
+ dir = 1;
+ pixel_y = 16
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"dR" = (
+/obj/structure/bed/chair/comfy/brown{
+ dir = 4
+ },
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"dV" = (
+/obj/machinery/portable_atmospherics/canister/empty,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"fq" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"fr" = (
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"fQ" = (
+/obj/structure/table/rack,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"fR" = (
+/obj/wallframe_spawn/reinforced_phoron/hull,
+/obj/machinery/door/blast/shutters,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"fW" = (
+/obj/structure/table/reinforced,
+/obj/item/paper/anomaly_scan,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"gf" = (
+/obj/structure/table/rack,
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"gg" = (
+/obj/structure/bed/chair/comfy/brown{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"gI" = (
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"hs" = (
+/obj/structure/firedoor_assembly,
+/obj/machinery/door/blast/regular/open,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"hC" = (
+/obj/structure/table/marble,
+/obj/machinery/chemical_dispenser/bar_coffee/full,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"if" = (
+/obj/structure/bed/chair/comfy/brown{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"is" = (
+/obj/structure/table/marble,
+/obj/machinery/chemical_dispenser/bar_alc/full{
+ dir = 4
+ },
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"iv" = (
+/obj/structure/aurora/smes,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"iy" = (
+/turf/simulated/floor,
+/area/map_template/bunker)
+"jn" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"jA" = (
+/obj/structure/cable/orange,
+/turf/simulated/floor,
+/area/map_template/bunker)
+"jR" = (
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"ls" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"nE" = (
+/obj/structure/bed/chair/armchair/red{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"nK" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"nU" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/map_template/bunker)
+"oA" = (
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"oS" = (
+/obj/structure/table/steel_reinforced,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"pd" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"pF" = (
+/obj/machinery/constructable_frame/machine_frame,
+/obj/decal/cleanable/ash,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"qI" = (
+/obj/machinery/door/unpowered/simple/glass,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"qN" = (
+/obj/structure/bed/chair/comfy/brown,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"rw" = (
+/obj/machinery/door/blast/shutters/open,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"rC" = (
+/obj/structure/reagent_dispensers/watertank,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"st" = (
+/obj/structure/table/reinforced,
+/obj/machinery/door/blast/shutters,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"sQ" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/map_template/bunker)
+"sT" = (
+/obj/structure/aurora/informative/old_computer{
+ possible_information = list("Рапорт N3124: Экспедицию на ледяную планету приказано свернуть. Вчера на планете по неизвестным для нас причиниам началась сильнейшая электромагнитная активность, некоторые сотрудники сообщали, что видели молнии - вздор. В любом случае, до выяснения безопасности планеты, весь основной научный состав эвакуируется с планеты, этот бункер консервируется. Вероятно, процедура проверки займёт не больше нескольких суток.", "Рапорт N1234: Высадились на ледяную экзопланету для проведения ряда научных изучений. Все аванпосты в штатном режиме, связь функционирует прекрасно, судно на орбите на связи.")
+ },
+/obj/structure/table/reinforced,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"sX" = (
+/obj/structure/table/rack,
+/obj/item/clothing/head/bio_hood/anomaly,
+/obj/item/clothing/suit/bio_suit/anomaly,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"td" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"ua" = (
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"vI" = (
+/obj/structure/aurora/informative/old_computer,
+/obj/structure/table/reinforced,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"wF" = (
+/obj/machinery/mech_recharger,
+/obj/structure/mech_wreckage,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"xg" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"xu" = (
+/turf/simulated/wall/r_titanium,
+/area/template_noop)
+"xM" = (
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/structure/closet/crate/freezer/rations,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"xY" = (
+/obj/machinery/door/blast/regular,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"yp" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/steel_ridged,
+/area/template_noop)
+"yE" = (
+/obj/structure/closet/fridge/meat,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"zc" = (
+/obj/decal/cleanable/ash,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"zd" = (
+/obj/machinery/robotics_fabricator{
+ req_access = list()
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"AX" = (
+/obj/item/paper/crumpled,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"By" = (
+/obj/machinery/door/unpowered/simple/iron,
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"BY" = (
+/obj/structure/reagent_dispensers/fueltank,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Cc" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"CS" = (
+/obj/machinery/portable_atmospherics/hydroponics,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"CU" = (
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"DH" = (
+/obj/machinery/door/blast/regular/open,
+/obj/structure/broken_door,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/map_template/bunker)
+"Eu" = (
+/obj/anomaly/electra/three_and_three/tesla_second,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"FI" = (
+/obj/machinery/constructable_frame/machine_frame,
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"FY" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"Gv" = (
+/obj/machinery/atmospherics/unary/tank/air{
+ dir = 4;
+ start_pressure = 4559.63
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"GN" = (
+/obj/structure/table/steel_reinforced,
+/obj/item/reagent_containers/food/drinks/glass2/coffeecup/metal{
+ pixel_y = -18;
+ pixel_x = 8
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Ha" = (
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/item/storage/mre/random,
+/obj/structure/closet/crate/freezer/rations,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Hh" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/map_template/bunker)
+"Hj" = (
+/obj/structure/table/marble,
+/obj/machinery/chemical_dispenser/bar_soft/full{
+ pixel_y = 8;
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Hk" = (
+/turf/simulated/floor/tiled/steel_ridged,
+/area/template_noop)
+"Ho" = (
+/obj/machinery/door/unpowered/simple/glass,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/map_template/bunker)
+"HX" = (
+/obj/machinery/door/blast/regular/open,
+/obj/structure/broken_door,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/template_noop)
+"IH" = (
+/turf/simulated/mineral/ice,
+/area/template_noop)
+"Jx" = (
+/turf/simulated/wall/r_titanium,
+/area/map_template/bunker)
+"Ka" = (
+/obj/structure/sign/hydrostorage{
+ pixel_y = 32
+ },
+/obj/machinery/vending/hydronutrients,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"KJ" = (
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"La" = (
+/obj/machinery/door/firedoor/autoset,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Lb" = (
+/obj/machinery/mech_recharger,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Mq" = (
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"MD" = (
+/obj/structure/hygiene/shower{
+ dir = 8;
+ pixel_x = 9
+ },
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"ML" = (
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"MQ" = (
+/obj/structure/table/marble,
+/obj/machinery/microwave,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Ni" = (
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Nl" = (
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/tiled/steel_ridged,
+/area/template_noop)
+"Nn" = (
+/obj/machinery/atmospherics/unary/tank/air{
+ start_pressure = 4559.63
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"NJ" = (
+/obj/structure/table/reinforced,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"Od" = (
+/obj/structure/bed/chair/comfy/brown{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Of" = (
+/obj/item/clothing/suit/bio_suit/anomaly,
+/obj/item/clothing/head/bio_hood/anomaly,
+/obj/structure/table/rack,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"Ph" = (
+/obj/structure/aurora/informative/old_computer,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"Pw" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"PC" = (
+/obj/machinery/door/unpowered/simple/iron,
+/turf/simulated/floor/tiled/techfloor,
+/area/map_template/bunker)
+"PO" = (
+/obj/structure/closet,
+/obj/item/clothing/under/rank/roboticist,
+/obj/item/book/manual/robotics_cyborgs,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"PP" = (
+/obj/item/bedsheet/brown,
+/obj/structure/bed,
+/obj/structure/curtain/open/bed{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"PS" = (
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"QQ" = (
+/obj/floor_decal/industrial/outline/yellow,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"QW" = (
+/obj/machinery/portable_atmospherics/powered/scrubber,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Rq" = (
+/obj/structure/hygiene/toilet,
+/turf/simulated/floor/tiled/freezer,
+/area/map_template/bunker)
+"Sp" = (
+/obj/machinery/door/unpowered/simple/glass,
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"Tf" = (
+/obj/structure/aurora/beaker_dropper,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"TI" = (
+/obj/machinery/portable_atmospherics/canister/air,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Uy" = (
+/obj/structure/aurora/informative/old_computer,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"UU" = (
+/obj/decal/cleanable/ash,
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"Vb" = (
+/obj/structure/aurora/informative/old_computer,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"WQ" = (
+/obj/machinery/door/unpowered/simple/iron,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+"WS" = (
+/obj/structure/ice_rock,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"Ye" = (
+/obj/structure/bed,
+/obj/item/bedsheet/brown,
+/obj/structure/curtain/open/bed{
+ anchored = 1
+ },
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Yz" = (
+/obj/machinery/portable_atmospherics/canister/oxygen,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Zf" = (
+/obj/machinery/door/unpowered/simple/iron,
+/turf/simulated/floor/tiled,
+/area/map_template/bunker)
+"Zy" = (
+/obj/anomaly/electra/three_and_three/tesla_second,
+/turf/simulated/floor/tiled/white,
+/area/map_template/bunker)
+
+(1,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(2,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(3,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(4,1,1) = {"
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(5,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(6,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(7,1,1) = {"
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(8,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+WS
+fr
+fr
+IH
+IH
+IH
+fr
+fr
+IH
+IH
+IH
+IH
+fr
+IH
+IH
+IH
+IH
+IH
+IH
+fr
+IH
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(9,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+IH
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(10,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fq
+fr
+fr
+fq
+fr
+fr
+fq
+fr
+fr
+fq
+fr
+fr
+fq
+fr
+fr
+fq
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(11,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(12,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+"}
+(13,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(14,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(15,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(16,1,1) = {"
+fr
+fr
+fr
+WS
+fr
+xu
+xu
+xu
+Jx
+Jx
+Gv
+dV
+dV
+ua
+TI
+Jx
+zd
+fQ
+cd
+fQ
+Jx
+MQ
+Hj
+is
+Ni
+Ni
+dR
+Od
+Ni
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(17,1,1) = {"
+fr
+fr
+fr
+fr
+PS
+xu
+Jx
+Jx
+Jx
+Nn
+ua
+ua
+ua
+ua
+ua
+Jx
+td
+ua
+QQ
+ua
+Jx
+hC
+if
+Ni
+Ni
+qN
+oS
+oS
+gg
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+IH
+fr
+fr
+fr
+fr
+"}
+(18,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+iv
+ua
+iv
+ua
+Yz
+Yz
+Jx
+wF
+ua
+ua
+ML
+Jx
+yE
+Ni
+Ni
+Ni
+qN
+oS
+oS
+gg
+Jx
+Jx
+Jx
+Jx
+xu
+as
+IH
+IH
+IH
+fr
+fr
+fr
+"}
+(19,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Yz
+ua
+QW
+ua
+Yz
+Yz
+Jx
+Uy
+ua
+ua
+ua
+Jx
+Jx
+Jx
+Jx
+Pw
+qN
+GN
+oS
+gg
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+IH
+IH
+IH
+IH
+fr
+fr
+"}
+(20,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Yz
+ua
+ua
+ua
+ua
+ua
+Jx
+Lb
+ua
+QQ
+ua
+rw
+Ni
+Ni
+Ni
+Ni
+Ni
+Ni
+Ni
+Ni
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+IH
+IH
+IH
+IH
+fr
+"}
+(21,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Yz
+ua
+ua
+ua
+ua
+ua
+Jx
+fQ
+ua
+gf
+PO
+Jx
+Ni
+Ni
+ls
+Ni
+Ni
+Ni
+Ni
+Ni
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+fr
+fr
+IH
+IH
+fr
+"}
+(22,1,1) = {"
+fr
+fr
+fr
+fr
+PS
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+La
+Jx
+Jx
+Ho
+Jx
+Jx
+Jx
+az
+az
+Jx
+Jx
+xY
+hs
+xY
+xY
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+fr
+fr
+IH
+IH
+fr
+"}
+(23,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Ye
+ua
+ua
+Jx
+CU
+CU
+CU
+gI
+CU
+gI
+CU
+Jx
+Ni
+Ni
+Ni
+Jx
+ua
+ua
+iy
+ua
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(24,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+td
+ua
+ML
+Jx
+Ph
+CU
+CU
+NJ
+NJ
+CU
+AX
+Jx
+Pw
+Ni
+Ni
+Jx
+nU
+ua
+ua
+iy
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+IH
+IH
+fr
+fr
+fr
+"}
+(25,1,1) = {"
+fr
+fr
+fr
+fr
+PS
+xu
+Jx
+Jx
+Jx
+ua
+ua
+ua
+Jx
+Vb
+CU
+CU
+bI
+fW
+CU
+CU
+fR
+Ni
+Ni
+Ni
+Jx
+ua
+jA
+ua
+ML
+Jx
+sQ
+Hk
+Nl
+xu
+as
+fr
+IH
+WS
+fr
+fr
+fr
+"}
+(26,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Cc
+ua
+ua
+Jx
+Tf
+jR
+AX
+bI
+bI
+CU
+CU
+st
+Ni
+Ni
+sX
+Jx
+ua
+iy
+iy
+ua
+DH
+Hk
+Hk
+Hk
+HX
+fr
+IH
+IH
+fr
+fr
+fr
+fr
+"}
+(27,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+sT
+ua
+ML
+Jx
+zc
+CU
+jR
+NJ
+bI
+CU
+CU
+fR
+Ni
+Ni
+Of
+Jx
+td
+Hh
+iy
+ML
+Jx
+yp
+Hk
+Nl
+xu
+as
+WS
+WS
+fr
+fr
+fr
+fr
+"}
+(28,1,1) = {"
+fr
+fr
+fr
+fr
+PS
+xu
+Jx
+Jx
+Jx
+Cc
+pd
+ua
+Zf
+CU
+nK
+CU
+CU
+UU
+CU
+CU
+Jx
+Pw
+Ni
+sX
+Jx
+ua
+Hh
+ua
+iy
+Jx
+Jx
+Jx
+Jx
+xu
+IH
+fr
+fr
+fr
+WS
+fr
+fr
+"}
+(29,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+jR
+Jx
+Jx
+Jx
+Jx
+Jx
+az
+az
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+"}
+(30,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+CU
+jR
+CU
+Sp
+jR
+CU
+gI
+CU
+CU
+WQ
+Ni
+Ni
+Ni
+By
+bi
+bi
+By
+Rq
+Jx
+Jx
+Jx
+Jx
+xu
+IH
+IH
+IH
+IH
+fr
+fr
+fr
+"}
+(31,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+FY
+jR
+CU
+Sp
+jR
+CS
+jR
+CS
+Mq
+Jx
+Jx
+PC
+Jx
+Jx
+bi
+bi
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+IH
+IH
+IH
+fr
+fr
+fr
+fr
+"}
+(32,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+CU
+CU
+jR
+qI
+CU
+CS
+Zy
+CS
+jR
+Jx
+Ni
+Ni
+Ni
+Jx
+dl
+bi
+By
+Rq
+Jx
+Jx
+Jx
+Jx
+xu
+as
+IH
+fr
+fr
+fr
+fr
+fr
+"}
+(33,1,1) = {"
+fr
+fr
+fr
+fr
+PS
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+WQ
+Jx
+Jx
+fr
+fr
+jR
+CS
+Mq
+Jx
+Ha
+Ni
+Ni
+Jx
+jn
+bi
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(34,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+NJ
+CU
+CU
+Jx
+Ka
+oA
+CU
+CS
+jR
+Jx
+xM
+Ni
+Ni
+Jx
+dl
+bi
+By
+MD
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(35,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+vI
+nE
+CU
+Jx
+pF
+WS
+oA
+CS
+ab
+Jx
+Ha
+Ni
+BY
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(36,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+NJ
+NJ
+PP
+Jx
+FI
+oA
+Eu
+fr
+CU
+Jx
+Ha
+Ni
+rC
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(37,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+bd
+aJ
+xg
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(38,1,1) = {"
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+xg
+xg
+xu
+xu
+Jx
+Jx
+Jx
+Jx
+Jx
+Jx
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(39,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+xu
+xu
+xu
+xu
+xu
+bd
+fr
+Eu
+WS
+xg
+bd
+bd
+xu
+xu
+xu
+xu
+xu
+xu
+xu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(40,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+KJ
+fr
+KJ
+fr
+fr
+fr
+fr
+fr
+fr
+Eu
+fr
+fr
+KJ
+fr
+fr
+KJ
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(41,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+Eu
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(42,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+Eu
+fr
+WS
+fr
+fr
+WS
+fr
+fr
+fr
+fr
+fr
+fr
+Eu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(43,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+Eu
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
+(44,1,1) = {"
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+fr
+"}
diff --git a/mods/anomaly/maps/electra_ruins/deployed_generator.dm b/mods/anomaly/maps/electra_ruins/deployed_generator.dm
new file mode 100644
index 0000000000000..bb0979030a5b1
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/deployed_generator.dm
@@ -0,0 +1,15 @@
+/datum/map_template/ruin/exoplanet/electra_generator
+ name = "deployed_generator"
+ id = "planetsite_anomalies_generator"
+ description = "anomalies lol."
+ mappaths = list('mods/anomaly/maps/electra_ruins/deployed_generator.dmm')
+ spawn_cost = 1
+ ruin_tags = RUIN_ELECTRA_ANOMALIES
+ apc_test_exempt_areas = list(
+ /area/map_template/deployed_generator = NO_SCRUBBER|NO_VENT|NO_APC
+ )
+
+
+/area/map_template/deployed_generator
+ name = "\improper Deployed science generator"
+ icon_state = "A"
diff --git a/mods/anomaly/maps/electra_ruins/deployed_generator.dmm b/mods/anomaly/maps/electra_ruins/deployed_generator.dmm
new file mode 100644
index 0000000000000..5502dd3874155
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/deployed_generator.dmm
@@ -0,0 +1,425 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"a" = (
+/turf/template_noop,
+/area/template_noop)
+"c" = (
+/obj/structure/aurora/cable,
+/obj/floor_decal/snow,
+/obj/structure/droppod_door,
+/turf/simulated/floor,
+/area/map_template/deployed_generator)
+"e" = (
+/obj/structure/droppod_door{
+ dir = 1
+ },
+/obj/structure/aurora/cable,
+/turf/simulated/floor,
+/area/map_template/deployed_generator)
+"h" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"i" = (
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/template_noop,
+/area/template_noop)
+"j" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"k" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/smes,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"m" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"o" = (
+/obj/floor_decal/snow,
+/obj/machinery/power/smes/batteryrack,
+/obj/structure/aurora/wall_light,
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"p" = (
+/obj/structure/aurora/wall_light,
+/turf/template_noop,
+/area/template_noop)
+"q" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'.";
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"t" = (
+/obj/floor_decal/snow,
+/turf/simulated/floor,
+/area/template_noop)
+"u" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/obj/floor_decal/snow,
+/obj/structure/droppod_door{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"w" = (
+/obj/floor_decal/snow,
+/obj/machinery/power/smes/batteryrack,
+/obj/structure/aurora/wall_light,
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"z" = (
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'.";
+ icon_state = "2-8"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"B" = (
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'.";
+ icon_state = "2-8"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"C" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 2;
+ icon_state = "1-2"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"D" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 8;
+ icon_state = "1-8"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"F" = (
+/obj/floor_decal/snow,
+/obj/structure/droppod_door{
+ dir = 4
+ },
+/turf/simulated/floor,
+/area/map_template/deployed_generator)
+"H" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/template_noop,
+/area/template_noop)
+"I" = (
+/obj/structure/aurora/informative/old_computer{
+ possible_information = list( "Бортовой журнал N3: Получена команда отстыковки. Выполнена отстыковка. Начат процесс входа в атмосферу. Процедура высадки на поверхность планеты выполнена. Отчёт отправл#@**$!", "Бортовой журнал N4: ОШИБКА: В течении суток команда от центра управления не получена. Невозможно связаться с центром управления. Энергохранилище переходит в режим сна.", "Бортовой журнал N7: ОШИБКА: Основные компоненты дроппода получили критические повреждения. 7 энергоячеек из 8 не отвечает. Окончание работы контроллера." )
+ },
+/obj/floor_decal/snow,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/obj/structure/aurora/wall_light{
+ dir = 8
+ },
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"J" = (
+/obj/structure/aurora/cable,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 8;
+ desc = "A flexible superconducting cable for heavy-duty power transfer. It's been labeled 'chaos reigns'.";
+ icon_state = "2-8"
+ },
+/obj/structure/cable{
+ d1 = 2;
+ d2 = 4;
+ icon_state = "2-4"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"L" = (
+/obj/structure/aurora/cable{
+ dir = 4
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"N" = (
+/obj/structure/aurora/nav_light,
+/obj/floor_decal/snow,
+/turf/simulated/floor,
+/area/template_noop)
+"P" = (
+/obj/floor_decal/snow,
+/obj/structure/droppod_door,
+/turf/simulated/floor,
+/area/map_template/deployed_generator)
+"S" = (
+/obj/floor_decal/snow,
+/obj/structure/droppod_door{
+ dir = 1
+ },
+/turf/simulated/floor,
+/area/map_template/deployed_generator)
+"T" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/template_noop,
+/area/template_noop)
+"V" = (
+/obj/structure/cable{
+ d1 = 1;
+ d2 = 4;
+ icon_state = "1-4"
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"X" = (
+/turf/simulated/wall/r_titanium,
+/area/map_template/deployed_generator)
+"Y" = (
+/obj/structure/aurora/cable,
+/obj/structure/cable{
+ d1 = 4;
+ d2 = 8;
+ icon_state = "4-8";
+ pixel_x = 0
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+"Z" = (
+/obj/floor_decal/snow,
+/obj/machinery/power/smes/batteryrack,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/reinforced,
+/area/map_template/deployed_generator)
+
+(1,1,1) = {"
+a
+N
+t
+T
+a
+a
+T
+t
+N
+a
+"}
+(2,1,1) = {"
+a
+t
+X
+X
+u
+u
+X
+X
+t
+a
+"}
+(3,1,1) = {"
+a
+p
+X
+I
+L
+L
+o
+X
+H
+a
+"}
+(4,1,1) = {"
+a
+a
+S
+j
+C
+h
+V
+P
+a
+a
+"}
+(5,1,1) = {"
+a
+a
+S
+q
+k
+k
+z
+P
+a
+a
+"}
+(6,1,1) = {"
+a
+a
+e
+J
+k
+k
+Y
+c
+a
+a
+"}
+(7,1,1) = {"
+a
+a
+S
+q
+k
+k
+q
+P
+a
+a
+"}
+(8,1,1) = {"
+a
+a
+S
+B
+m
+m
+D
+P
+a
+a
+"}
+(9,1,1) = {"
+a
+p
+X
+Z
+L
+L
+w
+X
+H
+a
+"}
+(10,1,1) = {"
+a
+t
+X
+X
+F
+F
+X
+X
+t
+a
+"}
+(11,1,1) = {"
+a
+N
+t
+i
+a
+a
+i
+t
+N
+a
+"}
diff --git a/mods/anomaly/maps/electra_ruins/garage.dm b/mods/anomaly/maps/electra_ruins/garage.dm
new file mode 100644
index 0000000000000..6b05819d42b79
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/garage.dm
@@ -0,0 +1,23 @@
+/datum/map_template/ruin/exoplanet/electra_garage
+ name = "garage"
+ id = "planetsite_anomalies_garage"
+ description = "anomalies lol."
+ mappaths = list('mods/anomaly/maps/electra_ruins/garage.dmm')
+ spawn_cost = 1
+ ruin_tags = RUIN_ELECTRA_ANOMALIES
+ apc_test_exempt_areas = list(
+ /area/map_template/garage = NO_SCRUBBER|NO_VENT|NO_APC,
+ /area/map_template/garage/first_home = NO_SCRUBBER|NO_VENT|NO_APC,
+ /area/map_template/garage/second_home = NO_SCRUBBER|NO_VENT|NO_APC
+ )
+
+/area/map_template/garage
+ name = "\improper Science garage"
+ icon_state = "A"
+
+/area/map_template/garage/first_home
+
+/area/map_template/garage/second_home
+
+/obj/forcefield/blocker
+ invisibility = 101
diff --git a/mods/anomaly/maps/electra_ruins/garage.dmm b/mods/anomaly/maps/electra_ruins/garage.dmm
new file mode 100644
index 0000000000000..c0c74a0f2f097
--- /dev/null
+++ b/mods/anomaly/maps/electra_ruins/garage.dmm
@@ -0,0 +1,2302 @@
+//MAP CONVERTED BY dmm2tgm.py THIS HEADER COMMENT PREVENTS RECONVERSION, DO NOT REMOVE
+"aF" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/informative/wall_computer{
+ pixel_y = 32;
+ possible_information = list( "#244...Шеф, я понимаю, вам приказали сверху, эксперименты и всё такое, но вы же сам человек умный, и понимаете, что колёсная техника на такой планете - это же шутка! После первого выезда, у колесницы колёса превратились в труху, день на это угробил! Пришлось из челнока брать запаски, благо взя42u447$@!*.", "14$@!*(4)...ледней вылазке случилось что-то совсем странное, странные огни в небе, словно " )
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"br" = (
+/obj/anomaly/electra/three_and_three/tesla,
+/obj/structure/aurora/old_comp,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"bI" = (
+/obj/structure/aurora/old_comp,
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"bX" = (
+/obj/structure/ice_rock,
+/obj/structure/railing/mapped{
+ dir = 8
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"cb" = (
+/obj/floor_decal/snow,
+/obj/structure/table/rack/dark,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"cc" = (
+/turf/simulated/wall/titanium,
+/area/map_template/garage)
+"cg" = (
+/obj/floor_decal/snow,
+/obj/forcefield/blocker,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"eb" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"eL" = (
+/obj/structure/table/rack/dark,
+/obj/item/storage/toolbox/syndicate,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"fn" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"fr" = (
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"fH" = (
+/obj/structure/ice_rock,
+/obj/structure/railing/mapped,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"gP" = (
+/obj/structure/aurora/nav_light,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"hn" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/template_noop,
+/area/template_noop)
+"hq" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"ib" = (
+/obj/floor_decal/snow,
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"kt" = (
+/obj/anomaly/electra/three_and_three/tesla_second,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"kM" = (
+/obj/structure/broken_cryo,
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"lJ" = (
+/obj/floor_decal/snow,
+/obj/floor_decal/snow,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"lN" = (
+/obj/structure/aurora/cable_angle{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"lO" = (
+/obj/floor_decal/snow,
+/obj/decal/cleanable/ash,
+/obj/structure/aurora/wall_light,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"lS" = (
+/turf/simulated/floor/exoplanet/concrete,
+/area/template_noop)
+"mb" = (
+/obj/structure/broken_cryo,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"op" = (
+/obj/floor_decal/snow,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"oS" = (
+/turf/simulated/mineral/ice,
+/area/template_noop)
+"pl" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"qc" = (
+/obj/structure/ice_rock,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"qL" = (
+/obj/structure/destroyed_apc{
+ layer = 5
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"qM" = (
+/obj/floor_decal/snow,
+/obj/structure/broken_cryo{
+ dir = 4
+ },
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"rp" = (
+/obj/floor_decal/snow,
+/obj/structure/table/rack/dark,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"tT" = (
+/obj/structure/aurora/smes,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"ua" = (
+/obj/structure/railing/mapped{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"uE" = (
+/obj/structure/aurora/old_comp,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"uX" = (
+/obj/structure/sign/science_2{
+ pixel_y = -32
+ },
+/turf/template_noop,
+/area/template_noop)
+"vg" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/informative/old_computer{
+ possible_information = list()
+ },
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"vR" = (
+/obj/structure/aurora/cable{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"wa" = (
+/obj/structure/broken_cryo{
+ dir = 4
+ },
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"wn" = (
+/obj/random/junk,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"wv" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/smes,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"wQ" = (
+/turf/template_noop,
+/area/template_noop)
+"xu" = (
+/obj/anomaly/electra/three_and_three/tesla_second,
+/obj/floor_decal/corner/yellow/mono,
+/turf/simulated/floor/exoplanet/concrete,
+/area/template_noop)
+"xG" = (
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"xJ" = (
+/turf/simulated/wall/titanium,
+/area/map_template/garage/second_home)
+"zc" = (
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"zk" = (
+/obj/item/material/shard/shrapnel/aluminium,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"zW" = (
+/obj/item/material/shard/shrapnel/aluminium,
+/turf/simulated/floor/exoplanet/concrete,
+/area/template_noop)
+"AB" = (
+/obj/structure/railing/mapped{
+ dir = 8
+ },
+/turf/simulated/mineral/ice,
+/area/template_noop)
+"By" = (
+/obj/structure/grille,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"BS" = (
+/obj/structure/aurora/nav_light,
+/turf/simulated/floor/exoplanet/concrete,
+/area/template_noop)
+"CI" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/old_comp,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/second_home)
+"Ek" = (
+/turf/simulated/wall/titanium,
+/area/map_template/garage/first_home)
+"Eo" = (
+/obj/structure/ice_rock,
+/obj/structure/grille/broken,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"Fi" = (
+/obj/structure/aurora/smes,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"FP" = (
+/obj/floor_decal/snow,
+/obj/random/junk,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"Gy" = (
+/obj/structure/disposalpipe/broken,
+/turf/template_noop,
+/area/template_noop)
+"GD" = (
+/obj/structure/broken_door,
+/obj/floor_decal/snow,
+/turf/unsimulated/floor/tile,
+/area/map_template/garage/second_home)
+"GF" = (
+/obj/structure/table/rack/dark,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"Hd" = (
+/obj/structure/aurora/cable_angle,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"Hk" = (
+/obj/floor_decal/snow,
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"HI" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"Ih" = (
+/obj/floor_decal/snow,
+/obj/random/junk,
+/obj/forcefield/blocker,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"IH" = (
+/obj/item/weldingtool/electric,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"IS" = (
+/obj/floor_decal/snow,
+/obj/item/remains/human,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"KT" = (
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"Lx" = (
+/obj/structure/ice_rock,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"Nd" = (
+/obj/machinery/door/blast/regular,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"OQ" = (
+/obj/floor_decal/snow,
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"Pi" = (
+/obj/machinery/door/blast/shutters,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"Pk" = (
+/obj/structure/aurora/wall_light{
+ dir = 1
+ },
+/obj/structure/broken_cryo{
+ dir = 4
+ },
+/obj/floor_decal/snow,
+/turf/simulated/floor/holofloor/tiled,
+/area/map_template/garage/first_home)
+"Pl" = (
+/obj/decal/cleanable/ash,
+/turf/simulated/floor/exoplanet/concrete,
+/area/template_noop)
+"Tb" = (
+/obj/structure/broken_cryo{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"Td" = (
+/obj/structure/sign/science_2{
+ pixel_y = 32
+ },
+/turf/template_noop,
+/area/template_noop)
+"TO" = (
+/obj/structure/ice_rock,
+/obj/structure/railing/mapped{
+ dir = 1
+ },
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"UL" = (
+/obj/structure/table/rack/dark,
+/obj/item/storage/toolbox/electrical,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"Vi" = (
+/obj/structure/broken_door,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"WC" = (
+/obj/structure/grille/broken,
+/obj/structure/ice_rock,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"Xh" = (
+/obj/structure/aurora/wall_light{
+ dir = 4
+ },
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"XD" = (
+/obj/structure/grille/broken,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"XN" = (
+/obj/structure/table/rack/dark,
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+"Yr" = (
+/obj/structure/table/rack/dark,
+/obj/item/storage/toolbox/mechanical,
+/turf/simulated/floor/exoplanet/concrete,
+/area/map_template/garage)
+"YK" = (
+/obj/structure/railing/mapped,
+/turf/simulated/floor/exoplanet/ice,
+/area/template_noop)
+"Zu" = (
+/obj/machinery/door/blast/regular,
+/turf/simulated/floor/exoplanet/ice,
+/area/map_template/garage)
+"ZL" = (
+/turf/simulated/floor/exoplanet/snow,
+/area/template_noop)
+
+(1,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(2,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(3,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(4,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(5,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(6,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(7,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(8,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+cc
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(9,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+Fi
+Fi
+GF
+Yr
+xG
+UL
+GF
+xG
+eL
+GF
+xG
+cc
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(10,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+Fi
+Fi
+xG
+xG
+IH
+xG
+xG
+wn
+xG
+xG
+xG
+cc
+hn
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(11,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+uX
+cc
+pl
+xG
+wn
+op
+xG
+wn
+op
+qL
+wn
+xG
+xG
+Zu
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(12,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+pl
+op
+op
+op
+cg
+cg
+cg
+cg
+xG
+xG
+xG
+Zu
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(13,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+aF
+op
+lJ
+op
+Ih
+cg
+cg
+cg
+xG
+xG
+xG
+Zu
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(14,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+Hk
+ZL
+ZL
+ZL
+ZL
+op
+op
+FP
+op
+wn
+xG
+Zu
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(15,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+cc
+ZL
+ZL
+ZL
+ZL
+ZL
+ZL
+op
+op
+op
+xG
+xG
+cc
+hn
+wQ
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(16,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+ZL
+oS
+ZL
+op
+FP
+op
+op
+xG
+xG
+cc
+wQ
+oS
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(17,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+oS
+oS
+oS
+fn
+op
+xG
+Xh
+wn
+Xh
+xG
+cc
+wQ
+oS
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(18,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+fr
+oS
+cc
+cc
+Nd
+Nd
+cc
+cc
+cc
+cc
+cc
+oS
+oS
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(19,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+Ek
+Ek
+Ek
+Ek
+Ek
+oS
+vR
+vR
+vR
+lN
+fr
+fr
+lS
+fr
+fr
+fr
+oS
+oS
+oS
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(20,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+Gy
+Ek
+vg
+KT
+XN
+Ek
+fr
+fr
+zk
+fr
+fr
+fr
+qc
+zW
+ua
+fr
+qc
+oS
+oS
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(21,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+uX
+Ek
+qM
+KT
+cb
+Ek
+fr
+fH
+gP
+ZL
+lS
+lS
+lS
+lS
+lS
+gP
+oS
+oS
+By
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(22,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+Ek
+uE
+ZL
+ZL
+Ek
+fr
+zk
+ZL
+Pl
+ZL
+ZL
+Pl
+lS
+xu
+lS
+fr
+fr
+By
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(23,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+Ek
+Pk
+IS
+lO
+Ek
+hq
+fr
+lS
+lS
+lS
+ZL
+ZL
+Pl
+lS
+lS
+fr
+fr
+Pi
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(24,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+fr
+ZL
+br
+Lx
+OQ
+Vi
+lS
+oS
+lS
+ZL
+Pl
+ZL
+lS
+lS
+lS
+lS
+TO
+fr
+Pi
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(25,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+Ek
+wa
+IS
+lO
+Ek
+oS
+oS
+ZL
+kt
+lS
+lS
+Pl
+ZL
+lS
+Pl
+fr
+fr
+Pi
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(26,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+Ek
+bI
+KT
+XN
+Ek
+oS
+oS
+lS
+lS
+lS
+lS
+lS
+ZL
+ZL
+ZL
+fr
+fr
+By
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(27,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+WC
+Tb
+ZL
+KT
+Ek
+fr
+YK
+BS
+lS
+lS
+lS
+lS
+lS
+ZL
+Lx
+zk
+fr
+Eo
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(28,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+XD
+tT
+ZL
+Lx
+Ek
+fr
+fr
+AB
+fr
+bX
+fr
+fr
+zW
+fr
+zk
+fr
+fr
+eb
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(29,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+WC
+XD
+WC
+Ek
+Ek
+fr
+oS
+oS
+fr
+fr
+fr
+HI
+lS
+HI
+fr
+fr
+fr
+oS
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(30,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+Hd
+vR
+qc
+vR
+vR
+oS
+xJ
+xJ
+xJ
+xJ
+xJ
+GD
+xJ
+xJ
+xJ
+xJ
+xJ
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(31,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+fr
+fr
+fr
+oS
+oS
+xJ
+rp
+rp
+ib
+ZL
+ZL
+Lx
+ZL
+Lx
+rp
+xJ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(32,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+qc
+wQ
+wQ
+wQ
+wQ
+xJ
+zc
+zc
+ZL
+Lx
+ZL
+ZL
+ZL
+zc
+zc
+xJ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(33,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+fr
+wQ
+wQ
+wQ
+wQ
+xJ
+CI
+kM
+oS
+mb
+uE
+mb
+uE
+kM
+wv
+xJ
+Td
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(34,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+xJ
+xJ
+xJ
+oS
+oS
+XD
+XD
+XD
+xJ
+xJ
+xJ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(35,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+oS
+ZL
+ZL
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(36,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+oS
+oS
+oS
+Lx
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(37,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+oS
+oS
+ZL
+ZL
+ZL
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(38,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(39,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+oS
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(40,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(41,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(42,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(43,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
+(44,1,1) = {"
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+wQ
+"}
diff --git a/mods/global_modpacks.dm b/mods/global_modpacks.dm
index ab807132ce522..d50ad21ea4761 100644
--- a/mods/global_modpacks.dm
+++ b/mods/global_modpacks.dm
@@ -34,6 +34,7 @@
#include "utility_items/_utility_items.dme"
#include "mechs_by_shegar/_mechs_by_shegar.dme"
#include "newUI/_newUI.dme"
+#include "weather\_weather.dme"
#include "anomaly/_anomaly.dme"
#include "bouquet_by_hakso/_bouquet_by_hakso.dme"
#include "integrated_circuits/_integrated_circuits.dme"
@@ -47,5 +48,5 @@
#include "simplangs/simplangs.dme"
#include "makeshift_sword_overhaul/makeshift_sword_overhaul.dme"
#include "item_identification/_item_identification.dme"
-
+#include "vehicle\_vehicle.dme"
#include "../packs/sierra-tweaks/_pack.dm"
diff --git a/mods/vehicle/README.md b/mods/vehicle/README.md
new file mode 100644
index 0000000000000..5fd6ea1cbb830
--- /dev/null
+++ b/mods/vehicle/README.md
@@ -0,0 +1,77 @@
+
+#### Список PRов:
+
+
+
+
+
+## Unathi
+
+ID мода: WEATHER
+
+
+### Описание мода
+
+Погода
+
+
+### Изменения *кор кода*
+
+Отсутствуют
+
+
+### Оверрайды
+
+Отсутствуют
+
+
+### Дефайны
+
+Отсутствуют
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+Отсутствуют
+
+
+### Авторы:
+
+Shegar
+
diff --git a/mods/vehicle/_vehicle.dm b/mods/vehicle/_vehicle.dm
new file mode 100644
index 0000000000000..a81e141fdeacf
--- /dev/null
+++ b/mods/vehicle/_vehicle.dm
@@ -0,0 +1,4 @@
+/singleton/modpack/vehicle
+ name = "Транспорт WIP"
+ desc = "Снегоходы, танки, брдм на гравидвигателях и прочее."
+ author = "Shegar"
diff --git a/mods/vehicle/_vehicle.dme b/mods/vehicle/_vehicle.dme
new file mode 100644
index 0000000000000..86e5b8e93ebab
--- /dev/null
+++ b/mods/vehicle/_vehicle.dme
@@ -0,0 +1,7 @@
+#ifndef MODPACK_VEHICLE
+#define MODPACK_VEHICLE
+
+
+#include "code\not_working\destroyed_apc.dm"
+
+#endif
diff --git a/mods/vehicle/code/not_working/destroyed_apc.dm b/mods/vehicle/code/not_working/destroyed_apc.dm
new file mode 100644
index 0000000000000..67af525806a7c
--- /dev/null
+++ b/mods/vehicle/code/not_working/destroyed_apc.dm
@@ -0,0 +1,6 @@
+//Размещайте в игре по частям.
+/obj/structure/destroyed_apc
+ name = "destroyed apc"
+ icon = 'mods/vehicle/icons/arc_destroyed.dmi'
+ icon_state = "arc_destroyed"
+ anchored = TRUE
diff --git a/mods/vehicle/code/working/d.dm b/mods/vehicle/code/working/d.dm
new file mode 100644
index 0000000000000..e69de29bb2d1d
diff --git a/mods/vehicle/icons/arc_destroyed.dmi b/mods/vehicle/icons/arc_destroyed.dmi
new file mode 100644
index 0000000000000..29e19569da374
Binary files /dev/null and b/mods/vehicle/icons/arc_destroyed.dmi differ
diff --git a/mods/weather/README.md b/mods/weather/README.md
new file mode 100644
index 0000000000000..02d18d758d25d
--- /dev/null
+++ b/mods/weather/README.md
@@ -0,0 +1,77 @@
+
+#### Список PRов:
+
+
+
+
+
+## Weather
+
+ID мода: WEATHER
+
+
+### Описание мода
+
+Погода
+
+
+### Изменения *кор кода*
+
+Отсутствуют
+
+
+### Оверрайды
+
+Отсутствуют
+
+
+### Дефайны
+
+/datum/map_template/load
+
+
+### Используемые файлы, не содержащиеся в модпаке
+
+mods/anomaly/sounds/electra_blast.ogg
+
+
+### Авторы:
+
+Shegar
+
diff --git a/mods/weather/_weather.dm b/mods/weather/_weather.dm
new file mode 100644
index 0000000000000..d2c524671d361
--- /dev/null
+++ b/mods/weather/_weather.dm
@@ -0,0 +1,4 @@
+/singleton/modpack/unathi
+ name = "Погода"
+ desc = "Снежные бураны, пылевые бури, кислотные дожди, авроры, выбросы - всё включено."
+ author = "Shegar"
diff --git a/mods/weather/_weather.dme b/mods/weather/_weather.dme
new file mode 100644
index 0000000000000..07aa7a9234047
--- /dev/null
+++ b/mods/weather/_weather.dme
@@ -0,0 +1,16 @@
+#ifndef MODPACK_WEATHER
+#define MODPACK_WEATHER
+
+#include "code\_controller.dm"
+#include "code\_weather_core.dm"
+#include "code\_weather_vars.dm"
+#include "code\ashen.dm"
+#include "code\snow.dm"
+#include "code\swamp.dm"
+#include "code\weather_manager.dm"
+#include "code\aurora_objects.dm"
+#include "code\_planet_deployment.dm"
+#include "code\map_templace.dm"
+
+
+#endif
diff --git a/mods/weather/code/_controller.dm b/mods/weather/code/_controller.dm
new file mode 100644
index 0000000000000..fecfd5d6cedae
--- /dev/null
+++ b/mods/weather/code/_controller.dm
@@ -0,0 +1,19 @@
+//SSweather
+PROCESSING_SUBSYSTEM_DEF(weather)
+ name = "Weather"
+ priority = SS_PRIORITY_TURF
+ init_order = SS_INIT_DEFAULT
+ flags = SS_BACKGROUND
+ //
+
+ var/list/weather_turf_in_world = list()
+ var/list/weather_managers_in_world = list()
+ var/list/aurora_sctructures = list()
+
+/datum/controller/subsystem/processing/weather/UpdateStat(time)
+ if (PreventUpdateStat(time))
+ return ..()
+ ..({"\
+ weather turfs amount: [LAZYLEN(weather_turf_in_world)] \
+ weather controllers amount: [LAZYLEN(weather_managers_in_world)]
+ "})
diff --git a/mods/weather/code/_planet_deployment.dm b/mods/weather/code/_planet_deployment.dm
new file mode 100644
index 0000000000000..ca5b5270be53b
--- /dev/null
+++ b/mods/weather/code/_planet_deployment.dm
@@ -0,0 +1,9 @@
+/obj/overmap/visitable/sector/exoplanet
+ var/weather_manager_type
+
+/obj/overmap/visitable/sector/exoplanet/proc/deploy_weather()
+ if(!weather_manager_type)
+ return //Погоды то нет()
+ var/turf/picked_turf
+ picked_turf = pick(get_area_turfs(planetary_area))
+ new weather_manager_type(picked_turf)
diff --git a/mods/weather/code/_weather_core.dm b/mods/weather/code/_weather_core.dm
new file mode 100644
index 0000000000000..49aa5db4a5f9d
--- /dev/null
+++ b/mods/weather/code/_weather_core.dm
@@ -0,0 +1,111 @@
+GLOBAL_LIST_EMPTY(effected_by_weather)
+GLOBAL_VAR_INIT(ambience_channel_weather, GLOB.sound_channels.RequestChannel("AMBIENCE_WEATHER"))
+#define isweatherhere(A) locate(/obj/weather) in A
+/obj/weather
+ var/play_monitor_effect = TRUE
+ var/play_sound = TRUE
+ var/area/start_area //Зона, в которой и создавалась погода. Используется для проверок при спавне карты.
+ var/area/last_check_area
+ //Виброс
+ var/list/blowout_messages = list()
+ var/blowout_icon_state
+ var/blowout_status = FALSE
+
+///Кто-то или что-то вошло в погоду
+/obj/weather/Crossed(O)
+ react_at_enter_monitor(O)
+
+/obj/weather/Uncrossed(O)
+ react_at_leave_monitor(O)
+
+/obj/weather/Initialize()
+ .=..()
+ LAZYADD(SSweather.weather_turf_in_world, src)
+ start_area = get_area(src)
+
+/obj/weather/proc/update(mob/living/input_mob)
+ if(input_mob)
+ if(input_mob.client)
+ update_visual(input_mob)
+ update_sound(input_mob)
+ else
+ for(var/mob/living/somebody in get_turf(src))
+ if(somebody.client)
+ update_visual(somebody)
+ update_sound(somebody)
+
+/obj/weather/proc/update_sound(mob/living/input_mob)
+ if(play_sound)
+ var/sound = sound(pick(sound_type), repeat = TRUE, wait = 0, volume = 50, channel = GLOB.ambience_channel_weather)
+ input_mob.playsound_local(get_turf(input_mob), sound)
+ else
+ sound_to(input_mob, sound(null, channel = GLOB.ambience_channel_weather))
+
+/obj/weather/proc/update_visual(mob/living/input_mob)
+ if(play_monitor_effect)
+ add_monitor_effect(input_mob)
+ else
+ remove_monitor_effect(input_mob)
+
+/obj/weather/proc/message_about_blowout()
+ if(LAZYLEN(blowout_messages))
+ for(var/mob/living/somebody in get_turf(src))
+ to_chat(somebody, pick(blowout_messages))
+
+/obj/weather/proc/add_monitor_effect(mob/living/input_mob)
+ LAZYADD(input_mob,GLOB.effected_by_weather)
+
+/obj/weather/proc/remove_monitor_effect(mob/living/input_mob)
+ LAZYREMOVE(input_mob,GLOB.effected_by_weather)
+
+/obj/weather/proc/react_at_enter_monitor(atom/movable/atom)
+ if(!must_react_at_enter)
+ return
+ if(blowout_status)
+ react_at_enter_in_blowout(atom)
+ return
+ //Незачем накладывать эффект тому, кто уже с этим эффектом
+ if(atom in GLOB.effected_by_weather)
+ return
+ if(isliving(atom))
+ var/mob/living/detected_mob = atom
+ //Если у моба есть клиент, значит есть на кого накладывать эффект на экран
+ if(detected_mob.client)
+ update_sound(detected_mob)
+ update_visual(detected_mob)
+ LAZYADD(GLOB.effected_by_weather, atom)
+
+/obj/weather/proc/react_at_leave_monitor(atom/movable/atom)
+ if(!must_react_at_enter)
+ return
+ if(blowout_status)
+ react_at_leave_from_blowout(atom)
+ return
+ var/mob/detected_mob = atom
+ if(!isweatherhere(get_turf(atom)))
+ if(atom in GLOB.effected_by_weather)
+ LAZYREMOVE(GLOB.effected_by_weather, atom)
+ remove_monitor_effect(detected_mob)
+ if(LAZYLEN(sound_type))
+ sound_to(detected_mob, sound(null, channel = GLOB.ambience_channel_weather))
+
+
+/obj/weather/proc/react_at_enter_in_blowout(atom/movable/atom)
+ return
+
+/obj/weather/proc/react_at_leave_from_blowout(atom/movable/atom)
+ return
+
+/obj/weather/proc/blowout_check_turf()
+ return
+
+/obj/weather/proc/update_by_map_templace() //Функция проверяет что
+ if(get_area(get_turf(src)) != start_area)
+ delete_weather()
+ return
+ last_check_area = get_area(get_turf(src))
+
+
+/obj/weather/proc/delete_weather()
+ LAZYREMOVE(SSweather.weather_turf_in_world, src)
+ qdel(src)
diff --git a/mods/anomaly/code/monitor_effects/monitor_vars.dm b/mods/weather/code/_weather_vars.dm
similarity index 81%
rename from mods/anomaly/code/monitor_effects/monitor_vars.dm
rename to mods/weather/code/_weather_vars.dm
index 9d99c62b3dd4a..4830292a61b93 100644
--- a/mods/anomaly/code/monitor_effects/monitor_vars.dm
+++ b/mods/weather/code/_weather_vars.dm
@@ -2,9 +2,10 @@
var/last_monitor_message = 0
//Наложит игроку на экран эффект, уберёт его, а так же может дополнительно начать влиять на существо.
-/obj/monitor_effect_triger
+/obj/weather
//Путь до эффекта накладываемого на экран
var/effect_icon_type
+ icon = 'mods/weather/icons/weather_effects.dmi'
var/sound_type = list()
///Должнен ли монитор эффект реагировать на пересечение с кем-либо или чем-либо
var/must_react_at_enter = FALSE
@@ -12,7 +13,5 @@
invisibility = TRUE
layer = EFFECTS_LAYER
vis_flags = VIS_INHERIT_ID
- //Лист сообщений выводимые в чат игроку при входе в зону
- var/list/trigger_messages_list = list()
var/trigger_message_cooldown = 10 MINUTES
mouse_opacity = FALSE //Погода должна быть непрокликиваемой
diff --git a/mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm b/mods/weather/code/ashen.dm
similarity index 50%
rename from mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm
rename to mods/weather/code/ashen.dm
index ee78b8ce329cb..365d0f6b59c26 100644
--- a/mods/anomaly/code/monitor_effects/vulcan_monitor_effect.dm
+++ b/mods/weather/code/ashen.dm
@@ -1,5 +1,4 @@
//Эффект вулкана WIP
-/obj/monitor_effect_triger/vulcan
+/obj/weather/ashen
icon_state = "light_storm"
- icon = 'mods/anomaly/icons/weather_effects.dmi'
invisibility = FALSE
diff --git a/mods/weather/code/aurora_objects.dm b/mods/weather/code/aurora_objects.dm
new file mode 100644
index 0000000000000..14a57577e9565
--- /dev/null
+++ b/mods/weather/code/aurora_objects.dm
@@ -0,0 +1,137 @@
+#define isaurora(A) istype(A, /obj/structure/aurora)
+
+//Все обьекты что оживают при белой мгле
+/obj/structure/aurora
+ name = "Dead equipment"
+ desc = "An ancient reminder of the past. It will never be able to leave the planet. Part of the planet, part of the ship."
+ density = TRUE
+ anchored = TRUE
+ icon = 'mods/weather/icons/aurora_objects.dmi'
+ var/wake_up_icon_state
+ var/waked_up = FALSE
+
+/obj/structure/aurora/Initialize()
+ .=..()
+ LAZYADD(SSweather.aurora_sctructures, src)
+
+//Обьект прошлого просыпается. Зажигаются фары/огни/монитор и прочее
+/obj/structure/aurora/proc/wake_up(wake_up_time)
+ set waitfor = FALSE
+ if(waked_up)
+ return
+ sleep(rand(2,10)) //Для того чтоб техника не зажигалась одновременно
+ waked_up = TRUE
+ icon_state = "[icon_state]_wake_up"
+ addtimer(new Callback(src, PROC_REF(go_sleep)), wake_up_time)
+
+/obj/structure/aurora/proc/go_sleep()
+ icon_state = initial(icon_state)
+ waked_up = FALSE
+
+
+//Обычное(Прост красивое)
+
+/obj/structure/aurora/beaker_dropper
+ icon_state = "beaker_dropper"
+
+/obj/structure/aurora/old_comp
+ icon_state = "old_comp"
+
+/obj/structure/aurora/wall_comp
+ icon_state = "wall_computer"
+ density = FALSE
+
+/obj/structure/aurora/wall_light
+ icon_state = "light_tube"
+ density = FALSE
+
+/obj/structure/aurora/wall_light/wake_up(wake_up_time)
+ . = ..()
+ set_light(4, 2, COLOR_WHITE)
+
+/obj/structure/aurora/wall_light/go_sleep()
+ . = ..()
+ set_light(0)
+
+/obj/structure/aurora/nav_light
+ icon_state = "nav_light"
+ density = FALSE
+
+
+
+//ИНФОРМАТИВНОЕ
+
+/obj/structure/aurora/informative
+ var/stored_information
+ var/list/possible_information = list()
+
+/obj/structure/aurora/informative/Initialize()
+ . = ..()
+ if(LAZYLEN(possible_information))
+ stored_information = pick(possible_information)
+
+/obj/structure/aurora/informative/examine(mob/user)
+ . = ..()
+ if(waked_up && stored_information)
+ to_chat(user, SPAN_NOTICE(stored_information))
+
+/obj/structure/aurora/informative/old_computer
+ icon_state = "old_comp_informative"
+ possible_information = list()
+
+/obj/structure/aurora/informative/wall_computer
+ icon_state = "wall_computer_informative"
+ density = FALSE
+
+//Интерактивное
+/obj/structure/aurora/cable
+ icon_state = "damaged_cable"
+ density = FALSE
+
+/obj/structure/aurora/cable/Crossed(mob/living/M)
+ ..()
+ if(waked_up)
+ M.electrocute_act(20, src, 1.0, ran_zone())
+
+/obj/structure/aurora/cable_angle
+ density = FALSE
+ icon_state = "cable_angle"
+
+
+//Активные обьекты
+/obj/structure/aurora/smes
+ icon_state = "smes"
+ var/electra_attack_cooldown
+ var/last_electra_attack
+ var/datum/beam = null
+
+/obj/structure/aurora/smes/Initialize()
+ . = ..()
+ electra_attack_cooldown = rand(3 SECONDS, 20 SECONDS)
+
+/obj/structure/aurora/smes/wake_up(wake_up_time)
+ ..()
+ last_electra_attack = world.time
+ START_PROCESSING(SSweather, src)
+
+/obj/structure/aurora/smes/go_sleep()
+ ..()
+ if(is_processing)
+ STOP_PROCESSING(SSweather,src)
+
+/obj/structure/aurora/smes/Process()
+ if(world.time - last_electra_attack > electra_attack_cooldown)
+ electra_attack()
+
+//Смес бьёт
+/obj/structure/aurora/smes/proc/electra_attack()
+ set waitfor = FALSE
+ last_electra_attack = world.time
+ var/turf/picked_turf
+ picked_turf = pick(RANGE_TURFS(src, 3))
+ for(var/mob/living/picked_living in picked_turf)
+ picked_living.electoanomaly_act(50, src)
+ for(var/obj/structure/aurora/picked_aurora in picked_turf)
+ picked_aurora.wake_up(5 SECONDS)
+ beam = src.Beam(BeamTarget = picked_turf, icon_state = "electra_long",icon='mods/anomaly/icons/effects.dmi',time = 0.3 SECONDS)
+ playsound(src, 'mods/anomaly/sounds/electra_blast.ogg', 100, FALSE )
diff --git a/mods/weather/code/map_templace.dm b/mods/weather/code/map_templace.dm
new file mode 100644
index 0000000000000..de6a227659aef
--- /dev/null
+++ b/mods/weather/code/map_templace.dm
@@ -0,0 +1,36 @@
+/datum/map_template/load(turf/T, centered=FALSE)
+ if(centered)
+ T = locate(T.x - round(width/2) , T.y - round(height/2) , T.z)
+ if(!T)
+ log_debug("[src] map template failed to load, could not locate a center turf.")
+ return
+ if(T.x+width > world.maxx)
+ log_debug("[src] map template failed to load, map would extend past world X bound.")
+ return
+ if(T.y+height > world.maxy)
+ log_debug("[src] map template failed to load, map would extend past world Y bound.")
+ return
+
+ var/list/atoms_to_initialise = list()
+ var/shuttle_state = pre_init_shuttles()
+
+ var/initialized_areas_by_type = list()
+ for (var/mappath in mappaths)
+ var/datum/map_load_metadata/M = GLOB.maploader.load_map(file(mappath), T.x, T.y, T.z, cropMap=TRUE, clear_contents=(template_flags & TEMPLATE_FLAG_CLEAR_CONTENTS), initialized_areas_by_type = initialized_areas_by_type)
+ if (M)
+ atoms_to_initialise += M.atoms_to_initialise
+ else
+ log_debug("Failed to load map file [mappath] for [src].")
+ return FALSE
+
+ //initialize things that are normally initialized after map load
+ init_atoms(atoms_to_initialise)
+ init_shuttles(shuttle_state)
+ after_load(T.z)
+ SSlighting.InitializeTurfs(atoms_to_initialise) // Hopefully no turfs get placed on new coords by SSatoms.
+ log_game("[name] loaded at at [T.x],[T.y],[T.z]")
+ loaded++
+ for(var/obj/weather/detected_weather in SSweather.weather_turf_in_world)
+ detected_weather.update_by_map_templace()
+
+ return TRUE
diff --git a/mods/weather/code/snow.dm b/mods/weather/code/snow.dm
new file mode 100644
index 0000000000000..8e622899d257d
--- /dev/null
+++ b/mods/weather/code/snow.dm
@@ -0,0 +1,136 @@
+/obj/weather_manager/snow
+ weather_turfs_types = list(
+ /obj/weather/snow
+ )
+ stages = list(
+ "calm",
+ "midle",
+ "storm"
+ )
+
+/obj/weather_manager/snow/change_stage(force_state, monitor = FALSE, sound = FALSE)
+ ..()
+ if(!force_state)
+ var/state = pick(stages)
+ if(state == "calm")
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.icon_state = "void_storm"
+ weather.play_monitor_effect = FALSE
+ weather.play_sound = FALSE
+ weather.update()
+ else if(state == "midle")
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.icon_state = "light_snow"
+ weather.play_monitor_effect = FALSE
+ weather.play_sound = FALSE
+ weather.update()
+ else if(state == "storm")
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.icon_state = "snow_storm"
+ weather.play_monitor_effect = TRUE
+ weather.play_sound = TRUE
+ weather.update()
+ else
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.icon_state = "void_storm"
+ weather.play_monitor_effect = monitor
+ weather.play_sound = sound
+ weather.update()
+
+/obj/weather_manager/snow/prepare_to_blowout()
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.icon_state = "void_storm"
+ weather.play_monitor_effect = FALSE
+ weather.play_sound = FALSE
+ weather.update()
+
+/obj/weather_manager/snow/start_blowout()
+ ..()
+ //Выброс в виде белой мглы медленно перекатывается слева направо
+ var/start_x
+ var/list/blowout_weather_turfs = connected_weather_turfs.Copy()
+ start_x = calculate_smallest_x(blowout_weather_turfs)
+ while(LAZYLEN(blowout_weather_turfs))
+ for(var/obj/weather/weather in blowout_weather_turfs)
+ if(weather.x == start_x)
+ weather.icon_state = weather.blowout_icon_state
+ weather.play_monitor_effect = FALSE
+ weather.play_sound = FALSE
+ weather.blowout_status = TRUE
+ weather.update()
+ weather.blowout_check_turf()
+ LAZYREMOVE(blowout_weather_turfs, weather)
+ sleep(7)
+ start_x++
+ sleep(rand(10 SECONDS,20 SECONDS))
+ report_progress("DEBUG: Выброс в процессе. Начинается стадия авроры.")
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.blowout_status = FALSE
+ weather.icon_state = "void_storm"
+ for(var/obj/structure/aurora/aurora_structure in SSweather.aurora_sctructures)
+ if(z == aurora_structure.z)
+ aurora_structure.wake_up(rand(5 MINUTES, 9 MINUTES))
+ sleep(rand(10 MINUTES, 15 MINUTES))
+ report_progress("DEBUG: Выброс в процессе. Аврора окончена. Начинается очистка планеты.")
+ regenerate_anomalies_on_planet()
+ stop_blowout()
+
+/obj/weather_manager/snow/stop_blowout()
+ for(var/obj/weather/weather in connected_weather_turfs)
+ weather.blowout_status = FALSE
+ weather.icon_state = initial(weather.icon_state)
+ ..()
+
+
+/proc/calculate_smallest_x(list/objects_list)
+ var/smallest_x = 10000
+ for(var/obj/atom in objects_list)
+ if(atom.x < smallest_x)
+ smallest_x = atom.x
+ return smallest_x
+
+//Эффект снежной вьюги
+/obj/weather/snow
+ icon_state = "snow_storm"
+ icon = 'mods/weather/icons/weather_effects.dmi'
+ must_react_at_enter = TRUE
+ sound_type = list(
+ 'mods/weather/sounds/snowstorm.ogg'
+ )
+ blowout_icon_state = "snow_blowout"
+ blowout_messages = list(
+ "...всё резко стихло...затишье перед бурей?...не к добру...",
+ "Всё стихло, а в небе что-то словно зажигается...это не есть хорошо.",
+ "Все чувства, даже шестое, проснулось в тебе...что-то грядёт."
+ )
+
+
+
+//Эффект снега на экране
+/obj/screen/fullscreen/snow_effect
+ icon = 'mods/weather/icons/snow_screen.dmi'
+ icon_state = "snow"
+ layer = BLIND_LAYER
+ scale_to_view = TRUE
+
+
+
+/obj/weather/snow/add_monitor_effect(mob/living/input_mob)
+ input_mob.overlay_fullscreen("snow_monitor", /obj/screen/fullscreen/snow_effect)
+ //Логируем пользователя в глобальный список
+
+/obj/weather/snow/remove_monitor_effect(mob/living/input_mob)
+ input_mob.clear_fullscreen("snow_monitor")
+
+/obj/weather/snow/react_at_enter_in_blowout(atom/movable/atom)
+ if(isliving(atom))
+ var/mob/input_mob = atom
+ input_mob.emp_act(1)
+ return
+
+/obj/weather/snow/react_at_leave_from_blowout(atom/movable/atom)
+ return
+
+/obj/weather/snow/blowout_check_turf()
+ for(var/mob/living/somebody in get_turf(src))
+ somebody.emp_act(1)
diff --git a/mods/weather/code/swamp.dm b/mods/weather/code/swamp.dm
new file mode 100644
index 0000000000000..2188a800ec27d
--- /dev/null
+++ b/mods/weather/code/swamp.dm
@@ -0,0 +1,2 @@
+/obj/weather/swamp
+ name = "bam"
diff --git a/mods/weather/code/weather_manager.dm b/mods/weather/code/weather_manager.dm
new file mode 100644
index 0000000000000..96da36c92fef2
--- /dev/null
+++ b/mods/weather/code/weather_manager.dm
@@ -0,0 +1,103 @@
+///Менеджер/контроллер управляет всей погодой что привязана к нему
+/obj/weather_manager
+ var/list/weather_turfs_types = list()
+ var/list/connected_weather_turfs = list()
+ //Время смены
+ var/change_time_result
+ var/blowout_time_result
+ var/last_change_time
+ var/last_blowout_time
+ var/list/stages = list(
+
+ )
+ //Выброс
+ var/can_blowout = FALSE
+ //Игрокам в зоне выброса сообщают о нём.
+ var/message_about_blowout = TRUE
+ var/blowout_change_stage
+ var/delay_between_message_and_blowout
+
+/obj/weather_manager/Initialize()
+ .=..()
+ var/area/my_area = get_area(src)
+ var/managers_here = 0
+ for(var/turf/picked_turf in my_area)
+ if(locate(/obj/weather_manager) in picked_turf)
+ managers_here++
+ if(managers_here > 1)
+ qdel(src)
+ return //В нашей зоне уже есть контроллер, второму тут не место.
+ if(!LAZYLEN(weather_turfs_types)) //Если нам нечего спавнить - всем спасибо, все свободны
+ qdel(src)
+ return
+ //Сам спавн
+ calculate_change_time()
+ var/list/all_turfs = get_area_turfs(get_area(src))
+ for(var/turf/picked_turf in all_turfs)
+ var/spawn_type = pick(weather_turfs_types)
+ var/obj/weather/spawned_weather = new spawn_type(picked_turf)
+ LAZYADD(connected_weather_turfs, spawned_weather)
+ last_change_time = world.time
+ last_blowout_time = world.time
+ LAZYADD(SSweather.weather_managers_in_world, src)
+ START_PROCESSING(SSweather,src)
+
+/obj/weather_manager/Process()
+ if(world.time - last_change_time >= change_time_result)
+ change_stage()
+ if(can_blowout && world.time - last_blowout_time >= change_time_result)
+ start_blowout()
+
+/obj/weather_manager/proc/change_stage()
+ for(var/obj/weather/connected_weather in connected_weather_turfs)
+ connected_weather.update()
+ last_change_time = world.time
+ calculate_change_time()
+
+/obj/weather_manager/proc/start_blowout()
+ calculate_blowout_message_delay_time()
+ report_progress("DEBUG: Начинается выброс. Стадия - подготовка.")
+ STOP_PROCESSING(SSweather, src)
+ prepare_to_blowout()
+ for(var/obj/weather/connected_weather in connected_weather_turfs)
+ if(message_about_blowout)
+ connected_weather.message_about_blowout()
+ if(connected_weather.blowout_status)
+ change_stage(connected_weather.blowout_status, FALSE, FALSE)
+ sleep(delay_between_message_and_blowout)
+ report_progress("DEBUG: Начинается выброс. Стадия - начало.")
+
+/obj/weather_manager/proc/prepare_to_blowout()
+ return
+
+/obj/weather_manager/proc/stop_blowout()
+ if(!is_processing)
+ report_progress("DEBUG: Выброс окончен.")
+ START_PROCESSING(SSweather, src)
+
+/obj/weather_manager/proc/regenerate_anomalies_on_planet() //Выполняет перереспавн всех аномалий которые были заспавнены стандартным генератором на планете
+ set waitfor = FALSE
+ var/obj/overmap/visitable/sector/exoplanet/my_planet = map_sectors["[get_z(src)]"]
+ my_planet.full_clear_from_anomalies()
+ my_planet.generate_big_anomaly_artefacts()
+
+/obj/weather_manager/proc/calculate_change_time()
+ change_time_result = rand(8, 20 MINUTES)
+
+/obj/weather_manager/proc/calculate_blowout_time()
+ blowout_time_result = rand(45 MINUTES, 85 MINUTES)
+
+/obj/weather_manager/proc/calculate_blowout_message_delay_time()
+ delay_between_message_and_blowout = rand(2 MINUTES, 4 MINUTES)
+
+/obj/weather_manager/shuttle_land_on()
+ move_to_safe_turf()
+
+/obj/weather_manager/proc/move_to_safe_turf()
+ var/list/possible_turfs = get_area_turfs(get_area(src))
+ var/turf/my_turf = get_turf(src)
+ //Сдвинем турф минимум на 15 турфов подальше. Как ещё защитить его от посадки на него шаттла - не знаю.
+ for(var/turf/picked_turf in possible_turfs)
+ if(get_dist(picked_turf,my_turf) <= 15)
+ LAZYREMOVE(possible_turfs,picked_turf)
+ src.forceMove(possible_turfs)
diff --git a/mods/weather/icons/aurora_objects.dmi b/mods/weather/icons/aurora_objects.dmi
new file mode 100644
index 0000000000000..ee95118e053c0
Binary files /dev/null and b/mods/weather/icons/aurora_objects.dmi differ
diff --git a/mods/anomaly/icons/snow_screen.dmi b/mods/weather/icons/snow_screen.dmi
similarity index 100%
rename from mods/anomaly/icons/snow_screen.dmi
rename to mods/weather/icons/snow_screen.dmi
diff --git a/mods/anomaly/icons/weather_effects.dmi b/mods/weather/icons/weather_effects.dmi
similarity index 70%
rename from mods/anomaly/icons/weather_effects.dmi
rename to mods/weather/icons/weather_effects.dmi
index 00083c464a24f..dfde65bc922be 100644
Binary files a/mods/anomaly/icons/weather_effects.dmi and b/mods/weather/icons/weather_effects.dmi differ
diff --git a/mods/anomaly/sounds/snowstorm.ogg b/mods/weather/sounds/snowstorm.ogg
similarity index 100%
rename from mods/anomaly/sounds/snowstorm.ogg
rename to mods/weather/sounds/snowstorm.ogg