diff --git a/.github/workflows/ci_suite.yml b/.github/workflows/ci_suite.yml
index cb0b50e9c56c1..c33f43d9a31aa 100644
--- a/.github/workflows/ci_suite.yml
+++ b/.github/workflows/ci_suite.yml
@@ -96,7 +96,7 @@ jobs:
if: steps.linter-setup.conclusion == 'success' && !cancelled()
run: |
bash tools/ci/check_grep.sh
- bash massmeta/tools/massmeta_check_grep.sh # MASSMETA EDIT ADDITION - checking modular_meta code
+ bash modular_meta/tools/massmeta_check_grep.sh # MASSMETA EDIT ADDITION - checking modular_meta code
- name: Ticked File Enforcement
if: steps.linter-setup.conclusion == 'success' && !cancelled()
run: |
diff --git a/code/__DEFINES/___meta_modpaks_includes.dm b/code/__DEFINES/___meta_modpaks_includes.dm
new file mode 100644
index 0000000000000..f3877eeacc8a5
--- /dev/null
+++ b/code/__DEFINES/___meta_modpaks_includes.dm
@@ -0,0 +1 @@
+#include "..\..\modular_meta\__config_modpaks.dm"
diff --git a/code/__DEFINES/~DELETE_AFTER_MODULARIZATION.dm b/code/__DEFINES/~DELETE_AFTER_MODULARIZATION.dm
new file mode 100644
index 0000000000000..930c562ab526c
--- /dev/null
+++ b/code/__DEFINES/~DELETE_AFTER_MODULARIZATION.dm
@@ -0,0 +1,4 @@
+#include "..\..\massmeta\modular_meta_defines.dm"
+
+//DELETE IT THEN YOU DONE
+
diff --git a/code/__DEFINES/~meta_defines_include.dm b/code/__DEFINES/~meta_defines_include.dm
index 73e817cba85b5..714187d41acbe 100644
--- a/code/__DEFINES/~meta_defines_include.dm
+++ b/code/__DEFINES/~meta_defines_include.dm
@@ -1 +1 @@
-#include "..\..\massmeta\modular_meta_defines.dm"
+#include "..\..\modular_meta\_defines\main_modular_defines_include.dm"
diff --git a/code/__HELPERS/~meta_helpers_include.dm b/code/__HELPERS/~meta_helpers_include.dm
new file mode 100644
index 0000000000000..96fe3ade52f19
--- /dev/null
+++ b/code/__HELPERS/~meta_helpers_include.dm
@@ -0,0 +1 @@
+#include "..\..\modular_meta\_helpers\main_modular_helpers_include.dm"
diff --git a/massmeta/code/modules/uplink/uplink_items/nukeops.dm b/massmeta/code/modules/uplink/uplink_items/nukeops.dm
index 6a57499537618..57b48355832b0 100644
--- a/massmeta/code/modules/uplink/uplink_items/nukeops.dm
+++ b/massmeta/code/modules/uplink/uplink_items/nukeops.dm
@@ -18,12 +18,3 @@
item = /obj/item/clothing/suit/space/hardsuit/shielded/syndi
cost = 20
purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
-
-/datum/uplink_item/device_tools/car
- name = "BlyatMobile"
- desc = "Conquer the New Horizons on 4-passenger seats sedan."
- item = /obj/vehicle/sealed/car/cheburek
- cost = 40
- surplus = 0
- purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
- restricted = TRUE
\ No newline at end of file
diff --git a/massmeta/modular_meta.dm b/massmeta/modular_meta.dm
index c1548026798fd..d8cc9d94a9c91 100644
--- a/massmeta/modular_meta.dm
+++ b/massmeta/modular_meta.dm
@@ -86,11 +86,6 @@
#include "code\modules\map_vote.dm"
#include "code\modules\hallucination\fake_chat.dm"
-//cheburek Car
-#include "code\modules\vehicles\cars\cheburek.dm"
-#include "code\modules\vehicles\vehicle_actions.dm"
-#include "code\modules\cargo\packs\imports.dm"
-
//buts
#include "code\modules\surgery\organs\internal\butts\butts.dm"
#include "code\modules\surgery\organs\internal\butts\butts_init.dm"
diff --git a/modular_meta/__config_modpaks.dm b/modular_meta/__config_modpaks.dm
new file mode 100644
index 0000000000000..bbe8049978282
--- /dev/null
+++ b/modular_meta/__config_modpaks.dm
@@ -0,0 +1,14 @@
+// Comment define below to remove module from compilation prosses
+// If you don't see module name here = you can't off it. Remove code manualy.
+// Looks like mods in minecraft, isn't it?
+// Some mods may have dependencies, have fun buddy
+
+
+/// FEATURES
+
+#define CHEBUREK_CAR
+
+/// PEREVODY
+
+
+/// REVERTS
diff --git a/modular_meta/_defines/main_modular_defines_include.dm b/modular_meta/_defines/main_modular_defines_include.dm
new file mode 100644
index 0000000000000..ce897fdde8d84
--- /dev/null
+++ b/modular_meta/_defines/main_modular_defines_include.dm
@@ -0,0 +1,2 @@
+// Put all you modular defines here, it would be pasted right before TG Defines
+// So you can easily use your defines in TG code folder, not only in our modular folder
diff --git a/modular_meta/_defines/readme.md b/modular_meta/_defines/readme.md
new file mode 100644
index 0000000000000..7ba8436ebf512
--- /dev/null
+++ b/modular_meta/_defines/readme.md
@@ -0,0 +1,5 @@
+## Тут лежат все наши Новые Defines (определения), что мы определили в нашем модуле.
+
+Все они добавляются непосредственно в `main_modular_defines_include.dm`
+
+Сами дефайны инициализируются сразу после дефайнов офф ТГ в code/\_\_DEFINES/~meta_defines_include.dm (вот такая вот переадресация типа)
diff --git a/modular_meta/_helpers/main_modular_helpers_include.dm b/modular_meta/_helpers/main_modular_helpers_include.dm
new file mode 100644
index 0000000000000..e39ea81bfe7ca
--- /dev/null
+++ b/modular_meta/_helpers/main_modular_helpers_include.dm
@@ -0,0 +1,2 @@
+// Put all you modular helpers here, it would be pasted right before TG Helpers
+// So you can easily use your helpers in TG code folder, not only in our modular folder
diff --git a/modular_meta/_helpers/readme.md b/modular_meta/_helpers/readme.md
new file mode 100644
index 0000000000000..b0c650c368694
--- /dev/null
+++ b/modular_meta/_helpers/readme.md
@@ -0,0 +1,5 @@
+## Тут лежат все наши Новые Helpers (помощники?), что мы определили в нашем модуле.
+
+Все они добавляются непосредственно в `main_modular_helpers_include.dm`
+
+Сами хелперы инициализируются сразу после хелперов офф ТГ в code/\_\_DEFINES/~meta_helpers_include.dm (такая же переадресация аналогичная как и у дефайнов)
diff --git a/modular_meta/_modpacks_subsystem.dm b/modular_meta/_modpacks_subsystem.dm
new file mode 100644
index 0000000000000..41f6c12cb8ed8
--- /dev/null
+++ b/modular_meta/_modpacks_subsystem.dm
@@ -0,0 +1,83 @@
+#define INIT_ORDER_MODPACKS 84
+
+/datum/modpack
+ /// A string name for the modpack. Used for looking up other modpacks in init.
+ var/name
+ /// A string desc for the modpack. Can be used for modpack verb list as description.
+ var/desc
+ /// A string with authors of this modpack.
+ var/author
+ // Add info about dependencies and add somethere safety checks, ok?
+
+/datum/modpack/proc/pre_initialize()
+ if(!name)
+ return "Modpack name is unset."
+
+/datum/modpack/proc/initialize()
+ return
+
+/datum/modpack/proc/post_initialize()
+ return
+
+SUBSYSTEM_DEF(modpacks)
+ name = "Modpacks"
+ init_order = INIT_ORDER_MODPACKS
+ flags = SS_NO_FIRE
+ var/list/loaded_modpacks = list()
+
+/datum/controller/subsystem/modpacks/Initialize()
+ var/list/all_modpacks = list()
+ for(var/modpack in subtypesof(/datum/modpack/))
+ all_modpacks.Add(new modpack)
+ // Pre-init and register all compiled modpacks.
+ for(var/datum/modpack/package as anything in all_modpacks)
+ var/fail_msg = package.pre_initialize()
+ if(QDELETED(package))
+ CRASH("Modpack of type [package.type] is null or queued for deletion.")
+ if(fail_msg)
+ CRASH("Modpack [package.name] failed to pre-initialize: [fail_msg].")
+ if(loaded_modpacks[package.name])
+ CRASH("Attempted to register duplicate modpack name [package.name].")
+ loaded_modpacks.Add(package)
+
+ // Handle init and post-init (two stages in case a modpack needs to implement behavior based on the presence of other packs).
+ for(var/datum/modpack/package as anything in all_modpacks)
+ var/fail_msg = package.initialize()
+ if(fail_msg)
+ CRASH("Modpack [(istype(package) && package.name) || "Unknown"] failed to initialize: [fail_msg]")
+ for(var/datum/modpack/package as anything in all_modpacks)
+ var/fail_msg = package.post_initialize()
+ if(fail_msg)
+ CRASH("Modpack [(istype(package) && package.name) || "Unknown"] failed to post-initialize: [fail_msg]")
+
+ return SS_INIT_SUCCESS
+
+/client/verb/modpacks_list()
+ set name = "Modpacks List"
+ set category = "OOC"
+
+ if(!mob || !SSmodpacks.initialized)
+ return
+
+ // WHERE MYH FANCY TGUI, HUH!&!??
+ // Need to make groops: Features, Perevody, Reverts
+ if(length(SSmodpacks.loaded_modpacks))
+ . = "
Список модификаций
"
+ for(var/datum/modpack/M as anything in SSmodpacks.loaded_modpacks)
+ if(M.name)
+ . += "
"
+
+ var/datum/browser/popup = new(mob, "modpacks_list", "Список Модификаций", 480, 580)
+ popup.set_content(.)
+ popup.open()
+ else
+ to_chat(src, "Этот сервер не использует какие-либо модификации.")
diff --git a/massmeta/code/modules/cargo/packs/imports.dm b/modular_meta/features/cheburek_car/code/car_import.dm
similarity index 85%
rename from massmeta/code/modules/cargo/packs/imports.dm
rename to modular_meta/features/cheburek_car/code/car_import.dm
index 79f124032e8c6..bd3772b20199f 100644
--- a/massmeta/code/modules/cargo/packs/imports.dm
+++ b/modular_meta/features/cheburek_car/code/car_import.dm
@@ -1,3 +1,4 @@
+// code/modules/cargo/packs/imports.dm
/datum/supply_pack/imports/sovietvehicle
name = "Soviet Vehicle Exports"
desc = "The most affordable vehicle in the entire galaxy. \
@@ -12,4 +13,4 @@
/obj/vehicle/sealed/car/cheburek
)
crate_name = "Top Secret"
- crate_type = /obj/structure/closet/crate/large/soviet
\ No newline at end of file
+ crate_type = /obj/structure/closet/crate/large/soviet
diff --git a/massmeta/code/modules/vehicles/cars/cheburek.dm b/modular_meta/features/cheburek_car/code/cheburek.dm
similarity index 83%
rename from massmeta/code/modules/vehicles/cars/cheburek.dm
rename to modular_meta/features/cheburek_car/code/cheburek.dm
index 05bf96153b182..95735bb6cce72 100644
--- a/massmeta/code/modules/vehicles/cars/cheburek.dm
+++ b/modular_meta/features/cheburek_car/code/cheburek.dm
@@ -1,21 +1,21 @@
- /**
- * Really big car with 4х4 sprite.
- *
- * Can run people over.
- *
- * Can run ALL over in "I DRIVE" mode.
- *
- * Has gearbox, you can break it, and also fix it by yourself!
- *
- * It can be used in minor events.
- *
- * Some memes and gags included.
- */
+ /*
+Really big car with 4х4 sprite.
+
+Can run people over.
+
+Can run ALL over in "I DRIVE" mode.
+
+Has gearbox, you can break it, and also fix it by yourself!
+
+It can be used in minor events.
+
+Some memes and gags included.
+*/
/obj/vehicle/sealed/car/cheburek
name = "Cheburek"
desc = "The cheapest Bucket with bolts and nuts you can afford"
- icon = 'massmeta/icons/obj/toys/shaha.dmi'
+ icon = 'modular_meta/features/cheburek_car/icons/shaha.dmi'
icon_state = "cheburek" // the name form gta 5, you know?
layer = LYING_MOB_LAYER
max_occupants = 4
@@ -127,47 +127,6 @@
)
return ..()
-//////////////////////////
-/////Driveshaft Event/////
-//////////////////////////
-
-/obj/effect/immovablerod/driveshaft
- name = "hyperspaced driveshaft"
- desc = "What the fuck is that?"
- icon = 'massmeta/icons/obj/anomaly.dmi'
- icon_state = "driveshaft"
- notify = FALSE
- loopy_rod = TRUE
- dnd_style_level_up = FALSE
- /// The distance the rod will go.
- var/max_distance = 13
- /// The turf the rod started from, to calcuate distance.
- var/turf/start_turf
-
-/obj/effect/immovablerod/driveshaft/Initialize(mapload, atom/target_atom, atom/specific_target, force_looping = FALSE, max_distance = 13)
- . = ..()
- start_turf = get_turf(src)
- src.max_distance = max_distance
-
-/obj/effect/immovablerod/driveshaft/Destroy(force)
- start_turf = null
- return ..()
-
-/obj/effect/immovablerod/driveshaft/Move()
- if(get_dist(start_turf, get_turf(src)) >= max_distance)
- qdel(src)
- return
- return ..()
-
-/obj/effect/immovablerod/driveshaft/penetrate(mob/living/penetrated)
- penetrated.visible_message(
- span_danger("[penetrated] is penetrated by a hyperspaced driveshaft!"),
- span_userdanger("The [src] penetrates you!"),
- span_danger("You hear a CRANG!"),
- )
- penetrated.adjustBruteLoss(50)
-
-
///////////////////////
/////Damage Events/////
///////////////////////
@@ -227,8 +186,8 @@
add_overlay(image(icon, "open_bonnet_stickers", ABOVE_MOB_LAYER))
else
add_overlay(image(icon, "close_bonnet_stickers", ABOVE_MOB_LAYER))
- playsound(src, 'massmeta/sounds/vehicles/gopnik_laught.ogg', 66)
- balloon_alert(user, "Some odd insulating tape appeared on [src].")
+ playsound(src, 'modular_meta/features/cheburek_car/sound/gopnik_laught.ogg', 66)
+ balloon_alert(user, "some odd insulating tape appeared on [src].")
visible_message(span_userdanger("You hear a terrible roar from under the bottom of the car"))
name = "Cheburek Chad"
desc = "This is a verified Slavic Сar, that's all you need to know"
@@ -247,14 +206,14 @@
if(obj_flags & EMAGGED)
cut_overlay(image(icon, "open_bonnet_stickers", ABOVE_MOB_LAYER))
add_overlay(image(icon, "close_bonnet_stickers", ABOVE_MOB_LAYER))
- playsound(src, 'massmeta/sounds/vehicles/close_bonnet.ogg', 50)
+ playsound(src, 'modular_meta/features/cheburek_car/sound/close_bonnet.ogg', 50)
else
bonnet_isopen = !bonnet_isopen
add_overlay(image(icon, "car_openbonnet", LYING_MOB_LAYER))
if(obj_flags & EMAGGED)
cut_overlay(image(icon, "close_bonnet_stickers", ABOVE_MOB_LAYER))
add_overlay(image(icon, "open_bonnet_stickers", ABOVE_MOB_LAYER))
- playsound(src, 'massmeta/sounds/vehicles/open_bonnet.ogg', 50)
+ playsound(src, 'modular_meta/features/cheburek_car/sound/open_bonnet.ogg', 50)
/obj/vehicle/sealed/car/cheburek/wrench_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
@@ -338,7 +297,7 @@
return
if(gopgear == 0 && gearbox_failure_count != 10)
canmove = TRUE
- playsound(src, 'massmeta/sounds/vehicles/emergency_brake_release.ogg', 100)
+ playsound(src, 'modular_meta/features/cheburek_car/sound/emergency_brake_release.ogg', 100)
vehicle_move_delay -= 0.5
gopgear++
return
@@ -346,14 +305,14 @@
if(prob(gearbox_failure_count * 10) || prob(33))
if(gearbox_failure_count == 10)
if(canmove)
- playsound(src, pick('massmeta/sounds/vehicles/gear_blyat.ogg', 'massmeta/sounds/vehicles/gear_nah.ogg'), 100)
+ playsound(src, pick('modular_meta/features/cheburek_car/sound/gear_blyat.ogg', 'modular_meta/features/cheburek_car/sound/gear_nah.ogg'), 100)
toggle_blinkers()
canmove = FALSE
- balloon_alert(user, "Gearbox broken")
+ balloon_alert(user, "gearbox broken")
else
gearbox_failure_count++
AddElement(/datum/element/waddling)
- playsound(src, pick('massmeta/sounds/vehicles/gear_fault.ogg', 'massmeta/sounds/vehicles/gear_fault2.ogg', 'massmeta/sounds/vehicles/gear_fault3.ogg'), 50)
+ playsound(src, pick('modular_meta/features/cheburek_car/sound/gear_fault.ogg', 'modular_meta/features/cheburek_car/sound/gear_fault2.ogg', 'modular_meta/features/cheburek_car/sound/gear_fault3.ogg'), 50)
addtimer(CALLBACK(src, PROC_REF(revert_waddling)), 1 SECONDS)
else
playsound(src, 'sound/vehicles/mecha/mechmove04.ogg', 75)
@@ -369,7 +328,7 @@
return
if(gopgear == 1 && gearbox_failure_count != 10)
canmove = FALSE
- playsound(src, 'massmeta/sounds/vehicles/emergency_brake_pull.ogg', 100)
+ playsound(src, 'modular_meta/features/cheburek_car/sound/emergency_brake_pull.ogg', 100)
vehicle_move_delay += 0.5
gopgear--
return
@@ -377,14 +336,14 @@
if(prob(gearbox_failure_count * 10) || prob(33))
if(gearbox_failure_count == 10)
if(canmove)
- playsound(src, pick('massmeta/sounds/vehicles/gear_blyat.ogg', 'massmeta/sounds/vehicles/gear_nah.ogg'), 100)
+ playsound(src, pick('modular_meta/features/cheburek_car/sound/gear_blyat.ogg', 'modular_meta/features/cheburek_car/sound/gear_nah.ogg'), 100)
toggle_blinkers()
canmove = FALSE
balloon_alert(user, "Gearbox broken")
else
gearbox_failure_count++
AddElement(/datum/element/waddling) // your gears are juggling like a clown do
- playsound(src, pick('massmeta/sounds/vehicles/gear_fault.ogg', 'massmeta/sounds/vehicles/gear_fault2.ogg', 'massmeta/sounds/vehicles/gear_fault3.ogg'), 50)
+ playsound(src, pick('modular_meta/features/cheburek_car/sound/gear_fault.ogg', 'modular_meta/features/cheburek_car/sound/gear_fault2.ogg', 'modular_meta/features/cheburek_car/sound/gear_fault3.ogg'), 50)
addtimer(CALLBACK(src, PROC_REF(revert_waddling)), 1 SECONDS)
else
playsound(src, 'sound/vehicles/mecha/mechmove04.ogg', 75)
@@ -415,7 +374,7 @@
/obj/vehicle/sealed/car/cheburek/proc/endless_tik()
if(isturnsound_on)
- playsound(src, 'massmeta/sounds/vehicles/car_turn_signal.ogg', 60)
+ playsound(src, 'modular_meta/features/cheburek_car/sound/car_turn_signal.ogg', 60)
//update_overlays()
cut_overlay(image(icon, "car_blinkers", LYING_MOB_LAYER))
blinkers_on = FALSE
diff --git a/modular_meta/features/cheburek_car/code/driveshaft_rod.dm b/modular_meta/features/cheburek_car/code/driveshaft_rod.dm
new file mode 100644
index 0000000000000..4ca66cdb3d2c8
--- /dev/null
+++ b/modular_meta/features/cheburek_car/code/driveshaft_rod.dm
@@ -0,0 +1,39 @@
+//////////////////////////
+/////Driveshaft Event/////
+//////////////////////////
+
+/obj/effect/immovablerod/driveshaft
+ name = "hyperspaced driveshaft"
+ desc = "What the fuck is that?"
+ icon = 'modular_meta/features/cheburek_car/icons/anomaly.dmi'
+ icon_state = "driveshaft"
+ notify = FALSE
+ loopy_rod = TRUE
+ dnd_style_level_up = FALSE
+ /// The distance the rod will go.
+ var/max_distance = 13
+ /// The turf the rod started from, to calcuate distance.
+ var/turf/start_turf
+
+/obj/effect/immovablerod/driveshaft/Initialize(mapload, atom/target_atom, atom/specific_target, force_looping = FALSE, max_distance = 13)
+ . = ..()
+ start_turf = get_turf(src)
+ src.max_distance = max_distance
+
+/obj/effect/immovablerod/driveshaft/Destroy(force)
+ start_turf = null
+ return ..()
+
+/obj/effect/immovablerod/driveshaft/Move()
+ if(get_dist(start_turf, get_turf(src)) >= max_distance)
+ qdel(src)
+ return
+ return ..()
+
+/obj/effect/immovablerod/driveshaft/penetrate(mob/living/penetrated)
+ penetrated.visible_message(
+ span_danger("[penetrated] is penetrated by a hyperspaced driveshaft!"),
+ span_userdanger("The [src] penetrates you!"),
+ span_danger("You hear a CRANG!"),
+ )
+ penetrated.adjustBruteLoss(50)
diff --git a/modular_meta/features/cheburek_car/code/nukeops_uplink.dm b/modular_meta/features/cheburek_car/code/nukeops_uplink.dm
new file mode 100644
index 0000000000000..69c0815f8e932
--- /dev/null
+++ b/modular_meta/features/cheburek_car/code/nukeops_uplink.dm
@@ -0,0 +1,8 @@
+/datum/uplink_item/device_tools/car
+ name = "BlyatMobile"
+ desc = "Conquer the New Horizons on 4-passenger seats sedan."
+ item = /obj/vehicle/sealed/car/cheburek
+ cost = 40
+ surplus = 0
+ purchasable_from = UPLINK_NUKE_OPS | UPLINK_CLOWN_OPS
+ restricted = TRUE
diff --git a/massmeta/code/modules/vehicles/vehicle_actions.dm b/modular_meta/features/cheburek_car/code/vehicle_actions.dm
similarity index 89%
rename from massmeta/code/modules/vehicles/vehicle_actions.dm
rename to modular_meta/features/cheburek_car/code/vehicle_actions.dm
index 860f77d717a1a..344ced6021bc8 100644
--- a/massmeta/code/modules/vehicles/vehicle_actions.dm
+++ b/modular_meta/features/cheburek_car/code/vehicle_actions.dm
@@ -1,6 +1,6 @@
//CHЁBUREK ACTION DATUMS
/datum/action/vehicle/sealed/gopnik
- button_icon = 'massmeta/icons/mob/actions/actions_vehicle.dmi'
+ button_icon = 'modular_meta/features/cheburek_car/icons/actions_vehicle.dmi'
name = "Toggle Gop Mode"
desc = "Grabs your Vodka and Semki!"
button_icon_state = "gop_mode"
@@ -16,7 +16,7 @@
C.toggle_gopmode(owner)
/datum/action/vehicle/sealed/gear_up
- button_icon = 'massmeta/icons/mob/actions/actions_vehicle.dmi'
+ button_icon = 'modular_meta/features/cheburek_car/icons/actions_vehicle.dmi'
name = "Gear UP"
desc = "Make your vedro move faster!"
button_icon_state = "car_gear_up"
@@ -32,7 +32,7 @@
G.increase_gear(owner)
/datum/action/vehicle/sealed/gear_down
- button_icon = 'massmeta/icons/mob/actions/actions_vehicle.dmi'
+ button_icon = 'modular_meta/features/cheburek_car/icons/actions_vehicle.dmi'
name = "Gear DOWN"
desc = "Make your vedro move slower!"
button_icon_state = "car_gear_down"
@@ -62,7 +62,7 @@
L.car_lights_toggle(owner)
/datum/action/vehicle/sealed/blinkers
- button_icon = 'massmeta/icons/mob/actions/actions_vehicle.dmi'
+ button_icon = 'modular_meta/features/cheburek_car/icons/actions_vehicle.dmi'
name = "Avariyka"
desc = "Useful if you need to park your bucket anywhere"
button_icon_state = "car_blinker"
diff --git a/modular_meta/features/cheburek_car/icons/actions_vehicle.dmi b/modular_meta/features/cheburek_car/icons/actions_vehicle.dmi
new file mode 100644
index 0000000000000..c3f60e14a20db
Binary files /dev/null and b/modular_meta/features/cheburek_car/icons/actions_vehicle.dmi differ
diff --git a/modular_meta/features/cheburek_car/icons/anomaly.dmi b/modular_meta/features/cheburek_car/icons/anomaly.dmi
new file mode 100644
index 0000000000000..fdaed704ed2b6
Binary files /dev/null and b/modular_meta/features/cheburek_car/icons/anomaly.dmi differ
diff --git a/modular_meta/features/cheburek_car/icons/shaha.dmi b/modular_meta/features/cheburek_car/icons/shaha.dmi
new file mode 100644
index 0000000000000..90795dbd09a77
Binary files /dev/null and b/modular_meta/features/cheburek_car/icons/shaha.dmi differ
diff --git a/modular_meta/features/cheburek_car/includes.dm b/modular_meta/features/cheburek_car/includes.dm
new file mode 100644
index 0000000000000..9f73d64a94277
--- /dev/null
+++ b/modular_meta/features/cheburek_car/includes.dm
@@ -0,0 +1,11 @@
+#include "code\car_import.dm"
+#include "code\cheburek.dm"
+#include "code\driveshaft_rod.dm"
+#include "code\nukeops_uplink.dm"
+#include "code\vehicle_actions.dm"
+
+
+/datum/modpack/cheburek_car
+ name = "Жигуль машинка"
+ desc = "Хуярит все и вся, хардбасс тоже!"
+ author = "Some Specimes"
diff --git a/modular_meta/features/cheburek_car/readme.md b/modular_meta/features/cheburek_car/readme.md
new file mode 100644
index 0000000000000..1f3678104b64e
--- /dev/null
+++ b/modular_meta/features/cheburek_car/readme.md
@@ -0,0 +1,14 @@
+## Module ID: CHEBUREK_CAR
+
+
+### Defines:
+
+- N/A
+
+### TG Proc/File Changes:
+
+- N/A
+
+### TGUI Files:
+
+- N/A
diff --git a/modular_meta/features/cheburek_car/sound/car_turn_signal.ogg b/modular_meta/features/cheburek_car/sound/car_turn_signal.ogg
new file mode 100644
index 0000000000000..8e7e7eda8ae22
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/car_turn_signal.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/close_bonnet.ogg b/modular_meta/features/cheburek_car/sound/close_bonnet.ogg
new file mode 100644
index 0000000000000..ea610f66f3e78
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/close_bonnet.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/emergency_brake_pull.ogg b/modular_meta/features/cheburek_car/sound/emergency_brake_pull.ogg
new file mode 100644
index 0000000000000..b4ed080fd5d66
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/emergency_brake_pull.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/emergency_brake_release.ogg b/modular_meta/features/cheburek_car/sound/emergency_brake_release.ogg
new file mode 100644
index 0000000000000..9add01ebcdbd0
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/emergency_brake_release.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gear_blyat.ogg b/modular_meta/features/cheburek_car/sound/gear_blyat.ogg
new file mode 100644
index 0000000000000..9ce716f7c5a95
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gear_blyat.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gear_fault.ogg b/modular_meta/features/cheburek_car/sound/gear_fault.ogg
new file mode 100644
index 0000000000000..510fdedac7d18
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gear_fault.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gear_fault2.ogg b/modular_meta/features/cheburek_car/sound/gear_fault2.ogg
new file mode 100644
index 0000000000000..469de00ead93d
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gear_fault2.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gear_fault3.ogg b/modular_meta/features/cheburek_car/sound/gear_fault3.ogg
new file mode 100644
index 0000000000000..0adf9243daea5
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gear_fault3.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gear_nah.ogg b/modular_meta/features/cheburek_car/sound/gear_nah.ogg
new file mode 100644
index 0000000000000..e0c9516078da6
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gear_nah.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/gopnik_laught.ogg b/modular_meta/features/cheburek_car/sound/gopnik_laught.ogg
new file mode 100644
index 0000000000000..929adc792b4ba
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/gopnik_laught.ogg differ
diff --git a/modular_meta/features/cheburek_car/sound/open_bonnet.ogg b/modular_meta/features/cheburek_car/sound/open_bonnet.ogg
new file mode 100644
index 0000000000000..9793fdfdaf391
Binary files /dev/null and b/modular_meta/features/cheburek_car/sound/open_bonnet.ogg differ
diff --git a/modular_meta/features/readme.md b/modular_meta/features/readme.md
new file mode 100644
index 0000000000000..6768888a10f53
--- /dev/null
+++ b/modular_meta/features/readme.md
@@ -0,0 +1,5 @@
+## Все-все-все КРУПНЫЕ фичи, что добавленны в этот репо.
+
+Фича считается крупной, если она с трудом уменьшается в 1 файлик .dm + она не является переводом.
+
+Все переводы и мелкие фиксы (они же реверты) идут в свои соответсвующие папки.
diff --git a/modular_meta/main_modular_include.dm b/modular_meta/main_modular_include.dm
new file mode 100644
index 0000000000000..0d57910bfe0d7
--- /dev/null
+++ b/modular_meta/main_modular_include.dm
@@ -0,0 +1,15 @@
+// All new mod's includes here
+// Some modules can be easy excludes from code compile sequence by commenting #define you need to remove in code\__DEFINES\__meta_modpaks_includes.dm
+// Keep in mind, that module may not be only in modular folder but also embedded directly in TG code and covered with #ifdef - #endif structure
+
+#include "_modpacks_subsystem.dm" //actually mods subsystem
+
+/// FEATURES
+#ifdef CHEBUREK_CAR
+ #include "features\cheburek_car\includes.dm"
+#endif
+
+/// PEREVODY
+
+
+/// REVERTS
diff --git a/modular_meta/modularization_guide_ru.md b/modular_meta/modularization_guide_ru.md
new file mode 100644
index 0000000000000..a08ced18a1818
--- /dev/null
+++ b/modular_meta/modularization_guide_ru.md
@@ -0,0 +1,439 @@
+# Руководство по модуляризации кода – MassMeta style, v0.3
+
+**Соблюдение этого Гайда – залог успешного мержа Вашей фичи в репозиторий.**
+
+## Вступление
+
+Проект **МассМета** 🧰 – это, постоянно обновляющаяся, модульная ветка от проекта [/TG/station](https://github.com/tgstation/tgstation). Тут мы добавляем свои фичи и по возможности откатываем неудачные. Прочитав эту инструкцию – Вы поймете как правильно нужно внедрить к нам Вашу идею, чтоб ее могли увидеть в свет другие игроки нашего сервера.
+
+Несоблюдение данного руководства приведёт к стагнации код-базы проекта, как это было до. Осознав наши прошлые ошибки - было принято решение привести проект к модульности подобно той, как на серверах Skyrat, однако доработанной под наши нужды. [Оригинальное руководство](https://github.com/NovaSector/NovaSector/blob/master/modular_nova/readme.md) (на англ.)
+
+⚠️ **Все Баг-фиксы немодульного кода, изменение не Наших карт и тем более уже рефакторы кода – Вам нужно будет заливать именно в апстрим /TG/station !**
+
+### Про тестирование своих PR'ов 🔬
+
+Прежде чем открывать PR на слияние, то было бы неплохо проверить Ваш код на работоспособность.
+А именно:
+* Скомпилируйте билд на своей локальной машине.
+* Запустите билд с Вашей **Фичей** и посмотрите как она себя ведёт, если ли какие-либо аномалии.
+* Если Ваша Фича предполагает взаимодействие нескольких игроков, то можете воспользоваться **Гостевым аккаунтом**. Для этого выйдите из BYOND-хаба и зайдите на локалку как Guest-[много циферок].
+
+Как только Вы считаете, что уже достаточно проверили своё творение, то создавайте PR на наш репозиторий, там Вам уже подскажут как можно доработать тот или иной момент.
+
+### Про платформу GitHub
+
+Это одна из многих видов Систем Контроля Версий. Проект /TG/station располагается именно на нем. Сам Git одновременно и достаточно проработан в плане алгоритмов, он ими же и ограничен. Они не всегда могут однозначно самостоятельно разрешить определенные изменения в коде, что приводит к конфликтам, которые нужно резолвить вручную.
+
+Подробнее про сам Git и как с ним работать [тут](https://git-scm.com/book/ru/v2).
+
+## Суть Конфликта ⚔️
+
+Начнём сразу с показательного примера.
+
+Предположим, что в какой-то строчке оригинального файла **`foobar.dm`** /TG/station было так:
+
+```byond
+var/something = 1
+```
+
+Однако, под наши нужны нам потребовалось изменить значение с **1** на **2** под какую-то фичу в проекте,
+
+```diff
+- var/something = 1
++ var/something = 2 //MASSMETA EDIT
+```
+
+Но неожиданно апстрим /TG/station вносит свои изменения (commit: their-feature) в эту же строку файла, меняя её у себя с **1** на **4**,
+
+```diff
+- var/something = 1
++ var/something = 4
+```
+Затем мы решили синхронизировать изменения и видим следующее,
+
+```byond
+<<<<<< HEAD:foobar.dm
+var/something = 2 //MASSMETA EDIT
+======
+var/something = 4
+>>>>>> their-feature:foobar.dm
+```
+
+В данном случае в череду коммитов /TG/station внедряется дополнительный, про который известно только нам самим. ГитХаб, видя подобное несоответствие - даёт нам сделать выбор.
+
+Например, нам нужно оставить только Наше изменение, то просто удаляем все что нам добавил ГитХаб и оставляем только нужное,
+
+```byond
+var/something = 2 //MASSMETA EDIT
+```
+
+Подобного рода конфликты разрешаются именно ручками, однако есть другие подходы в виде модульного кода, о которых мы расскажем далее в данном руководстве.
+
+Подробнее про [Ветвления и Слияния](https://git-scm.com/book/ru/v2/Ветвление-в-Git-Основы-ветвления-и-слияния).
+
+## Протокол модуляризации 🛠️
+
+У Вашего модуля должно быть короткое и информативное название в документации, например - **`shuttle_toggle`**.
+
+Этим уникальным **ID** Вы затем назовёте:
+
+- Свою модульную папку `modular_meta/features/shuttle_toggle/`, в которой вы будете локально работать.
+
+- А также в дальнейшем Вы будете помечать все **Немодульные** изменения в коде /TG/station.
+
+- В редких случаях он может пригодится как некая метка для включения/отключения модуля. Об этом будет отдельно рассказано ниже.
+
+Теперь подробнее про виды модуляризации.
+
+### Не Модульные Изменения
+
+Время от времени наступает момент, когда редактирование **оригинальных** файлов /TG/station становится неизбежным.
+
+📌 Пожалуйста, не забудьте записать факт их изменения под пунктом **"TG Proc/File Changes"** в **`readme.md`** вашего модуля.
+
+В этих случаях мы решили применять следующую стандартизацию:
+
+- **Добавление:**
+
+ ```byond
+ //MASSMETA EDIT ADDITION BEGIN (shuttle_toggle)
+ var/adminEmergencyNoRecall = FALSE
+ var/lastMode = SHUTTLE_IDLE
+ var/lastCallTime = 6000
+ //MASSMETA EDIT ADDITION END
+ ```
+
+- **Удаление:**
+
+ ```byond
+ //MASSMETA EDIT REMOVAL BEGIN (shuttle_toggle)
+ /*
+ for(var/obj/docking_port/stationary/S in stationary)
+ if(S.id = id)
+ return S
+ */
+ //MASSMETA EDIT REMOVAL END
+ ```
+
+- **Изменения:**
+
+ ```byond
+ //MASSMETA EDIT CHANGE BEGIN (shuttle_toggle)
+ /* ORIGINAL
+ if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE)
+ */
+ if(SHUTTLE_STRANDED, SHUTTLE_ESCAPE, SHUTTLE_DISABLED)
+ //MASSMETA EDIT CHANGE END
+ return 1
+ ```
+
+ 💡 Если предполагается **"Масштабное"** изменений кода, то такое переопределение уже можно переместить в модуль. Однако на месте удаления обязательно допишите: (Moved to: modular_meta/features/shuttle_toggle/randomverbs.dm)
+
+ ⚠️ Обязательно оставляем все что было до вашего вмешательства под пометкой **ORIGINAL**!
+
+### Полностью Модульные Изменения
+
+В нашем проекте присутствует папка **`modular_meta/`**, там будут храниться все наши **"Модульные"** изменения кода /TG/station.
+
+💡 Она полностью независима и этим мы гарантируем, что кодеры с /TG/station не будут туда вмешиваться.
+
+В этой папке есть ещё несколько подпапок и файлов:
+
+| Папка/Файл |
+| ---------------------------------- |
+| **_\defines** 📁 |
+| **\_helpers** 📁 |
+| **features** 📁 |
+| **perevody** 📁 |
+| **reverts** 📁 |
+| **tools** 📁 |
+| **\_modpacks_subsystem.dm** 📄 |
+| **main_modular_include.dm** 📄 |
+| **modularization_guide_ru.md** 📝 |
+| **module_template.md** 📝 |
+
+Теперь подробнее про каждую из Папок:
+
+- **`_\defines/ и \_helpers/`** 📂
+
+ Здесь лежат все наши модульные "определения" (они же defines) и "помощники" (helpers).
+
+ Вынесена отдельно из папки **`features/`** из-за того, что их требуется ставить выше основного ТГ кода, сразу же после дефайнов ТГ, (за счет этого мы можем использовать наши дефайны в коде ТГ, а не только в модулях).
+
+ 💡 Если эти штучки применяются только в рамках одного файла, то их достаточно объявить вверху и внизу файла.
+
+ ```byond
+ #define MY_DEFINE
+ //some code with MY_DEFINE here
+ #undef MY_DEFINE
+ ```
+
+ 📌 Пожалуйста, не забудьте записать факт их добавления под пунктом **"Defines/Helpers:"** в **`readme.md`** вашего модуля.
+
+ Все файлы в папках включены в **`modular_meta/_defines/main_modular_defines_include.dm`** и в **`modular_meta/_helpers/main_modular_helpers_include.dm`** соотвественно.
+
+- **`features/`** 📂
+
+ Здесь лежат все модульные файлы **"Новых Фич"**, которых нет в апстриме. Каждой присвоен уникальный **module_id**.
+
+ Подробнее про строение папок модуля расскажем чуть ниже.
+
+- **`perevody/`** 📂
+
+ Папка аналогичная `features/`, но в ней уже лежит перевод на Русский всякого в игре.
+
+ Выделена отдельно, чтобы её можно было легко отключить из компиляции кода для англо-язычных форков.
+
+ Такой модуль именовать уже обязательно с припиской **"ru_"**, например вот так: **ru_module_id**.
+
+- **`reverts/`** 📂
+
+ Папка аналогичная `features/`, но там располагаются недавние откаты плохих и возвраты хороших по нашему мнению фич, введёных апстримом /TG/station.
+
+ ❗ Если фича была уже выпилена давно или же апстрим произвел её полное удаление сразу, то она уже может рассматриваться как самостоятельный модуль в `features/`!
+
+ Такой модуль именовать обязательно с припиской **"revert_"**, например: **revert_module_id**.
+
+ ⚠️ Укажите в **`readme.md`** модуля ссылку на пиар, который откатываевается!
+
+- **`tools/`** 📂
+
+ Тут лежат все дополнительные инструменты проверки нашего кода.
+
+ Они проверяют только файлы в модульной папке, помогая нам не совершать дополнительных ошибкок.
+
+ К ним идет прямое обращение только в файле: **`.github/workflows/ci_suite.yml`**.
+
+## Подробнее про наполнение папок (features/ perevody/ reverts/)
+
+Чтобы сохранить общий стиль и обеспечить удобную навигацию по большинству модулей, а также контролировать количество файлов и папок в репозитории, Вы должны располагать определённые типы файлов по своим папкам.
+
+⚠️ Каждый модуль обязан содержать в себе файл документации модуля – `readme.md`.
+
+| Папка/Файл | Содержимое |
+| ------------------ | --------------------------------------------------------------------- |
+| **code/** 📁 | Файлы кода: **`.dm`** |
+| **icon/** 📁 | Файлы иконок и картинок: **`.dmi`** и **`.png`** |
+| **sound/** 📁 | Звуковые файлы: **`.ogg`** и **`.waw`** |
+| **includes.dm** 📄 | Инклюд всех файлов в папке **code/** и объект модуля `/datum/modpack/`|
+| **readme.md** 📝 | Полная документация к модулю, [пример](module_template.md) |
+
+⚠️ Файлы строк: **`.txt`** и **`.json`** вы помещаете в папку `strings/meta/`, т.к. код /TG/station не может работать нормально со всеми файлами-строк вне этой папки.
+
+⛔ У проектов **Skyrat** присуствует папка `master_files/`, однако у нас в проекте её НЕТ! Все переопредения кода у нас помещаются полностью в модуль с особыми пометками! Пояснения будут позже.
+
+❗ Также у проектов **Skyrat** стандартно все новые файлы сразу включаются в общий файл **`tgstation.dme`**, что я считаю достаточно трудным для дальнейшней поддержки. У нашего проекта другой поход в этом моменте, как Вы видите.
+
+### Подробнее про папку **`code/`**
+
+⚠️ В этих файлах не должно быть закомментированного кода, тем более полностью закомментированных файлов! А вот пояснения к коду оставлять можно, порой даже и нужно.
+
+Здесь располагается код двух типов:
+
+#### Абсолютно новые функции и объекты 🆕
+
+Просто ложите все свои новые файлы кода в папку `code/` своего модуля.
+
+💡 Можете разбивать Ваши файлы под по подпапкам, если в этом есть нужда.
+
+Не забывайте проставлять все ваши пути к иконкам и звуку правильно!
+
+#### Переопределение объектов и функций /TG/station 🔀
+
+С помощью этих файлов мы косвенно изменяем основной код /TG/station. Это позволяет нам очень изящно внедрять свои коррективы, не вмешиваясь напрямую в основной код. Тем самым не нарушая их череду коммитов и не создавая для нас самих в будущем **Конфликтов Слияния**.
+
+Однако это является и минусом такого подхода. Гитхаб не сможет нам оперативно подсказать где файл поменялся из-за вмешательства апстрима и где следует учесть измененое или дополнительное переопределение. Иногда прямые изменения кода через `//MASSMETA EDIT` предпочтительнее. Старайтесь использовать здравый смысл в этом вопросе.
+
+⚠️ У данных файлов **Не надо соблюдать Иерархию** аналогичной папки `code/` у /TG/station! Просто ложите вместе со всеми файлами в модуль.
+
+Эти файлы выносите в "отдельную группу" с помощью пометки `"m_"` в названии (от слова master), например: `m_tg_filename.dm`.
+
+⚠️ Над каждым блоком таких функций/объектов **подписывайте в каком оригинальном файле /TG/station они расположены**. Таким образом нам будет проще смекнуть что к чему.
+
+- **Пример модульного переопределения объекта** 💡
+
+ Например, Вы решили модульно переопределить иконку и описание у мольберта (easel).
+
+ Оригинальный объект в коде /TG/station по пути `code/modules/art/paintings.dm`:
+
+ ```byond
+ /obj/structure/easel
+ name = "easel"
+ desc = "Only for the finest of art!"
+ icon = 'icons/obj/art/artstuff.dmi'
+ icon_state = "easel"
+ density = TRUE
+ resistance_flags = FLAMMABLE
+ max_integrity = 60
+ var/obj/item/canvas/painting = null
+ ```
+
+ Для этого создайте новый файл желательно с таким же именем как у оригинала и расположите в папке `code/` вашего модуля: `code/master_paintings.dm`.
+
+ Для выполнения нашей цели, наполнение даного файла будет выглядеть примерно так:
+
+ ```byond
+ //ORIGINAL: code/modules/art/paintings.dm
+ /obj/structure/easel
+ desc = "Let yourself draw!"
+ icon = 'modular_meta/features/art/icons/artstuff.dmi'
+ icon_state = "new_easel"
+ ```
+
+ Теперь при компилировании проекта, данное переопределение подменит эти переменные у оригинального объекта мольберта. Тем самым в готовом проекте у мольберта будет уже Новая иконка и описание. Даже код /TG/station менять не пришлось! 🎉
+
+- **Пример модульного добавления фичи в функцию** 💡
+
+ Для простоты предположим, что вы хотите заставить оружие искрить при выстреле для имитации дульной вспышки.
+
+ Также Вы хотите, чтобы это можно было использовать со всеми видами оружия, использующими эту функцию.
+
+ В модульном файле объекта можно начать с добавления новой переменной `var/muzzle_flash`.
+
+ ```byond
+ /obj/item/gun
+ var/muzzle_flash = TRUE
+ ```
+
+ Теперь у Вас будет **у каждого** наследника этого объекта доступна эта переменная. После этого, допустим, вы захотите проверять её и вызвать искры после выстрела.
+
+ У этого объекта уже есть процедура, что вызывается при стрельбе:
+
+ ```byond
+ /obj/item/gun/proc/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
+ ```
+
+ Теперь мы начинаем **добавлять код** для работы нашей фичи в дочернюю процедуру `/obj/item/gun/shoot_live_shot()`.
+
+ ```byond
+ /obj/item/gun/shoot_live_shot(mob/living/user, pointblank = 0, atom/pbtarget = null, message = 1)
+ . = ..()
+ if(muzzle_flash)
+ spawn_sparks(src)
+ ```
+
+ Тут мы обязательно вызываем такую конструкцию **`. = ..()`**, она по сути своей говорит, что мы наследуемся от родительской функции. После данной конструкции добаляем весь наш **Новый** код.
+
+ Теперь при компилировании проекта, данные "добавления" допишутся в оригинальный объект и функцию. Этим мы добились того, что оружие при выстреле ещё и искрит, при том не вмешиваясь в функции /TG/station напрямую! 🎉
+
+### **`. = ..()`** для чайников
+
+Как вы уже могли заметить, у языка DM частично заложена парадигма ООП, нас в данном случае интересует процесс наследования объектов и их функций.
+
+💡 Вы также можете нажать F1 в Dream Maker и прочитать подробный мануал на английском.
+
+- `.` – это возвращаемое значение нашей функции по умолчанию. Изначально оно равно `null`.
+
+- `..` – это возвращаемое значение родительской функции.
+
+ Через `..()` Вы обращаетесь к родительской функции, этим вызывая её в нужном месте Вашей функции-наследника.
+
+И теперь, если вы сделаетете подобый манёвр `. = ..()`, то Вы вызовите родительскую функцию и присвоите её значение возвращаемому значению нашей функции. После этого можете свободно дополнять свою `.` чем хотите.
+
+Так же в случае, если Вы не хотите возвращать родительский вывод, то Вы можете сохранить его в любую переменную или просто использовать `..()`
+
+Мы так же можем вообще не вызывать `..()` - тогда функция оверрайдится полностью. Но я бы не рекомендовал делать подобное, ради перемещения ориг. функции в модуль и дальнейшей модификации её уже там, ибо когда /TG/station поменяет её у себя, то пиши пропало.
+
+Также учтите, что вы не сможете при модульном дополнии функции использовать те переменные, которые были объявленны в функции оригинале!
+
+## Карты 🗺️
+
+Используются карты:
+* 🔴 Оригинальные с офф ТГ (без прямых наших изменений)
+* 🟡 Заимствованные с других билдов (некоторые желательно не менять, т.к. мы можем подтягивать обновления в других билдов)
+* 🟢 Наши самодельные, они же полностью независимые, например, ProtoBoxStation (меняем и чиним как хотим)
+
+### Новые карты (наши самодельные)
+
+Все наши Новые карты лежат по пути со всеми остальными в **`\_maps/map_files/`** (не в модульной папке).
+
+К каждой карте идёт дополнительно **`.json`** файл-конфигурации в **`\_maps/`**, не забудьте добавить его тоже!
+
+### Модульное Изменение Карт ТГ (через применение Авто-мапперов)
+
+⚠️ Не изменяйте оригинальные карты /TG/station напрямую, Вы стокнётесь потом с таким же хаосом, как если вы бы меняли файлы иконок! Для внесения изменений ипользуйте модуль Авто-маппера.
+
+Когда вы добавляете новый элемент на карту, то вы должны сперва определеить масштаб переделок.
+
+- Если это **небольшое изменение на 1 предмет**, то используйте простой автоматизатор области.
+
+ Автомаппер простых областей использует записи точек отсчета, чтобы поместить один элемент в область карты, которая имеет определенный смысл.
+
+- Если речь идет об **изменении целой комнаты**, то используйте автоматизатор шаблонов.
+
+ Автомаппер использует готовые шаблоны для переопределения участков карты, используя координаты для определения начального местоположения. Примеры смотрите в файле automapper_config.toml.
+
+## Модульный TGUI (TG User Interface)
+
+**TGUI** - еще один исключительный случай, поскольку он использует Javascript, который не может быть модульным, нежели же код DM.
+
+ВСЕ файлы TGUI находятся в папке `/tgui/packages/tgui/interfaces/` и ее подкаталогах. Нет какой-то конкретной папки для Наших TGUI файлов!
+
+📌 Пожалуйста, не забудьте записать факт их добавления/изменения под пунктом **"TGUI Files:"** в **`readme.md`** вашего модуля.
+
+### Изменение оригинальных файлов /TG/station
+
+При изменении оригинальных файлов TGUI поступаем аналогично, как и при изменении вышележащего кода DM, однако схема написания комментариев тут несколько иная.
+
+Вы можете использовать как `// MASSMETA EDIT`, так и `/* MASSMETA EDIT */`, хотя в некоторых случаях вам придется использовать одно вместо другого. (в некотрых языках '//' - могут не являться комментированием, учтите это)
+
+В целом, старайтесь, чтобы комментарии к изменениям находились на той же строке, что и само изменение. Предпочтительно внутри JSX-тега. Например:
+
+```js
+
+```
+
+```js
+
+```
+
+```js
+
+```
+
+В крайнем случае Вы можете заключить ваше редактирование в фигурные скобки, например так:
+
+```js
+{/* MASSMETA EDIT ADDITION START */}
+
+ someProp="whatever"
+
+{/* MASSMETA EDIT ADDITION END */}
+```
+
+### Создание новых файлов TGUI
+
+⚠️ При создании нового файла TGUI с нуля, пожалуйста, добавьте **Заголовочный Комментарий** самом верху файла:
+
+```js
+// THIS IS A MASSMETA UI FILE
+```
+
+Таким образом, они легко идентифицируются как **Наши** модульные файлы TGUI `.tsx` и `.jsx`.
+
+Собственно ничего больше делать и не нужно, комментарии `// MASSMETA EDIT` в таком файле TGUI излишне.
+
+
+
+## В заключении
+
+Терпение и труд – ТГ к*дера перетрут. Если мы будем последовательны, то в конечном итоге это избавит НАС от будущих болей в области ГМ, когда Нам (Вам) же придется разрешать конфликты вручную.
+Благодаря более скрупулезному документированию будет сразу понятно, какие изменения были сделаны, где и с помощью каких функций, и все станет гораздо менее двусмысленным и запутанным.
+
+Желаю удачи в ТГ кодинге. Помните, что сообщество всегда готово помочь Вам, если вдруг понадобится помощь.
+
+Оригинальное руководство: Skyrat/NovaSector. Основа модульности: Nebula and Bandastation (SS220). Перевод: Artemchik542. Доработка модульной системы: Artemchik542, Huz2e.
diff --git a/modular_meta/module_template.md b/modular_meta/module_template.md
new file mode 100644
index 0000000000000..33683df7de87e
--- /dev/null
+++ b/modular_meta/module_template.md
@@ -0,0 +1,20 @@
+## Module ID: YOUR_MODULE_ID
+
+
+### Defines/Helpers:
+
+- N/A
+
+(Paste here file path to your module's defines/helpers in `_defines` and/or `_helpers`.)
+
+### TG Proc/File Changes:
+
+- N/A
+
+(Paste here file path to changes in TG `code/` folder.)
+
+### TGUI Files:
+
+- N/A
+
+(Paste here file path there original TGUI file were changed or new TGUI files made in `tgui/` folder.)
diff --git a/modular_meta/perevody/readme.md b/modular_meta/perevody/readme.md
new file mode 100644
index 0000000000000..845654844dd73
--- /dev/null
+++ b/modular_meta/perevody/readme.md
@@ -0,0 +1,5 @@
+## Все переводы на сами знаете какой язык.
+
+Применимо только для русско говорящего сервера, для других лучше отключить все модули этой категории.
+
+Всецело содежит много полезностей, что будут очень удобны не просто для лучшего понимания игры, а порой для более удобной игры, например чтобы реже приходилось переключать англ/ру раскладку во время игры.
diff --git a/modular_meta/readme.md b/modular_meta/readme.md
new file mode 100644
index 0000000000000..9751a74ee6af3
--- /dev/null
+++ b/modular_meta/readme.md
@@ -0,0 +1,21 @@
+### Это модульная папка проекта МассМета
+
+**Здесь находятся:**
+
+| Папка/Файл | Описание
+| ---------------------------------- | -------------------------------------------------------|
+| **_\defines** 📁 | "Определения" для вашего модульного и не очень кода |
+| **\_helpers** 📁 | "Помощники" для вашего модульного и не очень кода |
+| **features** 📁 | Все крутые фичи кодить сюда, и только сюда |
+| **perevody** 📁 | Переводы всякого на более понятый язык |
+| **reverts** 📁 | Откаты неугодных богу Робаста приколов в ТГ кодинге |
+| **tools** 📁 | Инструменты, что позволяют удобнее вести проект |
+| **\_\_config_modpaks.dm** 📄 | Конфигуратор модпаков, все что там есть - отключаемо |
+| **\_modpacks_subsystem.dm** 📄 | Подсистема модпаков |
+| **main_modular_include.dm** 📄 | Тут описаны все наши модули, что мы добавляем в проект |
+| **modularization_guide_ru.md** 📝 | Инструкция по модульному ведению проекта (на Русском) |
+| **module_template.md** 📝 | Шаблон пометок изменений кода вне модуля |
+
+⚠️ Все Defines и Helpers, применяющиеся в вашем модуле, должны быть реализованы в папке **\_defines** и **\_helpers** соответсвенно! ⚠️
+
+📚 Вам предоставлено пособие на Русском, о том как модульно вести проект. **modularization_guide_ru.md**
diff --git a/modular_meta/reverts/readme.md b/modular_meta/reverts/readme.md
new file mode 100644
index 0000000000000..662700293226d
--- /dev/null
+++ b/modular_meta/reverts/readme.md
@@ -0,0 +1,3 @@
+## Все мелкие переделкки в коде, что мы пытаемся назвать "откатами неприятностей", что наплодил апстрим ТГ.
+
+По сути своей - это самая полезная папка в модуле, позволяет игрокам опять почутсвовать больше веселья в игре, что было нагло украдено меинтейнерами ТГ.
diff --git a/modular_meta/tools/massmeta_check_grep.sh b/modular_meta/tools/massmeta_check_grep.sh
new file mode 100644
index 0000000000000..852316eeb2e36
--- /dev/null
+++ b/modular_meta/tools/massmeta_check_grep.sh
@@ -0,0 +1,20 @@
+#!/bin/bash
+
+#ANSI Escape Codes for colors to increase contrast of errors
+RED="\033[0;31m"
+GREEN="\033[0;32m"
+BLUE="\033[0;34m"
+NC="\033[0m" # No Color
+
+echo -e "${BLUE}Re-running grep checks, but looking in modular_meta/...${NC}"
+
+# Run the linters again, but modular massmeta code (features).
+sed 's/code\/\*\*\/\*\*.dm/modular_meta\/features\/\*\*\/\*\*.dm/g'