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/mod/modules/engineering_utility_module.dm b/tff_modular/master_files/code/modules/mod/modules/engineering_utility_module.dm deleted file mode 100644 index 3893c13c99e..00000000000 --- a/tff_modular/master_files/code/modules/mod/modules/engineering_utility_module.dm +++ /dev/null @@ -1,36 +0,0 @@ -/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, - ) - - var/datum/armor/mod_module_shock_protect/armor_debaf - -/obj/item/mod/module/shock_protect/on_suit_activation() - . = ..() - for(var/obj/item/part as anything in mod.mod_parts) - part.siemens_coefficient = 0 - part.set_armor(part.get_armor().add_other_armor(armor_debaf)) - -/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) - part.set_armor(initial(part.armor)) - -/datum/armor/mod_module_shock_protect - melee = -10 - bullet = -10 - laser = -15 diff --git a/tff_modular/master_files/code/modules/mod/modules/rig_module.dm b/tff_modular/master_files/code/modules/mod/modules/rig_module.dm deleted file mode 100644 index 93c5219b74d..00000000000 --- a/tff_modular/master_files/code/modules/mod/modules/rig_module.dm +++ /dev/null @@ -1,71 +0,0 @@ -#define MODULE_RIG_DEFAULT_NAME "rig_module_" - - -/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/master_files/code/modules/research/design/mod_design.dm b/tff_modular/master_files/code/modules/research/design/mod_design.dm index 116bc0188a0..a9c4bb67046 100644 --- a/tff_modular/master_files/code/modules/research/design/mod_design.dm +++ b/tff_modular/master_files/code/modules/research/design/mod_design.dm @@ -46,9 +46,18 @@ ) 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_rpd_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( @@ -57,7 +66,7 @@ /datum/design/module/mod_speed_effective name = "MOD speed effective module" - id = "mod_rpd_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( @@ -66,7 +75,7 @@ /datum/design/module/mod_cc_effective name = "MOD complexity effective module" - id = "mod_rpd_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( @@ -75,8 +84,8 @@ /datum/design/module/sprinter name = "MOD sprinter module" - id = "mod_rpd_module" - materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 3, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 2, /datum/material/uranium = SMALL_MATERIAL_AMOUNT * 4, /datum/material/silver = SMALL_MATERIAL_AMOUNT * 4) + 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 index 93555397b04..2f6f54df10e 100644 --- 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 @@ -20,6 +20,23 @@ 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/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 index 2ecd2fb42b9..905eab2d980 100644 Binary files a/tff_modular/master_files/icons/obj/clothing/modsuits/mod_clothing.dmi 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 index 78261efcbec..df47b8348c8 100644 Binary files a/tff_modular/master_files/icons/obj/clothing/modsuits/mod_modules.dmi 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 index c0a32687a51..45a411622dd 100644 Binary files a/tff_modular/master_files/icons/obj/mod.dmi 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_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/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/master_files/code/modules/mod/tff_mod.dm b/tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm similarity index 74% rename from tff_modular/master_files/code/modules/mod/tff_mod.dm rename to tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm index 4083ddd3509..28f79d27be4 100644 --- a/tff_modular/master_files/code/modules/mod/tff_mod.dm +++ b/tff_modular/modules/tff_modsuits/modsuits/mod_themes.dm @@ -1,11 +1,3 @@ -/** - * РнД МОД - */ - -/obj/item/mod/construction/plating/rnd - icon = 'tff_modular/master_files/icons/obj/mod.dmi' - theme = /datum/mod_theme/rnd - /datum/mod_theme/rnd name = "scientist" desc = "An scientist-fit suit with heat, shock, fire and explosive resistance. Laplas anomalistic desing." @@ -19,7 +11,7 @@ slowdown_inactive = 1 slowdown_active = 0.7 complexity_max = 15 - ui_theme = "ntos" + ui_theme = "hackerman" allowed_suit_storage = list( /obj/item/construction/rcd, /obj/item/pipe_dispenser, @@ -92,24 +84,3 @@ fire = 100 acid = 100 wound = 10 - -/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/master_files/code/modules/mod/modules/itemgive_module.dm b/tff_modular/modules/tff_modsuits/modules/_module_giver.dm similarity index 55% rename from tff_modular/master_files/code/modules/mod/modules/itemgive_module.dm rename to tff_modular/modules/tff_modsuits/modules/_module_giver.dm index 70e9d3ddafd..7a86fb25bd1 100644 --- a/tff_modular/master_files/code/modules/mod/modules/itemgive_module.dm +++ b/tff_modular/modules/tff_modsuits/modules/_module_giver.dm @@ -91,74 +91,3 @@ if(!selected_item) return detach(selected_item) - -/** - * Модули - */ - -/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) - -/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) - -/** - * Предметы - */ - -/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" 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..072c1ad0cd5 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules/module_combat.dm @@ -0,0 +1,87 @@ +/** + * Модуль энерго-копья. + */ +/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(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/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/master_files/code/modules/mod/modules/science_module.dm b/tff_modular/modules/tff_modsuits/modules/module_science.dm similarity index 53% rename from tff_modular/master_files/code/modules/mod/modules/science_module.dm rename to tff_modular/modules/tff_modsuits/modules/module_science.dm index 545a3cde1fd..e8dab6b2891 100644 --- a/tff_modular/master_files/code/modules/mod/modules/science_module.dm +++ b/tff_modular/modules/tff_modsuits/modules/module_science.dm @@ -22,3 +22,27 @@ /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/master_files/code/modules/mod/modules/utility_module.dm b/tff_modular/modules/tff_modsuits/modules/module_utility.dm similarity index 62% rename from tff_modular/master_files/code/modules/mod/modules/utility_module.dm rename to tff_modular/modules/tff_modsuits/modules/module_utility.dm index 090b8a25a32..88e9847cee8 100644 --- a/tff_modular/master_files/code/modules/mod/modules/utility_module.dm +++ b/tff_modular/modules/tff_modsuits/modules/module_utility.dm @@ -1,3 +1,5 @@ +#define MODULE_RIG_DEFAULT_NAME "rig_module_" + /** * Модуль эффективной траты энергии : уменьшает потребление энергии вдвое, замедляет также. */ @@ -48,7 +50,7 @@ /obj/item/mod/module/movemenet_effective/on_suit_activation() . = ..() - added_modifaer = min(0.5, mod.slowdown_active * 0.5) + added_modifaer = max(0.5, mod.slowdown_active * 0.5) mod.slowdown -= added_modifaer mod.wearer.update_equipment_speed_mods() @@ -65,7 +67,7 @@ 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 = "complexity_effective" + icon_state = "module_complexity_effective" complexity = 0 incompatible_modules = list( /obj/item/mod/module/plate_compression, @@ -90,7 +92,7 @@ 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_ACTIVE + module_type = MODULE_TOGGLE icon_state = "module_sprinter" overlay_state_active = "sprinter_module" overlay_state_inactive = "sprinter_module" @@ -120,3 +122,75 @@ 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..6124bffd3d6 --- /dev/null +++ b/tff_modular/modules/tff_modsuits/modules_items.dm @@ -0,0 +1,127 @@ +/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 = 3 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) + living_target.apply_damage(alt_attack_force, BRUTE, attacking_item = src) + 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_cooldown = 1 SECONDS + alt_attack_power_cost = 100 diff --git a/tgstation.dme b/tgstation.dme index 8ff852acb16..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" @@ -7788,11 +7789,6 @@ #include "tff_modular\master_files\code\modules\mob\living\carbon\human\human_buckle.dm" #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\mod\tff_mod.dm" -#include "tff_modular\master_files\code\modules\mod\modules\itemgive_module.dm" -#include "tff_modular\master_files\code\modules\mod\modules\rig_module.dm" -#include "tff_modular\master_files\code\modules\mod\modules\science_module.dm" -#include "tff_modular\master_files\code\modules\mod\modules\utility_module.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" @@ -7842,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"