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) + . += "
" + . += "
[M.name]
" + + if(M.desc || M.author) + . += "
" + if(M.desc) + . += "
Описание: [M.desc]" + if(M.author) + . += "
Автор: [M.author]" + . += "

" + + 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'