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