diff --git a/code/__DEFINES/~ff_defines/tff_company.dm b/code/__DEFINES/~ff_defines/tff_company.dm new file mode 100644 index 00000000000..88f82deb535 --- /dev/null +++ b/code/__DEFINES/~ff_defines/tff_company.dm @@ -0,0 +1,2 @@ +#define LAPLAS_ANOMALISTIC_NAME "Laplas anomalistic" +#define CARGO_LAPLAS_ANOMALISTIC (1<<10) diff --git a/tff_modular/master_files/code/modules/research/design/mod_design.dm b/tff_modular/master_files/code/modules/research/design/mod_design.dm new file mode 100644 index 00000000000..a9c4bb67046 --- /dev/null +++ b/tff_modular/master_files/code/modules/research/design/mod_design.dm @@ -0,0 +1,92 @@ +/datum/design/mod_plating/rnd + name = "RND MOD suit plating" + desc = "A special RND design MOD suit, by Laplas anomalistic." + id = "rnd_mod_plating" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 4, /datum/material/bluespace = SHEET_MATERIAL_AMOUNT * 2) + build_path = /obj/item/mod/construction/plating/rnd + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/module/mod_part_replacer + name = "MOD part replacer module" + id = "rnd_module_part_replacer" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 1) + build_path = /obj/item/mod/module/itemgive/part_replacer + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SCIENCE + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/module/mod_experiscaner + name = "MOD research scaner module" + id = "rnd_module_eperiscaner" + materials = list(/datum/material/iron = SMALL_MATERIAL_AMOUNT * 4, /datum/material/glass = SMALL_MATERIAL_AMOUNT * 4) + build_path = /obj/item/mod/module/itemgive/experiscanner + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_SCIENCE + ) + departmental_flags = DEPARTMENT_BITFLAG_SCIENCE + +/datum/design/module/mod_toolarm + name = "MOD tool arms modules" + id = "mod_toolarms_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 4, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4, /datum/material/silver = SHEET_MATERIAL_AMOUNT * 2, /datum/material/uranium = SHEET_MATERIAL_AMOUNT * 2) + build_path = /obj/item/mod/module/itemgive/tool_arms + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/module/mod_rpd + name = "MOD RPD module" + id = "mod_rpd_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 10, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 10) + build_path = /obj/item/mod/module/itemgive/rpd + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_ENGINEERING + ) + departmental_flags = DEPARTMENT_BITFLAG_ENGINEERING + +/datum/design/module/mod_module_shock_protect + name = "MOD shock protection module" + id = "mod_shock_protection_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 5) + build_path = /obj/item/mod/module/energy_effective + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_GENERAL + ) + +/datum/design/module/mod_energy_effective + name = "MOD energy effective module" + id = "mod_energy_eff_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 5) + build_path = /obj/item/mod/module/energy_effective + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_GENERAL + ) + +/datum/design/module/mod_speed_effective + name = "MOD speed effective module" + id = "mod_speed_eff_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 5) + build_path = /obj/item/mod/module/movemenet_effective + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_GENERAL + ) + +/datum/design/module/mod_cc_effective + name = "MOD complexity effective module" + id = "mod_cc_eff_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 2, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1, /datum/material/diamond = SMALL_MATERIAL_AMOUNT * 3) + build_path = /obj/item/mod/module/complexity_effective + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_GENERAL + ) + +/datum/design/module/sprinter + name = "MOD sprinter module" + id = "mod_sprinter_module" + materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 1, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 1, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 4, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + build_path = /obj/item/mod/module/sprinter + category = list( + RND_CATEGORY_MODSUIT_MODULES + RND_SUBCATEGORY_MODSUIT_MODULES_GENERAL + ) diff --git a/tff_modular/master_files/code/modules/research/techweb/tff_techweb_mod.dm b/tff_modular/master_files/code/modules/research/techweb/tff_techweb_mod.dm new file mode 100644 index 00000000000..2f6f54df10e --- /dev/null +++ b/tff_modular/master_files/code/modules/research/techweb/tff_techweb_mod.dm @@ -0,0 +1,42 @@ +/datum/techweb_node/mod_rnd + id = "mod_rnd" + display_name = "MOD research and develop modular suits" + description = "RND modules and suits, provadet by Laplas anomalistic corporation." + prereq_ids = list("bluespace_travel", "mod_advanced", "adv_engi") + design_ids = list( + "rnd_mod_plating", + "rnd_module_part_replacer", + "rnd_module_eperiscaner", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 4500) + discount_experiments = list( + /datum/experiment/ordnance/gaseous/bz = 3000, + ) + +/datum/techweb_node/advanced_mod_utility_modules + id = "advanced_mod_utility_modules" + display_name = "MOD advanced utility modules" + description = "Advanced utility modules for MOD suits. Designed by Laplas anomalistic and nanotransen." + prereq_ids = list("mod_advanced", "adv_engi") + design_ids = list( + "mod_toolarms_module", + "mod_shock_protection_module", + "mod_rpd_module", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + +/datum/techweb_node/utility_effection_mod_module + id = "effective_mod_utility_modules" + display_name = "MOD part effective modules" + description = "Utility modules, what can upgrade MOD part effective." + prereq_ids = list("mod_advanced") + design_ids = list( + "mod_energy_eff_module", + "mod_speed_eff_module", + "mod_cc_eff_module", + "mod_sprinter_module", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 5000) + discount_experiments = list( + /datum/experiment/ordnance/gaseous/bz = 4000, + ) diff --git a/tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi b/tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi new file mode 100644 index 00000000000..40574edc88b Binary files /dev/null and b/tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi differ diff --git a/tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi b/tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi new file mode 100644 index 00000000000..045bd67bed0 Binary files /dev/null and b/tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi differ diff --git a/tff_modular/master_files/icons/mob/clothing/species/teshari/back.dmi b/tff_modular/master_files/icons/mob/clothing/species/teshari/back.dmi index 49a7e305a55..74de49391f7 100644 Binary files a/tff_modular/master_files/icons/mob/clothing/species/teshari/back.dmi and b/tff_modular/master_files/icons/mob/clothing/species/teshari/back.dmi differ diff --git a/tff_modular/master_files/icons/mob/clothing/species/teshari/mod.dmi b/tff_modular/master_files/icons/mob/clothing/species/teshari/mod.dmi index 2f20ff1660d..b87d0c07346 100644 Binary files a/tff_modular/master_files/icons/mob/clothing/species/teshari/mod.dmi and b/tff_modular/master_files/icons/mob/clothing/species/teshari/mod.dmi differ diff --git a/tff_modular/master_files/icons/mob/clothing/species/teshari/mod_modules.dmi b/tff_modular/master_files/icons/mob/clothing/species/teshari/mod_modules.dmi index e6211c38093..070ee8fbf2b 100644 Binary files a/tff_modular/master_files/icons/mob/clothing/species/teshari/mod_modules.dmi and b/tff_modular/master_files/icons/mob/clothing/species/teshari/mod_modules.dmi differ diff --git a/tff_modular/master_files/icons/mob/inhands/melee_lefthand.dmi b/tff_modular/master_files/icons/mob/inhands/melee_lefthand.dmi new file mode 100644 index 00000000000..fc2abb0cd97 Binary files /dev/null and b/tff_modular/master_files/icons/mob/inhands/melee_lefthand.dmi differ diff --git a/tff_modular/master_files/icons/mob/inhands/melee_righthand.dmi b/tff_modular/master_files/icons/mob/inhands/melee_righthand.dmi new file mode 100644 index 00000000000..3018cf20cb3 Binary files /dev/null and b/tff_modular/master_files/icons/mob/inhands/melee_righthand.dmi differ diff --git a/tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi b/tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi new file mode 100644 index 00000000000..905eab2d980 Binary files /dev/null and b/tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi differ diff --git a/tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi b/tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi new file mode 100644 index 00000000000..df47b8348c8 Binary files /dev/null and b/tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi differ diff --git a/tff_modular/master_files/icons/obj/mod.dmi b/tff_modular/master_files/icons/obj/mod.dmi new file mode 100644 index 00000000000..45a411622dd Binary files /dev/null and b/tff_modular/master_files/icons/obj/mod.dmi differ diff --git a/tff_modular/master_files/sounds/anomaly_attack_slice.ogg b/tff_modular/master_files/sounds/anomaly_attack_slice.ogg new file mode 100644 index 00000000000..93c805af719 Binary files /dev/null and b/tff_modular/master_files/sounds/anomaly_attack_slice.ogg differ diff --git a/tff_modular/master_files/sounds/energy_emit.ogg b/tff_modular/master_files/sounds/energy_emit.ogg new file mode 100644 index 00000000000..8720d196a80 Binary files /dev/null and b/tff_modular/master_files/sounds/energy_emit.ogg differ diff --git a/tff_modular/master_files/sounds/energy_spear_throw.ogg b/tff_modular/master_files/sounds/energy_spear_throw.ogg new file mode 100644 index 00000000000..621d17dda6d Binary files /dev/null and b/tff_modular/master_files/sounds/energy_spear_throw.ogg differ diff --git a/tff_modular/master_files/sounds/rig_module_dead.ogg b/tff_modular/master_files/sounds/rig_module_dead.ogg new file mode 100644 index 00000000000..2d8ff4b8c1c Binary files /dev/null and b/tff_modular/master_files/sounds/rig_module_dead.ogg differ diff --git a/tff_modular/modules/tff_cargo/company_imports/laplas_anomalistic.dm b/tff_modular/modules/tff_cargo/company_imports/laplas_anomalistic.dm new file mode 100644 index 00000000000..ab10201ae22 --- /dev/null +++ b/tff_modular/modules/tff_cargo/company_imports/laplas_anomalistic.dm @@ -0,0 +1,14 @@ +/datum/armament_entry/company_import/laplas_anomalistic + category = LAPLAS_ANOMALISTIC_NAME + company_bitflag = CARGO_LAPLAS_ANOMALISTIC + +/datum/armament_entry/company_import/laplas_anomalistic/modsuits + subcategory = "MOD desings" + +/datum/armament_entry/company_import/laplas_anomalistic/modsuits/energy_spear + item_type = /obj/item/mod/module/energy_spear + cost = PAYCHECK_COMMAND * 8 + +/datum/armament_entry/company_import/laplas_anomalistic/modsuits/mod_blade + item_type = /obj/item/mod/module/itemgive/mod_blade + cost = PAYCHECK_COMMAND * 10 diff --git a/tff_modular/modules/tff_modsuits/modsuits/mod_control.dm b/tff_modular/modules/tff_modsuits/modsuits/mod_control.dm new file mode 100644 index 00000000000..47bea0461e4 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modsuits/mod_control.dm @@ -0,0 +1,24 @@ +/obj/item/mod/construction/plating/rnd + icon = 'tff_modular/master_files/icons/obj/mod.dmi' + theme = /datum/mod_theme/rnd + +/obj/item/mod/control/rnd + worn_icon = 'tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi' + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi' + icon_state = "rnd-control" + theme = /datum/mod_theme/rnd + +/obj/item/mod/control/pre_equipped/rnd + worn_icon = 'tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi' + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi' + icon_state = "rnd-control" + theme = /datum/mod_theme/rnd + starting_frequency = MODLINK_FREQ_NANOTRASEN + applied_cell = /obj/item/stock_parts/cell/hyper + applied_modules = list( + /obj/item/mod/module/dna_lock, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/flashlight, + /obj/item/mod/module/storage/bluespace, + /obj/item/mod/module/tether, + ) diff --git a/tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm b/tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm new file mode 100644 index 00000000000..28f79d27be4 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm @@ -0,0 +1,86 @@ +/datum/mod_theme/rnd + name = "scientist" + desc = "An scientist-fit suit with heat, shock, fire and explosive resistance. Laplas anomalistic desing." + default_skin = "rnd" + armor_type = /datum/armor/mod_theme_rnd + inbuilt_modules = list(/obj/item/mod/module/rig_module, /obj/item/mod/module/core_rnd) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + atom_flags = PREVENT_CONTENTS_EXPLOSION_1 + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.7 + complexity_max = 15 + ui_theme = "hackerman" + allowed_suit_storage = list( + /obj/item/construction/rcd, + /obj/item/pipe_dispenser, + /obj/item/analyzer, + ) + skins = list( + "rnd" = list( + MOD_ICON_OVERRIDE = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi', + MOD_WORN_ICON_OVERRIDE = 'tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = NECK_LAYER, + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + "robotic" = list( + MOD_ICON_OVERRIDE = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi', + MOD_WORN_ICON_OVERRIDE = 'tff_modular/master_files/icons/mob/clothing/modsuits/tff_mod.dmi', + HELMET_FLAGS = list( + UNSEALED_LAYER = NECK_LAYER, + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|HEADINTERNALS, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + CAN_OVERSLOT = TRUE, + ), + ), + ) + +/datum/armor/mod_theme_rnd + melee = 5 + bullet = 5 + laser = 5 + energy = 5 + bomb = 100 + bio = 100 + fire = 100 + acid = 100 + wound = 10 diff --git a/tff_modular/modules/tff_modsuits/modules/_module_giver.dm b/tff_modular/modules/tff_modsuits/modules/_module_giver.dm new file mode 100644 index 00000000000..7a86fb25bd1 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/_module_giver.dm @@ -0,0 +1,93 @@ +/obj/item/mod/module/itemgive + module_type = MODULE_USABLE + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + cooldown_time = 1 SECONDS + + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + overlay_icon_file = 'tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi' + var/list/items_to_give = list() + var/obj/item/selected_item + +/obj/item/mod/module/itemgive/Initialize(mapload) + . = ..() + for(var/typepath in items_to_give) + if(!ispath(typepath)) + continue + var/atom/item_to_create = new typepath(src) + items_to_give += WEAKREF(item_to_create) + items_to_give -= typepath + +/obj/item/mod/module/itemgive/Destroy() + . = ..() + if(selected_item) + detach(selected_item) + for(var/datum/weakref/ref in items_to_give) + var/obj/item/to_del = ref.resolve() + if(!to_del) + continue + qdel(to_del) + items_to_give.Cut() + +/obj/item/mod/module/itemgive/on_use() + . = ..() + if(selected_item) + if(detach(selected_item)) + return + var/list/opinions = list() + var/obj/item/pick + if(items_to_give.len > 1) + for(var/datum/weakref/tool_ref as anything in items_to_give) + var/obj/item/tool_to_add = tool_ref.resolve() + if(!tool_to_add) + continue + opinions[tool_to_add] = image(tool_to_add) + if(!opinions) + return + pick = show_radial_menu(mod.wearer, mod.wearer, opinions) + if(!pick) + return + else if(items_to_give.len) + var/datum/weakref/ref = items_to_give[1] + pick = ref.resolve() + + extend(pick) + mod.subtract_charge(DEFAULT_CHARGE_DRAIN) + +/obj/item/mod/module/itemgive/on_suit_deactivation(deleting) + . = ..() + if(selected_item) + detach(selected_item) + +/obj/item/mod/module/itemgive/proc/extend(obj/item/extend_tool) + if(!istype(extend_tool)) + return FALSE + //Проверим ли, можем мы выдать предмет. + if(!mod.wearer.put_in_hands(extend_tool)) + mod.wearer.balloon_alert(mod.wearer, "Hands occuped!") + mod.wearer.transferItemToLoc(extend_tool, src, force = TRUE) + return FALSE + ADD_TRAIT(extend_tool, TRAIT_NODROP, REF(src)) + RegisterSignal(mod.wearer, COMSIG_KB_MOB_DROPITEM_DOWN, PROC_REF(on_drop)) + selected_item = extend_tool + extend_tool.resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF + extend_tool.slot_flags = null + extend_tool.set_custom_materials(null) + mod.wearer.visible_message(span_notice("[mod.wearer] use [mod.name] mechanical [extend_tool]."), span_notice("You extend [mod.name], [extend_tool], in you hand."), span_hear("You hear energy hiss.")) + mod.wearer.balloon_alert(mod.wearer, "Tool extendet!") + playsound(get_turf(mod.wearer), 'tff_modular/master_files/sounds/energy_emit.ogg', 40) + return TRUE + +/obj/item/mod/module/itemgive/proc/detach(obj/item/detach_tool) + if(!istype(detach_tool)) + return FALSE + UnregisterSignal(mod.wearer, COMSIG_KB_MOB_DROPITEM_DOWN) + selected_item.forceMove(src) + selected_item = null + playsound(get_turf(mod.wearer), 'tff_modular/master_files/sounds/energy_emit.ogg', 40) + mod.wearer.balloon_alert(mod.wearer, "Tool detached!") + return TRUE + +/obj/item/mod/module/itemgive/proc/on_drop() + if(!selected_item) + return + detach(selected_item) diff --git a/tff_modular/modules/tff_modsuits/modules/module_combat.dm b/tff_modular/modules/tff_modsuits/modules/module_combat.dm new file mode 100644 index 00000000000..94f30a04f09 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/module_combat.dm @@ -0,0 +1,99 @@ +/** + * Модуль энерго-копья. + */ +/obj/item/mod/module/energy_spear + name = "MOD energy spear module" + desc = "MOD module installed in the users arm, when activated, uses the suit's energy to \ + create a short-lived energy beam in the form of a spear. It has extremely high speed and \ + penetration characteristics." + cooldown_time = 10 SECONDS + module_type = MODULE_USABLE + + use_power_cost = POWER_CELL_USE_INSANE * 2 + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_energy_spear" + incompatible_modules = list( + /obj/item/mod/module/energy_spear, + /obj/item/mod/module/holster, + ) + var/deployed = FALSE + var/datum/weakref/spear_ref + +/obj/item/mod/module/energy_spear/on_use() + if(!..()) + return + //Если прошлое копье еще существует(каким-то образом), останавливаем создание нового. + if(deployed) + mod.wearer.balloon_alert(mod.wearer, "Old spear exist!") + return FALSE + var/obj/item/energy_spear/spear = new(src) + if(!mod.wearer.put_in_hands(spear)) + mod.wearer.balloon_alert(mod.wearer, "Hands occuped!") + qdel(spear) + return FALSE + spear_ref = WEAKREF(spear) + mod.wearer.balloon_alert(mod.wearer, "Spear materialized for 10 seconds!") + mod.wearer.visible_message(span_warning("[mod.wearer], materialize [spear.name] in [mod.wearer.p_they()], hand ready to throw!"), span_warning("You materialize energy spear in your hand."), span_hear("You hear energy clack.")) + RegisterSignal(spear, COMSIG_MOVABLE_PRE_THROW, PROC_REF(on_spear_throw)) + RegisterSignal(spear, COMSIG_QDELETING, PROC_REF(on_spear_delete)) + addtimer(CALLBACK(src, PROC_REF(spear_timeout)), 10 SECONDS) + deployed = TRUE + playsound(get_turf(mod.wearer), 'tff_modular/master_files/sounds/energy_emit.ogg', 40) + icon_state = "module_energy_spear_deploed" + update_icon_state() + +/obj/item/mod/module/energy_spear/proc/spear_timeout() + if(deployed) + var/obj/item/energy_spear/spear = spear_ref.resolve() + UnregisterSignal(spear, COMSIG_MOVABLE_PRE_THROW) + qdel(spear) + +/obj/item/mod/module/energy_spear/proc/on_spear_delete() + SIGNAL_HANDLER + + spear_ref = null + deployed = FALSE + + icon_state = "module_energy_spear" + update_icon_state() + +/obj/item/mod/module/energy_spear/proc/on_spear_throw() + SIGNAL_HANDLER + + var/obj/item/energy_spear/spear = spear_ref.resolve() + if(!istype(spear)) + return + + UnregisterSignal(spear, COMSIG_MOVABLE_PRE_THROW) + QDEL_IN(spear, 5) + +/** + * Модуль клинка + */ + +/obj/item/mod/module/itemgive/mod_blade + name = "MOD blade module" + desc = "Massive MOD blade built into the arm. Possesses monstrous strength." + complexity = 5 + icon_state = "module_mod_blade" + items_to_give = list(/obj/item/melee/mod_blade) + incompatible_modules = list( + /obj/item/mod/module/itemgive/mod_blade, + /obj/item/mod/module/itemgive/mod_blade/syndicate, + ) + +/obj/item/mod/module/itemgive/mod_blade/on_install() + . = ..() + for(var/obj/item/melee/mod_blade/blade in items_to_give) + blade.mod = mod + + +/obj/item/mod/module/itemgive/mod_blade/on_uninstall(deleting) + . = ..() + for(var/obj/item/melee/mod_blade/blade in items_to_give) + blade.mod = null + +/obj/item/mod/module/itemgive/mod_blade/syndicate + name = "MOD armblade module" + icon_state = "module_mod_armblade" + items_to_give = list(/obj/item/melee/mod_blade/syndicate) diff --git a/tff_modular/modules/tff_modsuits/modules/module_engineering.dm b/tff_modular/modules/tff_modsuits/modules/module_engineering.dm new file mode 100644 index 00000000000..ec39288dcd3 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/module_engineering.dm @@ -0,0 +1,73 @@ +/** + * Модуль защиты от шока: несовместим с многими модулями, уменьшает защиту пользователя, но дает защиту от шока. + */ + +/obj/item/mod/module/shock_protect + name = "MOD shock protect module" + desc = "A MOD module installed in users chest and arms, gift a shock resistant to suit parts,\ + but make this weak." + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_shock_protect" + complexity = 3 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list( + /obj/item/mod/module/shock_protect, + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/magnetic_harness, + /obj/item/mod/module/projectile_dampener, + /obj/item/mod/module/rad_protection, + /obj/item/mod/module/emp_shield, + /obj/item/mod/module/stealth, + ) + +/obj/item/mod/module/shock_protect/on_suit_activation() + . = ..() + for(var/obj/item/part as anything in mod.mod_parts) + part.siemens_coefficient = 0 + + +/obj/item/mod/module/shock_protect/on_suit_deactivation(deleting) + . = ..() + for(var/obj/item/part as anything in mod.mod_parts) + part.siemens_coefficient = initial(part.siemens_coefficient) + +/obj/item/mod/module/shock_protect/emp_act(severity) + . = ..() + if(!mod.wearer) + return + mod.wearer.electrocute_act(20, src, 1) + to_chat(mod.wearer, span_userdanger("You feel like you [mod.name], throw powerfull electrical pusle in you!")) + +/** + * Модуль механических рук + */ + +/obj/item/mod/module/itemgive/tool_arms + name = "MOD tools arms module" + desc = "A module installed to users spine. That gift\ + Thwo mechanical robotics arm with kit of basic tools." + complexity = 2 + + overlay_state_inactive = "toolarm_module" + icon_state = "module_toolarm" + incompatible_modules = list(/obj/item/mod/module/itemgive/tool_arms) + items_to_give = list( + /obj/item/screwdriver/cyborg, + /obj/item/wrench/cyborg, + /obj/item/weldingtool/largetank/cyborg, + /obj/item/crowbar/cyborg, + /obj/item/wirecutters/cyborg, + /obj/item/multitool/cyborg, + ) + +/** + * Модуль РПД + */ + +/obj/item/mod/module/itemgive/rpd + name = "MOD rpd module" + desc = "A MOD module installed in users arm, gift a portable version of RPD device." + complexity = 2 + icon_state = "module_pipe_dispanser" + items_to_give = list(/obj/item/pipe_dispenser/mod) + incompatible_modules = list(/obj/item/mod/module/itemgive/rpd) diff --git a/tff_modular/modules/tff_modsuits/modules/module_science.dm b/tff_modular/modules/tff_modsuits/modules/module_science.dm new file mode 100644 index 00000000000..e8dab6b2891 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/module_science.dm @@ -0,0 +1,48 @@ +/obj/item/mod/module/core_rnd + name = "MOD core research module" + desc = "The primary electronic systems operating within the suit. Utilizing outgoing signals, \ + and analyse users stats." + icon_state = "infiltrator" + complexity = 0 + removable = FALSE + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 + incompatible_modules = list( //О да, этот модуль не дает использовать внутри костюма никакие модули связанные с СБ. + /obj/item/mod/module/armor_booster, + /obj/item/mod/module/magnetic_harness, + /obj/item/mod/module/holster, + /obj/item/mod/module/projectile_dampener, + /obj/item/mod/module/active_sonar, + /obj/item/mod/module/shooting_assistant, + ) + +/obj/item/mod/module/core_rnd/on_suit_activation() + . = ..() + ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, REF(src)) + +/obj/item/mod/module/core_rnd/on_suit_deactivation(deleting) + . = ..() + REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, REF(src)) + +/** + * Модуль БРПЕД + */ + +/obj/item/mod/module/itemgive/part_replacer + name = "MOD part replacer module" + desc = "A MOD module installed in users arm, gift a portable version of bluespace part replacer device." + complexity = 1 + icon_state = "module_part_replacer" + items_to_give = list(/obj/item/storage/part_replacer/bluespace/mod) + incompatible_modules = list(/obj/item/mod/module/itemgive/part_replacer) + +/** + * Модуль исследовательского сканера + */ + +/obj/item/mod/module/itemgive/experiscanner + name = "MOD research scaner module" + desc = "A MOD module installed in users arm, gift a portable version of research scaner." + complexity = 1 + icon_state = "module_research_scaner" + items_to_give = list(/obj/item/experi_scanner/mod) + incompatible_modules = list(/obj/item/mod/module/itemgive/experiscanner) diff --git a/tff_modular/modules/tff_modsuits/modules/module_utility.dm b/tff_modular/modules/tff_modsuits/modules/module_utility.dm new file mode 100644 index 00000000000..36d9273e62c --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/module_utility.dm @@ -0,0 +1,197 @@ +#define MODULE_RIG_DEFAULT_NAME "rig_module_" + +/** + * Модуль эффективной траты энергии : уменьшает потребление энергии вдвое, замедляет также. + */ + +/obj/item/mod/module/energy_effective + name = "MOD gnergy effective module" + desc = "A MOD module installed in MOD control, make them more power effective, but general movement slower" + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_power_effective" + complexity = 2 + idle_power_cost = 0 + incompatible_modules = list( + /obj/item/mod/module/energy_effective, + /obj/item/mod/module/movemenet_effective, + ) + var/added_modifaer + +/obj/item/mod/module/energy_effective/on_suit_activation() + . = ..() + mod.charge_drain = (mod.charge_drain * 0.5) + added_modifaer = mod.slowdown_active * 2 + mod.slowdown += added_modifaer + mod.wearer.update_equipment_speed_mods() + + +/obj/item/mod/module/energy_effective/on_suit_deactivation(deleting) + . = ..() + mod.charge_drain = initial(mod.charge_drain) + mod.slowdown -= added_modifaer + mod.wearer.update_equipment_speed_mods() + +/** + * Модуль эффективности движения: вдвое срезает замедление при движении, но вдводе увеличивает трату энергии. + */ + +/obj/item/mod/module/movemenet_effective + name = "MOD movement effective module" + desc = "MOD module installed in MOD control, adjust movement speed by causing faster power drain." + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_movement_effective" + complexity = 3 + idle_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list( + /obj/item/mod/module/movemenet_effective, + /obj/item/mod/module/energy_effective, + ) + var/added_modifaer + +/obj/item/mod/module/movemenet_effective/on_suit_activation() + . = ..() + added_modifaer = max(0.5, mod.slowdown_active * 0.5) + mod.slowdown -= added_modifaer + mod.wearer.update_equipment_speed_mods() + mod.charge_drain = (mod.charge_drain * 2) + +/obj/item/mod/module/movemenet_effective/on_suit_deactivation(deleting) + . = ..() + mod.slowdown += added_modifaer + mod.wearer.update_equipment_speed_mods() + mod.charge_drain = initial(mod.charge_drain) +/** + * Модуль эффективности вмещения: увеличивает максимальное кол-во модулей, что можно установить, ценой отсуствия любого модуля хранения. + */ + +/obj/item/mod/module/complexity_effective + name = "MOD complexity effective module" + desc = "MOD module installed in MOD control, adjust number of maximum installed modules, bu causing impossible install storage modules." + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_complexity_effective" + complexity = 0 + incompatible_modules = list( + /obj/item/mod/module/plate_compression, + /obj/item/mod/module/storage, + /obj/item/mod/module/complexity_effective, + ) + +/obj/item/mod/module/complexity_effective/on_install() + . = ..() + mod.complexity += 10 + +/obj/item/mod/module/complexity_effective/on_uninstall(deleting) + . = ..() + mod.complexity = initial(mod.complexity) + +/** + * Модуль спринтера: позволяет получить значительно повышенную скорость, ценой огромного энергопотребления. + */ + +/obj/item/mod/module/sprinter + name = "MOD sprinter module" + desc = "MOD module installed in wearer legs. Allow to adjust movemenet speed causing hight power use." + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + overlay_icon_file = 'tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi' + module_type = MODULE_TOGGLE + icon_state = "module_sprinter" + overlay_state_active = "sprinter_module" + overlay_state_inactive = "sprinter_module" + complexity = 2 + incompatible_modules = list( + /obj/item/mod/module/sprinter, + /obj/item/mod/module/movemenet_effective, + ) + var/added_speed = 1 + var/power_use_per_step = 50 + +/obj/item/mod/module/sprinter/on_activation() + . = ..() + mod.wearer.balloon_alert(mod.wearer, "Actutor overstressed!") + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, PROC_REF(on_wearer_move)) + mod.slowdown -= added_speed + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/sprinter/on_deactivation(display_message, deleting) + . = ..() + mod.wearer.balloon_alert(mod.wearer, "Actutor stabilized!") + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + mod.slowdown += added_speed + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/sprinter/proc/on_wearer_move() + SIGNAL_HANDLER + mod.subtract_charge(power_use_per_step) + +/** + * Модуль РИГ'а + */ + +/obj/item/mod/module/rig_module + name = "MOD RIG module" + desc = "A module installed to users spine. That analyse information about user health." + removable = FALSE + complexity = 0 + idle_power_cost = 0 + module_type = MODULE_PASSIVE + + overlay_icon_file = 'tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi' + overlay_state_inactive = "rig_module_dead" + + var/true_rig_icon = 'tff_modular/master_files/icons/mob/clothing/modsuits/mod_modules.dmi' + +/obj/item/mod/module/rig_module/on_suit_activation() + . = ..() + if(!mod.wearer) + return + if(istesharialt(mod.wearer)) + true_rig_icon = 'tff_modular/master_files/icons/mob/clothing/species/teshari/mod_modules.dmi' + RegisterSignal(mod.wearer, COMSIG_LIVING_DEATH, PROC_REF(wearer_dead)) + +/obj/item/mod/module/rig_module/on_suit_deactivation(deleting) + . = ..() + true_rig_icon = initial(src.true_rig_icon) + UnregisterSignal(mod.wearer, COMSIG_LIVING_DEATH) + +/obj/item/mod/module/rig_module/generate_worn_overlay(mutable_appearance/standing) + . = ..() + if(!mod.active) + return + //Актуально обновляем внешний вид нашего РИГ'а + var/mutable_appearance/rig_icon = mutable_appearance(true_rig_icon, calculate_health(), layer = standing.layer + 0.1) + rig_icon.appearance_flags |= RESET_COLOR + . += rig_icon + +/obj/item/mod/module/rig_module/on_process(seconds_per_tick) + . = ..() + on_use() //Для того, чтобы вызвать обновление аппаренса модуля, необходимо вызвать любой прок в нем - это наиболее простой и эффективный способ. + +/obj/item/mod/module/rig_module/proc/wearer_dead() + SIGNAL_HANDLER + playsound(get_turf(mod.wearer), 'tff_modular/master_files/sounds/rig_module_dead.ogg', 40) + +/obj/item/mod/module/rig_module/proc/calculate_health() + if(!mod.wearer) + return + if(mod.wearer.stat & DEAD) + return MODULE_RIG_DEFAULT_NAME + "dead" + + var/target_state = MODULE_RIG_DEFAULT_NAME + switch(mod.wearer?.health || 0) + if(80 to INFINITY) + target_state += "normal" + if(40 to 79) + target_state += "damaged" + if(-200 to 39) + target_state += "critical" + + return target_state + +/datum/mod_theme + inbuilt_modules = list(/obj/item/mod/module/rig_module) +/datum/mod_theme/advanced + inbuilt_modules = list(/obj/item/mod/module/rig_module, /obj/item/mod/module/magboot/advanced) +/datum/mod_theme/rescue + inbuilt_modules = list(/obj/item/mod/module/rig_module, /obj/item/mod/module/quick_carry/advanced) + +#undef MODULE_RIG_DEFAULT_NAME diff --git a/tff_modular/modules/tff_modsuits/modules_items.dm b/tff_modular/modules/tff_modsuits/modules_items.dm new file mode 100644 index 00000000000..6dbaea4f7eb --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules_items.dm @@ -0,0 +1,130 @@ +/obj/item/storage/part_replacer/bluespace/mod + name = "MOD bluespace rapid part exchange device" + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_part_replacer" + custom_materials = null + force = 0 + pshoom_or_beepboopblorpzingshadashwoosh = 'tff_modular/master_files/sounds/energy_emit.ogg' + alt_sound = 'tff_modular/master_files/sounds/energy_emit.ogg' + +/obj/item/pipe_dispenser/mod + name = "MOD pipe dispenser" + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_pipe_dispanser" + custom_materials = null + force = 0 + +/obj/item/experi_scanner/mod + name = "MOD Experi-Scanner" + icon = 'tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi' + icon_state = "module_research_scaner" + +/** + * МОД КОПЬЕ + */ + +/obj/item/energy_spear + name = "\improper MOD energy spear" + desc = "A spear made of pure energy, incredibly light to the touch." + icon = 'tff_modular/master_files/icons/obj/mod.dmi' + icon_state = "energy_spear" + force = 0 + w_class = WEIGHT_CLASS_BULKY + slot_flags = null + throwforce = 20 + // Оно невероятно быстрое и сможет догнать кого угодно, в любой среде! + throw_speed = 10 + demolition_mod = 2 + // Убедимся, что даже если оно попадет в кого-нибудь и застрянет, то никакоого эффекта это не даст. + embedding = list("impact_pain_mult" = 0, "remove_pain_mult" = 0, "jostle_chance" = 0) + armour_penetration = 50 + custom_materials = null + wound_bonus = -50 + bare_wound_bonus = 30 + + inhand_icon_state = "energy_spear" + lefthand_file = 'tff_modular/master_files/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'tff_modular/master_files/icons/mob/inhands/melee_righthand.dmi' + mob_throw_hit_sound = 'tff_modular/master_files/sounds/energy_spear_throw.ogg' + +/** + * МОД КЛИНОК + */ + +/obj/item/melee/mod_blade + name = "\improper MOD blade" + desc = "A sharp, stylish and massive MOD blade built into the hand." + icon = 'tff_modular/master_files/icons/obj/mod.dmi' + icon_state = "mod_blade" + force = 15 + w_class = WEIGHT_CLASS_BULKY + slot_flags = null + throwforce = 0 + throw_speed =0 + demolition_mod = 2 + embedding = list("impact_pain_mult" = 0, "remove_pain_mult" = 0, "jostle_chance" = 0) + armour_penetration = 50 + custom_materials = null + wound_bonus = -10 + bare_wound_bonus = 30 + + inhand_icon_state = "mod_blade" + lefthand_file = 'tff_modular/master_files/icons/mob/inhands/melee_lefthand.dmi' + righthand_file = 'tff_modular/master_files/icons/mob/inhands/melee_righthand.dmi' + // Урон от альтернативной атаки. + var/alt_attack_force = 10 + // Время перезарядки альтерантивной атаки. + var/alt_attack_cooldown = 5 SECONDS + COOLDOWN_DECLARE(cooldown_aoe) + // Цена по энергии для второстепенной атаки. + var/alt_attack_power_cost = 50 + //Мод костюм к которому привязан клинок. + var/obj/item/mod/control/mod + +/obj/item/melee/mod_blade/Initialize(mapload, obj/item/mod/control/connected_mod) + . = ..() + mod = connected_mod + +/obj/item/melee/mod_blade/Destroy(force) + . = ..() + mod = null + +/obj/item/melee/mod_blade/examine(mob/user) + . = ..() + . += span_notice("Right click for AOE attack.") + +/obj/item/melee/mod_blade/pre_attack_secondary(atom/target, mob/living/user, params) + . = ..() + if(!COOLDOWN_FINISHED(src, cooldown_aoe)) + user.balloon_alert(user, "On cooldown!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + if(!mod.subtract_charge(alt_attack_power_cost)) + user.balloon_alert(user, "No power!") + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + COOLDOWN_START(src, cooldown_aoe, alt_attack_cooldown) + var/turf/user_turf = get_turf(user) + var/dir_to_target = get_dir(user_turf, get_turf(target)) + var/static/list/attack_angles = list(0, -45, 45) + for(var/i in attack_angles) + var/turf/turf = get_step(user_turf, turn(dir_to_target, i)) + for(var/mob/living/living_target in turf) + if(user.Adjacent(living_target) && living_target.body_position != LYING_DOWN) + if(living_target == user) + user.balloon_alert(user, "Hurting self!") + break + living_target.apply_damage(alt_attack_force, BRUTE, attacking_item = src) + user.do_attack_animation(target, "slash", src, TRUE) + playsound(get_turf(user), 'tff_modular/master_files/sounds/anomaly_attack_slice.ogg', 40) + return SECONDARY_ATTACK_CANCEL_ATTACK_CHAIN + +/obj/item/melee/mod_blade/syndicate + name = "\improper MOD armblade" + desc = "A sharp, stylish and massive MOD blade built into the hand. This blade is especially strong, \ + colored blood red, and can cut through flesh like butter." + icon_state = "mod_armblade" + inhand_icon_state = "mod_armblade" + force = 30 + wound_bonus = 30 + bare_wound_bonus = 30 + alt_attack_force = 20 + alt_attack_power_cost = 100 diff --git a/tgstation.dme b/tgstation.dme index 22b7e8f1e17..6a15502387e 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -370,6 +370,7 @@ #include "code\__DEFINES\~ff_defines\nabber_clothes_pathes.dm" #include "code\__DEFINES\~ff_defines\signals.dm" #include "code\__DEFINES\~ff_defines\text.dm" +#include "code\__DEFINES\~ff_defines\tff_company.dm" #include "code\__DEFINES\~ff_defines\traits.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\ishelpers.dm" #include "code\__DEFINES\~ff_defines\__HELPERS\names.dm" @@ -7789,6 +7790,8 @@ #include "tff_modular\master_files\code\modules\mod\_module.dm" #include "tff_modular\master_files\code\modules\mod\mod_clothes.dm" #include "tff_modular\master_files\code\modules\reagents\recipe\coagulant_recipe.dm" +#include "tff_modular\master_files\code\modules\research\design\mod_design.dm" +#include "tff_modular\master_files\code\modules\research\techweb\tff_techweb_mod.dm" #include "tff_modular\modules\autoaccent\code\autoaccent.dm" #include "tff_modular\modules\blueshield-mod\code.dm" #include "tff_modular\modules\blueshield-rearm\code\holster.dm" @@ -7835,6 +7838,15 @@ #include "tff_modular\modules\teshari_reborn\code\abilites\agility.dm" #include "tff_modular\modules\teshari_reborn\code\abilites\echolocation.dm" #include "tff_modular\modules\teshari_reborn\code\abilites\teshari_ability.dm" +#include "tff_modular\modules\tff_cargo\company_imports\laplas_anomalistic.dm" +#include "tff_modular\modules\tff_modsuits\modules_items.dm" +#include "tff_modular\modules\tff_modsuits\modsuits\mod_control.dm" +#include "tff_modular\modules\tff_modsuits\modsuits\mod_themes.dm" +#include "tff_modular\modules\tff_modsuits\modules\_module_giver.dm" +#include "tff_modular\modules\tff_modsuits\modules\module_combat.dm" +#include "tff_modular\modules\tff_modsuits\modules\module_engineering.dm" +#include "tff_modular\modules\tff_modsuits\modules\module_science.dm" +#include "tff_modular\modules\tff_modsuits\modules\module_utility.dm" #include "tff_modular\modules\toys\code\loadout_datum_toys.dm" #include "tff_modular\modules\toys\code\plushes.dm" #include "tff_modular\modules\uplink_item\code\categories\stealthy_weapons.dm"