From 7ebd03e0498b387dd4a2634bf0328afc1efffeeb Mon Sep 17 00:00:00 2001 From: Putnam3145 Date: Wed, 30 Mar 2022 15:45:27 -0700 Subject: [PATCH 001/384] Adds beauty back --- code/datums/components/mood.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/datums/components/mood.dm b/code/datums/components/mood.dm index e100326f7b..5d2a9f290d 100644 --- a/code/datums/components/mood.dm +++ b/code/datums/components/mood.dm @@ -34,6 +34,7 @@ RegisterSignal(parent, COMSIG_MOB_HUD_CREATED, .proc/modify_hud) RegisterSignal(parent, COMSIG_MOB_DEATH, .proc/stop_processing) RegisterSignal(parent, COMSIG_VOID_MASK_ACT, .proc/direct_sanity_drain) + RegisterSignal(parent, COMSIG_ENTER_AREA, .proc/update_beauty) if(owner.hud_used) From 3d26d406ea64612214f531b98192e63bbb13ff43 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 1 Nov 2022 18:46:55 +0000 Subject: [PATCH 002/384] Bump @xmldom/xmldom from 0.7.5 to 0.7.8 in /tgui Bumps [@xmldom/xmldom](https://github.com/xmldom/xmldom) from 0.7.5 to 0.7.8. - [Release notes](https://github.com/xmldom/xmldom/releases) - [Changelog](https://github.com/xmldom/xmldom/blob/master/CHANGELOG.md) - [Commits](https://github.com/xmldom/xmldom/compare/0.7.5...0.7.8) --- updated-dependencies: - dependency-name: "@xmldom/xmldom" dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 5aed04b4dc..d89a5d35ad 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -2083,9 +2083,9 @@ __metadata: linkType: hard "@xmldom/xmldom@npm:^0.7.2": - version: 0.7.5 - resolution: "@xmldom/xmldom@npm:0.7.5" - checksum: 8d7ec35c1ef6183b4f621df08e01d7e61f244fb964a4719025e65fe6ac06fac418919be64fb40fe5908e69158ef728f2d936daa082db326fe04603012b5f2a84 + version: 0.7.8 + resolution: "@xmldom/xmldom@npm:0.7.8" + checksum: 3bae232f9e6e8218a2c4ab4baa0e2afd5d15d070236cd14b36a59261e5bc9ab26ddf919671fd3ed7474552c7528cf659f14993fdb12f26418f568121f8f4385f languageName: node linkType: hard From 16cc43e812c7483e5817737eac8c6d78e85ec4b3 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Mon, 14 Nov 2022 14:45:48 -0500 Subject: [PATCH 003/384] Main Push part 1 This pushes the main changes. This is not finished. Fixes need to be done elsewhere. --- code/__SPLURTCODE/DEFINES/traits.dm | 1 + .../mood_events/generic_positive_events.dm | 8 ++++++++ modular_splurt/code/datums/traits/good.dm | 7 +++++++ .../code/modules/clothing/clothing.dm | 19 +++++++++++++++++++ tgstation.dme | 1 + 5 files changed, 36 insertions(+) create mode 100644 modular_splurt/code/modules/clothing/clothing.dm diff --git a/code/__SPLURTCODE/DEFINES/traits.dm b/code/__SPLURTCODE/DEFINES/traits.dm index fa992cad27..fdff28f099 100644 --- a/code/__SPLURTCODE/DEFINES/traits.dm +++ b/code/__SPLURTCODE/DEFINES/traits.dm @@ -24,3 +24,4 @@ #define TRAIT_ARACHNID "Arachnid" #define TRAIT_FLUTTER "flutter" +#define TRAIT_CLOTH_EATER "cloth_eater" diff --git a/modular_splurt/code/datums/mood_events/generic_positive_events.dm b/modular_splurt/code/datums/mood_events/generic_positive_events.dm index 2f4ec2ac78..081f04149a 100644 --- a/modular_splurt/code/datums/mood_events/generic_positive_events.dm +++ b/modular_splurt/code/datums/mood_events/generic_positive_events.dm @@ -12,3 +12,11 @@ /datum/mood_event/masked_mook description = "I feel more complete with gas mask on.\n" mood_change = 1 + +/datum/mood_event/cloth_eaten + description = " That sure was a tasty outfit!\n" + mood_change = 3 + timeout = 2400 + +/datum/mood_event/cloth_eaten/add_effects(obj/item/clothing/eaten) + description = "That sure was a [pick("tasty","good","linty","amazing")] [eaten.name]!\n" diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index badf875fc0..530d9a9a48 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -143,3 +143,10 @@ desc = "You are able to move in Preassurized Low Gravity enviroments. Don't ask me how." value = 1 mob_trait = TRAIT_FLUTTER + +/datum/quirk/cloth_eater + name = "Cloth Eater" + desc = "You can eat most articles of clothing, but do so will damage them." + value = 1 + /var/mood_category ="cloth_eaten" + mob_trait = TRAIT_CLOTH_EATER diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm new file mode 100644 index 0000000000..3fb6bcb5b5 --- /dev/null +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -0,0 +1,19 @@ +/obj/item/reagent_containers/food/snacks/clothing + name = "oops" + desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." + list_reagents = list(/datum/reagent/consumable/nutriment = 1) + tastes = list("dust" = 1, "lint" = 1) +/* +/obj/item/clothing/attack(mob/M, mob/user, def_zone) + if(user.a_intent != INTENT_HARM && (isinsect(M)||HAS_TRAIT(M,TRAIT_CLOTH_EATER))) + var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new + clothing_as_food.name = name + var/mob/living/carbon/human/H = M + if(HAS_TRAIT(M,TRAIT_CLOTH_EATER)) + to_chat(user, "We should be damaging clothes") + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) + take_damage(15, sound_effect=FALSE) + qdel(clothing_as_food) + else + return ..() +*/ diff --git a/tgstation.dme b/tgstation.dme index 6444d935ad..8f56fb2e6c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -4536,6 +4536,7 @@ #include "modular_splurt\code\modules\client\verbs\looc.dm" #include "modular_splurt\code\modules\client\verbs\ooc.dm" #include "modular_splurt\code\modules\clothing\back.dm" +#include "modular_splurt\code\modules\clothing\clothing.dm" #include "modular_splurt\code\modules\clothing\gloves.dm" #include "modular_splurt\code\modules\clothing\kinkyclothes.dm" #include "modular_splurt\code\modules\clothing\sizeaccessories.dm" From 6ab173d9f7818ddb804587b4c509374eaa69a9fc Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Wed, 16 Nov 2022 01:25:13 +0000 Subject: [PATCH 004/384] Bump loader-utils from 1.4.0 to 1.4.2 in /tgui Bumps [loader-utils](https://github.com/webpack/loader-utils) from 1.4.0 to 1.4.2. - [Release notes](https://github.com/webpack/loader-utils/releases) - [Changelog](https://github.com/webpack/loader-utils/blob/v1.4.2/CHANGELOG.md) - [Commits](https://github.com/webpack/loader-utils/compare/v1.4.0...v1.4.2) --- updated-dependencies: - dependency-name: loader-utils dependency-type: indirect ... Signed-off-by: dependabot[bot] --- tgui/yarn.lock | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/tgui/yarn.lock b/tgui/yarn.lock index 5aed04b4dc..2dcf782a4f 100644 --- a/tgui/yarn.lock +++ b/tgui/yarn.lock @@ -5585,13 +5585,13 @@ __metadata: linkType: hard "loader-utils@npm:^1.4.0": - version: 1.4.0 - resolution: "loader-utils@npm:1.4.0" + version: 1.4.2 + resolution: "loader-utils@npm:1.4.2" dependencies: big.js: ^5.2.2 emojis-list: ^3.0.0 json5: ^1.0.1 - checksum: d150b15e7a42ac47d935c8b484b79e44ff6ab4c75df7cc4cb9093350cf014ec0b17bdb60c5d6f91a37b8b218bd63b973e263c65944f58ca2573e402b9a27e717 + checksum: eb6fb622efc0ffd1abdf68a2022f9eac62bef8ec599cf8adb75e94d1d338381780be6278534170e99edc03380a6d29bc7eb1563c89ce17c5fed3a0b17f1ad804 languageName: node linkType: hard From e27f0d2439998ff440570537e6e8a1e22d340f8d Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:27:58 -0500 Subject: [PATCH 005/384] Final Build I did it. EDIABLE CLOTHES --- code/modules/clothing/clothing.dm | 7 +++- .../code/modules/clothing/clothing.dm | 41 ++++++++++++------- 2 files changed, 32 insertions(+), 16 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index f349eae02b..541a52d894 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -81,14 +81,15 @@ var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) - +/*MOVED TO: modular_splurt/code/module/clothing/clothing.dmi /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) - +*/ /obj/item/clothing/attack(mob/M, mob/user, def_zone) +/*MOVED TO: modular_splurt/code/module/clothing/clothing.dmi if(user.a_intent != INTENT_HARM && isinsect(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name @@ -97,6 +98,8 @@ qdel(clothing_as_food) else return ..() + */ + return ..() /obj/item/clothing/attackby(obj/item/W, mob/user, params) if(damaged_clothes && istype(W, repairable_by)) diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index 3fb6bcb5b5..0a3f31137c 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -1,19 +1,32 @@ /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." - list_reagents = list(/datum/reagent/consumable/nutriment = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 8) //Cloth eaters get some nutrients. tastes = list("dust" = 1, "lint" = 1) -/* -/obj/item/clothing/attack(mob/M, mob/user, def_zone) - if(user.a_intent != INTENT_HARM && (isinsect(M)||HAS_TRAIT(M,TRAIT_CLOTH_EATER))) - var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new - clothing_as_food.name = name - var/mob/living/carbon/human/H = M - if(HAS_TRAIT(M,TRAIT_CLOTH_EATER)) - to_chat(user, "We should be damaging clothes") - SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) - take_damage(15, sound_effect=FALSE) - qdel(clothing_as_food) - else + +//A call on attemp_forcefeed() without async to properly know if it worked or not. In theory this shouldn't cause any issues as only a small part of the population should ever run this.VS normal eating. +/obj/item/reagent_containers/food/snacks/clothing/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) + if(user.a_intent == INTENT_HARM) return ..() -*/ + if(attempt_forcefeed(M, user) == 1) + return TRUE + else + return FALSE + +//As a bonus for having the Cloth Eater trait. You gain extra mood from eatin clothes, but damage them at the same time. +/obj/item/clothing/attack(mob/M, mob/user, def_zone) + if(user.a_intent != INTENT_HARM) + if(HAS_TRAIT(M,TRAIT_CLOTH_EATER)) + var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new + clothing_as_food.name = name + var/mob/living/H = M + if(clothing_as_food.attack(M, user, def_zone)) //I need to check a player can MAWNCH clothes before I run this. Doing them at the same time lets insects eat for free. + SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) + take_damage(20, sound_effect=FALSE) + qdel(clothing_as_food) + return TRUE + if((isinsect(M))) + //Let insects chew on clothes without damaging them. This only sends out a message and does nothing. + user.visible_message("[user] pointlessly [pick("nibbles on","chews on","bites")] the [name].") + return TRUE + .=..() From 88747b513107be85e5c7b77ad98b2b1e91f29057 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Thu, 17 Nov 2022 13:31:50 -0500 Subject: [PATCH 006/384] Actually Final Push Needed to fix the name and description and name --- modular_splurt/code/datums/traits/good.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index 530d9a9a48..1f3da30fa4 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -145,8 +145,8 @@ mob_trait = TRAIT_FLUTTER /datum/quirk/cloth_eater - name = "Cloth Eater" - desc = "You can eat most articles of clothing, but do so will damage them." + name = "Clothes Eater" + desc = "You love the taste of Clothes, and can't help yourself chow down on them. Destroying them in the process." value = 1 /var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER From d555bf1272855fd5c6ebe2b9b83d1c967d818962 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Thu, 17 Nov 2022 15:12:36 -0500 Subject: [PATCH 007/384] Final Final Final Version Last bites can be repaired now. --- code/modules/clothing/clothing.dm | 3 ++- .../code/modules/clothing/clothing.dm | 24 +++++++++++++++++++ 2 files changed, 26 insertions(+), 1 deletion(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 541a52d894..8af3b8d583 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -120,6 +120,7 @@ return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up +/*Moved TO: modular_splurt/code/module/clothing/clothing.dmi /obj/item/clothing/proc/repair(mob/user, params) update_clothes_damaged_state(CLOTHING_PRISTINE) obj_integrity = max_integrity @@ -132,7 +133,7 @@ if(user) UnregisterSignal(user, COMSIG_MOVABLE_MOVED) to_chat(user, "You fix the damage on [src].") - +*/ /** * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()] * diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index 0a3f31137c..a6d58e938f 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -1,3 +1,6 @@ +/obj/item/clothing + var/last_bites = 3 //Once clothes is shredded, + /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." @@ -21,12 +24,33 @@ clothing_as_food.name = name var/mob/living/H = M if(clothing_as_food.attack(M, user, def_zone)) //I need to check a player can MAWNCH clothes before I run this. Doing them at the same time lets insects eat for free. + if(damaged_clothes == CLOTHING_SHREDDED)// Can't let you eat if the clothes is damaged. + last_bites -= 1 + to_chat(M, "There isn't much left to eat.") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) take_damage(20, sound_effect=FALSE) qdel(clothing_as_food) + if(last_bites <= 0) + user.visible_message("[user] finishes eating the [name].") + src.Destroy() return TRUE if((isinsect(M))) //Let insects chew on clothes without damaging them. This only sends out a message and does nothing. user.visible_message("[user] pointlessly [pick("nibbles on","chews on","bites")] the [name].") return TRUE .=..() + +// Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up +/obj/item/clothing/proc/repair(mob/user, params) + update_clothes_damaged_state(CLOTHING_PRISTINE) + obj_integrity = max_integrity + name = initial(name) // remove "tattered" or "shredded" if there's a prefix + if(upgrade_prefix) + name = upgrade_prefix + " " + initial(name) + body_parts_covered = initial(body_parts_covered) + slot_flags = initial(slot_flags) + last_bites = 3 + damage_by_parts = null + if(user) + UnregisterSignal(user, COMSIG_MOVABLE_MOVED) + to_chat(user, "You fix the damage on [src].") From c83a463c704c6ab5f5936ff0459b1827e50da45b Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Fri, 18 Nov 2022 08:44:46 -0500 Subject: [PATCH 008/384] Real Final Update Moved attack() to modular_splurt. and cleaned up some code. Should be ready for PR. --- code/modules/clothing/clothing.dm | 8 +++++--- modular_splurt/code/modules/clothing/clothing.dm | 10 ++++------ 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 8af3b8d583..c9fc3eac65 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -81,15 +81,16 @@ var/atom/movable/screen/inventory/hand/H = over_object if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) + /*MOVED TO: modular_splurt/code/module/clothing/clothing.dmi /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) -*/ + /obj/item/clothing/attack(mob/M, mob/user, def_zone) -/*MOVED TO: modular_splurt/code/module/clothing/clothing.dmi +MOVED TO: modular_splurt/code/module/clothing/clothing.dmi if(user.a_intent != INTENT_HARM && isinsect(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name @@ -98,8 +99,9 @@ qdel(clothing_as_food) else return ..() - */ + return ..() +*/ /obj/item/clothing/attackby(obj/item/W, mob/user, params) if(damaged_clothes && istype(W, repairable_by)) diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index a6d58e938f..36888b6115 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -11,10 +11,8 @@ /obj/item/reagent_containers/food/snacks/clothing/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) if(user.a_intent == INTENT_HARM) return ..() - if(attempt_forcefeed(M, user) == 1) - return TRUE - else - return FALSE + return attempt_forcefeed(M, user) + //As a bonus for having the Cloth Eater trait. You gain extra mood from eatin clothes, but damage them at the same time. /obj/item/clothing/attack(mob/M, mob/user, def_zone) @@ -24,7 +22,7 @@ clothing_as_food.name = name var/mob/living/H = M if(clothing_as_food.attack(M, user, def_zone)) //I need to check a player can MAWNCH clothes before I run this. Doing them at the same time lets insects eat for free. - if(damaged_clothes == CLOTHING_SHREDDED)// Can't let you eat if the clothes is damaged. + if(damaged_clothes == CLOTHING_SHREDDED) //Check if we need to start breaking clothes last_bites -= 1 to_chat(M, "There isn't much left to eat.") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) @@ -38,7 +36,7 @@ //Let insects chew on clothes without damaging them. This only sends out a message and does nothing. user.visible_message("[user] pointlessly [pick("nibbles on","chews on","bites")] the [name].") return TRUE - .=..() + return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up /obj/item/clothing/proc/repair(mob/user, params) From cd4efbe7c98928c1b38339a453a9976d674d7c5e Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Fri, 18 Nov 2022 09:00:40 -0500 Subject: [PATCH 009/384] Addressing the Linter Error --- modular_splurt/code/datums/traits/good.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index 1f3da30fa4..a1fe71de6f 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -148,5 +148,5 @@ name = "Clothes Eater" desc = "You love the taste of Clothes, and can't help yourself chow down on them. Destroying them in the process." value = 1 - /var/mood_category ="cloth_eaten" + var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER From 61aeb9e4864f3a8e320f0b811a5985ab5c197914 Mon Sep 17 00:00:00 2001 From: "dependabot[bot]" <49699333+dependabot[bot]@users.noreply.github.com> Date: Tue, 22 Nov 2022 08:53:39 +0000 Subject: [PATCH 010/384] Bump pillow from 8.3.2 to 9.3.0 in /tools Bumps [pillow](https://github.com/python-pillow/Pillow) from 8.3.2 to 9.3.0. - [Release notes](https://github.com/python-pillow/Pillow/releases) - [Changelog](https://github.com/python-pillow/Pillow/blob/main/CHANGES.rst) - [Commits](https://github.com/python-pillow/Pillow/compare/8.3.2...9.3.0) --- updated-dependencies: - dependency-name: pillow dependency-type: direct:production ... Signed-off-by: dependabot[bot] --- tools/requirements.txt | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/tools/requirements.txt b/tools/requirements.txt index a9abe5e826..af387db66f 100644 --- a/tools/requirements.txt +++ b/tools/requirements.txt @@ -1,6 +1,6 @@ pygit2==1.0.1 bidict==0.13.1 -Pillow==8.3.2 +Pillow==9.3.0 # changelogs PyYaml==5.4 From 5952a9ba050fcf494f8fb828ef1dc4be35091d19 Mon Sep 17 00:00:00 2001 From: ShamanSliph <85446983+ShamanSliph@users.noreply.github.com> Date: Tue, 22 Nov 2022 10:58:46 -0500 Subject: [PATCH 011/384] Slightly Redid the description of the quirk. --- modular_splurt/code/datums/traits/good.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index a1fe71de6f..071c9a2781 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -146,7 +146,7 @@ /datum/quirk/cloth_eater name = "Clothes Eater" - desc = "You love the taste of Clothes, and can't help yourself chow down on them. Destroying them in the process." + desc = "You can eat most apperal to gain a boost in mood, and to gain some nutrients." value = 1 var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER From 85dd33000bc464f5756d79dea67525af0ec9fa25 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Sun, 27 Nov 2022 15:12:01 -0500 Subject: [PATCH 012/384] Insects Eat for Free, and some thing are now un-edible OF course this has issues. Some clothes do not have a Limb_integrity set, so it defaults to 0. But most outfits and clothes seem to have it set. Another PR would need to come through and update outfits to properly have some limb integrity. --- modular_splurt/code/modules/clothing/clothing.dm | 9 ++++----- 1 file changed, 4 insertions(+), 5 deletions(-) diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index 36888b6115..f479ec29a5 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -17,7 +17,10 @@ //As a bonus for having the Cloth Eater trait. You gain extra mood from eatin clothes, but damage them at the same time. /obj/item/clothing/attack(mob/M, mob/user, def_zone) if(user.a_intent != INTENT_HARM) - if(HAS_TRAIT(M,TRAIT_CLOTH_EATER)) + if(HAS_TRAIT(M,TRAIT_CLOTH_EATER) || isinsect(M)) + if(limb_integrity == 0) + to_chat(M, "This item is to tough to eat.") + return FALSE var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name var/mob/living/H = M @@ -32,10 +35,6 @@ user.visible_message("[user] finishes eating the [name].") src.Destroy() return TRUE - if((isinsect(M))) - //Let insects chew on clothes without damaging them. This only sends out a message and does nothing. - user.visible_message("[user] pointlessly [pick("nibbles on","chews on","bites")] the [name].") - return TRUE return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up From ca070fd9ea6a4a1eb32f1d60717abbfe01ce6ea1 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Sun, 27 Nov 2022 15:13:34 -0500 Subject: [PATCH 013/384] Insects Eat for Free, and some clothes now are protected Forgot to update the descriptions --- modular_splurt/code/datums/traits/good.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index 071c9a2781..f0f4d0294e 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -146,7 +146,7 @@ /datum/quirk/cloth_eater name = "Clothes Eater" - desc = "You can eat most apperal to gain a boost in mood, and to gain some nutrients." + desc = "You can eat most apperal to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" value = 1 var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER From 738f5c2f9944f57ff3a2535c37a0ff3ff69fe252 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Mon, 28 Nov 2022 00:36:51 -0500 Subject: [PATCH 014/384] Removed Proof of my English grade. I only know English. I promise. --- modular_splurt/code/datums/traits/good.dm | 2 +- modular_splurt/code/modules/clothing/clothing.dm | 4 ++-- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index f0f4d0294e..fd04dd3a46 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -146,7 +146,7 @@ /datum/quirk/cloth_eater name = "Clothes Eater" - desc = "You can eat most apperal to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" + desc = "You can eat most apparal to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" value = 1 var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index f479ec29a5..de55256e23 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -19,7 +19,7 @@ if(user.a_intent != INTENT_HARM) if(HAS_TRAIT(M,TRAIT_CLOTH_EATER) || isinsect(M)) if(limb_integrity == 0) - to_chat(M, "This item is to tough to eat.") + to_chat(M, "This item is too tough to eat.") return FALSE var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name @@ -27,7 +27,7 @@ if(clothing_as_food.attack(M, user, def_zone)) //I need to check a player can MAWNCH clothes before I run this. Doing them at the same time lets insects eat for free. if(damaged_clothes == CLOTHING_SHREDDED) //Check if we need to start breaking clothes last_bites -= 1 - to_chat(M, "There isn't much left to eat.") + to_chat(M, "There isn't much left to eat.") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) take_damage(20, sound_effect=FALSE) qdel(clothing_as_food) From 452bdc3d0c04bd78ade26e64294fe085f1b60dd5 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Mon, 28 Nov 2022 18:48:25 -0500 Subject: [PATCH 015/384] I promise English is my first language. I Mean it. --- modular_splurt/code/datums/traits/good.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/modular_splurt/code/datums/traits/good.dm b/modular_splurt/code/datums/traits/good.dm index fd04dd3a46..dd4a583576 100644 --- a/modular_splurt/code/datums/traits/good.dm +++ b/modular_splurt/code/datums/traits/good.dm @@ -146,7 +146,7 @@ /datum/quirk/cloth_eater name = "Clothes Eater" - desc = "You can eat most apparal to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" + desc = "You can eat most apparel to gain a boost in mood, and to gain some nutrients. (Insects already have this.)" value = 1 var/mood_category ="cloth_eaten" mob_trait = TRAIT_CLOTH_EATER From 611332781fd80b3ca58fd9299bfee52c1d96985f Mon Sep 17 00:00:00 2001 From: SpookyTheFox <67441715+SpookyTheFox@users.noreply.github.com> Date: Fri, 2 Dec 2022 20:36:24 -0500 Subject: [PATCH 016/384] moved blueshift gear out of premium This makes them all cheaper. Uniform pieces were 700cr in the vendor. They are a cosmetic alternative to normal sec uniforms, no need to make them unobtainable expensive. --- code/modules/vending/security.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 29314c3e31..d6f2724a28 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -14,14 +14,14 @@ /obj/item/storage/box/evidence = 6, /obj/item/flashlight/seclite = 4, /obj/item/restraints/legcuffs/bola/energy = 7, + /obj/item/clothing/head/helmet/blueshirt = 5, //SPLURT edit + /obj/item/clothing/under/rank/security/officer/blueshirt = 5, //SPLURT edit + /obj/item/clothing/suit/armor/vest/blueshirt = 5, //SPLURT edit /obj/item/secbat = 5) contraband = list(/obj/item/clothing/glasses/sunglasses = 2, /obj/item/storage/fancy/donut_box = 2, /obj/item/storage/belt/sabre/secbelt = 1) premium = list(/obj/item/coin/antagtoken = 1, - /obj/item/clothing/head/helmet/blueshirt = 5, //SPLURT edit, origional was 1 - /obj/item/clothing/suit/armor/vest/blueshirt = 5, //SPLURT edit, origional was 1 - /obj/item/clothing/under/rank/security/officer/blueshirt = 5, //SPLURT edit, origional was 1 /obj/item/clothing/gloves/tackler = 5, /obj/item/grenade/stingbang = 1, /obj/item/ssword_kit = 1, From 3d428c6455a61b2db2ee7649c7c39f89e4c70ed9 Mon Sep 17 00:00:00 2001 From: JimmyDrop <85446983+ShamanSliph@users.noreply.github.com> Date: Sat, 10 Dec 2022 23:47:59 -0500 Subject: [PATCH 017/384] Everything but Attack() updated. INB4 I missed something. --- code/modules/clothing/clothing.dm | 10 +++--- .../code/modules/clothing/clothing.dm | 32 ++++++------------- 2 files changed, 15 insertions(+), 27 deletions(-) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c9fc3eac65..5afd5abe3e 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -82,15 +82,15 @@ if(M.putItemFromInventoryInHandIfPossible(src, H.held_index)) add_fingerprint(usr) -/*MOVED TO: modular_splurt/code/module/clothing/clothing.dmi + /obj/item/reagent_containers/food/snacks/clothing name = "oops" desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." list_reagents = list(/datum/reagent/consumable/nutriment = 1) tastes = list("dust" = 1, "lint" = 1) - +/* +MOVED TO: modular_splurt/code/module/clothing/clothing.dm /obj/item/clothing/attack(mob/M, mob/user, def_zone) -MOVED TO: modular_splurt/code/module/clothing/clothing.dmi if(user.a_intent != INTENT_HARM && isinsect(M)) var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name @@ -122,7 +122,6 @@ MOVED TO: modular_splurt/code/module/clothing/clothing.dmi return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up -/*Moved TO: modular_splurt/code/module/clothing/clothing.dmi /obj/item/clothing/proc/repair(mob/user, params) update_clothes_damaged_state(CLOTHING_PRISTINE) obj_integrity = max_integrity @@ -135,7 +134,8 @@ MOVED TO: modular_splurt/code/module/clothing/clothing.dmi if(user) UnregisterSignal(user, COMSIG_MOVABLE_MOVED) to_chat(user, "You fix the damage on [src].") -*/ + + /** * take_damage_zone() is used for dealing damage to specific bodyparts on a worn piece of clothing, meant to be called from [/obj/item/bodypart/proc/check_woundings_mods()] * diff --git a/modular_splurt/code/modules/clothing/clothing.dm b/modular_splurt/code/modules/clothing/clothing.dm index de55256e23..18db8b396b 100644 --- a/modular_splurt/code/modules/clothing/clothing.dm +++ b/modular_splurt/code/modules/clothing/clothing.dm @@ -1,11 +1,8 @@ /obj/item/clothing - var/last_bites = 3 //Once clothes is shredded, + var/last_bites = 3 //Once clothes is shredded, this determines how many more bites till its deleted. /obj/item/reagent_containers/food/snacks/clothing - name = "oops" - desc = "If you're reading this it means I messed up. This is related to moths eating clothes and I didn't know a better way to do it than making a new food object." - list_reagents = list(/datum/reagent/consumable/nutriment = 8) //Cloth eaters get some nutrients. - tastes = list("dust" = 1, "lint" = 1) + list_reagents = list(/datum/reagent/consumable/nutriment = 4) //Cloth eaters get some nutrients. A Jumpsuit will roughly give back 50 Nutrition. IF eaten fully. //A call on attemp_forcefeed() without async to properly know if it worked or not. In theory this shouldn't cause any issues as only a small part of the population should ever run this.VS normal eating. /obj/item/reagent_containers/food/snacks/clothing/attack(mob/living/M, mob/living/user, attackchain_flags = NONE, damage_multiplier = 1) @@ -18,36 +15,27 @@ /obj/item/clothing/attack(mob/M, mob/user, def_zone) if(user.a_intent != INTENT_HARM) if(HAS_TRAIT(M,TRAIT_CLOTH_EATER) || isinsect(M)) - if(limb_integrity == 0) + if(limb_integrity == 0) //This checks if an item can be shredded. to_chat(M, "This item is too tough to eat.") - return FALSE + return FALSE //Return False to prevent the player smacking themselves with the item. Didn't want to risk a player accidently hurting themselves trying to eat anything. var/obj/item/reagent_containers/food/snacks/clothing/clothing_as_food = new clothing_as_food.name = name var/mob/living/H = M - if(clothing_as_food.attack(M, user, def_zone)) //I need to check a player can MAWNCH clothes before I run this. Doing them at the same time lets insects eat for free. + if(clothing_as_food.attack(M, user, def_zone)) //Staggered as calling it in the original IF will cause anyone who lacks either to eat. if(damaged_clothes == CLOTHING_SHREDDED) //Check if we need to start breaking clothes last_bites -= 1 - to_chat(M, "There isn't much left to eat.") + to_chat(M, "There isn't much of the [name] left to eat.") SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cloth_consumed", /datum/mood_event/cloth_eaten, src) take_damage(20, sound_effect=FALSE) qdel(clothing_as_food) if(last_bites <= 0) user.visible_message("[user] finishes eating the [name].") - src.Destroy() + qdel(src) return TRUE return ..() // Set the clothing's integrity back to 100%, remove all damage to bodyparts, and generally fix it up -/obj/item/clothing/proc/repair(mob/user, params) - update_clothes_damaged_state(CLOTHING_PRISTINE) - obj_integrity = max_integrity - name = initial(name) // remove "tattered" or "shredded" if there's a prefix - if(upgrade_prefix) - name = upgrade_prefix + " " + initial(name) - body_parts_covered = initial(body_parts_covered) - slot_flags = initial(slot_flags) +/obj/item/clothing/repair(mob/user, params) + .=..() last_bites = 3 - damage_by_parts = null - if(user) - UnregisterSignal(user, COMSIG_MOVABLE_MOVED) - to_chat(user, "You fix the damage on [src].") + From 183b554ed30b426c9d7ecae259a8fea407e76804 Mon Sep 17 00:00:00 2001 From: PeriodicChaos Date: Fri, 19 Aug 2022 15:42:47 -0400 Subject: [PATCH 018/384] modsuits part 1 --- code/__DEFINES/ai.dm | 6 + .../signals_atom/signals_atom_movable.dm | 3 + .../signals/signals_mob/signals_mob_carbon.dm | 3 + .../signals/signals_mob/signals_mob_living.dm | 4 + code/__DEFINES/dcs/signals/signals_mod.dm | 7 ++ code/__DEFINES/mod.dm | 31 +++++ code/__DEFINES/traits.dm | 18 +++ code/__DEFINES/wiremod.dm | 4 + code/_globalvars/lists/maintenance_loot.dm | 1 + code/_onclick/hud/radial.dm | 2 + code/datums/ai/objects/mod.dm | 48 ++++++++ .../crafting/recipes/recipes_misc.dm | 13 +++ code/datums/components/storage/storage.dm | 5 +- code/datums/holocall.dm | 11 ++ code/datums/outfit.dm | 55 +++++---- code/datums/wires/mod.dm | 57 ++++++++++ code/game/atoms.dm | 3 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/rechargestation.dm | 4 +- code/game/machinery/suit_storage_unit.dm | 106 ++++++++++++++++-- code/game/objects/items.dm | 4 + code/game/objects/items/devices/aicard.dm | 16 ++- code/game/objects/items/singularityhammer.dm | 8 +- code/game/objects/items/storage/_storage.dm | 3 - code/game/objects/items/tanks/jetpack.dm | 27 +++++ code/game/objects/objs.dm | 2 +- code/game/objects/structures/false_walls.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/window.dm | 2 +- code/game/turfs/simulated/walls.dm | 2 +- code/modules/cargo/packs/science.dm | 12 ++ tgstation.dme | 8 ++ 32 files changed, 421 insertions(+), 50 deletions(-) create mode 100644 code/__DEFINES/ai.dm create mode 100644 code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm create mode 100644 code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm create mode 100644 code/__DEFINES/dcs/signals/signals_mod.dm create mode 100644 code/__DEFINES/mod.dm create mode 100644 code/__DEFINES/wiremod.dm create mode 100644 code/datums/ai/objects/mod.dm create mode 100644 code/datums/wires/mod.dm diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm new file mode 100644 index 0000000000..a83f02135c --- /dev/null +++ b/code/__DEFINES/ai.dm @@ -0,0 +1,6 @@ +///Mob the MOD is trying to attach to +#define BB_MOD_TARGET "BB_mod_target" +///The implant the AI was created from +#define BB_MOD_IMPLANT "BB_mod_implant" +///Range for a MOD AI controller. +#define MOD_AI_RANGE 100 diff --git a/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm new file mode 100644 index 0000000000..be1e9b31c8 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_atom/signals_atom_movable.dm @@ -0,0 +1,3 @@ +/// from base of atom/movable/Process_Spacemove(): (movement_dir) +#define COMSIG_MOVABLE_SPACEMOVE "spacemove" + #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm new file mode 100644 index 0000000000..be1e9b31c8 --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm @@ -0,0 +1,3 @@ +/// from base of atom/movable/Process_Spacemove(): (movement_dir) +#define COMSIG_MOVABLE_SPACEMOVE "spacemove" + #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm index 5d2a471c0a..0fd09d9063 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_living.dm @@ -1,2 +1,6 @@ ///From base of mob/living/MobBump() (mob/living) #define COMSIG_LIVING_MOB_BUMP "living_mob_bump" + +///From base of mob/living/ZImpactDamage() (mob/living, levels, turf/t) +#define COMSIG_LIVING_Z_IMPACT "living_z_impact" + #define NO_Z_IMPACT_DAMAGE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm new file mode 100644 index 0000000000..4c8ec4d6de --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -0,0 +1,7 @@ +//MODsuit signals +/// Called when a module is selected to be the active one from on_select() +#define COMSIG_MOD_MODULE_SELECTED "mod_module_selected" +/// Called when a MOD activation is called from toggle_activate(mob/user) +#define COMSIG_MOD_ACTIVATE "mod_activate" + /// Cancels the suit's activation + #define MOD_CANCEL_ACTIVATE (1 << 0) diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm new file mode 100644 index 0000000000..03163497d4 --- /dev/null +++ b/code/__DEFINES/mod.dm @@ -0,0 +1,31 @@ +/// Default value for the max_complexity var on MODsuits +#define DEFAULT_MAX_COMPLEXITY 15 + +/// Default cell drain per process on MODsuits +#define DEFAULT_CELL_DRAIN 5 + +/// Passive module, just acts when put in naturally. +#define MODULE_PASSIVE 0 +/// Usable module, does something when you press a button. +#define MODULE_USABLE 1 +/// Toggle module, you turn it on/off and it does stuff. +#define MODULE_TOGGLE 2 +/// Actively usable module, you may only have one selected at a time. +#define MODULE_ACTIVE 3 + +//Defines used by the theme for clothing flags and similar +#define HELMET_LAYER "helmet_layer" +#define HELMET_FLAGS "helmet_flags" +#define CHESTPLATE_FLAGS "chestplate_flags" +#define GAUNTLETS_FLAGS "gauntlets_flags" +#define BOOTS_FLAGS "boots_flags" + +#define UNSEALED_CLOTHING "unsealed_clothing" +#define SEALED_CLOTHING "sealed_clothing" +#define UNSEALED_INVISIBILITY "unsealed_invisibility" +#define SEALED_INVISIBILITY "sealed_invisibility" +#define UNSEALED_COVER "unsealed_cover" +#define SEALED_COVER "sealed_cover" + +/// Global list of all /datum/mod_theme +GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 222dc5cd39..af5dccb3fd 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -158,6 +158,22 @@ #define TRAIT_CALCIUM_HEALER "calcium_healer" #define TRAIT_MAGIC_CHOKE "magic_choke" #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" +/// Prevents plasmamen from self-igniting +#define TRAIT_NOSELFIGNITION "no_selfignition" +/// Like antimagic, but doesn't block the user from casting +#define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" +/// Gives us turf, mob and object vision through walls +#define TRAIT_XRAY_VISION "xray_vision" +/// Gives us mob vision through walls and slight night vision +#define TRAIT_THERMAL_VISION "thermal_vision" +/// Gives us turf vision through walls and slight night vision +#define TRAIT_MESON_VISION "meson_vision" +/// Gives us Night vision +#define TRAIT_TRUE_NIGHT_VISION "true_night_vision" +/// Negates our gravity, letting us move normally on floors in 0-g +#define TRAIT_NEGATES_GRAVITY "negates_gravity" +/// Lets us scan reagents +#define TRAIT_REAGENT_SCANNER "reagent_scanner" #define TRAIT_ABDUCTOR_TRAINING "abductor-training" #define TRAIT_ABDUCTOR_SCIENTIST_TRAINING "abductor-scientist-training" #define TRAIT_SURGEON "surgeon" @@ -377,3 +393,5 @@ #define STATION_TRAIT_FILLED_MAINT "station_trait_filled_maint" #define STATION_TRAIT_EMPTY_MAINT "station_trait_empty_maint" #define STATION_TRAIT_PDA_GLITCHED "station_trait_pda_glitched" +/// Trait applied by MODsuits. +#define MOD_TRAIT "mod" diff --git a/code/__DEFINES/wiremod.dm b/code/__DEFINES/wiremod.dm new file mode 100644 index 0000000000..c242bcc7d6 --- /dev/null +++ b/code/__DEFINES/wiremod.dm @@ -0,0 +1,4 @@ +#define SHELL_FLAG_CIRCUIT_UNREMOVABLE (1<<0) + +/// Whether a circuit is not able to be modified +#define SHELL_FLAG_CIRCUIT_UNMODIFIABLE (1<<5) diff --git a/code/_globalvars/lists/maintenance_loot.dm b/code/_globalvars/lists/maintenance_loot.dm index b41b7356a8..9aa0f8be0a 100644 --- a/code/_globalvars/lists/maintenance_loot.dm +++ b/code/_globalvars/lists/maintenance_loot.dm @@ -51,6 +51,7 @@ GLOBAL_LIST_INIT(maintenance_loot, list( /obj/item/airlock_painter = 1, /obj/item/stack/cable_coil/random = 4, /obj/item/stack/cable_coil/random/five = 6, + /obj/item/mod/construction/broken_core = 5, /obj/item/stack/medical/suture = 1, /obj/item/stack/rods/ten = 9, /obj/item/stack/rods/twentyfive = 1, diff --git a/code/_onclick/hud/radial.dm b/code/_onclick/hud/radial.dm index 935379b721..b438afaec8 100644 --- a/code/_onclick/hud/radial.dm +++ b/code/_onclick/hud/radial.dm @@ -91,6 +91,8 @@ GLOBAL_LIST_EMPTY(radial_menus) else py_shift = 32 restrict_to_dir(NORTH) //I was going to parse screen loc here but that's more effort than it's worth. + else if(hudfix_method && AM.loc) + anchor = get_atom_on_turf(anchor) //Sets defaults //These assume 45 deg min_angle diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm new file mode 100644 index 0000000000..ced2ffceb6 --- /dev/null +++ b/code/datums/ai/objects/mod.dm @@ -0,0 +1,48 @@ +/// An AI controller for the MODsuit pathfinder module. It's activated by implant and attaches itself to the user. +/datum/ai_controller/mod + blackboard = list( + BB_MOD_TARGET, + BB_MOD_IMPLANT, + ) + max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesnt run otherwise + ai_movement = /datum/ai_movement/jps + ///ID card generated from the suit's required access. Used for pathing. + var/obj/item/card/id/advanced/id_card + +/datum/ai_controller/mod/TryPossessPawn(atom/new_pawn) + if(!istype(new_pawn, /obj/item/mod/control)) + return AI_CONTROLLER_INCOMPATIBLE + var/obj/item/mod/control/mod = new_pawn + id_card = new /obj/item/card/id/advanced/simple_bot() + if(length(mod.req_access)) + id_card.set_access(mod.req_access) + return ..() //Run parent at end + +/datum/ai_controller/mod/UnpossessPawn(destroy) + QDEL_NULL(id_card) + return ..() //Run parent at end + +/datum/ai_controller/mod/SelectBehaviors(delta_time) + current_behaviors = list() + if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_IMPLANT]) + queue_behavior(/datum/ai_behavior/mod_attach) + +/datum/ai_controller/mod/get_access() + return id_card + +/datum/ai_behavior/mod_attach + behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM + +/datum/ai_behavior/mod_attach/perform(delta_time, datum/ai_controller/controller) + . = ..() + if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET])) + return + var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] + implant.module.attach(controller.blackboard[BB_MOD_TARGET]) + finish_action(controller, TRUE) + +/datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded) + . = ..() + controller.blackboard[BB_MOD_TARGET] = null + var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] + implant.end_recall(succeeded) diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index ad37f770ed..7f6408f583 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -554,6 +554,19 @@ subcategory = CAT_MISCELLANEOUS category = CAT_MISCELLANEOUS +/datum/crafting_recipe/mod_core + name = "MOD core" + result = /obj/item/mod/construction/core + tool_behaviors = list(TOOL_SCREWDRIVER) + time = 10 SECONDS + reqs = list(/obj/item/stack/cable_coil = 5, + /obj/item/stack/rods = 2, + /obj/item/stack/sheet/glass = 1, + /obj/item/organ/heart = 1 + ) + subcategory = CAT_MISCELLANEOUS + category = CAT_MISCELLANEOUS + ////////////// //Banners///// ////////////// diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index c0101140d6..1218e8b9af 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -369,9 +369,10 @@ //Tries to dump content /datum/component/storage/proc/dump_content_at(atom/dest_object, mob/M) var/atom/A = parent - var/atom/dump_destination = dest_object.get_dumping_location() - if(A.Adjacent(M) && dump_destination && M.Adjacent(dump_destination)) + var/atom/dump_destination = get_dumping_location(dest_object) + if(M.CanReach(A) && dump_destination && M.CanReach(dump_destination)) if(check_locked(null, M, TRUE)) + to_chat(M, "[parent] seems to be locked!") return FALSE if(dump_destination.storage_contents_dump_act(src, M)) playsound(A, "rustle", 50, 1, -5) diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index c54f6c971a..a4d5591653 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -348,12 +348,21 @@ /datum/preset_holoimage/engineer/rig outfit_type = /datum/outfit/job/engineer/gloved/rig +/datum/preset_holoimage/engineer/mod + outfit_type = /datum/outfit/job/engineer/mod + /datum/preset_holoimage/engineer/ce outfit_type = /datum/outfit/job/ce +/datum/preset_holoimage/engineer/ce/mod + outfit_type = /datum/outfit/job/ce/mod + /datum/preset_holoimage/engineer/ce/rig outfit_type = /datum/outfit/job/engineer/gloved/rig +/datum/preset_holoimage/engineer/atmos/mod + outfit_type = /datum/outfit/job/atmos/mod + /datum/preset_holoimage/engineer/atmos outfit_type = /datum/outfit/job/atmos @@ -449,6 +458,7 @@ SAY Oh, shit! DELAY 10 PRESET /datum/preset_holoimage/engineer/atmos/rig + PRESET /datum/preset_holoimage/engineer/atmos/mod LANGUAGE /datum/language/narsie NAME Unknown SAY RISE, MY LORD!! @@ -456,6 +466,7 @@ LANGUAGE /datum/language/common NAME Plastic PRESET /datum/preset_holoimage/engineer/rig + PRESET /datum/preset_holoimage/engineer/mod SAY Fuck, fuck, fuck! DELAY 20 SAY It's loose! CALL THE FUCKING SHUTT- diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 4c17874f97..c5221bdaf8 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -79,6 +79,10 @@ //Type path of item to go in left hand var/r_hand = null + + ///ID of the slot containing a gas tank + var/internals_slot = null + /// Any clothing accessory item var/accessory = null @@ -140,6 +144,15 @@ //to be overridden for toggling internals, id binding, access etc return +#define EQUIP_OUTFIT_ITEM(item_path, slot_name) if(##item_path) { \ + H.equip_to_slot_or_del(SSwardrobe.provide_type(##item_path), ##slot_name, TRUE); \ + var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \ + if (outfit_item && outfit_item.type == ##item_path) { \ + outfit_item.on_outfit_equip(H, visualsOnly, ##slot_name); \ + } \ +} + + /** * Equips all defined types and paths to the mob passed in * @@ -153,31 +166,32 @@ //Start with uniform,suit,backpack for additional slots if(uniform) - H.equip_to_slot_or_del(new uniform(H), ITEM_SLOT_ICLOTHING, TRUE) + EQUIP_OUTFIT_ITEM(uniform, ITEM_SLOT_ICLOTHING) if(suit) - H.equip_to_slot_or_del(new suit(H), ITEM_SLOT_OCLOTHING, TRUE) - if(back) - H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) + EQUIP_OUTFIT_ITEM(suit, ITEM_SLOT_OCLOTHING) if(belt) - H.equip_to_slot_or_del(new belt(H), ITEM_SLOT_BELT, TRUE) + EQUIP_OUTFIT_ITEM(belt, ITEM_SLOT_BELT) if(gloves) - H.equip_to_slot_or_del(new gloves(H), ITEM_SLOT_GLOVES, TRUE) + EQUIP_OUTFIT_ITEM(gloves, ITEM_SLOT_GLOVES) if(shoes) - H.equip_to_slot_or_del(new shoes(H), ITEM_SLOT_FEET, TRUE) + EQUIP_OUTFIT_ITEM(shoes, ITEM_SLOT_FEET) if(head) - H.equip_to_slot_or_del(new head(H), ITEM_SLOT_HEAD, TRUE) + EQUIP_OUTFIT_ITEM(head, ITEM_SLOT_HEAD) if(mask) - H.equip_to_slot_or_del(new mask(H), ITEM_SLOT_MASK, TRUE) + EQUIP_OUTFIT_ITEM(mask, ITEM_SLOT_MASK) if(neck) - H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) + EQUIP_OUTFIT_ITEM(neck, ITEM_SLOT_NECK) if(ears) - H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS, TRUE) + EQUIP_OUTFIT_ITEM(ears, ITEM_SLOT_EARS) if(glasses) - H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) + EQUIP_OUTFIT_ITEM(glasses, ITEM_SLOT_EYES) + if(back) + EQUIP_OUTFIT_ITEM(back, ITEM_SLOT_BACK) if(id) - H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) + EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) if(suit_store) - H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) + EQUIP_OUTFIT_ITEM(suit_store, ITEM_SLOT_SUITSTORE) + if(undershirt) H.undershirt = initial(undershirt.name) @@ -195,9 +209,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - H.equip_to_slot_or_del(new l_pocket(H), ITEM_SLOT_LPOCKET, TRUE) + EQUIP_OUTFIT_ITEM(l_pocket, ITEM_SLOT_LPOCKET) if(r_pocket) - H.equip_to_slot_or_del(new r_pocket(H), ITEM_SLOT_RPOCKET, TRUE) + EQUIP_OUTFIT_ITEM(r_pocket, ITEM_SLOT_RPOCKET) if(box) if(!backpack_contents) @@ -211,11 +225,7 @@ if(!isnum(number))//Default to 1 number = 1 for(var/i in 1 to number) - H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE) - - if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) - var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit - HS.ToggleHelmet() + EQUIP_OUTFIT_ITEM(path, ITEM_SLOT_BACKPACK) post_equip(H, visualsOnly, preference_source) @@ -232,6 +242,9 @@ H.update_body() return TRUE +#undef EQUIP_OUTFIT_ITEM + + /** * Apply a fingerprint from the passed in human to all items in the outfit * diff --git a/code/datums/wires/mod.dm b/code/datums/wires/mod.dm new file mode 100644 index 0000000000..b5805557ea --- /dev/null +++ b/code/datums/wires/mod.dm @@ -0,0 +1,57 @@ +/datum/wires/mod + holder_type = /obj/item/mod/control + proper_name = "MOD control unit" + +/datum/wires/mod/New(atom/holder) + wires = list(WIRE_HACK, WIRE_DISABLE, WIRE_SHOCK, WIRE_INTERFACE) + add_duds(2) + ..() + +/datum/wires/mod/interactable(mob/user) + if(!..()) + return FALSE + var/obj/item/mod/control/mod = holder + return mod.open + +/datum/wires/mod/get_status() + var/obj/item/mod/control/mod = holder + var/list/status = list() + status += "The orange light is [mod.seconds_electrified ? "on" : "off"]." + status += "The red light is [mod.malfunctioning ? "off" : "blinking"]." + status += "The green light is [mod.locked ? "on" : "off"]." + status += "The yellow light is [mod.interface_break ? "off" : "on"]." + return status + +/datum/wires/mod/on_pulse(wire) + var/obj/item/mod/control/mod = holder + switch(wire) + if(WIRE_HACK) + mod.locked = !mod.locked + if(WIRE_DISABLE) + mod.malfunctioning = TRUE + if(WIRE_SHOCK) + mod.seconds_electrified = MACHINE_DEFAULT_ELECTRIFY_TIME + if(WIRE_INTERFACE) + mod.interface_break = !mod.interface_break + +/datum/wires/mod/on_cut(wire, mend) + var/obj/item/mod/control/mod = holder + switch(wire) + if(WIRE_HACK) + if(!mend) + mod.req_access = list() + if(WIRE_DISABLE) + mod.malfunctioning = !mend + if(WIRE_SHOCK) + if(mend) + mod.seconds_electrified = MACHINE_NOT_ELECTRIFIED + else + mod.seconds_electrified = MACHINE_ELECTRIFIED_PERMANENT + if(WIRE_INTERFACE) + mod.interface_break = !mend + +/datum/wires/mod/ui_act(action, params) + var/obj/item/mod/control/mod = holder + if(!issilicon(usr) && mod.seconds_electrified && mod.shock(usr)) + return FALSE + return ..() diff --git a/code/game/atoms.dm b/code/game/atoms.dm index e7d9898dd2..fd10507d59 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -911,7 +911,8 @@ user.active_storage.ui_show(user) return TRUE -/atom/proc/get_dumping_location(obj/item/storage/source,mob/user) +///Get the best place to dump the items contained in the source storage item? +/atom/proc/get_dumping_location() return null //This proc is called on the location of an atom when the atom is Destroy()'d diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ef47a0e7f6..9dd54e043f 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -381,7 +381,7 @@ /obj/machinery/door/morgue icon = 'icons/obj/doors/doormorgue.dmi' -/obj/machinery/door/get_dumping_location(obj/item/storage/source,mob/user) +/obj/machinery/door/get_dumping_location() return null /obj/machinery/door/proc/lock() diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 11ae19f7fa..634ffec74a 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -1,6 +1,6 @@ /obj/machinery/recharge_station - name = "cyborg recharging station" - desc = "This device recharges cyborgs and resupplies them with materials." + name = "recharging station" + desc = "This device recharges energy dependent lifeforms, like cyborgs, ethereals and MODsuit users." icon = 'icons/obj/objects.dmi' icon_state = "borgcharger0" density = FALSE diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 74a05a1e7b..5e509a637b 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -10,11 +10,15 @@ var/obj/item/clothing/suit/space/suit = null var/obj/item/clothing/head/helmet/space/helmet = null var/obj/item/clothing/mask/mask = null + var/obj/item/mod/control/mod = null var/obj/item/storage = null var/suit_type = null var/helmet_type = null var/mask_type = null + /// What type of MOD the unit starts with when spawned. + var/mod_type = null + /// What type of additional item the unit starts with when spawned. var/storage_type = null state_open = FALSE @@ -38,21 +42,50 @@ mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/captain +/obj/machinery/suit_storage_unit/captainmod + mask_type = /obj/item/clothing/mask/gas/atmos/captain + storage_type = /obj/item/tank/jetpack/oxygen/captain + mod_type = /obj/item/mod/control/pre_equipped/magnate + /obj/machinery/suit_storage_unit/engine suit_type = /obj/item/clothing/suit/space/hardsuit/engine mask_type = /obj/item/clothing/mask/breath storage_type= /obj/item/clothing/shoes/magboots +/obj/machinery/suit_storage_unit/enginemod + mask_type = /obj/item/clothing/mask/breath + mod_type = /obj/item/mod/control/pre_equipped/engineering + +/obj/machinery/suit_storage_unit/atmos + suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos + mask_type = /obj/item/clothing/mask/gas/atmos + storage_type = /obj/item/watertank/atmos + +/obj/machinery/suit_storage_unit/atmosmod + mask_type = /obj/item/clothing/mask/gas/atmos + storage_type = /obj/item/watertank/atmos + mod_type = /obj/item/mod/control/pre_equipped/atmospheric + /obj/machinery/suit_storage_unit/ce suit_type = /obj/item/clothing/suit/space/hardsuit/engine/elite mask_type = /obj/item/clothing/mask/breath storage_type= /obj/item/clothing/shoes/magboots/advance +/obj/machinery/suit_storage_unit/cemod + mask_type = /obj/item/clothing/mask/breath + storage_type = /obj/item/clothing/shoes/magboots/advance + mod_type = /obj/item/mod/control/pre_equipped/advanced + /obj/machinery/suit_storage_unit/security suit_type = /obj/item/clothing/suit/space/hardsuit/security mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/security +/obj/machinery/suit_storage_unit/securitymod + mask_type = /obj/item/clothing/mask/gas/sechailer + mod_type = /obj/item/mod/control/pre_equipped/security + + /obj/machinery/suit_storage_unit/hos suit_type = /obj/item/clothing/suit/space/hardsuit/security/hos mask_type = /obj/item/clothing/mask/gas/sechailer @@ -63,6 +96,11 @@ mask_type = /obj/item/clothing/mask/gas storage_type = /obj/item/watertank/atmos +/obj/machinery/suit_storage_unit/hosmod + mask_type = /obj/item/clothing/mask/gas/sechailer + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/safeguard + /obj/machinery/suit_storage_unit/mining suit_type = /obj/item/clothing/suit/hooded/explorer/standard mask_type = /obj/item/clothing/mask/gas/explorer @@ -71,6 +109,16 @@ suit_type = /obj/item/clothing/suit/space/hardsuit/mining mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/mining/evahos + suit_type = null + mask_type = /obj/item/clothing/mask/breath + mod_type = /obj/item/mod/control/pre_equipped/mining + +/obj/machinery/suit_storage_unit/medicalmod + mask_type = /obj/item/clothing/mask/breath/medical + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/medical + /obj/machinery/suit_storage_unit/cmo suit_type = /obj/item/clothing/suit/space/hardsuit/medical mask_type = /obj/item/clothing/mask/breath @@ -81,15 +129,29 @@ helmet_type = /obj/item/clothing/head/helmet/space/eva/paramedic mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/cmomod + mask_type = /obj/item/clothing/mask/breath/medical + storage_type = /obj/item/tank/internals/oxygen + mod_type = /obj/item/mod/control/pre_equipped/rescue + /obj/machinery/suit_storage_unit/rd suit_type = /obj/item/clothing/suit/space/hardsuit/rd mask_type = /obj/item/clothing/mask/breath +/obj/machinery/suit_storage_unit/rdmod + mask_type = /obj/item/clothing/mask/breath + mod_type = /obj/item/mod/control/pre_equipped/research + /obj/machinery/suit_storage_unit/syndicate suit_type = /obj/item/clothing/suit/space/hardsuit/syndi mask_type = /obj/item/clothing/mask/gas/syndicate storage_type = /obj/item/tank/jetpack/oxygen/harness +/obj/machinery/suit_storage_unit/syndicatemod + mask_type = /obj/item/clothing/mask/gas/syndicate + storage_type = /obj/item/tank/jetpack/oxygen/harness + mod_type = /obj/item/mod/control/pre_equipped/nuclear + /obj/machinery/suit_storage_unit/ert/command suit_type = /obj/item/clothing/suit/space/hardsuit/ert mask_type = /obj/item/clothing/mask/breath @@ -129,6 +191,8 @@ helmet = new helmet_type(src) if(mask_type) mask = new mask_type(src) + if(mod_type) + mod = new mod_type(src) if(storage_type) storage = new storage_type(src) update_icon() @@ -137,6 +201,7 @@ QDEL_NULL(suit) QDEL_NULL(helmet) QDEL_NULL(mask) + QDEL_NULL(mod) QDEL_NULL(storage) return ..() @@ -154,7 +219,7 @@ . += "broken" else . += "open" - if(suit) + if(suit || mod) . += "suit" if(helmet) . += "helm" @@ -175,6 +240,7 @@ helmet = null suit = null mask = null + mod = null storage = null occupant = null @@ -241,6 +307,8 @@ qdel(suit) // Delete everything but the occupant. mask = null qdel(mask) + mod = null + qdel(mod) storage = null qdel(storage) // The wires get damaged too. @@ -262,6 +330,9 @@ if(mask) things_to_clear += mask things_to_clear += mask.GetAllContents() + if(mod) + things_to_clear += mod + things_to_clear += mod.get_all_contents() if(storage) things_to_clear += storage things_to_clear += storage.GetAllContents() @@ -279,13 +350,25 @@ if(occupant) dump_contents() -/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) - if(!prob(prb)) - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() - if(electrocute_mob(user, src, src, 1, TRUE)) - return 1 +/obj/machinery/suit_storage_unit/process(delta_time) + var/obj/item/stock_parts/cell/cell + if(suit) + if(!istype(suit)) + return + if(!suit.cell) + return + cell = suit.cell + else if(mod) + if(!istype(mod)) + return + if(!mod.cell) + return + cell = mod.cell + else + return + + use_power(charge_rate * delta_time) + cell.give(charge_rate * delta_time) /obj/machinery/suit_storage_unit/relaymove(mob/user) if(locked) @@ -353,6 +436,13 @@ if(!user.transferItemToLoc(I, src)) return mask = I + else if(istype(I, /obj/item/mod/control)) + if(mod) + to_chat(user, span_warning("The unit already contains a MOD!")) + return + if(!user.transferItemToLoc(I, src)) + return + mod = I else if(storage) to_chat(user, "The auxiliary storage compartment is full!") diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0dcc23f3aa..5fd55eeb45 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1271,3 +1271,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb /obj/item/proc/update_action_buttons(status_only = FALSE, force = FALSE) for(var/datum/action/current_action as anything in actions) current_action.UpdateButtonIcon(status_only, force) + +/// Special stuff you want to do when an outfit equips this item. +/obj/item/proc/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + return diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 503e2a9473..52ec7f796f 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -26,18 +26,22 @@ user.visible_message("[user] is trying to upload [user.p_them()]self into [src]! That's not going to work out well!") return BRUTELOSS -/obj/item/aicard/afterattack(atom/target, mob/user, proximity) - . = ..() - if(!proximity || !target) - return +/obj/item/aicard/pre_attack(atom/target, mob/living/user, params) if(AI) //AI is on the card, implies user wants to upload it. - log_combat(user, AI, "carded", src) + var/our_ai = AI target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) + else //No AI on the card, therefore the user wants to download one. + target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) + if(AI) + log_combat(user, our_ai, "uploaded", src, "to [target].") + return TRUE else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) if(AI) log_combat(user, AI, "carded", src) - update_icon() //Whatever happened, update the card's state (icon, name) to match. + return TRUE + update_appearance() //Whatever happened, update the card's state (icon, name) to match. + return ..() /obj/item/aicard/update_icon() cut_overlays() diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index b9d66a5bd0..77dee74711 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -53,7 +53,13 @@ var/atom/movable/A = X if(A == wielder) continue - if(A && !A.anchored && !ishuman(X)) + if(isliving(A)) + var/mob/living/vortexed_mob = A + if(vortexed_mob.mob_negates_gravity()) + continue + else + vortexed_mob.Paralyze(2 SECONDS) + if(!A.anchored && !isobserver(A)) step_towards(A,pull) step_towards(A,pull) step_towards(A,pull) diff --git a/code/game/objects/items/storage/_storage.dm b/code/game/objects/items/storage/_storage.dm index cbaa1775eb..c7aa36a350 100644 --- a/code/game/objects/items/storage/_storage.dm +++ b/code/game/objects/items/storage/_storage.dm @@ -5,9 +5,6 @@ w_class = WEIGHT_CLASS_NORMAL var/component_type = /datum/component/storage/concrete -/obj/item/storage/get_dumping_location(obj/item/storage/source,mob/user) - return src - /obj/item/storage/Initialize(mapload) . = ..() PopulateContents() diff --git a/code/game/objects/items/tanks/jetpack.dm b/code/game/objects/items/tanks/jetpack.dm index 06c38ead9f..76bfe63d27 100644 --- a/code/game/objects/items/tanks/jetpack.dm +++ b/code/game/objects/items/tanks/jetpack.dm @@ -19,6 +19,25 @@ ion_trail = new ion_trail.set_up(src) +/obj/item/tank/jetpack/Destroy() + QDEL_NULL(ion_trail) + return ..() + +/obj/item/tank/jetpack/item_action_slot_check(slot) + if(slot == ITEM_SLOT_BACK) + return TRUE + +/obj/item/tank/jetpack/equipped(mob/user, slot, initial) + . = ..() + if(on && slot != ITEM_SLOT_BACK) + turn_off(user) + +/obj/item/tank/jetpack/dropped(mob/user, silent) + . = ..() + if(on) + turn_off(user) + + /obj/item/tank/jetpack/populate_gas() if(gas_type) air_contents.set_moles(gas_type, ((6 * ONE_ATMOSPHERE) * volume / (R_IDEAL_GAS_EQUATION * T20C))) @@ -53,6 +72,7 @@ icon_state = "[initial(icon_state)]-on" ion_trail.start() RegisterSignal(user, COMSIG_MOVABLE_MOVED, .proc/move_react) + RegisterSignal(user, COMSIG_MOVABLE_SPACEMOVE, .proc/spacemove_react) if(full_speed) user.add_movespeed_modifier(/datum/movespeed_modifier/jetpack/fullspeed) else @@ -90,6 +110,13 @@ else ..() +/obj/item/tank/jetpack/proc/spacemove_react(mob/user, movement_dir) + SIGNAL_HANDLER + + if(on && (movement_dir || stabilizers)) + return COMSIG_MOVABLE_STOP_SPACEMOVE + + /obj/item/tank/jetpack/improvised name = "improvised jetpack" desc = "A jetpack made from two air tanks, a fire extinguisher and some atmospherics equipment. It doesn't look like it can hold much." diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 4ea25bec96..7ed99f895b 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -237,7 +237,7 @@ if(!anchored || current_size >= STAGE_FIVE) step_towards(src,S) -/obj/get_dumping_location(datum/component/storage/source,mob/user) +/obj/get_dumping_location() return get_turf(src) /** diff --git a/code/game/objects/structures/false_walls.dm b/code/game/objects/structures/false_walls.dm index bf06f06e6f..67d17eecfd 100644 --- a/code/game/objects/structures/false_walls.dm +++ b/code/game/objects/structures/false_walls.dm @@ -133,7 +133,7 @@ new mineral(loc) qdel(src) -/obj/structure/falsewall/get_dumping_location(obj/item/storage/source,mob/user) +/obj/structure/falsewall/get_dumping_location() return null /obj/structure/falsewall/examine_status(mob/user) //So you can't detect falsewalls by examine. diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index 998285dd58..129744ab1c 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -273,7 +273,7 @@ C.add_delayedload(C.newavail() * 0.0375) // you can gain up to 3.5 via the 4x upgrades power is halved by the pole so thats 2x then 1X then .5X for 3.5x the 3 bounces shock. return ..() -/obj/structure/grille/get_dumping_location(datum/component/storage/source,mob/user) +/obj/structure/grille/get_dumping_location() return null /obj/structure/grille/broken // Pre-broken grilles for map placement diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index cf5e34fd8b..625d36f5c2 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -567,7 +567,7 @@ GLOBAL_LIST_EMPTY(electrochromatic_window_lookup) take_damage(round(exposed_volume / 100), BURN, 0, 0) ..() -/obj/structure/window/get_dumping_location(obj/item/storage/source,mob/user) +/obj/structure/window/get_dumping_location() return null /obj/structure/window/CanAStarPass(obj/item/card/id/ID, to_dir, atom/movable/caller) diff --git a/code/game/turfs/simulated/walls.dm b/code/game/turfs/simulated/walls.dm index cac03b0637..deda368e66 100644 --- a/code/game/turfs/simulated/walls.dm +++ b/code/game/turfs/simulated/walls.dm @@ -278,7 +278,7 @@ if(.) ChangeTurf(/turf/closed/wall/clockwork) -/turf/closed/wall/get_dumping_location(obj/item/storage/source, mob/user) +/turf/closed/wall/get_dumping_location() return null /turf/closed/wall/acid_act(acidpwr, acid_volume) diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 125bfe2034..6ec6554693 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -238,3 +238,15 @@ contains = list(/obj/item/raw_anomaly_core/pyro) crate_name = "raw pyro anomaly" crate_type = /obj/structure/closet/crate/secure/science + +/datum/supply_pack/science/mod_core + name = "MOD core Crate" + desc = "Three cores, perfect for any MODsuit construction! Naturally harvestedâ„¢, of course." + cost = CARGO_CRATE_VALUE * 3 + access = ACCESS_ROBOTICS + access_view = ACCESS_ROBOTICS + contains = list(/obj/item/mod/construction/core, + /obj/item/mod/construction/core, + /obj/item/mod/construction/core) + crate_name = "MOD core crate" + crate_type = /obj/structure/closet/crate/secure/science diff --git a/tgstation.dme b/tgstation.dme index c45ca0f83f..1ced56efb1 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,6 +26,7 @@ #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\actionspeed_modifiers.dm" #include "code\__DEFINES\admin.dm" +#include "code\__DEFINES\ai.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\bitfields.dm" @@ -80,6 +81,7 @@ #include "code\__DEFINES\menu.dm" #include "code\__DEFINES\misc.dm" #include "code\__DEFINES\mobs.dm" +#include "code\__DEFINES\mod.dm" #include "code\__DEFINES\monkeys.dm" #include "code\__DEFINES\move_force.dm" #include "code\__DEFINES\movement.dm" @@ -136,6 +138,7 @@ #include "code\__DEFINES\vote.dm" #include "code\__DEFINES\vv.dm" #include "code\__DEFINES\wall_dents.dm" +#include "code\__DEFINES\wiremod.dm" #include "code\__DEFINES\wires.dm" #include "code\__DEFINES\wounds.dm" #include "code\__DEFINES\_flags\_flags.dm" @@ -156,8 +159,11 @@ #include "code\__DEFINES\dcs\flags.dm" #include "code\__DEFINES\dcs\helpers.dm" #include "code\__DEFINES\dcs\signals.dm" +#include "code\__DEFINES\dcs\signals\signals_mod.dm" #include "code\__DEFINES\dcs\signals\signals_subsystem.dm" +#include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movable.dm" #include "code\__DEFINES\dcs\signals\signals_atom\signals_atom_movement.dm" +#include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_carbon.dm" #include "code\__DEFINES\dcs\signals\signals_mob\signals_mob_living.dm" #include "code\__DEFINES\mapping\maploader.dm" #include "code\__DEFINES\material\worth.dm" @@ -500,6 +506,7 @@ #include "code\datums\achievements\misc_scores.dm" #include "code\datums\achievements\skill_achievements.dm" #include "code\datums\actions\beam_rifle.dm" +#include "code\datums\ai\objects\mod.dm" #include "code\datums\announcers\_announcer.dm" #include "code\datums\announcers\default_announcer.dm" #include "code\datums\announcers\intern_announcer.dm" @@ -807,6 +814,7 @@ #include "code\datums\wires\emitter.dm" #include "code\datums\wires\explosive.dm" #include "code\datums\wires\microwave.dm" +#include "code\datums\wires\mod.dm" #include "code\datums\wires\mulebot.dm" #include "code\datums\wires\particle_accelerator.dm" #include "code\datums\wires\r_n_d.dm" From b538ad721b3fd5f71fdc39b336934aca45720d1e Mon Sep 17 00:00:00 2001 From: PeriodicChaos Date: Sat, 20 Aug 2022 12:55:37 -0400 Subject: [PATCH 019/384] modsuits part 2 --- code/datums/ai/objects/mod.dm | 48 - code/modules/client/preferences/mod_select.dm | 23 + code/modules/mob/living/carbon/carbon.dm | 17 +- .../mob/living/carbon/human/inventory.dm | 10 +- .../mob/living/carbon/human/species.dm | 2 +- code/modules/mob/living/living.dm | 5 +- code/modules/mob/living/silicon/ai/ai.dm | 22 +- code/modules/mob/mob.dm | 2 +- code/modules/mob/mob_helpers.dm | 2 +- code/modules/mod/mod_actions.dm | 71 ++ code/modules/mod/mod_activation.dm | 217 +++++ code/modules/mod/mod_ai.dm | 88 ++ code/modules/mod/mod_clothes.dm | 123 +++ code/modules/mod/mod_construction.dm | 278 ++++++ code/modules/mod/mod_control.dm | 559 ++++++++++++ code/modules/mod/mod_theme.dm | 854 ++++++++++++++++++ code/modules/mod/mod_types.dm | 157 ++++ code/modules/mod/mod_ui.dm | 80 ++ code/modules/mod/modules/_module.dm | 252 ++++++ code/modules/mod/modules/modules.dm | 352 ++++++++ tgstation.dme | 14 +- 21 files changed, 3109 insertions(+), 67 deletions(-) delete mode 100644 code/datums/ai/objects/mod.dm create mode 100644 code/modules/client/preferences/mod_select.dm create mode 100644 code/modules/mod/mod_actions.dm create mode 100644 code/modules/mod/mod_activation.dm create mode 100644 code/modules/mod/mod_ai.dm create mode 100644 code/modules/mod/mod_clothes.dm create mode 100644 code/modules/mod/mod_construction.dm create mode 100644 code/modules/mod/mod_control.dm create mode 100644 code/modules/mod/mod_theme.dm create mode 100644 code/modules/mod/mod_types.dm create mode 100644 code/modules/mod/mod_ui.dm create mode 100644 code/modules/mod/modules/_module.dm create mode 100644 code/modules/mod/modules/modules.dm diff --git a/code/datums/ai/objects/mod.dm b/code/datums/ai/objects/mod.dm deleted file mode 100644 index ced2ffceb6..0000000000 --- a/code/datums/ai/objects/mod.dm +++ /dev/null @@ -1,48 +0,0 @@ -/// An AI controller for the MODsuit pathfinder module. It's activated by implant and attaches itself to the user. -/datum/ai_controller/mod - blackboard = list( - BB_MOD_TARGET, - BB_MOD_IMPLANT, - ) - max_target_distance = MOD_AI_RANGE //a little spicy but its one specific item that summons it, and it doesnt run otherwise - ai_movement = /datum/ai_movement/jps - ///ID card generated from the suit's required access. Used for pathing. - var/obj/item/card/id/advanced/id_card - -/datum/ai_controller/mod/TryPossessPawn(atom/new_pawn) - if(!istype(new_pawn, /obj/item/mod/control)) - return AI_CONTROLLER_INCOMPATIBLE - var/obj/item/mod/control/mod = new_pawn - id_card = new /obj/item/card/id/advanced/simple_bot() - if(length(mod.req_access)) - id_card.set_access(mod.req_access) - return ..() //Run parent at end - -/datum/ai_controller/mod/UnpossessPawn(destroy) - QDEL_NULL(id_card) - return ..() //Run parent at end - -/datum/ai_controller/mod/SelectBehaviors(delta_time) - current_behaviors = list() - if(blackboard[BB_MOD_TARGET] && blackboard[BB_MOD_IMPLANT]) - queue_behavior(/datum/ai_behavior/mod_attach) - -/datum/ai_controller/mod/get_access() - return id_card - -/datum/ai_behavior/mod_attach - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT|AI_BEHAVIOR_MOVE_AND_PERFORM - -/datum/ai_behavior/mod_attach/perform(delta_time, datum/ai_controller/controller) - . = ..() - if(!controller.pawn.Adjacent(controller.blackboard[BB_MOD_TARGET])) - return - var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] - implant.module.attach(controller.blackboard[BB_MOD_TARGET]) - finish_action(controller, TRUE) - -/datum/ai_behavior/mod_attach/finish_action(datum/ai_controller/controller, succeeded) - . = ..() - controller.blackboard[BB_MOD_TARGET] = null - var/obj/item/implant/mod/implant = controller.blackboard[BB_MOD_IMPLANT] - implant.end_recall(succeeded) diff --git a/code/modules/client/preferences/mod_select.dm b/code/modules/client/preferences/mod_select.dm new file mode 100644 index 0000000000..c80c8b4c69 --- /dev/null +++ b/code/modules/client/preferences/mod_select.dm @@ -0,0 +1,23 @@ +/// Switches between mouse buttons for MODsuit active modules +/datum/preference/choiced/mod_select + category = PREFERENCE_CATEGORY_GAME_PREFERENCES + savefile_key = "mod_select" + savefile_identifier = PREFERENCE_PLAYER + +/datum/preference/choiced/mod_select/init_possible_values() + return list(MIDDLE_CLICK, ALT_CLICK) + +/datum/preference/choiced/mod_select/create_default_value() + return MIDDLE_CLICK + +/datum/preference/choiced/mod_select/apply_to_client_updated(client/client, value) + if(!ishuman(client.mob)) + return + var/mob/living/carbon/human/client_owner = client.mob + if(!istype(client_owner.back, /obj/item/mod/control)) + return + var/obj/item/mod/control/mod = client_owner.back + if(!mod.selected_module) + return + UnregisterSignal(mod.wearer, mod.selected_module.used_signal) + mod.selected_module.update_signal(value) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index e12a28d01a..daedb7a2b3 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -27,8 +27,8 @@ if(prob(40)) if(prob(25)) audible_message("You hear something rumbling inside [src]'s stomach...", \ - "You hear something rumbling.", 4,\ - "Something is rumbling inside your stomach!") + "You hear something rumbling.", 4,\ + "Something is rumbling inside your stomach!") var/obj/item/I = user.get_active_held_item() if(I && I.force) var/d = rand(round(I.force / 4), I.force) @@ -624,12 +624,21 @@ if(M.name == XRAY) sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) see_in_dark = max(see_in_dark, 8) + + if(HAS_TRAIT(src, TRAIT_TRUE_NIGHT_VISION)) + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE) + see_in_dark = max(see_in_dark, 8) + + if(HAS_TRAIT(src, TRAIT_MESON_VISION)) + sight |= SEE_TURFS + lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) + if(HAS_TRAIT(src, TRAIT_THERMAL_VISION)) - sight |= (SEE_MOBS) + sight |= SEE_MOBS lighting_alpha = min(lighting_alpha, LIGHTING_PLANE_ALPHA_MOSTLY_VISIBLE) if(HAS_TRAIT(src, TRAIT_XRAY_VISION)) - sight |= (SEE_TURFS|SEE_MOBS|SEE_OBJS) + sight |= SEE_TURFS|SEE_MOBS|SEE_OBJS see_in_dark = max(see_in_dark, 8) if(see_override) diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 4c30a1d742..2f3c1357da 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -304,7 +304,8 @@ if(equip_to_slot_if_possible(thing, ITEM_SLOT_BACK)) update_inv_hands() return - if(!SEND_SIGNAL(equipped_back, COMSIG_CONTAINS_STORAGE)) // not a storage item + var/datum/component/storage/storage = equipped_back.GetComponent(/datum/component/storage) + if(!storage) if(!thing) equipped_back.attack_hand(src) else @@ -314,10 +315,11 @@ if(!SEND_SIGNAL(equipped_back, COMSIG_TRY_STORAGE_INSERT, thing, src)) to_chat(src, "You can't fit anything in!") return - if(!equipped_back.contents.len) // nothing to take out - to_chat(src, "There's nothing in your backpack to take out!") + var/atom/real_location = storage.real_location() + if(!real_location.contents.len) // nothing to take out + to_chat(src, "There's nothing in your [equipped_back.name] to take out!") return - var/obj/item/stored = equipped_back.contents[equipped_back.contents.len] + var/obj/item/stored = real_location.contents[real_location.contents.len] if(!stored || stored.on_found(src)) return stored.attack_hand(src) // take out thing from backpack diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index afceabf2a6..68a9f8bd0f 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1303,7 +1303,7 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(ITEM_SLOT_FEET) if(H.shoes) return FALSE - if( !(I.slot_flags & ITEM_SLOT_FEET) ) + if((DIGITIGRADE in species_traits) && !(I.item_flags & IGNORE_DIGITIGRADE)) return FALSE if(num_legs < 2) return FALSE diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index be6508dd96..e6aac9cde9 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -47,6 +47,8 @@ return ..() /mob/living/proc/ZImpactDamage(turf/T, levels) + if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE) + return visible_message("[src] crashes into [T] with a sickening noise!", \ "You crash into [T] with a sickening noise!") adjustBruteLoss((levels * 5) ** 1.5) @@ -753,7 +755,8 @@ return pick("trails_1", "trails_2") /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - if(buckled) + playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) + if(buckled || mob_negates_gravity()) return if(client && client.move_delay >= world.time + world.tick_lag*2) pressure_resistance_prob_delta -= 30 diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index deaf50973d..3cda68c015 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -38,8 +38,8 @@ var/can_be_carded = TRUE var/alarms = list("Motion"=list(), "Fire"=list(), "Atmosphere"=list(), "Power"=list(), "Camera"=list(), "Burglar"=list()) var/viewalerts = 0 - var/icon/holo_icon//Female is assigned when AI is created. - var/obj/vehicle/sealed/mecha/controlled_mech //For controlled_mech a mech, to determine whether to relaymove or use the AI eye. + var/icon/holo_icon //Female is assigned when AI is created. + var/obj/controlled_equipment //A piece of equipment, to determine whether to relaymove or use the AI eye. var/radio_enabled = TRUE //Determins if a carded AI can speak with its built in radio or not. radiomod = ";" //AIs will, by default, state their laws on the internal radio. var/obj/item/pda/ai/aiPDA @@ -173,10 +173,20 @@ GLOB.ai_list -= src GLOB.shuttle_caller_list -= src SSshuttle.autoEvac() - qdel(eyeobj) // No AI, no Eye + QDEL_NULL(eyeobj) // No AI, no Eye + QDEL_NULL(spark_system) + QDEL_NULL(malf_picker) + QDEL_NULL(doomsday_device) + QDEL_NULL(robot_control) + QDEL_NULL(aiMulti) + QDEL_NULL(alert_control) malfhack = null - - . = ..() + current = null + Bot = null + controlled_equipment = null + linked_core = null + apc_override = null + return ..() /mob/living/silicon/ai/IgniteMob() fire_stacks = 0 @@ -410,7 +420,7 @@ if (href_list["ai_take_control"]) //Mech domination var/obj/vehicle/sealed/mecha/M = locate(href_list["ai_take_control"]) - if(controlled_mech) + if(controlled_equipment) to_chat(src, "You are already loaded into an onboard computer!") return if(!GLOB.cameranet.checkCameraVis(M)) diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 507a94b613..baa4d87075 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -722,7 +722,7 @@ GLOBAL_VAR_INIT(exploit_warn_spam_prevention, 0) return pick(protection_sources) else return src - if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY))) + if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (!self && magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC_NO_SELFBLOCK)) || (holy && HAS_TRAIT(src, TRAIT_HOLY))) return src //You can buckle on mobs if you're next to them since most are dense diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index 90a7aae95e..cdad94cf3f 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -585,7 +585,7 @@ It's fairly easy to fix if dealing with single letters but not so much with comp //Can the mob see reagents inside of containers? /mob/proc/can_see_reagents() - return stat == DEAD || silicon_privileges //Dead guys and silicons can always see reagents + return stat == DEAD || silicon_privileges || HAS_TRAIT(src, TRAIT_REAGENT_SCANNER) //Dead guys and silicons can always see reagents /mob/proc/is_blind() SHOULD_BE_PURE(TRUE) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm new file mode 100644 index 0000000000..2c27879e79 --- /dev/null +++ b/code/modules/mod/mod_actions.dm @@ -0,0 +1,71 @@ +/datum/action/item_action/mod + background_icon_state = "bg_tech_blue" + icon_icon = 'icons/mob/actions/actions_mod.dmi' + check_flags = AB_CHECK_CONSCIOUS + var/obj/item/mod/control/mod + +/datum/action/item_action/mod/New(Target) + ..() + mod = Target + +/datum/action/item_action/mod/Grant(mob/M) + if(owner) + Share(M) + return + ..() + +/datum/action/item_action/mod/Remove(mob/M) + var/mob_to_grant + for(var/datum/weakref/reference as anything in sharers) + var/mob/freeloader = reference.resolve() + if(!freeloader) + continue + mob_to_grant = freeloader + break + ..() + if(mob_to_grant) + Grant(mob_to_grant) + +/datum/action/item_action/mod/deploy + name = "Deploy MODsuit" + desc = "Deploy/Conceal a part of the MODsuit." + button_icon_state = "deploy" + +/datum/action/item_action/mod/deploy/Trigger() + if(!IsAvailable()) + return FALSE + mod.choose_deploy(usr) + return TRUE + +/datum/action/item_action/mod/activate + name = "Activate MODsuit" + desc = "Activate/Deactivate the MODsuit." + button_icon_state = "activate" + +/datum/action/item_action/mod/activate/Trigger() + if(!IsAvailable()) + return FALSE + mod.toggle_activate(usr) + return TRUE + +/datum/action/item_action/mod/module + name = "Toggle Module" + desc = "Toggle a MODsuit module." + button_icon_state = "module" + +/datum/action/item_action/mod/module/Trigger() + if(!IsAvailable()) + return FALSE + mod.quick_module(usr) + return TRUE + +/datum/action/item_action/mod/panel + name = "MODsuit Panel" + desc = "Open the MODsuit's panel." + button_icon_state = "panel" + +/datum/action/item_action/mod/panel/Trigger() + if(!IsAvailable()) + return FALSE + mod.ui_interact(usr) + return TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm new file mode 100644 index 0000000000..f7869dc227 --- /dev/null +++ b/code/modules/mod/mod_activation.dm @@ -0,0 +1,217 @@ +#define MOD_ACTIVATION_STEP_TIME 2 SECONDS +#define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED + +/// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted. +/obj/item/mod/control/proc/choose_deploy(mob/user) + if(!length(mod_parts)) + return + var/list/display_names = list() + var/list/items = list() + for(var/obj/item/piece as anything in mod_parts) + display_names[piece.name] = REF(piece) + var/image/piece_image = image(icon = piece.icon, icon_state = piece.icon_state) + items += list(piece.name = piece_image) + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE, tooltips = TRUE) + if(!pick) + return + var/part_reference = display_names[pick] + var/obj/item/part = locate(part_reference) in mod_parts + if(!istype(part) || user.incapacitated()) + return + if(active || activating) + balloon_alert(user, "deactivate the suit first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + var/parts_to_check = mod_parts - part + if(part.loc == src) + deploy(user, part) + for(var/obj/item/piece as anything in parts_to_check) + if(piece.loc != src) + continue + choose_deploy(user) + break + else + conceal(user, part) + for(var/obj/item/piece as anything in parts_to_check) + if(piece.loc == src) + continue + choose_deploy(user) + break + +/// Deploys a part of the suit onto the user. +/obj/item/mod/control/proc/deploy(mob/user, part) + var/obj/item/piece = part + if(piece == gauntlets && wearer.gloves) + gauntlets.overslot = wearer.gloves + wearer.transferItemToLoc(gauntlets.overslot, gauntlets, force = TRUE) + if(piece == boots && wearer.shoes) + boots.overslot = wearer.shoes + wearer.transferItemToLoc(boots.overslot, boots, force = TRUE) + if(wearer.equip_to_slot_if_possible(piece, piece.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + ADD_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) + if(!user) + return TRUE + wearer.visible_message(span_notice("[wearer]'s [piece] deploy[piece.p_s()] with a mechanical hiss."), + span_notice("[piece] deploy[piece.p_s()] with a mechanical hiss."), + span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + return TRUE + else if(piece.loc != src) + if(!user) + return FALSE + balloon_alert(user, "[piece] already deployed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + else + if(!user) + return FALSE + balloon_alert(user, "bodypart clothed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/// Retract a part of the suit from the user +/obj/item/mod/control/proc/conceal(mob/user, part) + var/obj/item/piece = part + REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) + wearer.transferItemToLoc(piece, src, force = TRUE) + if(piece == gauntlets) + gauntlets.show_overslot() + if(piece == boots) + boots.show_overslot() + if(!user) + return + wearer.visible_message(span_notice("[wearer]'s [piece] retract[piece.p_s()] back into [src] with a mechanical hiss."), + span_notice("[piece] retract[piece.p_s()] back into [src] with a mechanical hiss."), + span_hear("You hear a mechanical hiss.")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + +/// Starts the activation sequence, where parts of the suit activate one by one until the whole suit is on +/obj/item/mod/control/proc/toggle_activate(mob/user, force_deactivate = FALSE) + if(!wearer) + if(!force_deactivate) + balloon_alert(user, "put suit on back!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!force_deactivate && (SEND_SIGNAL(src, COMSIG_MOD_ACTIVATE, user) & MOD_CANCEL_ACTIVATE)) + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + for(var/obj/item/part as anything in mod_parts) + if(!force_deactivate && part.loc == src) + balloon_alert(user, "deploy all parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(locked && !active && !allowed(user) && !force_deactivate) + balloon_alert(user, "access insufficient!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!cell?.charge && !force_deactivate) + balloon_alert(user, "suit not powered!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(open && !force_deactivate) + balloon_alert(user, "close the suit panel!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(activating) + if(!force_deactivate) + balloon_alert(user, "suit already [active ? "shutting down" : "starting up"]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + for(var/obj/item/mod/module/module as anything in modules) + if(!module.active) + continue + module.on_deactivation() + activating = TRUE + to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(boots, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(gauntlets, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(chestplate,seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"].")) + playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) + seal_part(helmet, seal = !active) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) + if(ai) + to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"")) + finish_activation(on = !active) + if(active) + playsound(src, 'sound/machines/synth_yes.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50)) + else + playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + activating = FALSE + return TRUE + +///Seals or unseals the given part +/obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) + if(seal) + part.clothing_flags |= part.visor_flags + part.flags_inv |= part.visor_flags_inv + part.flags_cover |= part.visor_flags_cover + part.heat_protection = initial(part.heat_protection) + part.cold_protection = initial(part.cold_protection) + else + part.flags_cover &= ~part.visor_flags_cover + part.flags_inv &= ~part.visor_flags_inv + part.clothing_flags &= ~part.visor_flags + part.heat_protection = NONE + part.cold_protection = NONE + if(part == boots) + boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]" + wearer.update_inv_shoes() + if(part == gauntlets) + gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]" + wearer.update_inv_gloves() + if(part == chestplate) + chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]" + wearer.update_inv_wear_suit() + wearer.update_inv_w_uniform() + if(part == helmet) + helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]" + if(seal) + helmet.alternate_worn_layer = null + else + helmet.alternate_worn_layer = helmet.alternate_layer + wearer.update_inv_head() + wearer.update_inv_wear_mask() + wearer.update_hair() + +/// Finishes the suit's activation, starts processing +/obj/item/mod/control/proc/finish_activation(on) + icon_state = "[skin]-control[on ? "-sealed" : ""]" + slowdown = on ? slowdown_active : slowdown_inactive + if(on) + for(var/obj/item/mod/module/module as anything in modules) + module.on_suit_activation() + START_PROCESSING(SSobj, src) + else + for(var/obj/item/mod/module/module as anything in modules) + module.on_suit_deactivation() + STOP_PROCESSING(SSobj, src) + wearer.update_equipment_speed_mods() + active = on + wearer.update_inv_back() + +/// Quickly deploys all the suit parts and if successful, seals them and turns on the suit. Intended mostly for outfits. +/obj/item/mod/control/proc/quick_activation() + var/seal = TRUE + for(var/obj/item/part in mod_parts) + if(!deploy(null, part)) + seal = FALSE + if(!seal) + return + for(var/obj/item/part in mod_parts) + seal_part(part, seal = TRUE) + finish_activation(on = TRUE) + +#undef MOD_ACTIVATION_STEP_TIME +#undef MOD_ACTIVATION_STEP_FLAGS diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm new file mode 100644 index 0000000000..f470fb8046 --- /dev/null +++ b/code/modules/mod/mod_ai.dm @@ -0,0 +1,88 @@ +/obj/item/mod/control/transfer_ai(interaction, mob/user, mob/living/silicon/ai/intAI, obj/item/aicard/card) + . = ..() + if(!.) + return + if(!open) //mod must be open + balloon_alert(user, "suit must be open to transfer!") + return + switch(interaction) + if(AI_TRANS_TO_CARD) + if(!ai) + balloon_alert(user, "no AI in suit!") + return + balloon_alert(user, "transferring to card...") + if(!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + intAI = ai + intAI.ai_restore_power()//So the AI initially has power. + intAI.control_disabled = TRUE + intAI.radio_enabled = FALSE + intAI.disconnect_shell() + intAI.forceMove(card) + card.AI = intAI + for(var/datum/action/action as anything in actions) + if(action.owner == intAI) + action.Remove(intAI) + else + action.Unshare(intAI) + intAI.controlled_equipment = null + intAI.remote_control = null + balloon_alert(intAI, "transferred to a card") + balloon_alert(user, "AI transferred to card") + ai = null + + if(AI_TRANS_FROM_CARD) //Using an AI card to upload to the suit. + intAI = card.AI + if(!intAI) + balloon_alert(user, "no AI in card!") + return + if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client + intAI.disconnect_shell() + if(intAI.stat || !intAI.client) + balloon_alert(user, "AI unresponsive!") + return + balloon_alert(user, "transferring to suit...") + if(!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "AI transferred to suit") + ai_enter_mod(intAI) + card.AI = null + +/obj/item/mod/control/proc/ai_enter_mod(mob/living/silicon/ai/new_ai) + new_ai.control_disabled = FALSE + new_ai.radio_enabled = TRUE + new_ai.ai_restore_power() + new_ai.cancel_camera() + new_ai.controlled_equipment = src + new_ai.remote_control = src + new_ai.forceMove(src) + ai = new_ai + balloon_alert(new_ai, "transferred to a suit") + for(var/datum/action/action as anything in actions) + action.Grant(new_ai) + +#define MOVE_DELAY 2 +#define WEARER_DELAY 1 +#define LONE_DELAY 5 +#define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5 + +/obj/item/mod/control/relaymove(mob/user, direction) + if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) + return FALSE + var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) + COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) + playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) + cell.charge = max(0, cell.charge - CELL_PER_STEP) + if(ismovable(wearer?.loc)) + return wearer.loc.relaymove(wearer, direction) + if(wearer && !wearer.Process_Spacemove(direction)) + return FALSE + var/atom/movable/mover = wearer || src + return step(mover, direction) + +#undef MOVE_DELAY +#undef WEARER_DELAY +#undef LONE_DELAY +#undef CELL_PER_STEP diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm new file mode 100644 index 0000000000..37045015d6 --- /dev/null +++ b/code/modules/mod/mod_clothes.dm @@ -0,0 +1,123 @@ +/obj/item/clothing/head/helmet/space/mod + name = "MOD helmet" + desc = "A helmet for a MODsuit." + icon = 'icons/obj/mod.dmi' + icon_state = "helmet" + worn_icon = 'icons/mob/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + body_parts_covered = HEAD + heat_protection = HEAD + cold_protection = HEAD + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + flash_protect = FLASH_PROTECTION_NONE + clothing_flags = SNUG_FIT + flags_inv = HIDEFACIALHAIR + flags_cover = NONE + visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE + visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT + visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF + var/alternate_layer = NECK_LAYER + var/obj/item/mod/control/mod + +/obj/item/clothing/head/helmet/space/mod/Destroy() + if(!QDELETED(mod)) + mod.helmet = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/obj/item/clothing/suit/armor/mod + name = "MOD chestplate" + desc = "A chestplate for a MODsuit." + icon = 'icons/obj/mod.dmi' + icon_state = "chestplate" + worn_icon = 'icons/mob/mod.dmi' + blood_overlay_type = "armor" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + body_parts_covered = CHEST|GROIN + heat_protection = CHEST|GROIN + cold_protection = CHEST|GROIN + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + visor_flags = STOPSPRESSUREDAMAGE + visor_flags_inv = HIDEJUMPSUIT + allowed = list(/obj/item/flashlight, /obj/item/tank/internals) + resistance_flags = NONE + var/obj/item/mod/control/mod + +/obj/item/clothing/suit/armor/mod/Destroy() + if(!QDELETED(mod)) + mod.chestplate = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/obj/item/clothing/gloves/mod + name = "MOD gauntlets" + desc = "A pair of gauntlets for a MODsuit." + icon = 'icons/obj/mod.dmi' + icon_state = "gauntlets" + worn_icon = 'icons/mob/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + body_parts_covered = HANDS|ARMS + heat_protection = HANDS|ARMS + cold_protection = HANDS|ARMS + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + var/obj/item/mod/control/mod + var/obj/item/clothing/overslot + +/obj/item/clothing/gloves/mod/Destroy() + if(!QDELETED(mod)) + mod.gauntlets = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/// Replaces these gloves on the wearer with the overslot ones + +/obj/item/clothing/gloves/mod/proc/show_overslot() + if(!overslot) + return + if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + overslot = null + +/obj/item/clothing/shoes/mod + name = "MOD boots" + desc = "A pair of boots for a MODsuit." + icon = 'icons/obj/mod.dmi' + icon_state = "boots" + worn_icon = 'icons/mob/mod.dmi' + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + body_parts_covered = FEET|LEGS + heat_protection = FEET|LEGS + cold_protection = FEET|LEGS + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + clothing_flags = THICKMATERIAL + resistance_flags = NONE + item_flags = IGNORE_DIGITIGRADE + var/obj/item/mod/control/mod + var/obj/item/clothing/overslot + +/obj/item/clothing/shoes/mod/Destroy() + if(!QDELETED(mod)) + mod.boots = null + mod.mod_parts -= src + QDEL_NULL(mod) + return ..() + +/// Replaces these shoes on the wearer with the overslot ones +/obj/item/clothing/shoes/mod/proc/show_overslot() + if(!overslot) + return + if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) + mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + overslot = null diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm new file mode 100644 index 0000000000..4916f8b6bc --- /dev/null +++ b/code/modules/mod/mod_construction.dm @@ -0,0 +1,278 @@ +/obj/item/mod/construction + desc = "A part used in MOD construction." + inhand_icon_state = "rack_parts" + +/obj/item/mod/construction/helmet + name = "MOD helmet" + icon_state = "helmet" + +/obj/item/mod/construction/chestplate + name = "MOD chestplate" + icon_state = "chestplate" + +/obj/item/mod/construction/gauntlets + name = "MOD gauntlets" + icon_state = "gauntlets" + +/obj/item/mod/construction/boots + name = "MOD boots" + icon_state = "boots" + +/obj/item/mod/construction/core + name = "MOD core" + icon_state = "mod-core" + desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ + These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \ + owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\ + Which one you have in your suit is unclear, but either way, \ + it's been repurposed to be an internal power source for a Modular Outerwear Device." + +/obj/item/mod/construction/broken_core + name = "broken MOD core" + icon_state = "mod-core-broken" + desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." + +/obj/item/mod/construction/broken_core/examine(mob/user) + . = ..() + . += span_notice("You could repair it with a screwdriver...") + +/obj/item/mod/construction/broken_core/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(!tool.use_tool(src, user, 5 SECONDS, volume = 30)) + return + new /obj/item/mod/construction/core(drop_location()) + qdel(src) + +/obj/item/mod/construction/armor + name = "MOD armor plates" + desc = "Armor plates used to finish a MOD." + icon_state = "standard-armor" + var/datum/mod_theme/theme = /datum/mod_theme + +/obj/item/mod/construction/armor/Initialize(mapload) + . = ..() + var/datum/mod_theme/used_theme = GLOB.mod_themes[theme] + name = "MOD [used_theme.name] armor plates" + desc = "[desc] [used_theme.desc]" + icon_state = "[used_theme.default_skin]-armor" + +/obj/item/mod/construction/armor/engineering + theme = /datum/mod_theme/engineering + +/obj/item/mod/construction/armor/atmospheric + theme = /datum/mod_theme/atmospheric + +/obj/item/mod/construction/armor/mining + theme = /datum/mod_theme/mining + +/obj/item/mod/construction/armor/medical + theme = /datum/mod_theme/medical + +/obj/item/mod/construction/armor/security + theme = /datum/mod_theme/security + +/obj/item/mod/construction/armor/cosmohonk + theme = /datum/mod_theme/cosmohonk + +/obj/item/mod/paint + name = "MOD paint kit" + desc = "This kit will repaint your MODsuit to something unique." + icon = 'icons/obj/mod.dmi' + icon_state = "paintkit" + +#define START_STEP "start" +#define CORE_STEP "core" +#define SCREWED_CORE_STEP "screwed_core" +#define HELMET_STEP "helmet" +#define CHESTPLATE_STEP "chestplate" +#define GAUNTLETS_STEP "gauntlets" +#define BOOTS_STEP "boots" +#define WRENCHED_ASSEMBLY_STEP "wrenched_assembly" +#define SCREWED_ASSEMBLY_STEP "screwed_assembly" + +/obj/item/mod/construction/shell + name = "MOD shell" + icon_state = "mod-construction_start" + desc = "A MOD shell." + var/obj/item/core + var/obj/item/helmet + var/obj/item/chestplate + var/obj/item/gauntlets + var/obj/item/boots + var/step = START_STEP + +/obj/item/mod/construction/shell/examine(mob/user) + . = ..() + var/display_text + switch(step) + if(START_STEP) + display_text = "It looks like it's missing a MOD core..." + if(CORE_STEP) + display_text = "The core seems loose..." + if(SCREWED_CORE_STEP) + display_text = "It looks like it's missing a helmet..." + if(HELMET_STEP) + display_text = "It looks like it's missing a chestplate..." + if(CHESTPLATE_STEP) + display_text = "It looks like it's missing gauntlets..." + if(GAUNTLETS_STEP) + display_text = "It looks like it's missing boots..." + if(BOOTS_STEP) + display_text = "The assembly seems unsecured..." + if(WRENCHED_ASSEMBLY_STEP) + display_text = "The assembly seems loose..." + if(SCREWED_ASSEMBLY_STEP) + display_text = "All it's missing is external armor..." + . += span_notice(display_text) + +/obj/item/mod/construction/shell/attackby(obj/item/part, mob/user, params) + . = ..() + switch(step) + if(START_STEP) + if(!istype(part, /obj/item/mod/construction/core)) + return + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "core stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "core inserted") + core = part + step = CORE_STEP + if(CORE_STEP) + if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "core screwed") + step = SCREWED_CORE_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + core.forceMove(drop_location()) + balloon_alert(user, "core taken out") + step = START_STEP + if(SCREWED_CORE_STEP) + if(istype(part, /obj/item/mod/construction/helmet)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "helmet stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "helmet added") + helmet = part + step = HELMET_STEP + else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "core unscrewed") + step = CORE_STEP + if(HELMET_STEP) + if(istype(part, /obj/item/mod/construction/chestplate)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "chestplate stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "chestplate added") + chestplate = part + step = CHESTPLATE_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + helmet.forceMove(drop_location()) + balloon_alert(user, "helmet removed") + helmet = null + step = SCREWED_CORE_STEP + if(CHESTPLATE_STEP) + if(istype(part, /obj/item/mod/construction/gauntlets)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "gauntlets stuck to your hand!") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "gauntlets added") + gauntlets = part + step = GAUNTLETS_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + chestplate.forceMove(drop_location()) + balloon_alert(user, "chestplate removed") + chestplate = null + step = HELMET_STEP + if(GAUNTLETS_STEP) + if(istype(part, /obj/item/mod/construction/boots)) //Construct + if(!user.transferItemToLoc(part, src)) + balloon_alert(user, "boots added") + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "You fit [part] onto [src].") + boots = part + step = BOOTS_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + gauntlets.forceMove(drop_location()) + balloon_alert(user, "gauntlets removed") + gauntlets = null + step = CHESTPLATE_STEP + if(BOOTS_STEP) + if(part.tool_behaviour == TOOL_WRENCH) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly secured") + step = WRENCHED_ASSEMBLY_STEP + else if(part.tool_behaviour == TOOL_CROWBAR) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + boots.forceMove(drop_location()) + balloon_alert(user, "boots removed") + boots = null + step = GAUNTLETS_STEP + if(WRENCHED_ASSEMBLY_STEP) + if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly screwed") + step = SCREWED_ASSEMBLY_STEP + else if(part.tool_behaviour == TOOL_WRENCH) //Deconstruct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly unsecured") + step = BOOTS_STEP + if(SCREWED_ASSEMBLY_STEP) + if(istype(part, /obj/item/mod/construction/armor)) //Construct + var/obj/item/mod/construction/armor/external_armor = part + if(!user.transferItemToLoc(part, src)) + return + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + balloon_alert(user, "suit finished") + var/obj/item/modsuit = new /obj/item/mod/control(drop_location(), external_armor.theme) + qdel(src) + user.put_in_hands(modsuit) + else if(part.tool_behaviour == TOOL_SCREWDRIVER) //Construct + if(part.use_tool(src, user, 0, volume=30)) + balloon_alert(user, "assembly unscrewed") + step = SCREWED_ASSEMBLY_STEP + update_icon_state() + +/obj/item/mod/construction/shell/update_icon_state() + . = ..() + icon_state = "mod-construction_[step]" + +/obj/item/mod/construction/shell/Destroy() + QDEL_NULL(core) + QDEL_NULL(helmet) + QDEL_NULL(chestplate) + QDEL_NULL(gauntlets) + QDEL_NULL(boots) + return ..() + +/obj/item/mod/construction/shell/handle_atom_del(atom/deleted_atom) + if(deleted_atom == core) + core = null + if(deleted_atom == helmet) + helmet = null + if(deleted_atom == chestplate) + chestplate = null + if(deleted_atom == gauntlets) + gauntlets = null + if(deleted_atom == boots) + boots = null + return ..() + +#undef START_STEP +#undef CORE_STEP +#undef SCREWED_CORE_STEP +#undef HELMET_STEP +#undef CHESTPLATE_STEP +#undef GAUNTLETS_STEP +#undef BOOTS_STEP +#undef WRENCHED_ASSEMBLY_STEP +#undef SCREWED_ASSEMBLY_STEP diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm new file mode 100644 index 0000000000..8ca7dc8573 --- /dev/null +++ b/code/modules/mod/mod_control.dm @@ -0,0 +1,559 @@ +/// MODsuits, trade-off between armor and utility +/obj/item/mod + name = "Base MOD" + desc = "You should not see this, yell at a coder!" + icon = 'icons/obj/mod.dmi' + icon_state = "standard-control" + worn_icon = 'icons/mob/mod.dmi' + +/obj/item/mod/control + name = "MOD control unit" + desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." + icon_state = "control" + inhand_icon_state = "mod_control" + w_class = WEIGHT_CLASS_BULKY + slot_flags = ITEM_SLOT_BACK + strip_delay = 10 SECONDS + slowdown = 2 + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel) + resistance_flags = NONE + max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + permeability_coefficient = 0.01 + siemens_coefficient = 0.5 + alternate_worn_layer = BODY_FRONT_LAYER + /// The MOD's theme, decides on some stuff like armor and statistics. + var/datum/mod_theme/theme = /datum/mod_theme + /// Looks of the MOD. + var/skin = "standard" + /// Theme of the MOD TGUI + var/ui_theme = "ntos" + /// If the suit is deployed and turned on. + var/active = FALSE + /// If the suit wire/module hatch is open. + var/open = FALSE + /// If the suit is ID locked. + var/locked = FALSE + /// If the suit is malfunctioning. + var/malfunctioning = FALSE + /// If the suit is currently activating/deactivating. + var/activating = FALSE + /// How long the MOD is electrified for. + var/seconds_electrified = MACHINE_NOT_ELECTRIFIED + /// If the suit interface is broken. + var/interface_break = FALSE + /// How much module complexity can this MOD carry. + var/complexity_max = DEFAULT_MAX_COMPLEXITY + /// How much module complexity this MOD is carrying. + var/complexity = 0 + /// Power usage of the MOD. + var/cell_drain = DEFAULT_CELL_DRAIN + /// Slowdown of the MOD when not active. + var/slowdown_inactive = 2 + /// Slowdown of the MOD when active. + var/slowdown_active = 1 + /// MOD cell. + var/obj/item/stock_parts/cell/cell + /// MOD helmet. + var/obj/item/clothing/head/helmet/space/mod/helmet + /// MOD chestplate. + var/obj/item/clothing/suit/armor/mod/chestplate + /// MOD gauntlets. + var/obj/item/clothing/gloves/mod/gauntlets + /// MOD boots. + var/obj/item/clothing/shoes/mod/boots + /// List of parts (helmet, chestplate, gauntlets, boots). + var/list/mod_parts = list() + /// Modules the MOD should spawn with. + var/list/initial_modules = list() + /// Modules the MOD currently possesses. + var/list/modules = list() + /// Currently used module. + var/obj/item/mod/module/selected_module + /// AI mob inhabiting the MOD. + var/mob/living/silicon/ai/ai + /// Delay between moves as AI. + var/movedelay = 0 + /// Cooldown for AI moves. + COOLDOWN_DECLARE(cooldown_mod_move) + /// Person wearing the MODsuit. + var/mob/living/carbon/human/wearer + +/obj/item/mod/control/Initialize(mapload, new_theme, new_skin) + . = ..() + if(new_theme) + theme = new_theme + theme = GLOB.mod_themes[theme] + slowdown_inactive = theme.slowdown_inactive + slowdown_active = theme.slowdown_active + slowdown = slowdown_inactive + complexity_max = theme.complexity_max + skin = new_skin || theme.default_skin + ui_theme = theme.ui_theme + cell_drain = theme.cell_drain + initial_modules += theme.inbuilt_modules + wires = new /datum/wires/mod(src) + if(length(req_access)) + locked = TRUE + if(ispath(cell)) + cell = new cell(src) + helmet = new /obj/item/clothing/head/helmet/space/mod(src) + helmet.mod = src + mod_parts += helmet + chestplate = new /obj/item/clothing/suit/armor/mod(src) + chestplate.mod = src + mod_parts += chestplate + gauntlets = new /obj/item/clothing/gloves/mod(src) + gauntlets.mod = src + mod_parts += gauntlets + boots = new /obj/item/clothing/shoes/mod(src) + boots.mod = src + mod_parts += boots + var/list/all_parts = mod_parts.Copy() + src + for(var/obj/item/piece as anything in all_parts) + piece.name = "[theme.name] [piece.name]" + piece.desc = "[piece.desc] [theme.desc]" + piece.armor = getArmor(arglist(theme.armor)) + piece.resistance_flags = theme.resistance_flags + piece.heat_protection = NONE + piece.cold_protection = NONE + piece.max_heat_protection_temperature = theme.max_heat_protection_temperature + piece.min_cold_protection_temperature = theme.min_cold_protection_temperature + piece.permeability_coefficient = theme.permeability_coefficient + piece.siemens_coefficient = theme.siemens_coefficient + piece.icon_state = "[skin]-[initial(piece.icon_state)]" + update_flags() + for(var/obj/item/mod/module/module as anything in initial_modules) + module = new module(src) + install(module) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + movedelay = CONFIG_GET(number/movedelay/run_delay) + +/obj/item/mod/control/Destroy() + if(active) + STOP_PROCESSING(SSobj, src) + var/atom/deleting_atom + if(!QDELETED(helmet)) + deleting_atom = helmet + helmet.mod = null + helmet = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(chestplate)) + deleting_atom = chestplate + chestplate.mod = null + chestplate = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(gauntlets)) + deleting_atom = gauntlets + gauntlets.mod = null + gauntlets = null + mod_parts -= deleting_atom + qdel(deleting_atom) + if(!QDELETED(boots)) + deleting_atom = boots + boots.mod = null + boots = null + mod_parts -= deleting_atom + qdel(deleting_atom) + for(var/obj/item/mod/module/module as anything in modules) + module.mod = null + modules -= module + QDEL_NULL(wires) + QDEL_NULL(cell) + return ..() + +/obj/item/mod/control/process(delta_time) + if(seconds_electrified > MACHINE_NOT_ELECTRIFIED) + seconds_electrified-- + if((!cell || !cell.charge) && active && !activating) + power_off() + return PROCESS_KILL + var/malfunctioning_charge_drain = 0 + if(malfunctioning) + malfunctioning_charge_drain = rand(1,20) + cell.charge = max(0, cell.charge - (cell_drain + malfunctioning_charge_drain)*delta_time) + update_cell_alert() + for(var/obj/item/mod/module/module as anything in modules) + if(malfunctioning && module.active && DT_PROB(5, delta_time)) + module.on_deactivation() + module.on_process(delta_time) + +/obj/item/mod/control/equipped(mob/user, slot) + ..() + if(slot == ITEM_SLOT_BACK) + set_wearer(user) + else if(wearer) + unset_wearer() + +/obj/item/mod/control/dropped(mob/user) + . = ..() + if(wearer) + unset_wearer() + +/obj/item/mod/control/item_action_slot_check(slot) + if(slot == ITEM_SLOT_BACK) + return TRUE + +/obj/item/mod/control/allow_attack_hand_drop(mob/user) + var/mob/living/carbon/carbon_user = user + if(!istype(carbon_user) || src != carbon_user.back) + return ..() + for(var/obj/item/part in mod_parts) + if(part.loc != src) + balloon_alert(carbon_user, "retract parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/obj/item/mod/control/MouseDrop(atom/over_object) + if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) + return ..() + for(var/obj/item/part in mod_parts) + if(part.loc != src) + balloon_alert(wearer, "retract parts first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) + return + if(!wearer.incapacitated()) + var/atom/movable/screen/inventory/hand/ui_hand = over_object + if(wearer.putItemFromInventoryInHandIfPossible(src, ui_hand.held_index)) + add_fingerprint(usr) + return ..() + +/obj/item/mod/control/attack_hand(mob/user) + if(seconds_electrified && cell?.charge) + if(shock(user)) + return + if(open && loc == user) + if(!cell) + balloon_alert(user, "no cell!") + return + balloon_alert(user, "removing cell...") + if(!do_after(user, 1.5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "cell removed") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + if(!user.put_in_hands(cell)) + cell.forceMove(drop_location()) + update_cell_alert() + return + return ..() + +/obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) + if(..()) + return TRUE + if(active || activating || ai_controller) + balloon_alert(user, "deactivate suit first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + balloon_alert(user, "[open ? "closing" : "opening"] panel...") + screwdriver.play_tool_sound(src, 100) + if(screwdriver.use_tool(src, user, 1 SECONDS)) + if(active || activating) + balloon_alert(user, "deactivate suit first!") + screwdriver.play_tool_sound(src, 100) + balloon_alert(user, "panel [open ? "closed" : "opened"]") + open = !open + else + balloon_alert(user, "interrupted!") + return TRUE + +/obj/item/mod/control/crowbar_act(mob/living/user, obj/item/crowbar) + . = ..() + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(!allowed(user)) + balloon_alert(user, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(length(modules)) + var/list/removable_modules = list() + for(var/obj/item/mod/module/module as anything in modules) + if(!module.removable) + continue + removable_modules += module + var/obj/item/mod/module/module_to_remove = tgui_input_list(user, "Which module to remove?", "Module Removal", removable_modules) + if(!module_to_remove?.mod) + return FALSE + uninstall(module_to_remove) + module_to_remove.forceMove(drop_location()) + crowbar.play_tool_sound(src, 100) + return TRUE + balloon_alert(user, "no modules!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + +/obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/mod/module)) + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + install(attacking_item, user) + return TRUE + else if(istype(attacking_item, /obj/item/stock_parts/cell)) + if(!open) + balloon_alert(user, "open the panel first!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + if(cell) + balloon_alert(user, "cell already installed!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return FALSE + attacking_item.forceMove(src) + cell = attacking_item + balloon_alert(user, "cell installed") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + update_cell_alert() + return TRUE + else if(is_wire_tool(attacking_item) && open) + wires.interact(user) + return TRUE + else if(istype(attacking_item, /obj/item/mod/paint)) + if(active || activating) + balloon_alert(user, "suit is active!") + else if(paint(user, attacking_item)) + balloon_alert(user, "suit painted") + else + balloon_alert(user, "not painted!") + return TRUE + else if(open && attacking_item.GetID()) + update_access(user, attacking_item) + return TRUE + return ..() + +/obj/item/mod/control/get_cell() + if(open) + return cell + +/obj/item/mod/control/GetAccess() + if(ai_controller) + return req_access.Copy() + else + return ..() + +/obj/item/mod/control/emag_act(mob/user) + locked = !locked + balloon_alert(user, "[locked ? "locked" : "unlocked"]") + +/obj/item/mod/control/emp_act(severity) + . = ..() + to_chat(wearer, span_notice("[severity > 1 ? "Light" : "Strong"] electromagnetic pulse detected!")) + if(!active || !wearer || . & EMP_PROTECT_CONTENTS) + return + selected_module = null + wearer.apply_damage(10 / severity, BURN, spread_damage=TRUE) + to_chat(wearer, span_danger("You feel [src] heat up from the EMP, burning you slightly.")) + if (wearer.stat < UNCONSCIOUS && prob(10)) + wearer.emote("scream") + +/obj/item/mod/control/on_outfit_equip(mob/living/carbon/human/outfit_wearer, visuals_only, item_slot) + if(visuals_only) + set_wearer(outfit_wearer) //we need to set wearer manually since it doesnt call equipped + quick_activation() + +/obj/item/mod/control/doStrip(mob/stripper, mob/owner) + if(active && !toggle_activate(stripper, force_deactivate = TRUE)) + return + for(var/obj/item/part in mod_parts) + conceal(null, part) + return ..() + +/obj/item/mod/control/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) + . = ..() + if(!active) + return + for(var/obj/item/mod/module/module as anything in modules) + var/list/module_icons = module.generate_worn_overlay(standing) + if(!length(module_icons)) + continue + . += module_icons + +/obj/item/mod/control/proc/set_wearer(mob/user) + wearer = user + RegisterSignal(wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + RegisterSignal(wearer, COMSIG_PROCESS_BORGCHARGER_OCCUPANT, .proc/on_borg_charge) + update_cell_alert() + for(var/obj/item/mod/module/module as anything in modules) + module.on_equip() + +/obj/item/mod/control/proc/unset_wearer() + for(var/obj/item/mod/module/module as anything in modules) + module.on_unequip() + UnregisterSignal(wearer, list(COMSIG_ATOM_EXITED, COMSIG_PROCESS_BORGCHARGER_OCCUPANT)) + wearer.clear_alert("mod_charge") + wearer = null + +/obj/item/mod/control/proc/update_flags() + var/list/used_skin = theme.skins[skin] + for(var/obj/item/clothing/part as anything in mod_parts) + var/used_category + if(part == helmet) + used_category = HELMET_FLAGS + helmet.alternate_worn_layer = used_skin[HELMET_LAYER] + helmet.alternate_layer = used_skin[HELMET_LAYER] + if(part == chestplate) + used_category = CHESTPLATE_FLAGS + if(part == gauntlets) + used_category = GAUNTLETS_FLAGS + if(part == boots) + used_category = BOOTS_FLAGS + var/list/category = used_skin[used_category] + part.clothing_flags = category[UNSEALED_CLOTHING] || NONE + part.visor_flags = category[SEALED_CLOTHING] || NONE + part.flags_inv = category[UNSEALED_INVISIBILITY] || NONE + part.visor_flags_inv = category[SEALED_INVISIBILITY] || NONE + part.flags_cover = category[UNSEALED_COVER] || NONE + part.visor_flags_cover = category[SEALED_COVER] || NONE + +/obj/item/mod/control/proc/quick_module(mob/user) + if(!length(modules)) + return + var/list/display_names = list() + var/list/items = list() + for(var/obj/item/mod/module/module as anything in modules) + if(module.module_type == MODULE_PASSIVE) + continue + display_names[module.name] = REF(module) + var/image/module_image = image(icon = module.icon, icon_state = module.icon_state) + items += list(module.name = module_image) + if(!length(items)) + return + var/pick = show_radial_menu(user, src, items, custom_check = FALSE, require_near = TRUE) + if(!pick) + return + var/module_reference = display_names[pick] + var/obj/item/mod/module/selected_module = locate(module_reference) in modules + if(!istype(selected_module) || user.incapacitated()) + return + selected_module.on_select() + +/obj/item/mod/control/proc/paint(mob/user, obj/item/paint) + if(length(theme.skins) <= 1) + return FALSE + var/list/skins = list() + for(var/mod_skin in theme.skins) + skins[mod_skin] = image(icon = icon, icon_state = "[mod_skin]-control") + var/pick = show_radial_menu(user, src, skins, custom_check = FALSE, require_near = TRUE) + if(!pick || !user.is_holding(paint)) + return FALSE + skin = pick + var/list/skin_updating = mod_parts.Copy() + src + for(var/obj/item/piece as anything in skin_updating) + piece.icon_state = "[skin]-[initial(piece.icon_state)]" + update_flags() + wearer?.regenerate_icons() + return TRUE + +/obj/item/mod/control/proc/shock(mob/living/user) + if(!istype(user) || cell?.charge < 1) + return FALSE + do_sparks(5, TRUE, src) + var/check_range = TRUE + return electrocute_mob(user, cell, src, 0.7, check_range) + +/obj/item/mod/control/proc/install(module, mob/user) + var/obj/item/mod/module/new_module = module + for(var/obj/item/mod/module/old_module as anything in modules) + if(is_type_in_list(new_module, old_module.incompatible_modules) || is_type_in_list(old_module, new_module.incompatible_modules)) + if(user) + balloon_alert(user, "[new_module] incompatible with [old_module]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(is_type_in_list(module, theme.module_blacklist)) + if(user) + balloon_alert(user, "[src] doesn't accept [new_module]!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + var/complexity_with_module = complexity + complexity_with_module += new_module.complexity + if(complexity_with_module > complexity_max) + if(user) + balloon_alert(user, "[new_module] would make [src] too complex!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + new_module.forceMove(src) + modules += new_module + complexity += new_module.complexity + new_module.mod = src + new_module.on_install() + if(wearer) + new_module.on_equip() + if(user) + balloon_alert(user, "[new_module] added") + playsound(src, 'sound/machines/click.ogg', 50, TRUE, SILENCED_SOUND_EXTRARANGE) + +/obj/item/mod/control/proc/uninstall(module) + var/obj/item/mod/module/old_module = module + modules -= old_module + complexity -= old_module.complexity + if(active) + old_module.on_suit_deactivation() + if(old_module.active) + old_module.on_deactivation() + if(wearer) + old_module.on_unequip() + old_module.on_uninstall() + old_module.mod = null + +/obj/item/mod/control/proc/update_access(mob/user, obj/item/card/id/card) + if(!allowed(user)) + balloon_alert(user, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + req_access = card.access.Copy() + balloon_alert(user, "access updated") + +/obj/item/mod/control/proc/update_cell_alert() + if(!wearer) + return + if(!cell) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/nocell) + return + var/remaining_cell = cell.charge/cell.maxcharge + switch(remaining_cell) + if(0.75 to INFINITY) + wearer.clear_alert("mod_charge") + if(0.5 to 0.75) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 1) + if(0.25 to 0.5) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 2) + if(0.01 to 0.25) + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/lowcell, 3) + else + wearer.throw_alert("mod_charge", /atom/movable/screen/alert/emptycell) + +/obj/item/mod/control/proc/power_off() + balloon_alert(wearer, "no power!") + toggle_activate(wearer, force_deactivate = TRUE) + +/obj/item/mod/control/proc/on_exit(datum/source, atom/movable/part, direction) + SIGNAL_HANDLER + + if(part.loc == src) + return + if(part == cell) + cell = null + update_cell_alert() + return + if(part.loc == wearer) + return + if(modules.Find(part)) + uninstall(part) + return + if(mod_parts.Find(part)) + conceal(wearer, part) + if(active) + INVOKE_ASYNC(src, .proc/toggle_activate, wearer, TRUE) + return + +/obj/item/mod/control/proc/on_borg_charge(datum/source, amount) + SIGNAL_HANDLER + + if(!cell) + return + cell.give(amount) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm new file mode 100644 index 0000000000..174cc1bab3 --- /dev/null +++ b/code/modules/mod/mod_theme.dm @@ -0,0 +1,854 @@ +/// Global proc that sets up all MOD themes as singletons in a list and returns it. +/proc/setup_mod_themes() + . = list() + for(var/path in typesof(/datum/mod_theme)) + var/datum/mod_theme/new_theme = new path() + .[path] = new_theme + +/// MODsuit theme, instanced once and then used by MODsuits to grab various statistics. +/datum/mod_theme + /// Theme name for the MOD. + var/name = "standard" + /// Description added to the MOD. + var/desc = "A civilian class suit by Nakamura Engineering, doesn't offer much other than slightly quicker movement." + /// Default skin of the MOD. + var/default_skin = "standard" + /// Armor shared across the MOD pieces. + var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + /// Resistance flags shared across the MOD pieces. + var/resistance_flags = NONE + /// Max heat protection shared across the MOD pieces. + var/max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT + /// Max cold protection shared across the MOD pieces. + var/min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT + /// Permeability shared across the MOD pieces. + var/permeability_coefficient = 0.01 + /// Siemens shared across the MOD pieces. + var/siemens_coefficient = 0.5 + /// How much modules can the MOD carry without malfunctioning. + var/complexity_max = DEFAULT_MAX_COMPLEXITY + /// How much battery power the MOD uses by just being on + var/cell_drain = DEFAULT_CELL_DRAIN + /// Slowdown of the MOD when not active. + var/slowdown_inactive = 1.25 + /// Slowdown of the MOD when active. + var/slowdown_active = 0.75 + /// Theme used by the MOD TGUI. + var/ui_theme = "ntos" + /// List of inbuilt modules. These are different from the pre-equipped suits, you should mainly use these for unremovable modules with 0 complexity. + var/list/inbuilt_modules = list() + /// Modules blacklisted from the MOD. + var/list/module_blacklist = list() + /// List of skins with their appropriate clothing flags. + var/list/skins = list( + "standard" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "civilian" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/engineering + name = "engineering" + desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." + default_skin = "engineering" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1.5 + slowdown_active = 1 + skins = list( + "engineering" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/atmospheric + name = "atmospheric" + desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." + default_skin = "atmospheric" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + slowdown_inactive = 1.5 + slowdown_active = 1 + skins = list( + "atmospheric" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/advanced + name = "advanced" + desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish." + default_skin = "advanced" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.5 + inbuilt_modules = list(/obj/item/mod/module/magboot/advanced) + skins = list( + "advanced" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/mining + name = "mining" + desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." + default_skin = "mining" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + cell_drain = DEFAULT_CELL_DRAIN * 2 + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + skins = list( + "mining" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/medical + name = "medical" + desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." + default_skin = "medical" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) + cell_drain = DEFAULT_CELL_DRAIN * 1.5 + slowdown_inactive = 1 + slowdown_active = 0.5 + skins = list( + "medical" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "corpsman" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/rescue + name = "rescue" + desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." + default_skin = "rescue" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + cell_drain = DEFAULT_CELL_DRAIN * 1.5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) + skins = list( + "rescue" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/research + name = "research" + desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." + default_skin = "research" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + slowdown_inactive = 2 + slowdown_active = 1.5 + inbuilt_modules = list(/obj/item/mod/module/reagent_scanner/advanced) + skins = list( + "research" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/security + name = "security" + desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." + default_skin = "security" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 1 + slowdown_active = 0.5 + skins = list( + "security" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/safeguard + name = "safeguard" + desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." + default_skin = "safeguard" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + skins = list( + "safeguard" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/magnate + name = "magnate" + desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." + default_skin = "magnate" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY + 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + skins = list( + "magnate" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/cosmohonk + name = "cosmohonk" + desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." + default_skin = "cosmohonk" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) + cell_drain = DEFAULT_CELL_DRAIN * 0.25 + slowdown_inactive = 1.75 + slowdown_active = 1.25 + skins = list( + "cosmohonk" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/syndicate + name = "syndicate" + desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." + default_skin = "syndicate" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 1 + slowdown_active = 0.5 + ui_theme = "syndicate" + inbuilt_modules = list(/obj/item/mod/module/armor_booster) + skins = list( + "syndicate" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/elite + name = "elite" + desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." + default_skin = "elite" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + ui_theme = "syndicate" + inbuilt_modules = list(/obj/item/mod/module/armor_booster/elite) + skins = list( + "elite" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/enchanted + name = "enchanted" + desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." + default_skin = "enchanted" + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY - 5 + slowdown_inactive = 0.75 + slowdown_active = 0.25 + ui_theme = "wizard" + inbuilt_modules = list(/obj/item/mod/module/anti_magic/wizard) + skins = list( + "enchanted" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/prototype + name = "prototype" + desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." + default_skin = "prototype" + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) + resistance_flags = FIRE_PROOF + complexity_max = DEFAULT_MAX_COMPLEXITY + 10 + slowdown_inactive = 2.5 + slowdown_active = 2 + ui_theme = "hackerman" + inbuilt_modules = list(/obj/item/mod/module/kinesis) + skins = list( + "prototype" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/responsory + name = "responsory" + desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." + default_skin = "responsory" + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15) + resistance_flags = FIRE_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "responsory" = list( + HELMET_LAYER = NECK_LAYER, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT, + SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + "inquisitory" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, + UNSEALED_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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/apocryphal + name = "apocryphal" + desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." + default_skin = "apocryphal" + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + complexity_max = DEFAULT_MAX_COMPLEXITY + 10 + skins = list( + "apocryphal" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, + SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/corporate + name = "corporate" + desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." + default_skin = "corporate" + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + siemens_coefficient = 0 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "corporate" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, + 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, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/debug + name = "debug" + desc = "Strangely nostalgic." + default_skin = "debug" + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) + resistance_flags = FIRE_PROOF|ACID_PROOF + max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT + complexity_max = 50 + slowdown_inactive = 0.5 + slowdown_active = 0 + skins = list( + "debug" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH, + SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL, + SEALED_CLOTHING = STOPSPRESSUREDAMAGE, + ), + ), + ) + +/datum/mod_theme/administrative + name = "administrative" + desc = "A suit made of adminium. Who comes up with these stupid mineral names?" + default_skin = "debug" + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) + resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF + max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT + complexity_max = 1000 + cell_drain = DEFAULT_CELL_DRAIN * 0 + slowdown_inactive = 0 + slowdown_active = 0 + skins = list( + "debug" = list( + HELMET_LAYER = null, + HELMET_FLAGS = list( + UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, + SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + ), + CHESTPLATE_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN, + SEALED_INVISIBILITY = HIDEJUMPSUIT, + ), + GAUNTLETS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + ), + BOOTS_FLAGS = list( + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, + ), + ), + ) diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm new file mode 100644 index 0000000000..af482e50f4 --- /dev/null +++ b/code/modules/mod/mod_types.dm @@ -0,0 +1,157 @@ +/obj/item/mod/control/pre_equipped + cell = /obj/item/stock_parts/cell/high + var/applied_skin + +/obj/item/mod/control/pre_equipped/Initialize(mapload, new_theme, new_skin) + new_skin = applied_skin + return ..() + +/obj/item/mod/control/pre_equipped/standard + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight) + +/obj/item/mod/control/pre_equipped/engineering + theme = /datum/mod_theme/engineering + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot) + +/obj/item/mod/control/pre_equipped/atmospheric + theme = /datum/mod_theme/atmospheric + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/t_ray) + +/obj/item/mod/control/pre_equipped/advanced + theme = /datum/mod_theme/advanced + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight) + +/obj/item/mod/control/pre_equipped/mining + theme = /datum/mod_theme/mining + cell = /obj/item/stock_parts/cell/high/plus + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/orebag, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill) + +/obj/item/mod/control/pre_equipped/medical + theme = /datum/mod_theme/medical + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/quick_carry) + +/obj/item/mod/control/pre_equipped/rescue + theme = /datum/mod_theme/rescue + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector) + +/obj/item/mod/control/pre_equipped/research + theme = /datum/mod_theme/research + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray) + +/obj/item/mod/control/pre_equipped/security + theme = /datum/mod_theme/security + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/safeguard + theme = /datum/mod_theme/safeguard + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/magnate + theme = /datum/mod_theme/magnate + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder) + +/obj/item/mod/control/pre_equipped/traitor + theme = /datum/mod_theme/syndicate + cell = /obj/item/stock_parts/cell/super + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/tether, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock) + +/obj/item/mod/control/pre_equipped/nuclear + theme = /datum/mod_theme/syndicate + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/elite + theme = /datum/mod_theme/elite + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/enchanted + theme = /datum/mod_theme/enchanted + cell = /obj/item/stock_parts/cell/crystal_cell/wizard + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield) + +/obj/item/mod/control/pre_equipped/prototype + theme = /datum/mod_theme/prototype + cell = /obj/item/stock_parts/cell/high/plus + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/tether) + +/obj/item/mod/control/pre_equipped/responsory + theme = /datum/mod_theme/responsory + cell = /obj/item/stock_parts/cell/hyper + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + var/insignia_type = /obj/item/mod/module/insignia + +/obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin) + initial_modules.Insert(1, insignia_type) + return ..() + +/obj/item/mod/control/pre_equipped/responsory/commander + insignia_type = /obj/item/mod/module/insignia/commander + +/obj/item/mod/control/pre_equipped/responsory/security + insignia_type = /obj/item/mod/module/insignia/security + +/obj/item/mod/control/pre_equipped/responsory/engineer + insignia_type = /obj/item/mod/module/insignia/engineer + +/obj/item/mod/control/pre_equipped/responsory/medic + insignia_type = /obj/item/mod/module/insignia/medic + +/obj/item/mod/control/pre_equipped/responsory/janitor + insignia_type = /obj/item/mod/module/insignia/janitor + +/obj/item/mod/control/pre_equipped/responsory/clown + insignia_type = /obj/item/mod/module/insignia/clown + +/obj/item/mod/control/pre_equipped/responsory/chaplain + insignia_type = /obj/item/mod/module/insignia/chaplain + +/obj/item/mod/control/pre_equipped/responsory/inquisitory + initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/anti_magic, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + applied_skin = "inquisitory" + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/commander + insignia_type = /obj/item/mod/module/insignia/commander + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/security + insignia_type = /obj/item/mod/module/insignia/security + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/medic + insignia_type = /obj/item/mod/module/insignia/medic + +/obj/item/mod/control/pre_equipped/responsory/inquisitory/chaplain + insignia_type = /obj/item/mod/module/insignia/chaplain + +/obj/item/mod/control/pre_equipped/apocryphal + theme = /datum/mod_theme/apocryphal + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/corporate + theme = /datum/mod_theme/corporate + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/holster) + +/obj/item/mod/control/pre_equipped/debug + theme = /datum/mod_theme/debug + cell = /obj/item/stock_parts/cell/bluespace + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/bikehorn, /obj/item/mod/module/rad_protection, /obj/item/mod/module/tether, /obj/item/mod/module/injector) //one of every type of module, for testing if they all work correctly + +/obj/item/mod/control/pre_equipped/administrative + theme = /datum/mod_theme/administrative + cell = /obj/item/stock_parts/cell/infinite/abductor + initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack) + +//these exist for the prefs menu +/obj/item/mod/control/pre_equipped/syndicate_empty + theme = /datum/mod_theme/syndicate + +/obj/item/mod/control/pre_equipped/syndicate_empty/elite + theme = /datum/mod_theme/elite + +INITIALIZE_IMMEDIATE(/obj/item/mod/control/pre_equipped/syndicate_empty) diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm new file mode 100644 index 0000000000..1e719e93eb --- /dev/null +++ b/code/modules/mod/mod_ui.dm @@ -0,0 +1,80 @@ +/obj/item/mod/control/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "MODsuit", name) + ui.open() + +/obj/item/mod/control/ui_data() + var/data = list() + data["interface_break"] = interface_break + data["malfunctioning"] = malfunctioning + data["open"] = open + data["active"] = active + data["locked"] = locked + data["complexity"] = complexity + data["selected_module"] = selected_module?.name + data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" + data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" + data["AI"] = ai?.name + data["cell"] = cell?.name + data["charge"] = cell ? round(cell.percent(), 1) : 0 + data["modules"] = list() + for(var/obj/item/mod/module/module as anything in modules) + var/list/module_data = list( + name = module.name, + description = module.desc, + module_type = module.module_type, + active = module.active, + idle_power = module.idle_power_cost, + active_power = module.active_power_cost, + use_power = module.use_power_cost, + complexity = module.complexity, + cooldown_time = module.cooldown_time, + cooldown = round(COOLDOWN_TIMELEFT(module, cooldown_timer), 1 SECONDS), + id = module.tgui_id, + ref = REF(module), + configuration_data = module.get_configuration() + ) + module_data += module.add_ui_data() + data["modules"] += list(module_data) + return data + +/obj/item/mod/control/ui_static_data(mob/user) + var/data = list() + data["ui_theme"] = ui_theme + data["control"] = name + data["complexity_max"] = complexity_max + data["helmet"] = helmet?.name + data["chestplate"] = chestplate?.name + data["gauntlets"] = gauntlets?.name + data["boots"] = boots?.name + return data + +/obj/item/mod/control/ui_act(action, params) + . = ..() + if(.) + return + if(!allowed(usr) && locked) + balloon_alert(usr, "insufficient access!") + playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) + return + if(malfunctioning && prob(75)) + balloon_alert(usr, "button malfunctions!") + return + switch(action) + if("lock") + locked = !locked + balloon_alert(usr, "[locked ? "locked" : "unlocked"]!") + if("activate") + toggle_activate(usr) + if("select") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.on_select() + if("configure") + var/obj/item/mod/module/module = locate(params["ref"]) in modules + if(!module) + return + module.configure_edit(params["key"], params["value"]) + return TRUE diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm new file mode 100644 index 0000000000..a310f95537 --- /dev/null +++ b/code/modules/mod/modules/_module.dm @@ -0,0 +1,252 @@ +/obj/item/mod/module + name = "MOD module" + icon_state = "module" + /// If it can be removed + var/removable = TRUE + /// If it's passive, togglable, usable or active + var/module_type = MODULE_PASSIVE + /// Is the module active + var/active = FALSE + /// How much space it takes up in the MOD + var/complexity = 0 + /// Power use when idle + var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when active + var/active_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when used, we call it manually + var/use_power_cost = DEFAULT_CELL_DRAIN * 0 + /// ID used by their TGUI + var/tgui_id + /// Linked MODsuit + var/obj/item/mod/control/mod + /// If we're an active module, what item are we? + var/obj/item/device + /// Overlay given to the user when the module is inactive + var/overlay_state_inactive + /// Overlay given to the user when the module is active + var/overlay_state_active + /// Overlay given to the user when the module is used, lasts until cooldown finishes + var/overlay_state_use + /// What modules are we incompatible with? + var/list/incompatible_modules = list() + /// Cooldown after use + var/cooldown_time = 0 + /// The mouse button needed to use this module + var/used_signal + /// Timer for the cooldown + COOLDOWN_DECLARE(cooldown_timer) + +/obj/item/mod/module/Initialize(mapload) + . = ..() + if(module_type != MODULE_ACTIVE) + return + if(ispath(device)) + device = new device(src) + ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) + RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + +/obj/item/mod/module/Destroy() + mod?.uninstall(src) + if(device) + UnregisterSignal(device, COMSIG_PARENT_PREQDELETED) + QDEL_NULL(device) + return ..() + +/obj/item/mod/module/examine(mob/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + . += span_notice("Complexity level: [complexity]") + +/// Called from MODsuit's install() proc, so when the module is installed. +/obj/item/mod/module/proc/on_install() + return + +/// Called from MODsuit's uninstall() proc, so when the module is uninstalled. +/obj/item/mod/module/proc/on_uninstall() + return + +/// Called when the MODsuit is activated +/obj/item/mod/module/proc/on_suit_activation() + return + +/// Called when the MODsuit is deactivated +/obj/item/mod/module/proc/on_suit_deactivation() + return + +/// Called when the MODsuit is equipped +/obj/item/mod/module/proc/on_equip() + return + +/// Called when the MODsuit is unequipped +/obj/item/mod/module/proc/on_unequip() + return + +/// Called when the module is selected from the TGUI +/obj/item/mod/module/proc/on_select() + if(!mod.active || mod.activating || module_type == MODULE_PASSIVE) + return + if(module_type != MODULE_USABLE) + if(active) + on_deactivation() + else + on_activation() + else + on_use() + SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED) + +/// Called when the module is activated +/obj/item/mod/module/proc/on_activation() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + balloon_alert(mod.wearer, "on cooldown!") + return FALSE + if(!mod.active || mod.activating || !mod.cell?.charge) + balloon_alert(mod.wearer, "unpowered!") + return FALSE + if(module_type == MODULE_ACTIVE) + if(mod.selected_module && !mod.selected_module.on_deactivation()) + return + mod.selected_module = src + if(device) + if(mod.wearer.put_in_hands(device)) + balloon_alert(mod.wearer, "[device] extended") + RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + else + balloon_alert(mod.wearer, "can't extend [device]!") + return + else + var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK + update_signal(used_button) + balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + active = TRUE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is deactivated +/obj/item/mod/module/proc/on_deactivation() + active = FALSE + if(module_type == MODULE_ACTIVE) + mod.selected_module = null + if(device) + mod.wearer.transferItemToLoc(device, src, TRUE) + balloon_alert(mod.wearer, "[device] retracted") + UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) + else + balloon_alert(mod.wearer, "[src] deactivated") + UnregisterSignal(mod.wearer, used_signal) + used_signal = null + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is used +/obj/item/mod/module/proc/on_use() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + return FALSE + if(!check_power(use_power_cost)) + return FALSE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when an activated module without a device is used +/obj/item/mod/module/proc/on_select_use(atom/target) + mod.wearer.face_atom(target) + if(!on_use()) + return FALSE + return TRUE + +/// Called when an activated module without a device is active and the user alt/middle-clicks +/obj/item/mod/module/proc/on_special_click(mob/source, atom/target) + SIGNAL_HANDLER + on_select_use(target) + return COMSIG_MOB_CANCEL_CLICKON + +/// Called on the MODsuit's process +/obj/item/mod/module/proc/on_process(delta_time) + if(active) + if(!drain_power(active_power_cost * delta_time)) + on_deactivation() + return FALSE + on_active_process(delta_time) + else + drain_power(idle_power_cost * delta_time) + return TRUE + +/// Called on the MODsuit's process if it is an active module +/obj/item/mod/module/proc/on_active_process(delta_time) + return + +/// Drains power from the suit cell +/obj/item/mod/module/proc/drain_power(amount) + if(!check_power(amount)) + return FALSE + mod.cell.charge = max(0, mod.cell.charge - amount) + return TRUE + +/obj/item/mod/module/proc/check_power(amount) + if(!mod.cell || (mod.cell.charge < amount)) + return FALSE + return TRUE + +/// Adds additional things to the MODsuit ui_data() +/obj/item/mod/module/proc/add_ui_data() + return list() + +/// Creates a list of configuring options for this module +/obj/item/mod/module/proc/get_configuration() + return list() + +/// Generates an element of the get_configuration list with a display name, type and value +/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values) + return list("display_name" = display_name, "type" = type, "value" = value, "values" = values) + +/// Receives configure edits from the TGUI and edits the vars +/obj/item/mod/module/proc/configure_edit(key, value) + return + +/// Called when the device moves to a different place on active modules +/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction) + SIGNAL_HANDLER + + if(!active) + return + if(part.loc == src) + return + if(part.loc == mod.wearer) + return + if(part == device) + on_deactivation() + +/// Called when the device gets deleted on active modules +/obj/item/mod/module/proc/on_device_deletion(datum/source) + SIGNAL_HANDLER + + if(source == device) + device = null + qdel(src) + +/// Generates an icon to be used for the suit's worn overlays +/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) + . = list() + var/used_overlay + if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) + used_overlay = overlay_state_use + else if(overlay_state_active && active) + used_overlay = overlay_state_active + else if(overlay_state_inactive) + used_overlay = overlay_state_inactive + else + return + var/mutable_appearance/module_icon = mutable_appearance('icons/mob/mod.dmi', used_overlay, layer = standing.layer + 0.1) + . += module_icon + +/// Updates the signal used by active modules to be activated +/obj/item/mod/module/proc/update_signal(value) + switch(value) + if(MIDDLE_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON + if(ALT_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON + RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm new file mode 100644 index 0000000000..b5fc9a41e9 --- /dev/null +++ b/code/modules/mod/modules/modules.dm @@ -0,0 +1,352 @@ +/obj/item/mod/module + name = "MOD module" + icon_state = "module" + /// If it can be removed + var/removable = TRUE + /// If it's passive, togglable, usable or active + var/module_type = MODULE_PASSIVE + /// Is the module active + var/active = FALSE + /// How much space it takes up in the MOD + var/complexity = 0 + /// Power use when idle + var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when active + var/active_power_cost = DEFAULT_CELL_DRAIN * 0 + /// Power use when used, we call it manually + var/use_power_cost = DEFAULT_CELL_DRAIN * 0 + /// ID used by their TGUI + var/tgui_id + /// Linked MODsuit + var/obj/item/mod/control/mod + /// If we're an active module, what item are we? + var/obj/item/device + /// Overlay given to the user when the module is inactive + var/overlay_state_inactive + /// Overlay given to the user when the module is active + var/overlay_state_active + /// Overlay given to the user when the module is used, lasts until cooldown finishes + var/overlay_state_use + /// What modules are we incompatible with? + var/list/incompatible_modules = list() + /// Cooldown after use + var/cooldown_time = 0 + /// The mouse button needed to use this module + var/used_signal + /// Timer for the cooldown + COOLDOWN_DECLARE(cooldown_timer) + +/obj/item/mod/module/Initialize(mapload) + . = ..() + if(module_type != MODULE_ACTIVE) + return + if(ispath(device)) + device = new device(src) + ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) + RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) + RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) + +/obj/item/mod/module/Destroy() + mod?.uninstall(src) + if(device) + UnregisterSignal(device, COMSIG_PARENT_PREQDELETED) + QDEL_NULL(device) + return ..() + +/obj/item/mod/module/examine(mob/user) + . = ..() + if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + . += span_notice("Complexity level: [complexity]") + +/// Called from MODsuit's install() proc, so when the module is installed. +/obj/item/mod/module/proc/on_install() + return + +/// Called from MODsuit's uninstall() proc, so when the module is uninstalled. +/obj/item/mod/module/proc/on_uninstall() + return + +/// Called when the MODsuit is activated +/obj/item/mod/module/proc/on_suit_activation() + return + +/// Called when the MODsuit is deactivated +/obj/item/mod/module/proc/on_suit_deactivation() + return + +/// Called when the MODsuit is equipped +/obj/item/mod/module/proc/on_equip() + return + +/// Called when the MODsuit is unequipped +/obj/item/mod/module/proc/on_unequip() + return + +/// Called when the module is selected from the TGUI +/obj/item/mod/module/proc/on_select() + if(!mod.active || mod.activating || module_type == MODULE_PASSIVE) + return + if(module_type != MODULE_USABLE) + if(active) + on_deactivation() + else + on_activation() + else + on_use() + SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED) + +/// Called when the module is activated +/obj/item/mod/module/proc/on_activation() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + balloon_alert(mod.wearer, "on cooldown!") + return FALSE + if(!mod.active || mod.activating || !mod.cell?.charge) + balloon_alert(mod.wearer, "unpowered!") + return FALSE + if(module_type == MODULE_ACTIVE) + if(mod.selected_module && !mod.selected_module.on_deactivation()) + return + mod.selected_module = src + if(device) + if(mod.wearer.put_in_hands(device)) + balloon_alert(mod.wearer, "[device] extended") + RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) + else + balloon_alert(mod.wearer, "can't extend [device]!") + return + else + var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK + update_signal(used_button) + balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + active = TRUE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is deactivated +/obj/item/mod/module/proc/on_deactivation() + active = FALSE + if(module_type == MODULE_ACTIVE) + mod.selected_module = null + if(device) + mod.wearer.transferItemToLoc(device, src, TRUE) + balloon_alert(mod.wearer, "[device] retracted") + UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) + else + balloon_alert(mod.wearer, "[src] deactivated") + UnregisterSignal(mod.wearer, used_signal) + used_signal = null + mod.wearer.update_inv_back() + return TRUE + +/// Called when the module is used +/obj/item/mod/module/proc/on_use() + if(!COOLDOWN_FINISHED(src, cooldown_timer)) + return FALSE + if(!check_power(use_power_cost)) + return FALSE + COOLDOWN_START(src, cooldown_timer, cooldown_time) + addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) + mod.wearer.update_inv_back() + return TRUE + +/// Called when an activated module without a device is used +/obj/item/mod/module/proc/on_select_use(atom/target) + mod.wearer.face_atom(target) + if(!on_use()) + return FALSE + return TRUE + +/// Called when an activated module without a device is active and the user alt/middle-clicks +/obj/item/mod/module/proc/on_special_click(mob/source, atom/target) + SIGNAL_HANDLER + on_select_use(target) + return COMSIG_MOB_CANCEL_CLICKON + +/// Called on the MODsuit's process +/obj/item/mod/module/proc/on_process(delta_time) + if(active) + if(!drain_power(active_power_cost * delta_time)) + on_deactivation() + return FALSE + on_active_process(delta_time) + else + drain_power(idle_power_cost * delta_time) + return TRUE + +/// Called on the MODsuit's process if it is an active module +/obj/item/mod/module/proc/on_active_process(delta_time) + return + +/// Drains power from the suit cell +/obj/item/mod/module/proc/drain_power(amount) + if(!check_power(amount)) + return FALSE + mod.cell.charge = max(0, mod.cell.charge - amount) + return TRUE + +/obj/item/mod/module/proc/check_power(amount) + if(!mod.cell || (mod.cell.charge < amount)) + return FALSE + return TRUE + +/// Adds additional things to the MODsuit ui_data() +/obj/item/mod/module/proc/add_ui_data() + return list() + +/// Creates a list of configuring options for this module +/obj/item/mod/module/proc/get_configuration() + return list() + +/// Generates an element of the get_configuration list with a display name, type and value +/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values) + return list("display_name" = display_name, "type" = type, "value" = value, "values" = values) + +/// Receives configure edits from the TGUI and edits the vars +/obj/item/mod/module/proc/configure_edit(key, value) + return + +/// Called when the device moves to a different place on active modules +/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction) + SIGNAL_HANDLER + + if(!active) + return + if(part.loc == src) + return + if(part.loc == mod.wearer) + return + if(part == device) + on_deactivation() + +/// Called when the device gets deleted on active modules +/obj/item/mod/module/proc/on_device_deletion(datum/source) + SIGNAL_HANDLER + + if(source == device) + device = null + qdel(src) + +/// Generates an icon to be used for the suit's worn overlays +/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) + . = list() + var/used_overlay + if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) + used_overlay = overlay_state_use + else if(overlay_state_active && active) + used_overlay = overlay_state_active + else if(overlay_state_inactive) + used_overlay = overlay_state_inactive + else + return + var/mutable_appearance/module_icon = mutable_appearance('icons/mob/mod.dmi', used_overlay, layer = standing.layer + 0.1) + . += module_icon + +/// Updates the signal used by active modules to be activated +/obj/item/mod/module/proc/update_signal(value) + switch(value) + if(MIDDLE_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON + if(ALT_CLICK) + mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON + RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) + icon_state = "magic_nullifier" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/anti_magic) + +/obj/item/mod/module/anti_magic/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/wizard + name = "MOD magic neutralizer module" + desc = "The caster wielding this spell gains an invisible barrier around them, channeling arcane power through \ + specialized runes engraved onto the surface of the suit to generate anti-magic field. \ + The field will neutralize all magic that comes into contact with the user. \ + It will not protect the caster from social ridicule." + icon_state = "magic_neutralizer" + +/obj/item/mod/module/anti_magic/wizard/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +/obj/item/mod/module/anti_magic/wizard/on_suit_deactivation() + REMOVE_TRAIT(mod.wearer, TRAIT_ANTIMAGIC_NO_SELFBLOCK, MOD_TRAIT) + +/obj/item/mod/module/kinesis //TODO POST-MERGE MAKE NOT SUCK ASS, MAKE BALLER AS FUCK + name = "MOD kinesis module" + desc = "A modular plug-in to the forearm, this module was presumed lost for many years, \ + despite the suits it used to be mounted on still seeing some circulation. \ + This piece of technology allows the user to generate precise anti-gravity fields, \ + letting them move objects as small as a titanium rod to as large as industrial machinery. \ + Oddly enough, it doesn't seem to work on living creatures." + icon_state = "kinesis" +// module_type = MODULE_ACTIVE + module_type = MODULE_TOGGLE +// complexity = 3 + complexity = 0 + active_power_cost = DEFAULT_CELL_DRAIN*0.75 +// use_power_cost = DEFAULT_CELL_DRAIN*3 + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/kinesis) + cooldown_time = 0.5 SECONDS + var/has_tk = FALSE + +/obj/item/mod/module/kinesis/on_activation() + . = ..() + if(!.) + return + if(mod.wearer.dna.check_mutation(TK)) + has_tk = TRUE + else + mod.wearer.dna.add_mutation(TK) + +/obj/item/mod/module/kinesis/on_deactivation() + . = ..() + if(!.) + return + if(has_tk) + has_tk = FALSE + return + mod.wearer.dna.remove_mutation(TK) + +/obj/item/mod/module/insignia + name = "MOD insignia module" + desc = "Despite the existence of IFF systems, radio communique, and modern methods of deductive reasoning involving \ + the wearer's own eyes, colorful paint jobs remain a popular way for different factions in the galaxy to display who \ + they are. This system utilizes a series of tiny moving paint sprayers to both apply and remove different \ + color patterns to and from the suit." + icon_state = "insignia" + removable = FALSE + incompatible_modules = list(/obj/item/mod/module/insignia) + overlay_state_inactive = "insignia" + +/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) + overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" + . = ..() + for(var/mutable_appearance/appearance as anything in .) + appearance.color = color + +/obj/item/mod/module/insignia/commander + color = "#4980a5" + +/obj/item/mod/module/insignia/security + color = "#b30d1e" + +/obj/item/mod/module/insignia/engineer + color = "#e9c80e" + +/obj/item/mod/module/insignia/medic + color = "#ebebf5" + +/obj/item/mod/module/insignia/janitor + color = "#7925c7" + +/obj/item/mod/module/insignia/clown + color = "#ff1fc7" + +/obj/item/mod/module/insignia/chaplain + color = "#f0a00c" diff --git a/tgstation.dme b/tgstation.dme index 1ced56efb1..5efc223582 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -506,7 +506,6 @@ #include "code\datums\achievements\misc_scores.dm" #include "code\datums\achievements\skill_achievements.dm" #include "code\datums\actions\beam_rifle.dm" -#include "code\datums\ai\objects\mod.dm" #include "code\datums\announcers\_announcer.dm" #include "code\datums\announcers\default_announcer.dm" #include "code\datums\announcers\intern_announcer.dm" @@ -2023,6 +2022,7 @@ #include "code\modules\client\preferences_savefile.dm" #include "code\modules\client\preferences_toggles.dm" #include "code\modules\client\preferences_vr.dm" +#include "code\modules\client\preferences\mod_select.dm" #include "code\modules\client\verbs\aooc.dm" #include "code\modules\client\verbs\autobunker.dm" #include "code\modules\client\verbs\etips.dm" @@ -2958,6 +2958,18 @@ #include "code\modules\mob\living\simple_animal\slime\slime.dm" #include "code\modules\mob\living\simple_animal\slime\slime_mobility.dm" #include "code\modules\mob\living\simple_animal\slime\subtypes.dm" +#include "code\modules\mod\mod_actions.dm" +#include "code\modules\mod\mod_activation.dm" +#include "code\modules\mod\mod_ai.dm" +#include "code\modules\mod\mod_clothes.dm" +#include "code\modules\mod\mod_construction.dm" +#include "code\modules\mod\mod_construction.dm" +#include "code\modules\mod\mod_control.dm" +#include "code\modules\mod\mod_theme.dm" +#include "code\modules\mod\mod_types.dm" +#include "code\modules\mod\mod_ui.dm" +#include "code\modules\mod\modules\_module.dm" +#include "code\modules\mod\modules\modules.dm" #include "code\modules\modular_computers\laptop_vendor.dm" #include "code\modules\modular_computers\computers\_modular_computer_shared.dm" #include "code\modules\modular_computers\computers\item\computer.dm" From f7ac3c76245f758b11f8d02caed475002c81727c Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sat, 10 Dec 2022 00:55:20 -0700 Subject: [PATCH 020/384] beeg commit --- code/__DEFINES/_flags/_flags.dm | 12 + code/__DEFINES/dcs/signals.dm | 2 + code/__DEFINES/dcs/signals/signals_medical.dm | 14 + .../signals/signals_mob/signals_mob_carbon.dm | 3 - code/__DEFINES/dcs/signals/signals_mod.dm | 30 +- code/__DEFINES/mod.dm | 13 +- code/__DEFINES/traits.dm | 3 +- .../crafting/recipes/recipes_misc.dm | 2 +- code/datums/components/storage/storage.dm | 2 +- code/datums/holocall.dm | 9 - code/datums/outfit.dm | 61 +- code/game/machinery/suit_storage_unit.dm | 26 +- code/game/objects/items.dm | 4 +- code/game/objects/items/defib.dm | 6 + code/game/objects/items/devices/aicard.dm | 8 +- code/modules/cargo/packs/science.dm | 1 - code/modules/client/preferences/mod_select.dm | 23 - code/modules/mob/inventory.dm | 1 + .../mob/living/carbon/human/inventory.dm | 6 + .../mob/living/carbon/human/species.dm | 2 - code/modules/mob/living/silicon/ai/ai.dm | 12 +- code/modules/mod/mod_actions.dm | 71 +- code/modules/mod/mod_activation.dm | 41 +- code/modules/mod/mod_ai.dm | 100 ++- code/modules/mod/mod_clothes.dm | 42 +- code/modules/mod/mod_construction.dm | 13 +- code/modules/mod/mod_control.dm | 43 +- code/modules/mod/mod_theme.dm | 114 +-- code/modules/mod/mod_types.dm | 37 +- code/modules/mod/mod_ui.dm | 2 +- code/modules/mod/modules/_module.dm | 138 +++- code/modules/mod/modules/modules.dm | 262 +----- .../mod/modules/modules_engineering.dm | 154 ++++ code/modules/mod/modules/modules_general.dm | 339 ++++++++ code/modules/mod/modules/modules_maint.dm | 101 +++ code/modules/mod/modules/modules_medical.dm | 208 +++++ code/modules/mod/modules/modules_science.dm | 135 ++++ code/modules/mod/modules/modules_security.dm | 207 +++++ code/modules/mod/modules/modules_service.dm | 65 ++ code/modules/mod/modules/modules_supply.dm | 174 ++++ code/modules/mod/modules/modules_visor.dm | 91 +++ code/modules/research/designs/mod_designs.dm | 392 +++++++++ code/modules/research/machinery/protolathe.dm | 3 +- code/modules/research/machinery/techfab.dm | 3 +- .../research/techweb/nodes/mod_nodes.dm | 123 +++ code/modules/surgery/surgery.dm | 9 + code/modules/vehicles/mecha/_mecha.dm | 6 +- .../modules/vehicles/mecha/mech_fabricator.dm | 2 + code/modules/vehicles/mecha/mecha_wreckage.dm | 2 +- icons/mob/actions/actions_mod.dmi | Bin 0 -> 3408 bytes icons/mob/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 133028 bytes icons/mob/clothing/modsuit/mod_modules.dmi | Bin 0 -> 14775 bytes icons/obj/clothing/modsuit/mod_clothing.dmi | Bin 0 -> 77817 bytes .../obj/clothing/modsuit/mod_construction.dmi | Bin 0 -> 4745 bytes icons/obj/clothing/modsuit/mod_modules.dmi | Bin 0 -> 52753 bytes icons/obj/defibrillators.dmi | Bin 6737 -> 7419 bytes sound/items/modsuit/atrocinator_step.ogg | Bin 0 -> 4934 bytes sound/items/modsuit/ballin.ogg | 0 sound/items/modsuit/ballout.ogg | Bin 0 -> 9842 bytes sound/items/modsuit/flamethrower.ogg | Bin 0 -> 49116 bytes sound/items/modsuit/inflate_bloon.ogg | Bin 0 -> 16773 bytes sound/items/modsuit/loader_charge.ogg | Bin 0 -> 21120 bytes sound/items/modsuit/loader_launch.ogg | Bin 0 -> 17220 bytes sound/items/modsuit/magnetic_harness.ogg | Bin 0 -> 6981 bytes sound/items/modsuit/rewinder.ogg | Bin 0 -> 30358 bytes sound/items/modsuit/springlock.ogg | Bin 0 -> 11936 bytes sound/items/modsuit/tem_shot.ogg | Bin 0 -> 12742 bytes sound/items/modsuit/time_anchor_set.ogg | Bin 0 -> 13411 bytes sound/mecha/hydraulic.ogg | Bin 0 -> 27124 bytes sound/weapons/revolverempty.ogg | Bin 0 -> 9578 bytes tgstation.dme | 15 +- tgui/packages/tgui/interfaces/MODpaint.js | 151 ++++ tgui/packages/tgui/interfaces/MODsuit.js | 752 ++++++++++++++++++ 73 files changed, 3502 insertions(+), 533 deletions(-) create mode 100644 code/__DEFINES/dcs/signals/signals_medical.dm delete mode 100644 code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm delete mode 100644 code/modules/client/preferences/mod_select.dm create mode 100644 code/modules/mod/modules/modules_engineering.dm create mode 100644 code/modules/mod/modules/modules_general.dm create mode 100644 code/modules/mod/modules/modules_maint.dm create mode 100644 code/modules/mod/modules/modules_medical.dm create mode 100644 code/modules/mod/modules/modules_science.dm create mode 100644 code/modules/mod/modules/modules_security.dm create mode 100644 code/modules/mod/modules/modules_service.dm create mode 100644 code/modules/mod/modules/modules_supply.dm create mode 100644 code/modules/mod/modules/modules_visor.dm create mode 100644 code/modules/research/designs/mod_designs.dm create mode 100644 code/modules/research/techweb/nodes/mod_nodes.dm create mode 100644 icons/mob/actions/actions_mod.dmi create mode 100644 icons/mob/clothing/modsuit/mod_clothing.dmi create mode 100644 icons/mob/clothing/modsuit/mod_modules.dmi create mode 100644 icons/obj/clothing/modsuit/mod_clothing.dmi create mode 100644 icons/obj/clothing/modsuit/mod_construction.dmi create mode 100644 icons/obj/clothing/modsuit/mod_modules.dmi create mode 100644 sound/items/modsuit/atrocinator_step.ogg create mode 100644 sound/items/modsuit/ballin.ogg create mode 100644 sound/items/modsuit/ballout.ogg create mode 100644 sound/items/modsuit/flamethrower.ogg create mode 100644 sound/items/modsuit/inflate_bloon.ogg create mode 100644 sound/items/modsuit/loader_charge.ogg create mode 100644 sound/items/modsuit/loader_launch.ogg create mode 100644 sound/items/modsuit/magnetic_harness.ogg create mode 100644 sound/items/modsuit/rewinder.ogg create mode 100644 sound/items/modsuit/springlock.ogg create mode 100644 sound/items/modsuit/tem_shot.ogg create mode 100644 sound/items/modsuit/time_anchor_set.ogg create mode 100644 sound/mecha/hydraulic.ogg create mode 100644 sound/weapons/revolverempty.ogg create mode 100644 tgui/packages/tgui/interfaces/MODpaint.js create mode 100644 tgui/packages/tgui/interfaces/MODsuit.js diff --git a/code/__DEFINES/_flags/_flags.dm b/code/__DEFINES/_flags/_flags.dm index 895f37a7a9..0bdf362e20 100644 --- a/code/__DEFINES/_flags/_flags.dm +++ b/code/__DEFINES/_flags/_flags.dm @@ -214,5 +214,17 @@ GLOBAL_LIST_INIT(bitflags, list( ///Turns the dir by 180 degrees #define DIRFLIP(d) turn(d, 180) +// timed_action_flags parameter for `/proc/do_after_mob`, `/proc/do_mob` and `/proc/do_after` +/// Can do the action even if mob moves location +#define IGNORE_USER_LOC_CHANGE (1<<0) +/// Can do the action even if the target moves location +#define IGNORE_TARGET_LOC_CHANGE (1<<1) +/// Can do the action even if the item is no longer being held +#define IGNORE_HELD_ITEM (1<<2) +/// Can do the action even if the mob is incapacitated (ex. handcuffed) +#define IGNORE_INCAPACITATED (1<<3) +/// Used to prevent important slowdowns from being abused by drugs like kronkaine +#define IGNORE_SLOWDOWNS (1<<4) + /// 33554431 (2^24 - 1) is the maximum value our bitflags can reach. #define MAX_BITFLAG_DIGITS 8 diff --git a/code/__DEFINES/dcs/signals.dm b/code/__DEFINES/dcs/signals.dm index 2b9fa902e9..cd2c735e09 100644 --- a/code/__DEFINES/dcs/signals.dm +++ b/code/__DEFINES/dcs/signals.dm @@ -474,6 +474,8 @@ #define COMSIG_ITEM_AFTERATTACK "item_afterattack" //from base of obj/item/afterattack(): (atom/target, mob/user, params) #define COMSIG_ITEM_ALT_AFTERATTACK "item_alt_afterattack" //from base of obj/item/altafterattack(): (atom/target, mob/user, proximity, params) #define COMSIG_ITEM_EQUIPPED "item_equip" //from base of obj/item/equipped(): (/mob/equipper, slot) +/// A mob has just unequipped an item. +#define COMSIG_MOB_UNEQUIPPED_ITEM "mob_unequipped_item" // Do not grant actions on equip. #define COMPONENT_NO_GRANT_ACTIONS 1 #define COMSIG_ITEM_DROPPED "item_drop" //from base of obj/item/dropped(): (mob/user) diff --git a/code/__DEFINES/dcs/signals/signals_medical.dm b/code/__DEFINES/dcs/signals/signals_medical.dm new file mode 100644 index 0000000000..801eb6b41b --- /dev/null +++ b/code/__DEFINES/dcs/signals/signals_medical.dm @@ -0,0 +1,14 @@ +/// From /datum/surgery/New(): (datum/surgery/surgery, surgery_location (body zone), obj/item/bodypart/targeted_limb) +#define COMSIG_MOB_SURGERY_STARTED "mob_surgery_started" + +/// From /datum/surgery_step/success(): (datum/surgery_step/step, mob/living/target, target_zone, obj/item/tool, datum/surgery/surgery, default_display_results) +#define COMSIG_MOB_SURGERY_STEP_SUCCESS "mob_surgery_step_success" + +/// From /obj/item/shockpaddles/proc/do_success(): (obj/item/shockpaddles/source) +#define COMSIG_DEFIBRILLATOR_SUCCESS "defib_success" + #define COMPONENT_DEFIB_STOP (1<<0) + +/// From /datum/surgery/can_start(): (mob/source, datum/surgery/surgery, mob/living/patient) +#define COMSIG_SURGERY_STARTING "surgery_starting" + #define COMPONENT_CANCEL_SURGERY (1<<0) + #define COMPONENT_FORCE_SURGERY (1<<1) diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm deleted file mode 100644 index be1e9b31c8..0000000000 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_mob_carbon.dm +++ /dev/null @@ -1,3 +0,0 @@ -/// from base of atom/movable/Process_Spacemove(): (movement_dir) -#define COMSIG_MOVABLE_SPACEMOVE "spacemove" - #define COMSIG_MOVABLE_STOP_SPACEMOVE (1<<0) diff --git a/code/__DEFINES/dcs/signals/signals_mod.dm b/code/__DEFINES/dcs/signals/signals_mod.dm index 4c8ec4d6de..2533b69852 100644 --- a/code/__DEFINES/dcs/signals/signals_mod.dm +++ b/code/__DEFINES/dcs/signals/signals_mod.dm @@ -1,7 +1,35 @@ //MODsuit signals -/// Called when a module is selected to be the active one from on_select() +/// Called when a module is selected to be the active one from on_select(obj/item/mod/module/module) #define COMSIG_MOD_MODULE_SELECTED "mod_module_selected" +/// Called when a MOD deploys one or more of its parts. +#define COMSIG_MOD_DEPLOYED "mod_deployed" +/// Called when a MOD retracts one or more of its parts. +#define COMSIG_MOD_RETRACTED "mod_retracted" +/// Called when a MOD is finished toggling itself. +#define COMSIG_MOD_TOGGLED "mod_toggled" /// Called when a MOD activation is called from toggle_activate(mob/user) #define COMSIG_MOD_ACTIVATE "mod_activate" /// Cancels the suit's activation #define MOD_CANCEL_ACTIVATE (1 << 0) +/// Called when a MOD finishes having a module removed from it. +#define COMSIG_MOD_MODULE_REMOVED "mod_module_removed" +/// Called when a MOD finishes having a module added to it. +#define COMSIG_MOD_MODULE_ADDED "mod_module_added" +/// Called when a MOD is having modules removed from crowbar_act(mob/user, obj/crowbar) +#define COMSIG_MOD_MODULE_REMOVAL "mod_module_removal" + /// Cancels the removal of modules + #define MOD_CANCEL_REMOVAL (1 << 0) +/// Called when a module attempts to activate, however it does. At the end of checks so you can add some yourself, or work on trigger behavior (mob/user) +#define COMSIG_MODULE_TRIGGERED "mod_module_triggered" + /// Cancels activation, with no message. Include feedback on your cancel. + #define MOD_ABORT_USE (1<<0) +/// Called when a module activates, after all checks have passed and cooldown started. +#define COMSIG_MODULE_ACTIVATED "mod_module_activated" +/// Called when a module deactivates, after all checks have passed. +#define COMSIG_MODULE_DEACTIVATED "mod_module_deactivated" +/// Called when a module is used, after all checks have passed and cooldown started. +#define COMSIG_MODULE_USED "mod_module_used" +/// Called when the MODsuit wearer is set. +#define COMSIG_MOD_WEARER_SET "mod_wearer_set" +/// Called when the MODsuit wearer is unset. +#define COMSIG_MOD_WEARER_UNSET "mod_wearer_unset" diff --git a/code/__DEFINES/mod.dm b/code/__DEFINES/mod.dm index 03163497d4..0e380f9e95 100644 --- a/code/__DEFINES/mod.dm +++ b/code/__DEFINES/mod.dm @@ -2,7 +2,10 @@ #define DEFAULT_MAX_COMPLEXITY 15 /// Default cell drain per process on MODsuits -#define DEFAULT_CELL_DRAIN 5 +#define DEFAULT_CHARGE_DRAIN 5 + +/// Default time for a part to seal +#define MOD_ACTIVATION_STEP_TIME (2 SECONDS) /// Passive module, just acts when put in naturally. #define MODULE_PASSIVE 0 @@ -14,18 +17,24 @@ #define MODULE_ACTIVE 3 //Defines used by the theme for clothing flags and similar -#define HELMET_LAYER "helmet_layer" +#define CONTROL_LAYER "control_layer" #define HELMET_FLAGS "helmet_flags" #define CHESTPLATE_FLAGS "chestplate_flags" #define GAUNTLETS_FLAGS "gauntlets_flags" #define BOOTS_FLAGS "boots_flags" +#define UNSEALED_LAYER "unsealed_layer" #define UNSEALED_CLOTHING "unsealed_clothing" #define SEALED_CLOTHING "sealed_clothing" #define UNSEALED_INVISIBILITY "unsealed_invisibility" #define SEALED_INVISIBILITY "sealed_invisibility" #define UNSEALED_COVER "unsealed_cover" #define SEALED_COVER "sealed_cover" +#define CAN_OVERSLOT "can_overslot" + +//Defines used to override MOD clothing's icon and worn icon files in the skin. +#define MOD_ICON_OVERRIDE "mod_icon_override" +#define MOD_WORN_ICON_OVERRIDE "mod_worn_icon_override" /// Global list of all /datum/mod_theme GLOBAL_LIST_INIT(mod_themes, setup_mod_themes()) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index af5dccb3fd..96b0bc4d33 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -160,6 +160,7 @@ #define TRAIT_CAPTAIN_METABOLISM "captain-metabolism" /// Prevents plasmamen from self-igniting #define TRAIT_NOSELFIGNITION "no_selfignition" +#define TRAIT_NOSELFIGNITION_HEAD_ONLY "no_selfignition_head_only" /// Like antimagic, but doesn't block the user from casting #define TRAIT_ANTIMAGIC_NO_SELFBLOCK "anti_magic_no_selfblock" /// Gives us turf, mob and object vision through walls @@ -229,8 +230,6 @@ #define TRAIT_AUTO_CATCH_ITEM "auto_catch_item" #define TRAIT_CLOWN_MENTALITY "clown_mentality" // The future is now, clownman. #define TRAIT_FREESPRINT "free_sprinting" -#define TRAIT_XRAY_VISION "xray_vision" -#define TRAIT_THERMAL_VISION "thermal_vision" #define TRAIT_NO_TELEPORT "no-teleport" //you just can't #define TRAIT_NO_INTERNALS "no-internals" #define TRAIT_TOXIC_ALCOHOL "alcohol_intolerance" diff --git a/code/datums/components/crafting/recipes/recipes_misc.dm b/code/datums/components/crafting/recipes/recipes_misc.dm index 7f6408f583..fd72964505 100644 --- a/code/datums/components/crafting/recipes/recipes_misc.dm +++ b/code/datums/components/crafting/recipes/recipes_misc.dm @@ -557,7 +557,7 @@ /datum/crafting_recipe/mod_core name = "MOD core" result = /obj/item/mod/construction/core - tool_behaviors = list(TOOL_SCREWDRIVER) + tools = list(TOOL_SCREWDRIVER) time = 10 SECONDS reqs = list(/obj/item/stack/cable_coil = 5, /obj/item/stack/rods = 2, diff --git a/code/datums/components/storage/storage.dm b/code/datums/components/storage/storage.dm index 1218e8b9af..b3e6d63cb8 100644 --- a/code/datums/components/storage/storage.dm +++ b/code/datums/components/storage/storage.dm @@ -369,7 +369,7 @@ //Tries to dump content /datum/component/storage/proc/dump_content_at(atom/dest_object, mob/M) var/atom/A = parent - var/atom/dump_destination = get_dumping_location(dest_object) + var/atom/dump_destination = dest_object.get_dumping_location(dest_object) if(M.CanReach(A) && dump_destination && M.CanReach(dump_destination)) if(check_locked(null, M, TRUE)) to_chat(M, "[parent] seems to be locked!") diff --git a/code/datums/holocall.dm b/code/datums/holocall.dm index a4d5591653..a795bb562e 100644 --- a/code/datums/holocall.dm +++ b/code/datums/holocall.dm @@ -348,21 +348,12 @@ /datum/preset_holoimage/engineer/rig outfit_type = /datum/outfit/job/engineer/gloved/rig -/datum/preset_holoimage/engineer/mod - outfit_type = /datum/outfit/job/engineer/mod - /datum/preset_holoimage/engineer/ce outfit_type = /datum/outfit/job/ce -/datum/preset_holoimage/engineer/ce/mod - outfit_type = /datum/outfit/job/ce/mod - /datum/preset_holoimage/engineer/ce/rig outfit_type = /datum/outfit/job/engineer/gloved/rig -/datum/preset_holoimage/engineer/atmos/mod - outfit_type = /datum/outfit/job/atmos/mod - /datum/preset_holoimage/engineer/atmos outfit_type = /datum/outfit/job/atmos diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index c5221bdaf8..0718e54cab 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -105,8 +105,18 @@ */ var/list/implants = null - ///ID of the slot containing a gas tank - var/internals_slot = null + //skyrat edit + ///Slot for underwear like boxers and panties + var/underwear = null + ///Slot for socks, yes, the thing that usually goes before your shoes + var/socks = null + ///Slot for the undershirt (which is quite a foreign concept to me) or bras + var/shirt = null + ///Slot for the opposite ear. + var/ears_extra = null + ///Slot for the part of your arms that isn't quite hands yet. + var/wrists = null + // /// Should the toggle helmet proc be called on the helmet during equip var/toggle_helmet = TRUE @@ -144,15 +154,6 @@ //to be overridden for toggling internals, id binding, access etc return -#define EQUIP_OUTFIT_ITEM(item_path, slot_name) if(##item_path) { \ - H.equip_to_slot_or_del(SSwardrobe.provide_type(##item_path), ##slot_name, TRUE); \ - var/obj/item/outfit_item = H.get_item_by_slot(##slot_name); \ - if (outfit_item && outfit_item.type == ##item_path) { \ - outfit_item.on_outfit_equip(H, visualsOnly, ##slot_name); \ - } \ -} - - /** * Equips all defined types and paths to the mob passed in * @@ -166,34 +167,31 @@ //Start with uniform,suit,backpack for additional slots if(uniform) - EQUIP_OUTFIT_ITEM(uniform, ITEM_SLOT_ICLOTHING) + H.equip_to_slot_or_del(new uniform(H), ITEM_SLOT_ICLOTHING, TRUE) if(suit) - EQUIP_OUTFIT_ITEM(suit, ITEM_SLOT_OCLOTHING) + H.equip_to_slot_or_del(new suit(H), ITEM_SLOT_OCLOTHING, TRUE) if(belt) - EQUIP_OUTFIT_ITEM(belt, ITEM_SLOT_BELT) + H.equip_to_slot_or_del(new belt(H), ITEM_SLOT_BELT, TRUE) if(gloves) - EQUIP_OUTFIT_ITEM(gloves, ITEM_SLOT_GLOVES) + H.equip_to_slot_or_del(new gloves(H), ITEM_SLOT_GLOVES, TRUE) if(shoes) - EQUIP_OUTFIT_ITEM(shoes, ITEM_SLOT_FEET) + H.equip_to_slot_or_del(new shoes(H), ITEM_SLOT_FEET, TRUE) if(head) - EQUIP_OUTFIT_ITEM(head, ITEM_SLOT_HEAD) + H.equip_to_slot_or_del(new head(H), ITEM_SLOT_HEAD, TRUE) if(mask) - EQUIP_OUTFIT_ITEM(mask, ITEM_SLOT_MASK) + H.equip_to_slot_or_del(new mask(H), ITEM_SLOT_MASK, TRUE) if(neck) - EQUIP_OUTFIT_ITEM(neck, ITEM_SLOT_NECK) + H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) if(ears) - EQUIP_OUTFIT_ITEM(ears, ITEM_SLOT_EARS) + H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS, TRUE) if(glasses) - EQUIP_OUTFIT_ITEM(glasses, ITEM_SLOT_EYES) + H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) if(back) - EQUIP_OUTFIT_ITEM(back, ITEM_SLOT_BACK) + H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) if(id) - EQUIP_OUTFIT_ITEM(id, ITEM_SLOT_ID) + H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) if(suit_store) - EQUIP_OUTFIT_ITEM(suit_store, ITEM_SLOT_SUITSTORE) - - if(undershirt) - H.undershirt = initial(undershirt.name) + H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) if(accessory) var/obj/item/clothing/under/U = H.w_uniform @@ -209,9 +207,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - EQUIP_OUTFIT_ITEM(l_pocket, ITEM_SLOT_LPOCKET) + H.equip_to_slot_or_del(l_pocket, ITEM_SLOT_LPOCKET, TRUE) if(r_pocket) - EQUIP_OUTFIT_ITEM(r_pocket, ITEM_SLOT_RPOCKET) + H.equip_to_slot_or_del(r_pocket, ITEM_SLOT_RPOCKET, TRUE) if(box) if(!backpack_contents) @@ -225,7 +223,7 @@ if(!isnum(number))//Default to 1 number = 1 for(var/i in 1 to number) - EQUIP_OUTFIT_ITEM(path, ITEM_SLOT_BACKPACK) + H.equip_to_slot_or_del(path, ITEM_SLOT_BACKPACK, TRUE) post_equip(H, visualsOnly, preference_source) @@ -242,9 +240,6 @@ H.update_body() return TRUE -#undef EQUIP_OUTFIT_ITEM - - /** * Apply a fingerprint from the passed in human to all items in the outfit * diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index 5e509a637b..aa351e6c90 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -31,6 +31,8 @@ var/uv_cycles = 6 var/message_cooldown var/breakout_time = 300 + /// How fast it charges cells in a suit + var/charge_rate = 250 /obj/machinery/suit_storage_unit/standard_unit suit_type = /obj/item/clothing/suit/space/eva @@ -43,7 +45,7 @@ storage_type = /obj/item/tank/jetpack/oxygen/captain /obj/machinery/suit_storage_unit/captainmod - mask_type = /obj/item/clothing/mask/gas/atmos/captain + mask_type = /obj/item/clothing/mask/gas/sechailer storage_type = /obj/item/tank/jetpack/oxygen/captain mod_type = /obj/item/mod/control/pre_equipped/magnate @@ -58,11 +60,11 @@ /obj/machinery/suit_storage_unit/atmos suit_type = /obj/item/clothing/suit/space/hardsuit/engine/atmos - mask_type = /obj/item/clothing/mask/gas/atmos + mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/watertank/atmos /obj/machinery/suit_storage_unit/atmosmod - mask_type = /obj/item/clothing/mask/gas/atmos + mask_type = /obj/item/clothing/mask/breath storage_type = /obj/item/watertank/atmos mod_type = /obj/item/mod/control/pre_equipped/atmospheric @@ -332,7 +334,7 @@ things_to_clear += mask.GetAllContents() if(mod) things_to_clear += mod - things_to_clear += mod.get_all_contents() + things_to_clear += mod.GetAllContents() if(storage) things_to_clear += storage things_to_clear += storage.GetAllContents() @@ -352,13 +354,7 @@ /obj/machinery/suit_storage_unit/process(delta_time) var/obj/item/stock_parts/cell/cell - if(suit) - if(!istype(suit)) - return - if(!suit.cell) - return - cell = suit.cell - else if(mod) + if(mod) if(!istype(mod)) return if(!mod.cell) @@ -370,6 +366,14 @@ use_power(charge_rate * delta_time) cell.give(charge_rate * delta_time) +/obj/machinery/suit_storage_unit/proc/shock(mob/user, prb) + if(!prob(prb)) + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + if(electrocute_mob(user, src, src, 1, TRUE)) + return 1 + /obj/machinery/suit_storage_unit/relaymove(mob/user) if(locked) if(message_cooldown <= world.time) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 5fd55eeb45..7a953089a5 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -399,7 +399,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) + if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(I = src)) return . = FALSE @@ -428,7 +428,7 @@ GLOBAL_VAR_INIT(embedpocalypse, FALSE) // if true, all items will be able to emb if(throwing) throwing.finalize(FALSE) if(loc == user) - if(!user.temporarilyRemoveItemFromInventory(src)) + if(!allow_attack_hand_drop(user) || !user.temporarilyRemoveItemFromInventory(src)) return pickup(user) diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index f680d0034b..aea961860d 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -461,6 +461,8 @@ cooldown = TRUE busy = FALSE update_icon() + if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) + return if(req_defib) defib.cooldowncheck(user) else @@ -514,6 +516,8 @@ cooldown = TRUE busy = FALSE update_icon() + if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) + return if(!req_defib) recharge(60) if(req_defib && (defib.cooldowncheck(user))) @@ -632,6 +636,8 @@ defib.deductcharge(revivecost) cooldown = 1 update_icon() + if(SEND_SIGNAL(src, COMSIG_DEFIBRILLATOR_SUCCESS) & COMPONENT_DEFIB_STOP) + return if(req_defib) defib.cooldowncheck(user) else diff --git a/code/game/objects/items/devices/aicard.dm b/code/game/objects/items/devices/aicard.dm index 52ec7f796f..d94f078f8a 100644 --- a/code/game/objects/items/devices/aicard.dm +++ b/code/game/objects/items/devices/aicard.dm @@ -28,17 +28,11 @@ /obj/item/aicard/pre_attack(atom/target, mob/living/user, params) if(AI) //AI is on the card, implies user wants to upload it. - var/our_ai = AI target.transfer_ai(AI_TRANS_FROM_CARD, user, AI, src) else //No AI on the card, therefore the user wants to download one. target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) if(AI) - log_combat(user, our_ai, "uploaded", src, "to [target].") - return TRUE - else //No AI on the card, therefore the user wants to download one. - target.transfer_ai(AI_TRANS_TO_CARD, user, null, src) - if(AI) - log_combat(user, AI, "carded", src) + log_combat(user, AI, "uploaded", src, "to [target].") return TRUE update_appearance() //Whatever happened, update the card's state (icon, name) to match. return ..() diff --git a/code/modules/cargo/packs/science.dm b/code/modules/cargo/packs/science.dm index 6ec6554693..96d9a97b5f 100644 --- a/code/modules/cargo/packs/science.dm +++ b/code/modules/cargo/packs/science.dm @@ -244,7 +244,6 @@ desc = "Three cores, perfect for any MODsuit construction! Naturally harvestedâ„¢, of course." cost = CARGO_CRATE_VALUE * 3 access = ACCESS_ROBOTICS - access_view = ACCESS_ROBOTICS contains = list(/obj/item/mod/construction/core, /obj/item/mod/construction/core, /obj/item/mod/construction/core) diff --git a/code/modules/client/preferences/mod_select.dm b/code/modules/client/preferences/mod_select.dm deleted file mode 100644 index c80c8b4c69..0000000000 --- a/code/modules/client/preferences/mod_select.dm +++ /dev/null @@ -1,23 +0,0 @@ -/// Switches between mouse buttons for MODsuit active modules -/datum/preference/choiced/mod_select - category = PREFERENCE_CATEGORY_GAME_PREFERENCES - savefile_key = "mod_select" - savefile_identifier = PREFERENCE_PLAYER - -/datum/preference/choiced/mod_select/init_possible_values() - return list(MIDDLE_CLICK, ALT_CLICK) - -/datum/preference/choiced/mod_select/create_default_value() - return MIDDLE_CLICK - -/datum/preference/choiced/mod_select/apply_to_client_updated(client/client, value) - if(!ishuman(client.mob)) - return - var/mob/living/carbon/human/client_owner = client.mob - if(!istype(client_owner.back, /obj/item/mod/control)) - return - var/obj/item/mod/control/mod = client_owner.back - if(!mod.selected_module) - return - UnregisterSignal(mod.wearer, mod.selected_module.used_signal) - mod.selected_module.update_signal(value) diff --git a/code/modules/mob/inventory.dm b/code/modules/mob/inventory.dm index 203c578c2c..51659a2904 100644 --- a/code/modules/mob/inventory.dm +++ b/code/modules/mob/inventory.dm @@ -337,6 +337,7 @@ on_item_dropped(I) if(I.dropped(src) == ITEM_RELOCATED_BY_DROPPED) return FALSE + SEND_SIGNAL(src, COMSIG_MOB_UNEQUIPPED_ITEM, I, force, newloc, no_move, invdrop, silent) return TRUE //This is a SAFE proc. Use this instead of equip_to_slot()! diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 2f3c1357da..85bef76d98 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -305,6 +305,12 @@ update_inv_hands() return var/datum/component/storage/storage = equipped_back.GetComponent(/datum/component/storage) + if(istype(equipped_back, /obj/item/mod/control)) + var/obj/item/mod/control/C = equipped_back + for(var/obj/item/mod/module/storage/S in C.modules) + if(S.stored) + equipped_back = S.stored + storage = S.stored.GetComponent(/datum/component/storage) if(!storage) if(!thing) equipped_back.attack_hand(src) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 68a9f8bd0f..75dfb0e14c 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1303,8 +1303,6 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(ITEM_SLOT_FEET) if(H.shoes) return FALSE - if((DIGITIGRADE in species_traits) && !(I.item_flags & IGNORE_DIGITIGRADE)) - return FALSE if(num_legs < 2) return FALSE if(DIGITIGRADE in species_traits) diff --git a/code/modules/mob/living/silicon/ai/ai.dm b/code/modules/mob/living/silicon/ai/ai.dm index 3cda68c015..5ba5f2431d 100644 --- a/code/modules/mob/living/silicon/ai/ai.dm +++ b/code/modules/mob/living/silicon/ai/ai.dm @@ -99,6 +99,13 @@ var/display_icon_override var/emote_display = "Neutral" //text string of the current emote we set for the status displays, to prevent logins resetting it. + var/datum/robot_control/robot_control + /// Station alert datum for showing alerts UI + var/datum/station_alert/alert_control + ///remember AI's last location + var/atom/lastloc + interaction_range = INFINITY + /mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai) . = ..() if(!target_ai) //If there is no player/brain inside. @@ -177,9 +184,10 @@ QDEL_NULL(spark_system) QDEL_NULL(malf_picker) QDEL_NULL(doomsday_device) - QDEL_NULL(robot_control) + // TODO: Why these no work? + // QDEL_NULL(robot_control) QDEL_NULL(aiMulti) - QDEL_NULL(alert_control) + // QDEL_NULL(alert_control) malfhack = null current = null Bot = null diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index 2c27879e79..b280ffdd70 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -3,28 +3,41 @@ icon_icon = 'icons/mob/actions/actions_mod.dmi' check_flags = AB_CHECK_CONSCIOUS var/obj/item/mod/control/mod + /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently. + var/ai_action = FALSE + /// Whether this action is intended for the inserted pAI. Stuff breaks a lot if this is done differently. + var/pai_action = FALSE /datum/action/item_action/mod/New(Target) ..() - mod = Target - -/datum/action/item_action/mod/Grant(mob/M) - if(owner) - Share(M) + if(!istype(Target, /obj/item/mod/control)) + qdel(src) return - ..() + if(ai_action) + background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND -/datum/action/item_action/mod/Remove(mob/M) - var/mob_to_grant - for(var/datum/weakref/reference as anything in sharers) - var/mob/freeloader = reference.resolve() - if(!freeloader) - continue - mob_to_grant = freeloader - break - ..() - if(mob_to_grant) - Grant(mob_to_grant) +/datum/action/item_action/mod/Grant(mob/user) + mod = target + if(ai_action && user != mod.ai) + return + else if(!ai_action && user == mod.ai) + return + return ..() + +/datum/action/item_action/mod/Remove(mob/user) + if(ai_action && mod && user != mod.ai) + return + else if(!ai_action && mod && user == mod.ai) + return + return ..() + +/datum/action/item_action/mod/Trigger(trigger_flags) + if(!IsAvailable()) + return FALSE + if(mod.malfunctioning && prob(75)) + mod.balloon_alert(usr, "button malfunctions!") + return FALSE + return TRUE /datum/action/item_action/mod/deploy name = "Deploy MODsuit" @@ -37,6 +50,12 @@ mod.choose_deploy(usr) return TRUE +/datum/action/item_action/mod/deploy/ai + ai_action = TRUE + +/datum/action/item_action/mod/deploy/pai + pai_action = TRUE + /datum/action/item_action/mod/activate name = "Activate MODsuit" desc = "Activate/Deactivate the MODsuit." @@ -48,6 +67,12 @@ mod.toggle_activate(usr) return TRUE +/datum/action/item_action/mod/activate/ai + ai_action = TRUE + +/datum/action/item_action/mod/activate/pai + pai_action = TRUE + /datum/action/item_action/mod/module name = "Toggle Module" desc = "Toggle a MODsuit module." @@ -59,6 +84,12 @@ mod.quick_module(usr) return TRUE +/datum/action/item_action/mod/module/ai + ai_action = TRUE + +/datum/action/item_action/mod/module/pai + pai_action = TRUE + /datum/action/item_action/mod/panel name = "MODsuit Panel" desc = "Open the MODsuit's panel." @@ -69,3 +100,9 @@ return FALSE mod.ui_interact(usr) return TRUE + +/datum/action/item_action/mod/panel/ai + ai_action = TRUE + +/datum/action/item_action/mod/panel/pai + pai_action = TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index f7869dc227..c0b1300dc4 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -1,4 +1,3 @@ -#define MOD_ACTIVATION_STEP_TIME 2 SECONDS #define MOD_ACTIVATION_STEP_FLAGS IGNORE_USER_LOC_CHANGE|IGNORE_TARGET_LOC_CHANGE|IGNORE_HELD_ITEM|IGNORE_INCAPACITATED /// Creates a radial menu from which the user chooses parts of the suit to deploy/retract. Repeats until all parts are extended or retracted. @@ -72,7 +71,8 @@ /obj/item/mod/control/proc/conceal(mob/user, part) var/obj/item/piece = part REMOVE_TRAIT(piece, TRAIT_NODROP, MOD_TRAIT) - wearer.transferItemToLoc(piece, src, force = TRUE) + if(wearer) + wearer.transferItemToLoc(piece, src, force = TRUE) if(piece == gauntlets) gauntlets.show_overslot() if(piece == boots) @@ -117,28 +117,36 @@ playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE for(var/obj/item/mod/module/module as anything in modules) - if(!module.active) + if(!module.active || module.allowed_inactive) continue module.on_deactivation() activating = TRUE to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) - if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(boots, seal = !active) - if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + else + return toggle_activate_fail() + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[gauntlets] [active ? "become loose around your fingers" : "tighten around your fingers and wrists"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(gauntlets, seal = !active) - if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + else + return toggle_activate_fail() + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[chestplate] [active ? "releases your chest" : "cinches tightly against your chest"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(chestplate,seal = !active) - if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + else + return toggle_activate_fail() + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[helmet] hisses [active ? "open" : "closed"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) seal_part(helmet, seal = !active) - if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, wearer, MOD_ACTIVATION_STEP_FLAGS)) + else + return toggle_activate_fail() + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("Systems [active ? "shut down. Parts unsealed. Goodbye" : "started up. Parts sealed. Welcome"], [wearer].")) if(ai) to_chat(ai, span_notice("SYSTEMS [active ? "DEACTIVATED. GOODBYE" : "ACTIVATED. WELCOME"]: \"[ai]\"")) @@ -148,9 +156,20 @@ SEND_SOUND(wearer, sound('sound/mecha/nominal.ogg',volume=50)) else playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + else + return toggle_activate_fail() activating = FALSE return TRUE +/obj/item/mod/control/proc/toggle_activate_fail() + seal_part(boots, seal = active) + seal_part(gauntlets, seal = active) + seal_part(chestplate,seal = active) + seal_part(helmet, seal = active) + to_chat(wearer, span_warning("[active ? "Shut down" : "Start up"] cancelled.")) + activating = FALSE + return FALSE + ///Seals or unseals the given part /obj/item/mod/control/proc/seal_part(obj/item/clothing/part, seal) if(seal) @@ -165,18 +184,16 @@ part.clothing_flags &= ~part.visor_flags part.heat_protection = NONE part.cold_protection = NONE + part.icon_state = "[skin]-[initial(part.icon_state)][seal ? "-sealed" : ""]" + part.item_state = "[skin]-[initial(part.item_state)][seal ? "-sealed" : ""]" if(part == boots) - boots.icon_state = "[skin]-boots[seal ? "-sealed" : ""]" wearer.update_inv_shoes() if(part == gauntlets) - gauntlets.icon_state = "[skin]-gauntlets[seal ? "-sealed" : ""]" wearer.update_inv_gloves() if(part == chestplate) - chestplate.icon_state = "[skin]-chestplate[seal ? "-sealed" : ""]" wearer.update_inv_wear_suit() wearer.update_inv_w_uniform() if(part == helmet) - helmet.icon_state = "[skin]-helmet[seal ? "-sealed" : ""]" if(seal) helmet.alternate_worn_layer = null else diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index f470fb8046..c7356e41f0 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -14,6 +14,8 @@ if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "interrupted!") return + if(!ai) + return intAI = ai intAI.ai_restore_power()//So the AI initially has power. intAI.control_disabled = TRUE @@ -22,10 +24,7 @@ intAI.forceMove(card) card.AI = intAI for(var/datum/action/action as anything in actions) - if(action.owner == intAI) - action.Remove(intAI) - else - action.Unshare(intAI) + action.Remove(intAI) intAI.controlled_equipment = null intAI.remote_control = null balloon_alert(intAI, "transferred to a card") @@ -37,6 +36,9 @@ if(!intAI) balloon_alert(user, "no AI in card!") return + if(ai) + balloon_alert(user, "already has AI!") + return if(intAI.deployed_shell) //Recall AI if shelled so it can be checked for a client intAI.disconnect_shell() if(intAI.stat || !intAI.client) @@ -46,6 +48,8 @@ if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "interrupted!") return + if(ai) + return balloon_alert(user, "AI transferred to suit") ai_enter_mod(intAI) card.AI = null @@ -63,14 +67,95 @@ for(var/datum/action/action as anything in actions) action.Grant(new_ai) +/** + * Simple proc to insert the pAI into the MODsuit. + * + * user - The person trying to put the pAI into the MODsuit. + * card - The pAI card we're slotting in the MODsuit. + */ + +/obj/item/mod/control/proc/insert_pai(mob/user, obj/item/paicard/card) + if(mod_pai) + balloon_alert(user, "pAI already installed!") + return + if(!card.pai || !card.pai.mind) + balloon_alert(user, "pAI unresponsive!") + return + balloon_alert(user, "transferring to suit...") + if(!do_after(user, 5 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return FALSE + if(!user.transferItemToLoc(card, src)) + return + + mod_pai = card.pai + balloon_alert(user, "pAI transferred to suit") + balloon_alert(mod_pai, "transferred to a suit") + mod_pai.canholo = FALSE + mod_pai.remote_control = src + for(var/datum/action/action as anything in actions) + action.Grant(mod_pai) + return TRUE + +/** + * Simple proc to extract the pAI from the MODsuit. It's the proc to call if you want to take it out, + * remove_pai() is there so atom_destruction() doesn't have any risk of sleeping. + * + * user - The person trying to take out the pAI from the MODsuit. + * forced - Whether or not we skip the checks and just eject the pAI. Defaults to FALSE. + * feedback - Whether to give feedback via balloon alerts or not. Defaults to TRUE. + */ +/obj/item/mod/control/proc/extract_pai(mob/user, forced = FALSE, feedback = TRUE) + if(!mod_pai) + if(user && feedback) + balloon_alert(user, "no pAI to remove!") + return + if(!forced) + if(!open) + if(user && feedback) + balloon_alert(user, "open the suit panel!") + return FALSE + if(!do_after(user, 5 SECONDS, target = src)) + if(user && feedback) + balloon_alert(user, "interrupted!") + return FALSE + + remove_pai(feedback) + + if(feedback && user) + balloon_alert(user, "pAI removed from the suit") + +/** + * Simple proc that handles the safe removal of the pAI from a MOD control unit. + * + * Arguments: + * * feedback - Whether or not we want to give balloon alert feedback to the mod_pai. Defaults to FALSE. + */ +/obj/item/mod/control/proc/remove_pai(feedback = FALSE) + var/turf/drop_off = get_turf(src) + if(drop_off) // In case there's no drop_off, the pAI will simply get deleted. + mod_pai.card.forceMove(drop_off) + + for(var/datum/action/action as anything in actions) + if(action.owner == mod_pai) + action.Remove(mod_pai) + + if(feedback) + balloon_alert(mod_pai, "removed from a suit") + mod_pai.remote_control = null + mod_pai.canholo = TRUE + mod_pai = null + #define MOVE_DELAY 2 #define WEARER_DELAY 1 #define LONE_DELAY 5 -#define CELL_PER_STEP DEFAULT_CELL_DRAIN * 2.5 +#define CELL_PER_STEP (DEFAULT_CHARGE_DRAIN * 2.5) /obj/item/mod/control/relaymove(mob/user, direction) if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) return FALSE + if(wearer && (wearer.pulledby?.grab_state || wearer.incapacitated() || wearer.stat)) + return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) @@ -86,3 +171,8 @@ #undef WEARER_DELAY #undef LONE_DELAY #undef CELL_PER_STEP + +/obj/item/mod/control/ui_state(mob/user) + if(user == mod_pai) + return GLOB.contained_state + return ..() diff --git a/code/modules/mod/mod_clothes.dm b/code/modules/mod/mod_clothes.dm index 37045015d6..548f6064e5 100644 --- a/code/modules/mod/mod_clothes.dm +++ b/code/modules/mod/mod_clothes.dm @@ -1,9 +1,12 @@ /obj/item/clothing/head/helmet/space/mod name = "MOD helmet" desc = "A helmet for a MODsuit." - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + taur_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_state = "helmet" - worn_icon = 'icons/mob/mod.dmi' + item_state = "helmet" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) body_parts_covered = HEAD heat_protection = HEAD @@ -12,15 +15,16 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT clothing_flags = THICKMATERIAL resistance_flags = NONE - flash_protect = FLASH_PROTECTION_NONE - clothing_flags = SNUG_FIT + flash_protect = 0 + clothing_flags = NONE flags_inv = HIDEFACIALHAIR flags_cover = NONE visor_flags = THICKMATERIAL|STOPSPRESSUREDAMAGE visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT - visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF + visor_flags_cover = HEADCOVERSMOUTH|HEADCOVERSEYES var/alternate_layer = NECK_LAYER var/obj/item/mod/control/mod + mutantrace_variation = STYLE_MUZZLE /obj/item/clothing/head/helmet/space/mod/Destroy() if(!QDELETED(mod)) @@ -32,9 +36,12 @@ /obj/item/clothing/suit/armor/mod name = "MOD chestplate" desc = "A chestplate for a MODsuit." - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + taur_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_state = "chestplate" - worn_icon = 'icons/mob/mod.dmi' + item_state = "chestplate" blood_overlay_type = "armor" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) body_parts_covered = CHEST|GROIN @@ -48,6 +55,7 @@ allowed = list(/obj/item/flashlight, /obj/item/tank/internals) resistance_flags = NONE var/obj/item/mod/control/mod + mutantrace_variation = STYLE_DIGITIGRADE|STYLE_SNEK_TAURIC|STYLE_PAW_TAURIC /obj/item/clothing/suit/armor/mod/Destroy() if(!QDELETED(mod)) @@ -59,9 +67,12 @@ /obj/item/clothing/gloves/mod name = "MOD gauntlets" desc = "A pair of gauntlets for a MODsuit." - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + taur_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_state = "gauntlets" - worn_icon = 'icons/mob/mod.dmi' + item_state = "gauntlets" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) body_parts_covered = HANDS|ARMS heat_protection = HANDS|ARMS @@ -86,15 +97,18 @@ if(!overslot) return if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + mod.wearer.dropItemToGround(overslot, force = TRUE) overslot = null /obj/item/clothing/shoes/mod name = "MOD boots" desc = "A pair of boots for a MODsuit." - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + taur_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_state = "boots" - worn_icon = 'icons/mob/mod.dmi' + item_state = "boots" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) body_parts_covered = FEET|LEGS heat_protection = FEET|LEGS @@ -103,7 +117,7 @@ min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT clothing_flags = THICKMATERIAL resistance_flags = NONE - item_flags = IGNORE_DIGITIGRADE + item_flags = NONE var/obj/item/mod/control/mod var/obj/item/clothing/overslot @@ -119,5 +133,5 @@ if(!overslot) return if(!mod.wearer.equip_to_slot_if_possible(overslot, overslot.slot_flags, qdel_on_fail = FALSE, disable_warning = TRUE)) - mod.wearer.dropItemToGround(overslot, force = TRUE, silent = TRUE) + mod.wearer.dropItemToGround(overslot, force = TRUE) overslot = null diff --git a/code/modules/mod/mod_construction.dm b/code/modules/mod/mod_construction.dm index 4916f8b6bc..19c188dcf6 100644 --- a/code/modules/mod/mod_construction.dm +++ b/code/modules/mod/mod_construction.dm @@ -1,6 +1,7 @@ /obj/item/mod/construction desc = "A part used in MOD construction." - inhand_icon_state = "rack_parts" + icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' + item_state = "rack_parts" /obj/item/mod/construction/helmet name = "MOD helmet" @@ -20,7 +21,7 @@ /obj/item/mod/construction/core name = "MOD core" - icon_state = "mod-core" + icon_state = "mod-core-standard" desc = "Growing in the most lush, fertile areas of the planet Sprout, there is a crystal known as the Heartbloom. \ These rare, organic piezoelectric crystals are of incredible cultural significance to the artist castes of the Ethereals, \ owing to their appearance; which is exactly similar to that of an Ethereal's heart. \n\ @@ -29,7 +30,7 @@ /obj/item/mod/construction/broken_core name = "broken MOD core" - icon_state = "mod-core-broken" + icon_state = "mod-core" desc = "An internal power source for a Modular Outerwear Device. You don't seem to be able to source any power from this one, though." /obj/item/mod/construction/broken_core/examine(mob/user) @@ -46,7 +47,7 @@ /obj/item/mod/construction/armor name = "MOD armor plates" desc = "Armor plates used to finish a MOD." - icon_state = "standard-armor" + icon_state = "standard-plating" var/datum/mod_theme/theme = /datum/mod_theme /obj/item/mod/construction/armor/Initialize(mapload) @@ -54,7 +55,7 @@ var/datum/mod_theme/used_theme = GLOB.mod_themes[theme] name = "MOD [used_theme.name] armor plates" desc = "[desc] [used_theme.desc]" - icon_state = "[used_theme.default_skin]-armor" + icon_state = "[used_theme.default_skin]-plating" /obj/item/mod/construction/armor/engineering theme = /datum/mod_theme/engineering @@ -77,7 +78,7 @@ /obj/item/mod/paint name = "MOD paint kit" desc = "This kit will repaint your MODsuit to something unique." - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' icon_state = "paintkit" #define START_STEP "start" diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index 8ca7dc8573..ca4ec2a468 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -2,15 +2,18 @@ /obj/item/mod name = "Base MOD" desc = "You should not see this, yell at a coder!" - icon = 'icons/obj/mod.dmi' + icon = 'icons/obj/clothing/modsuit/mod_clothing.dmi' + mob_overlay_icon = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + anthro_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' + taur_mob_worn_overlay = 'icons/mob/clothing/modsuit/mod_clothing.dmi' icon_state = "standard-control" - worn_icon = 'icons/mob/mod.dmi' + item_state = "standard-control" /obj/item/mod/control name = "MOD control unit" desc = "The control unit of a Modular Outerwear Device, a powered, back-mounted suit that protects against various environments." icon_state = "control" - inhand_icon_state = "mod_control" + item_state = "control" w_class = WEIGHT_CLASS_BULKY slot_flags = ITEM_SLOT_BACK strip_delay = 10 SECONDS @@ -48,7 +51,7 @@ /// How much module complexity this MOD is carrying. var/complexity = 0 /// Power usage of the MOD. - var/cell_drain = DEFAULT_CELL_DRAIN + var/cell_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. var/slowdown_inactive = 2 /// Slowdown of the MOD when active. @@ -73,6 +76,8 @@ var/obj/item/mod/module/selected_module /// AI mob inhabiting the MOD. var/mob/living/silicon/ai/ai + /// pAI mob inhabiting the MOD. + var/mob/living/silicon/pai/mod_pai /// Delay between moves as AI. var/movedelay = 0 /// Cooldown for AI moves. @@ -123,6 +128,7 @@ piece.permeability_coefficient = theme.permeability_coefficient piece.siemens_coefficient = theme.siemens_coefficient piece.icon_state = "[skin]-[initial(piece.icon_state)]" + piece.item_state = "[skin]-[initial(piece.item_state)]" update_flags() for(var/obj/item/mod/module/module as anything in initial_modules) module = new module(src) @@ -206,6 +212,7 @@ balloon_alert(carbon_user, "retract parts first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, FALSE, SILENCED_SOUND_EXTRARANGE) return FALSE + return ..() /obj/item/mod/control/MouseDrop(atom/over_object) if(src != wearer?.back || !istype(over_object, /atom/movable/screen/inventory/hand)) @@ -241,10 +248,22 @@ return return ..() +/obj/item/mod/control/AltClick(mob/user) + if(seconds_electrified && cell?.charge) + if(shock(user)) + return + if(!open) + for(var/obj/item/mod/module/storage/S in modules) + if(S.stored) + playsound(user, "rustle", 50, 1, -5) + SEND_SIGNAL(S.stored, COMSIG_TRY_STORAGE_SHOW, wearer, TRUE) + return + . = ..() + /obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) if(..()) return TRUE - if(active || activating || ai_controller) + if(active || activating) balloon_alert(user, "deactivate suit first!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return FALSE @@ -330,12 +349,6 @@ if(open) return cell -/obj/item/mod/control/GetAccess() - if(ai_controller) - return req_access.Copy() - else - return ..() - /obj/item/mod/control/emag_act(mob/user) locked = !locked balloon_alert(user, "[locked ? "locked" : "unlocked"]") @@ -363,12 +376,12 @@ conceal(null, part) return ..() -/obj/item/mod/control/worn_overlays(mutable_appearance/standing, isinhands = FALSE, icon_file) +/obj/item/mod/control/worn_overlays(isinhands = FALSE, icon_file) . = ..() if(!active) return for(var/obj/item/mod/module/module as anything in modules) - var/list/module_icons = module.generate_worn_overlay(standing) + var/list/module_icons = module.generate_worn_overlay() if(!length(module_icons)) continue . += module_icons @@ -394,8 +407,8 @@ var/used_category if(part == helmet) used_category = HELMET_FLAGS - helmet.alternate_worn_layer = used_skin[HELMET_LAYER] - helmet.alternate_layer = used_skin[HELMET_LAYER] + helmet.alternate_worn_layer = used_skin["HELMET_LAYER"] + helmet.alternate_layer = used_skin["HELMET_LAYER"] if(part == chestplate) used_category = CHESTPLATE_FLAGS if(part == gauntlets) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 174cc1bab3..ed183557b9 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -28,7 +28,7 @@ /// How much modules can the MOD carry without malfunctioning. var/complexity_max = DEFAULT_MAX_COMPLEXITY /// How much battery power the MOD uses by just being on - var/cell_drain = DEFAULT_CELL_DRAIN + var/cell_drain = DEFAULT_CHARGE_DRAIN /// Slowdown of the MOD when not active. var/slowdown_inactive = 1.25 /// Slowdown of the MOD when active. @@ -44,11 +44,11 @@ "standard" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -67,10 +67,10 @@ "civilian" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -102,11 +102,11 @@ "engineering" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -137,12 +137,12 @@ "atmospheric" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR, UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -175,11 +175,11 @@ "advanced" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -204,17 +204,17 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - cell_drain = DEFAULT_CELL_DRAIN * 2 + cell_drain = DEFAULT_CHARGE_DRAIN * 2 complexity_max = DEFAULT_MAX_COMPLEXITY + 5 skins = list( "mining" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -237,18 +237,18 @@ desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." default_skin = "medical" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) - cell_drain = DEFAULT_CELL_DRAIN * 1.5 + cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 1 slowdown_active = 0.5 skins = list( "medical" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -267,11 +267,11 @@ "corpsman" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -296,7 +296,7 @@ armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - cell_drain = DEFAULT_CELL_DRAIN * 1.5 + cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 0.75 slowdown_active = 0.25 inbuilt_modules = list(/obj/item/mod/module/quick_carry/advanced) @@ -304,11 +304,11 @@ "rescue" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -341,10 +341,10 @@ "research" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -375,12 +375,12 @@ "security" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -413,10 +413,10 @@ "safeguard" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -449,11 +449,11 @@ "magnate" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -476,18 +476,18 @@ desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." default_skin = "cosmohonk" armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) - cell_drain = DEFAULT_CELL_DRAIN * 0.25 + cell_drain = DEFAULT_CHARGE_DRAIN * 0.25 slowdown_inactive = 1.75 slowdown_active = 1.25 skins = list( "cosmohonk" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -515,16 +515,16 @@ slowdown_inactive = 1 slowdown_active = 0.5 ui_theme = "syndicate" - inbuilt_modules = list(/obj/item/mod/module/armor_booster) + inbuilt_modules = list() skins = list( "syndicate" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -553,16 +553,16 @@ slowdown_inactive = 0.75 slowdown_active = 0.25 ui_theme = "syndicate" - inbuilt_modules = list(/obj/item/mod/module/armor_booster/elite) + inbuilt_modules = list() skins = list( "elite" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -597,10 +597,10 @@ "enchanted" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -633,10 +633,10 @@ "prototype" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -668,11 +668,11 @@ "responsory" = list( HELMET_LAYER = NECK_LAYER, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT, + UNSEALED_CLOTHING = NONE, SEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -691,10 +691,10 @@ "inquisitory" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -725,11 +725,11 @@ "apocryphal" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEEARS|HIDEHAIR, SEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEMASK|HIDEEYES|HIDEFACE|HIDESNOUT, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -761,11 +761,11 @@ "corporate" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEYES|HIDEFACE, - SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -797,12 +797,12 @@ "debug" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL, + UNSEALED_CLOTHING = THICKMATERIAL, SEALED_CLOTHING = STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, UNSEALED_COVER = HEADCOVERSMOUTH, - SEALED_COVER = HEADCOVERSEYES|PEPPERPROOF, + SEALED_COVER = HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( UNSEALED_CLOTHING = THICKMATERIAL, @@ -828,20 +828,20 @@ resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT complexity_max = 1000 - cell_drain = DEFAULT_CELL_DRAIN * 0 + cell_drain = DEFAULT_CHARGE_DRAIN * 0 slowdown_inactive = 0 slowdown_active = 0 skins = list( "debug" = list( HELMET_LAYER = null, HELMET_FLAGS = list( - UNSEALED_CLOTHING = SNUG_FIT|THICKMATERIAL|STOPSPRESSUREDAMAGE, + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, UNSEALED_INVISIBILITY = HIDEFACIALHAIR|HIDEEARS|HIDEHAIR|HIDESNOUT, SEALED_INVISIBILITY = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE, - UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES|PEPPERPROOF, + UNSEALED_COVER = HEADCOVERSMOUTH|HEADCOVERSEYES, ), CHESTPLATE_FLAGS = list( - UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE|BLOCKS_SHOVE_KNOCKDOWN, + UNSEALED_CLOTHING = THICKMATERIAL|STOPSPRESSUREDAMAGE, SEALED_INVISIBILITY = HIDEJUMPSUIT, ), GAUNTLETS_FLAGS = list( diff --git a/code/modules/mod/mod_types.dm b/code/modules/mod/mod_types.dm index af482e50f4..3296cf7ba3 100644 --- a/code/modules/mod/mod_types.dm +++ b/code/modules/mod/mod_types.dm @@ -20,12 +20,12 @@ /obj/item/mod/control/pre_equipped/advanced theme = /datum/mod_theme/advanced cell = /obj/item/stock_parts/cell/super - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/jetpack, /obj/item/mod/module/flashlight) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight) /obj/item/mod/control/pre_equipped/mining theme = /datum/mod_theme/mining cell = /obj/item/stock_parts/cell/high/plus - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/orebag, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/orebag, /obj/item/mod/module/flashlight, /obj/item/mod/module/magboot, /obj/item/mod/module/drill) /obj/item/mod/control/pre_equipped/medical theme = /datum/mod_theme/medical @@ -34,12 +34,12 @@ /obj/item/mod/control/pre_equipped/rescue theme = /datum/mod_theme/rescue cell = /obj/item/stock_parts/cell/super - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/flashlight, /obj/item/mod/module/health_analyzer, /obj/item/mod/module/injector) /obj/item/mod/control/pre_equipped/research theme = /datum/mod_theme/research cell = /obj/item/stock_parts/cell/super - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/circuit, /obj/item/mod/module/t_ray) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/t_ray) /obj/item/mod/control/pre_equipped/security theme = /datum/mod_theme/security @@ -48,42 +48,37 @@ /obj/item/mod/control/pre_equipped/safeguard theme = /datum/mod_theme/safeguard cell = /obj/item/stock_parts/cell/super - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/magnate theme = /datum/mod_theme/magnate cell = /obj/item/stock_parts/cell/hyper - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/holster, /obj/item/mod/module/pathfinder) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/traitor theme = /datum/mod_theme/syndicate cell = /obj/item/stock_parts/cell/super - initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/tether, /obj/item/mod/module/pathfinder, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/dna_lock) /obj/item/mod/control/pre_equipped/nuclear theme = /datum/mod_theme/syndicate cell = /obj/item/stock_parts/cell/hyper - initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/elite theme = /datum/mod_theme/elite cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list(/obj/item/mod/module/storage/syndicate, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) - -/obj/item/mod/control/pre_equipped/enchanted - theme = /datum/mod_theme/enchanted - cell = /obj/item/stock_parts/cell/crystal_cell/wizard - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/energy_shield/wizard, /obj/item/mod/module/emp_shield) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/visor/thermal, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/prototype theme = /datum/mod_theme/prototype cell = /obj/item/stock_parts/cell/high/plus - initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight, /obj/item/mod/module/tether) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/rad_protection, /obj/item/mod/module/flashlight) /obj/item/mod/control/pre_equipped/responsory theme = /datum/mod_theme/responsory cell = /obj/item/stock_parts/cell/hyper - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) var/insignia_type = /obj/item/mod/module/insignia /obj/item/mod/control/pre_equipped/responsory/Initialize(mapload, new_theme, new_skin) @@ -112,7 +107,7 @@ insignia_type = /obj/item/mod/module/insignia/chaplain /obj/item/mod/control/pre_equipped/responsory/inquisitory - initial_modules = list(/obj/item/mod/module/storage/large_capacity, /obj/item/mod/module/anti_magic, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/anti_magic, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/flashlight, /obj/item/mod/module/holster) applied_skin = "inquisitory" /obj/item/mod/control/pre_equipped/responsory/inquisitory/commander @@ -130,22 +125,22 @@ /obj/item/mod/control/pre_equipped/apocryphal theme = /datum/mod_theme/apocryphal cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/jetpack, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/emp_shield, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/corporate theme = /datum/mod_theme/corporate cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/holster) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/holster) /obj/item/mod/control/pre_equipped/debug theme = /datum/mod_theme/debug cell = /obj/item/stock_parts/cell/bluespace - initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/bikehorn, /obj/item/mod/module/rad_protection, /obj/item/mod/module/tether, /obj/item/mod/module/injector) //one of every type of module, for testing if they all work correctly + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/flashlight, /obj/item/mod/module/bikehorn, /obj/item/mod/module/rad_protection, /obj/item/mod/module/injector) //one of every type of module, for testing if they all work correctly /obj/item/mod/control/pre_equipped/administrative theme = /datum/mod_theme/administrative cell = /obj/item/stock_parts/cell/infinite/abductor - initial_modules = list(/obj/item/mod/module/storage/bluespace, /obj/item/mod/module/welding, /obj/item/mod/module/stealth/ninja, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced, /obj/item/mod/module/jetpack) + initial_modules = list(/obj/item/mod/module/storage, /obj/item/mod/module/welding, /obj/item/mod/module/quick_carry/advanced, /obj/item/mod/module/magboot/advanced) //these exist for the prefs menu /obj/item/mod/control/pre_equipped/syndicate_empty diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 1e719e93eb..065f3f6748 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -54,7 +54,7 @@ . = ..() if(.) return - if(!allowed(usr) && locked) + if(locked && !allowed(usr)) balloon_alert(usr, "insufficient access!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index a310f95537..5bbd96bd68 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -1,5 +1,6 @@ /obj/item/mod/module name = "MOD module" + icon = 'icons/obj/clothing/modsuit/mod_modules.dmi' icon_state = "module" /// If it can be removed var/removable = TRUE @@ -10,11 +11,11 @@ /// How much space it takes up in the MOD var/complexity = 0 /// Power use when idle - var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 + var/idle_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// Power use when active - var/active_power_cost = DEFAULT_CELL_DRAIN * 0 + var/active_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// Power use when used, we call it manually - var/use_power_cost = DEFAULT_CELL_DRAIN * 0 + var/use_power_cost = DEFAULT_CHARGE_DRAIN * 0 /// ID used by their TGUI var/tgui_id /// Linked MODsuit @@ -27,12 +28,20 @@ var/overlay_state_active /// Overlay given to the user when the module is used, lasts until cooldown finishes var/overlay_state_use + /// Icon file for the overlay. + var/overlay_icon_file = 'icons/mob/clothing/modsuit/mod_modules.dmi' + /// Does the overlay use the control unit's colors? + var/use_mod_colors = FALSE /// What modules are we incompatible with? var/list/incompatible_modules = list() /// Cooldown after use var/cooldown_time = 0 /// The mouse button needed to use this module var/used_signal + /// If we're allowed to use this module while phased out. + var/allowed_in_phaseout = FALSE + /// If we're allowed to use this module while the suit is disabled. + var/allowed_inactive = FALSE /// Timer for the cooldown COOLDOWN_DECLARE(cooldown_timer) @@ -55,7 +64,7 @@ /obj/item/mod/module/examine(mob/user) . = ..() - if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) + if(user.hud_list[DIAG_HUD] && user.client.images & user.hud_list[DIAG_HUD]) . += span_notice("Complexity level: [complexity]") /// Called from MODsuit's install() proc, so when the module is installed. @@ -84,7 +93,9 @@ /// Called when the module is selected from the TGUI /obj/item/mod/module/proc/on_select() - if(!mod.active || mod.activating || module_type == MODULE_PASSIVE) + if(((!mod.active || mod.activating) && !allowed_inactive) || module_type == MODULE_PASSIVE) + if(mod.wearer) + balloon_alert(mod.wearer, "not active!") return if(module_type != MODULE_USABLE) if(active) @@ -93,7 +104,7 @@ on_activation() else on_use() - SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED) + SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED, src) /// Called when the module is activated /obj/item/mod/module/proc/on_activation() @@ -103,6 +114,10 @@ if(!mod.active || mod.activating || !mod.cell?.charge) balloon_alert(mod.wearer, "unpowered!") return FALSE + if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) + //specifically a to_chat because the user is phased out. + to_chat(mod.wearer, span_warning("You cannot activate this right now.")) + return FALSE if(module_type == MODULE_ACTIVE) if(mod.selected_module && !mod.selected_module.on_deactivation()) return @@ -115,9 +130,8 @@ balloon_alert(mod.wearer, "can't extend [device]!") return else - var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK - update_signal(used_button) - balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") + update_signal() + balloon_alert(mod.wearer, "[src] activated, alt-click to use") active = TRUE COOLDOWN_START(src, cooldown_timer, cooldown_time) mod.wearer.update_inv_back() @@ -145,6 +159,10 @@ return FALSE if(!check_power(use_power_cost)) return FALSE + if(!allowed_in_phaseout && istype(mod.wearer.loc, /obj/effect/dummy/phased_mob)) + //specifically a to_chat because the user is phased out. + to_chat(mod.wearer, span_warning("You cannot activate this right now.")) + return FALSE COOLDOWN_START(src, cooldown_timer, cooldown_time) addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) mod.wearer.update_inv_back() @@ -228,8 +246,10 @@ qdel(src) /// Generates an icon to be used for the suit's worn overlays -/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) +/obj/item/mod/module/proc/generate_worn_overlay() . = list() + if(!mod.active) + return var/used_overlay if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) used_overlay = overlay_state_use @@ -239,14 +259,98 @@ used_overlay = overlay_state_inactive else return - var/mutable_appearance/module_icon = mutable_appearance('icons/mob/mod.dmi', used_overlay, layer = standing.layer + 0.1) + var/mutable_appearance/module_icon = mutable_appearance(overlay_icon_file, used_overlay) + if(!use_mod_colors) + module_icon.appearance_flags |= RESET_COLOR . += module_icon /// Updates the signal used by active modules to be activated -/obj/item/mod/module/proc/update_signal(value) - switch(value) - if(MIDDLE_CLICK) - mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON - if(ALT_CLICK) - mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON +/obj/item/mod/module/proc/update_signal() + mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) + +/obj/item/mod/module/anomaly_locked + name = "MOD anomaly locked module" + desc = "A form of a module, locked behind an anomalous core to function." + incompatible_modules = list(/obj/item/mod/module/anomaly_locked) + /// The core item the module runs off. + var/obj/item/assembly/signaler/anomaly/core + /// Accepted types of anomaly cores. + var/list/accepted_anomalies = list(/obj/item/assembly/signaler/anomaly) + /// If this one starts with a core in. + var/prebuilt = FALSE + +/obj/item/mod/module/anomaly_locked/Initialize(mapload) + . = ..() + if(!prebuilt || !length(accepted_anomalies)) + return + var/core_path = pick(accepted_anomalies) + core = new core_path(src) + update_icon_state() + +/obj/item/mod/module/anomaly_locked/Destroy() + QDEL_NULL(core) + return ..() + +/obj/item/mod/module/anomaly_locked/examine(mob/user) + . = ..() + if(!length(accepted_anomalies)) + return + if(core) + . += span_notice("There is a [core.name] installed in it. You could remove it with a screwdriver...") + else + var/list/core_list = list() + for(var/path in accepted_anomalies) + var/atom/core_path = path + core_list += initial(core_path.name) + . += span_notice("You need to insert \a [english_list(core_list, and_text = " or ")] for this module to function.") + +/obj/item/mod/module/anomaly_locked/on_select() + if(!core) + balloon_alert(mod.wearer, "no core!") + return + return ..() + +/obj/item/mod/module/anomaly_locked/on_process(delta_time) + . = ..() + if(!core) + return FALSE + +/obj/item/mod/module/anomaly_locked/on_active_process(delta_time) + if(!core) + return FALSE + return TRUE + +/obj/item/mod/module/anomaly_locked/attackby(obj/item/item, mob/living/user, params) + if(item.type in accepted_anomalies) + if(core) + balloon_alert(user, "core already in!") + return + if(!user.transferItemToLoc(item, src)) + return + core = item + balloon_alert(user, "core installed") + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + update_icon_state() + else + return ..() + +/obj/item/mod/module/anomaly_locked/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(!core) + balloon_alert(user, "no core!") + return + balloon_alert(user, "removing core...") + if(!do_after(user, 3 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "core removed") + core.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(core) + core = null + update_icon_state() + +/obj/item/mod/module/anomaly_locked/update_icon_state() + icon_state = initial(icon_state) + (core ? "-core" : "") + return ..() diff --git a/code/modules/mod/modules/modules.dm b/code/modules/mod/modules/modules.dm index b5fc9a41e9..0e0da3572b 100644 --- a/code/modules/mod/modules/modules.dm +++ b/code/modules/mod/modules/modules.dm @@ -1,259 +1,3 @@ -/obj/item/mod/module - name = "MOD module" - icon_state = "module" - /// If it can be removed - var/removable = TRUE - /// If it's passive, togglable, usable or active - var/module_type = MODULE_PASSIVE - /// Is the module active - var/active = FALSE - /// How much space it takes up in the MOD - var/complexity = 0 - /// Power use when idle - var/idle_power_cost = DEFAULT_CELL_DRAIN * 0 - /// Power use when active - var/active_power_cost = DEFAULT_CELL_DRAIN * 0 - /// Power use when used, we call it manually - var/use_power_cost = DEFAULT_CELL_DRAIN * 0 - /// ID used by their TGUI - var/tgui_id - /// Linked MODsuit - var/obj/item/mod/control/mod - /// If we're an active module, what item are we? - var/obj/item/device - /// Overlay given to the user when the module is inactive - var/overlay_state_inactive - /// Overlay given to the user when the module is active - var/overlay_state_active - /// Overlay given to the user when the module is used, lasts until cooldown finishes - var/overlay_state_use - /// What modules are we incompatible with? - var/list/incompatible_modules = list() - /// Cooldown after use - var/cooldown_time = 0 - /// The mouse button needed to use this module - var/used_signal - /// Timer for the cooldown - COOLDOWN_DECLARE(cooldown_timer) - -/obj/item/mod/module/Initialize(mapload) - . = ..() - if(module_type != MODULE_ACTIVE) - return - if(ispath(device)) - device = new device(src) - ADD_TRAIT(device, TRAIT_NODROP, MOD_TRAIT) - RegisterSignal(device, COMSIG_PARENT_PREQDELETED, .proc/on_device_deletion) - RegisterSignal(src, COMSIG_ATOM_EXITED, .proc/on_exit) - -/obj/item/mod/module/Destroy() - mod?.uninstall(src) - if(device) - UnregisterSignal(device, COMSIG_PARENT_PREQDELETED) - QDEL_NULL(device) - return ..() - -/obj/item/mod/module/examine(mob/user) - . = ..() - if(HAS_TRAIT(user, TRAIT_DIAGNOSTIC_HUD)) - . += span_notice("Complexity level: [complexity]") - -/// Called from MODsuit's install() proc, so when the module is installed. -/obj/item/mod/module/proc/on_install() - return - -/// Called from MODsuit's uninstall() proc, so when the module is uninstalled. -/obj/item/mod/module/proc/on_uninstall() - return - -/// Called when the MODsuit is activated -/obj/item/mod/module/proc/on_suit_activation() - return - -/// Called when the MODsuit is deactivated -/obj/item/mod/module/proc/on_suit_deactivation() - return - -/// Called when the MODsuit is equipped -/obj/item/mod/module/proc/on_equip() - return - -/// Called when the MODsuit is unequipped -/obj/item/mod/module/proc/on_unequip() - return - -/// Called when the module is selected from the TGUI -/obj/item/mod/module/proc/on_select() - if(!mod.active || mod.activating || module_type == MODULE_PASSIVE) - return - if(module_type != MODULE_USABLE) - if(active) - on_deactivation() - else - on_activation() - else - on_use() - SEND_SIGNAL(mod, COMSIG_MOD_MODULE_SELECTED) - -/// Called when the module is activated -/obj/item/mod/module/proc/on_activation() - if(!COOLDOWN_FINISHED(src, cooldown_timer)) - balloon_alert(mod.wearer, "on cooldown!") - return FALSE - if(!mod.active || mod.activating || !mod.cell?.charge) - balloon_alert(mod.wearer, "unpowered!") - return FALSE - if(module_type == MODULE_ACTIVE) - if(mod.selected_module && !mod.selected_module.on_deactivation()) - return - mod.selected_module = src - if(device) - if(mod.wearer.put_in_hands(device)) - balloon_alert(mod.wearer, "[device] extended") - RegisterSignal(mod.wearer, COMSIG_ATOM_EXITED, .proc/on_exit) - else - balloon_alert(mod.wearer, "can't extend [device]!") - return - else - var/used_button = mod.wearer.client?.prefs.read_preference(/datum/preference/choiced/mod_select) || MIDDLE_CLICK - update_signal(used_button) - balloon_alert(mod.wearer, "[src] activated, [used_button]-click to use") - active = TRUE - COOLDOWN_START(src, cooldown_timer, cooldown_time) - mod.wearer.update_inv_back() - return TRUE - -/// Called when the module is deactivated -/obj/item/mod/module/proc/on_deactivation() - active = FALSE - if(module_type == MODULE_ACTIVE) - mod.selected_module = null - if(device) - mod.wearer.transferItemToLoc(device, src, TRUE) - balloon_alert(mod.wearer, "[device] retracted") - UnregisterSignal(mod.wearer, COMSIG_ATOM_EXITED) - else - balloon_alert(mod.wearer, "[src] deactivated") - UnregisterSignal(mod.wearer, used_signal) - used_signal = null - mod.wearer.update_inv_back() - return TRUE - -/// Called when the module is used -/obj/item/mod/module/proc/on_use() - if(!COOLDOWN_FINISHED(src, cooldown_timer)) - return FALSE - if(!check_power(use_power_cost)) - return FALSE - COOLDOWN_START(src, cooldown_timer, cooldown_time) - addtimer(CALLBACK(mod.wearer, /mob.proc/update_inv_back), cooldown_time) - mod.wearer.update_inv_back() - return TRUE - -/// Called when an activated module without a device is used -/obj/item/mod/module/proc/on_select_use(atom/target) - mod.wearer.face_atom(target) - if(!on_use()) - return FALSE - return TRUE - -/// Called when an activated module without a device is active and the user alt/middle-clicks -/obj/item/mod/module/proc/on_special_click(mob/source, atom/target) - SIGNAL_HANDLER - on_select_use(target) - return COMSIG_MOB_CANCEL_CLICKON - -/// Called on the MODsuit's process -/obj/item/mod/module/proc/on_process(delta_time) - if(active) - if(!drain_power(active_power_cost * delta_time)) - on_deactivation() - return FALSE - on_active_process(delta_time) - else - drain_power(idle_power_cost * delta_time) - return TRUE - -/// Called on the MODsuit's process if it is an active module -/obj/item/mod/module/proc/on_active_process(delta_time) - return - -/// Drains power from the suit cell -/obj/item/mod/module/proc/drain_power(amount) - if(!check_power(amount)) - return FALSE - mod.cell.charge = max(0, mod.cell.charge - amount) - return TRUE - -/obj/item/mod/module/proc/check_power(amount) - if(!mod.cell || (mod.cell.charge < amount)) - return FALSE - return TRUE - -/// Adds additional things to the MODsuit ui_data() -/obj/item/mod/module/proc/add_ui_data() - return list() - -/// Creates a list of configuring options for this module -/obj/item/mod/module/proc/get_configuration() - return list() - -/// Generates an element of the get_configuration list with a display name, type and value -/obj/item/mod/module/proc/add_ui_configuration(display_name, type, value, list/values) - return list("display_name" = display_name, "type" = type, "value" = value, "values" = values) - -/// Receives configure edits from the TGUI and edits the vars -/obj/item/mod/module/proc/configure_edit(key, value) - return - -/// Called when the device moves to a different place on active modules -/obj/item/mod/module/proc/on_exit(datum/source, atom/movable/part, direction) - SIGNAL_HANDLER - - if(!active) - return - if(part.loc == src) - return - if(part.loc == mod.wearer) - return - if(part == device) - on_deactivation() - -/// Called when the device gets deleted on active modules -/obj/item/mod/module/proc/on_device_deletion(datum/source) - SIGNAL_HANDLER - - if(source == device) - device = null - qdel(src) - -/// Generates an icon to be used for the suit's worn overlays -/obj/item/mod/module/proc/generate_worn_overlay(mutable_appearance/standing) - . = list() - var/used_overlay - if(overlay_state_use && !COOLDOWN_FINISHED(src, cooldown_timer)) - used_overlay = overlay_state_use - else if(overlay_state_active && active) - used_overlay = overlay_state_active - else if(overlay_state_inactive) - used_overlay = overlay_state_inactive - else - return - var/mutable_appearance/module_icon = mutable_appearance('icons/mob/mod.dmi', used_overlay, layer = standing.layer + 0.1) - . += module_icon - -/// Updates the signal used by active modules to be activated -/obj/item/mod/module/proc/update_signal(value) - switch(value) - if(MIDDLE_CLICK) - mod.selected_module.used_signal = COMSIG_MOB_MIDDLECLICKON - if(ALT_CLICK) - mod.selected_module.used_signal = COMSIG_MOB_ALTCLICKON - RegisterSignal(mod.wearer, mod.selected_module.used_signal, /obj/item/mod/module.proc/on_special_click) - icon_state = "magic_nullifier" - removable = FALSE - incompatible_modules = list(/obj/item/mod/module/anti_magic) - /obj/item/mod/module/anti_magic/on_suit_activation() ADD_TRAIT(mod.wearer, TRAIT_ANTIMAGIC, MOD_TRAIT) ADD_TRAIT(mod.wearer, TRAIT_HOLY, MOD_TRAIT) @@ -288,8 +32,8 @@ module_type = MODULE_TOGGLE // complexity = 3 complexity = 0 - active_power_cost = DEFAULT_CELL_DRAIN*0.75 -// use_power_cost = DEFAULT_CELL_DRAIN*3 + active_power_cost = DEFAULT_CHARGE_DRAIN*0.75 +// use_power_cost = DEFAULT_CHARGE_DRAIN*3 removable = FALSE incompatible_modules = list(/obj/item/mod/module/kinesis) cooldown_time = 0.5 SECONDS @@ -324,7 +68,7 @@ incompatible_modules = list(/obj/item/mod/module/insignia) overlay_state_inactive = "insignia" -/obj/item/mod/module/insignia/generate_worn_overlay(mutable_appearance/standing) +/obj/item/mod/module/insignia/generate_worn_overlay() overlay_state_inactive = "[initial(overlay_state_inactive)]-[mod.skin]" . = ..() for(var/mutable_appearance/appearance as anything in .) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm new file mode 100644 index 0000000000..9bd391bd22 --- /dev/null +++ b/code/modules/mod/modules/modules_engineering.dm @@ -0,0 +1,154 @@ +//Engineering modules for MODsuits + +///Welding Protection - Makes the helmet protect from flashes and welding. +/obj/item/mod/module/welding + name = "MOD welding protection module" + desc = "A module installed into the visor of the suit, this projects a \ + polarized, holographic overlay in front of the user's eyes. It's rated high enough for \ + immunity against extremities such as spot and arc welding, solar eclipses, and handheld flashlights." + icon_state = "welding" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/welding) + overlay_state_inactive = "module_welding" + +/obj/item/mod/module/welding/on_suit_activation() + mod.helmet.flash_protect = 2 + +/obj/item/mod/module/welding/on_suit_deactivation(deleting = FALSE) + if(deleting) + return + mod.helmet.flash_protect = initial(mod.helmet.flash_protect) + +///T-Ray Scan - Scans the terrain for undertile objects. +/obj/item/mod/module/t_ray + name = "MOD t-ray scan module" + desc = "A module installed into the visor of the suit, allowing the user to use a pulse of terahertz radiation \ + to essentially echolocate things beneath the floor, mostly cables and pipes. \ + A staple of atmospherics work, and counter-smuggling work." + icon_state = "tray" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/t_ray) + cooldown_time = 0.5 SECONDS + /// T-ray scan range. + var/range = 4 + +/obj/item/mod/module/t_ray/on_active_process(delta_time) + t_ray_scan(mod.wearer, 0.8 SECONDS, range) + +///Magnetic Stability - Gives the user a slowdown but makes them negate gravity and be immune to slips. +/obj/item/mod/module/magboot + name = "MOD magnetic stability module" + desc = "These are powerful electromagnets fitted into the suit's boots, allowing users both \ + excellent traction no matter the condition indoors, and to essentially hitch a ride on the exterior of a hull. \ + However, these basic models do not feature computerized systems to automatically toggle them on and off, \ + so numerous users report a certain stickiness to their steps." + icon_state = "magnet" + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/magboot) + cooldown_time = 0.5 SECONDS + /// Slowdown added onto the suit. + var/slowdown_active = 0.5 + +/obj/item/mod/module/magboot/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + ADD_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown += slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_NEGATES_GRAVITY, MOD_TRAIT) + REMOVE_TRAIT(mod.wearer, TRAIT_NOSLIPWATER, MOD_TRAIT) + mod.slowdown -= slowdown_active + mod.wearer.update_gravity(mod.wearer.has_gravity()) + mod.wearer.update_equipment_speed_mods() + +/obj/item/mod/module/magboot/advanced + name = "MOD advanced magnetic stability module" + removable = FALSE + complexity = 0 + slowdown_active = 0 + +// No tether module, sorry! + +///Radiation Protection - Protects the user from radiation, gives them a geiger counter and rad info in the panel. +/obj/item/mod/module/rad_protection + name = "MOD radiation protection module" + desc = "A module utilizing polymers and reflective shielding to protect the user against ionizing radiation." + icon_state = "radshield" + complexity = 2 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/rad_protection) + +/obj/item/mod/module/rad_protection/on_suit_activation() + for(var/obj/item/part in mod.mod_parts) + armor[RAD] = 65 + rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE + +/obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) + for(var/obj/item/part in mod.mod_parts) + armor[RAD] = 0 + rad_flags = NONE + +///Constructor - Lets you build quicker and create RCD holograms. +/obj/item/mod/module/constructor + name = "MOD constructor module" + desc = "This module entirely occupies the wearer's forearm, notably causing conflict with \ + advanced arm servos meant to carry crewmembers. However, it contains the \ + latest engineering schematics combined with inbuilt memory to help the user build walls." + icon_state = "constructor" + module_type = MODULE_USABLE + complexity = 2 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/constructor, /obj/item/mod/module/quick_carry) + cooldown_time = 11 SECONDS + +/obj/item/mod/module/constructor/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +/obj/item/mod/module/constructor/on_suit_deactivation(deleting = FALSE) + REMOVE_TRAIT(mod.wearer, TRAIT_QUICK_BUILD, MOD_TRAIT) + +///Mister - Sprays water over an area. +/obj/item/mod/module/mister + name = "MOD water mister module" + desc = "A module containing a mister, able to spray it over areas." + icon_state = "mister" + module_type = MODULE_ACTIVE + complexity = 2 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + device = /obj/item/reagent_containers/spray/mister + incompatible_modules = list(/obj/item/mod/module/mister) + cooldown_time = 0.5 SECONDS + /// Volume of our reagent holder. + var/volume = 500 + +/obj/item/mod/module/mister/Initialize(mapload) + create_reagents(volume, OPENCONTAINER) + return ..() + +///Resin Mister - Sprays resin over an area. +/obj/item/mod/module/mister/atmos + name = "MOD resin mister module" + desc = "An atmospheric resin mister, able to fix up areas quickly." + device = /obj/item/extinguisher/mini/nozzle/mod + volume = 250 + +/obj/item/mod/module/mister/atmos/Initialize(mapload) + . = ..() + reagents.add_reagent(/datum/reagent/water, volume) + +/obj/item/extinguisher/mini/nozzle/mod + name = "MOD atmospheric mister" + desc = "An atmospheric resin mister with three modes, mounted as a module." diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm new file mode 100644 index 0000000000..f7f7dfbfb0 --- /dev/null +++ b/code/modules/mod/modules/modules_general.dm @@ -0,0 +1,339 @@ +//General modules for MODsuits + +///Storage - Adds a storage component to the suit. +/obj/item/mod/module/storage + name = "MOD storage containment module" + desc = "What amounts to a series of integrated storage compartments and specialized pockets installed across \ + the surface of the suit, useful for storing various bits, and or bobs." + icon_state = "storage" + complexity = 3 + incompatible_modules = list(/obj/item/mod/module/storage) + module_type = MODULE_USABLE + cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE + /// Bag we have stored. + var/obj/item/storage/backpack/stored + +/obj/item/mod/module/storage/attackby(obj/item/I, mob/user, params) + if(!istype(I, /obj/item/storage/backpack)) + return ..() + var/obj/item/storage/backpack/B = I + if(stored) + balloon_alert(user, "backpack already installed!") + return + if(!user.transferItemToLoc(B, src)) + return + stored = B + balloon_alert(user, "backpack installed") + playsound(src, 'sound/machines/click.ogg', 30, TRUE) + +/obj/item/mod/module/storage/screwdriver_act(mob/living/user, obj/item/tool) + . = ..() + if(!stored) + balloon_alert(user, "no backpack!") + return + balloon_alert(user, "removing backpack...") + if(!do_after(user, 3 SECONDS, target = src)) + balloon_alert(user, "interrupted!") + return + balloon_alert(user, "backpack removed") + stored.forceMove(drop_location()) + if(Adjacent(user) && !issilicon(user)) + user.put_in_hands(stored) + stored = null + +/obj/item/mod/module/storage/on_use() + . = ..() + if(!.) + return + if(!stored) + var/obj/item/storage/backpack/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "no backpack installed!") + return + if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) + stored = holding + balloon_alert(mod.wearer, "backpack stored") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) + balloon_alert(mod.wearer, "backpack retrieved") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else + balloon_alert(mod.wearer, "backpack storage full!") + +/obj/item/mod/module/storage/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored) + stored = null + +/obj/item/mod/module/storage/Destroy() + QDEL_NULL(stored) + return ..() + +/// No Ion Jetpack + +///Eating Apparatus - Lets the user eat/drink with the suit on. +/obj/item/mod/module/mouthhole + name = "MOD eating apparatus module" + desc = "A favorite by Miners, this modification to the helmet utilizes a nanotechnology barrier infront of the mouth \ + to allow eating and drinking while retaining protection and atmosphere. However, it won't free you from masks, \ + lets pepper spray pass through and it will do nothing to improve the taste of a goliath steak." + icon_state = "apparatus" + complexity = 1 + incompatible_modules = list(/obj/item/mod/module/mouthhole) + overlay_state_inactive = "module_apparatus" + /// Former flags of the helmet. + var/former_flags = NONE + /// Former visor flags of the helmet. + var/former_visor_flags = NONE + +/obj/item/mod/module/mouthhole/on_install() + former_flags = mod.helmet.flags_cover + former_visor_flags = mod.helmet.visor_flags_cover + mod.helmet.flags_cover &= ~HEADCOVERSMOUTH + mod.helmet.visor_flags_cover &= ~HEADCOVERSMOUTH + +/obj/item/mod/module/mouthhole/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.helmet.flags_cover |= former_flags + mod.helmet.visor_flags_cover |= former_visor_flags + +///EMP Shield - Protects the suit from EMPs. +/obj/item/mod/module/emp_shield + name = "MOD EMP shield module" + desc = "A field inhibitor installed into the suit, protecting it against feedback such as \ + electromagnetic pulses that would otherwise damage the electronic systems of the suit or it's modules. \ + However, it will take from the suit's power to do so." + icon_state = "empshield" + complexity = 1 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/emp_shield) + +/obj/item/mod/module/emp_shield/on_install() + mod.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/emp_shield/on_uninstall(deleting = FALSE) + mod.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_WIRES|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/emp_shield/advanced + name = "MOD advanced EMP shield module" + desc = "An advanced field inhibitor installed into the suit, protecting it against feedback such as \ + electromagnetic pulses that would otherwise damage the electronic systems of the suit or electronic devices on the wearer, \ + including augmentations. However, it will take from the suit's power to do so." + complexity = 2 + +/obj/item/mod/module/emp_shield/advanced/on_suit_activation() + mod.wearer.AddElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + +/obj/item/mod/module/emp_shield/advanced/on_suit_deactivation(deleting) + mod.wearer.RemoveElement(/datum/element/empprotection, EMP_PROTECT_SELF|EMP_PROTECT_CONTENTS) + +///Flashlight - Gives the suit a customizable flashlight. +/obj/item/mod/module/flashlight + name = "MOD flashlight module" + desc = "A simple pair of configurable flashlights installed on the left and right sides of the helmet, \ + useful for providing light in a variety of ranges and colors. \ + Some survivalists prefer the color green for their illumination, for reasons unknown." + icon_state = "flashlight" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/flashlight) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_light" + light_color = COLOR_WHITE + light_range = 4 + light_power = 1 + /// Charge drain per range amount. + var/base_power = DEFAULT_CHARGE_DRAIN * 0.1 + /// Minimum range we can set. + var/min_range = 2 + /// Maximum range we can set. + var/max_range = 5 + +/obj/item/mod/module/flashlight/on_activation() + . = ..() + if(!.) + return + mod.set_light(light_range, light_power, light_color) + active_power_cost = base_power * light_range + +/obj/item/mod/module/flashlight/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + mod.set_light(0, 0) + +/obj/item/mod/module/flashlight/on_process(delta_time) + active_power_cost = base_power * light_range + return ..() + +/obj/item/mod/module/flashlight/generate_worn_overlay() + . = ..() + if(!active) + return + var/mutable_appearance/light_icon = mutable_appearance(overlay_icon_file, "module_light_on") + light_icon.appearance_flags = RESET_COLOR + light_icon.color = light_color + . += light_icon + +/obj/item/mod/module/flashlight/get_configuration() + . = ..() + .["light_color"] = add_ui_configuration("Light Color", "color", light_color) + .["light_range"] = add_ui_configuration("Light Range", "number", light_range) + +/obj/item/mod/module/flashlight/configure_edit(key, value) + switch(key) + if("light_color") + value = input(usr, "Pick new light color", "Flashlight Color") as color|null + if(!value) + return + var/list/hsl = rgb2hsl(hex2num(copytext(value,2,4)),hex2num(copytext(value,4,6)),hex2num(copytext(value,6,8))) + if(hsl[3] < 0.5) + balloon_alert(mod.wearer, "too dark!") + return + mod.set_light_color(value) + mod.wearer.regenerate_icons() + light_color = value + if("light_range") + mod.set_light_range(clamp(value, min_range, max_range)) + light_range = clamp(value, min_range, max_range) + +///Dispenser - Dispenses an item after a time passes. +/obj/item/mod/module/dispenser + name = "MOD burger dispenser module" + desc = "A rare piece of technology reverse-engineered from a prototype found in a Donk Corporation vessel. \ + This can draw incredible amounts of power from the suit's charge to create edible organic matter in the \ + palm of the wearer's glove; however, research seemed to have entirely stopped at burgers. \ + Notably, all attempts to get it to dispense Earl Grey tea have failed." + icon_state = "dispenser" + module_type = MODULE_USABLE + complexity = 3 + use_power_cost = DEFAULT_CHARGE_DRAIN * 2 + incompatible_modules = list(/obj/item/mod/module/dispenser) + cooldown_time = 5 SECONDS + /// Path we dispense. + var/dispense_type = /obj/item/reagent_containers/food/snacks/burger/plain + /// Time it takes for us to dispense. + var/dispense_time = 0 SECONDS + +/obj/item/mod/module/dispenser/on_use() + . = ..() + if(!.) + return + if(dispense_time && !do_after(mod.wearer, dispense_time, target = mod)) + balloon_alert(mod.wearer, "interrupted!") + return FALSE + var/obj/item/dispensed = new dispense_type(mod.wearer.loc) + mod.wearer.put_in_hands(dispensed) + balloon_alert(mod.wearer, "[dispensed] dispensed") + playsound(src, 'sound/machines/click.ogg', 100, TRUE) + drain_power(use_power_cost) + return dispensed + +///Longfall - Nullifies fall damage, removing charge instead. +/obj/item/mod/module/longfall + name = "MOD longfall module" + desc = "Useful for protecting both the suit and the wearer, \ + utilizing commonplace systems to convert the possible damage from a fall into kinetic charge, \ + as well as internal gyroscopes to ensure the user's safe falling. \ + Useful for mining, monorail tracks, or even skydiving!" + icon_state = "longfall" + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/longfall) + +/obj/item/mod/module/longfall/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT, .proc/z_impact_react) + +/obj/item/mod/module/longfall/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_LIVING_Z_IMPACT) + +/obj/item/mod/module/longfall/proc/z_impact_react(datum/source, levels, turf/fell_on) + if(!drain_power(use_power_cost*levels)) + return + new /obj/effect/temp_visual/mook_dust(fell_on) + mod.wearer.Stun(levels * 1 SECONDS) + to_chat(mod.wearer, span_notice("[src] protects you from the damage!")) + return NO_Z_IMPACT_DAMAGE + +///Thermal Regulator - Naw. + +///DNA Lock - Prevents people without the set DNA from activating the suit. +/obj/item/mod/module/dna_lock + name = "MOD DNA lock module" + desc = "A module which engages with the various locks and seals tied to the suit's systems, \ + enabling it to only be worn by someone corresponding with the user's exact DNA profile; \ + however, this incredibly sensitive module is shorted out by EMPs. Luckily, cloning has been outlawed." + icon_state = "dnalock" + module_type = MODULE_USABLE + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 3 + incompatible_modules = list(/obj/item/mod/module/dna_lock) + cooldown_time = 0.5 SECONDS + /// The DNA we lock with. + var/dna = null + +/obj/item/mod/module/dna_lock/on_install() + RegisterSignal(mod, COMSIG_MOD_ACTIVATE, .proc/on_mod_activation) + RegisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL, .proc/on_mod_removal) + RegisterSignal(mod, COMSIG_ATOM_EMP_ACT, .proc/on_emp) + RegisterSignal(mod, COMSIG_ATOM_EMAG_ACT, .proc/on_emag) + +/obj/item/mod/module/dna_lock/on_uninstall(deleting = FALSE) + UnregisterSignal(mod, COMSIG_MOD_ACTIVATE) + UnregisterSignal(mod, COMSIG_MOD_MODULE_REMOVAL) + UnregisterSignal(mod, COMSIG_ATOM_EMP_ACT) + UnregisterSignal(mod, COMSIG_ATOM_EMAG_ACT) + +/obj/item/mod/module/dna_lock/on_use() + . = ..() + if(!.) + return + dna = mod.wearer.dna.unique_enzymes + balloon_alert(mod.wearer, "dna updated") + drain_power(use_power_cost) + +/obj/item/mod/module/dna_lock/emp_act(severity) + . = ..() + if(. & EMP_PROTECT_SELF) + return + on_emp(src, severity) + +/obj/item/mod/module/dna_lock/emag_act(mob/user, obj/item/card/emag/emag_card) + . = ..() + on_emag(src, user, emag_card) + +/obj/item/mod/module/dna_lock/proc/dna_check(mob/user) + if(!iscarbon(user)) + return FALSE + var/mob/living/carbon/carbon_user = user + if(!dna || (carbon_user.has_dna() && carbon_user.dna.unique_enzymes == dna)) + return TRUE + balloon_alert(user, "dna locked!") + return FALSE + +/obj/item/mod/module/dna_lock/proc/on_emp(datum/source, severity) + SIGNAL_HANDLER + + dna = null + +/obj/item/mod/module/dna_lock/proc/on_emag(datum/source, mob/user, obj/item/card/emag/emag_card) + SIGNAL_HANDLER + + dna = null + +/obj/item/mod/module/dna_lock/proc/on_mod_activation(datum/source, mob/user) + SIGNAL_HANDLER + + if(!dna_check(user)) + return MOD_CANCEL_ACTIVATE + +/obj/item/mod/module/dna_lock/proc/on_mod_removal(datum/source, mob/user) + SIGNAL_HANDLER + + if(!dna_check(user)) + return MOD_CANCEL_REMOVAL + +///Sign Language Translator - I want, but no diff --git a/code/modules/mod/modules/modules_maint.dm b/code/modules/mod/modules/modules_maint.dm new file mode 100644 index 0000000000..9252ed7ce8 --- /dev/null +++ b/code/modules/mod/modules/modules_maint.dm @@ -0,0 +1,101 @@ +//Maint modules for MODsuits + +///Springlock Mechanism - Nope + +///Rave Visor - Pointless + +///Tanner - Maybe another time + +///Balloon Blower - Blows a balloon. +/obj/item/mod/module/balloon + name = "MOD balloon blower module" + desc = "A strange module invented years ago by some ingenious mimes. It blows balloons." + icon_state = "bloon" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/balloon) + cooldown_time = 15 SECONDS + +/obj/item/mod/module/balloon/on_use() + . = ..() + if(!.) + return + if(!do_after(mod.wearer, 10 SECONDS, target = mod)) + return FALSE + mod.wearer.adjustOxyLoss(20) + playsound(src, 'sound/items/modsuit/inflate_bloon.ogg', 50, TRUE) + var/obj/item/toy/balloon/balloon = new(get_turf(src)) + mod.wearer.put_in_hands(balloon) + drain_power(use_power_cost) + +///Paper Dispenser - Dispenses (sometimes burning) paper sheets. +/obj/item/mod/module/paper_dispenser + name = "MOD paper dispenser module" + desc = "A simple module designed by the bureaucrats of Torch Bay. \ + It dispenses 'warm, clean, and crisp sheets of paper' onto a nearby table. Usually." + icon_state = "paper_maker" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/paper_dispenser) + cooldown_time = 5 SECONDS + /// The total number of sheets created by this MOD. The more sheets, them more likely they set on fire. + var/num_sheets_dispensed = 0 + +/obj/item/mod/module/paper_dispenser/on_use() + . = ..() + if(!.) + return + if(!do_after(mod.wearer, 1 SECONDS, target = mod)) + return FALSE + + var/obj/item/paper/crisp_paper = new(get_turf(src)) + crisp_paper.desc = "It's crisp and warm to the touch. Must be fresh." + + var/obj/structure/table/nearby_table = locate() in range(1, mod.wearer) + playsound(get_turf(src), 'sound/machines/click.ogg', 50, TRUE) + balloon_alert(mod.wearer, "dispensed paper[nearby_table ? " onto table":""]") + + mod.wearer.put_in_hands(crisp_paper) + if(nearby_table) + mod.wearer.transferItemToLoc(crisp_paper, nearby_table.drop_location(), silent = FALSE) + + // Up to a 30% chance to set the sheet on fire, +2% per sheet made + if(prob(min(num_sheets_dispensed * 2, 30))) + if(crisp_paper in mod.wearer.held_items) + mod.wearer.dropItemToGround(crisp_paper, force = TRUE) + crisp_paper.balloon_alert(mod.wearer, "PC LOAD LETTER!") + crisp_paper.visible_message(span_warning("[crisp_paper] bursts into flames, it's too crisp!")) + crisp_paper.fire_act(1000, 100) + + drain_power(use_power_cost) + num_sheets_dispensed++ + + +///Stamper - Extends a stamp that can switch between accept/deny modes. +/obj/item/mod/module/stamp + name = "MOD stamper module" + desc = "A module installed into the wrist of the suit, this functions as a high-power stamp, \ + able to switch between accept and deny modes." + icon_state = "stamp" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + device = /obj/item/stamp/mod + incompatible_modules = list(/obj/item/mod/module/stamp) + cooldown_time = 0.5 SECONDS + +/obj/item/stamp/mod + name = "MOD electronic stamp" + desc = "A high-power stamp, able to switch between accept and deny mode when used." + +/obj/item/stamp/mod/attack_self(mob/user, modifiers) + . = ..() + if(icon_state == "stamp-ok") + icon_state = "stamp-deny" + else + icon_state = "stamp-ok" + balloon_alert(user, "switched mode") + +///Atrocinator - Perhaps another time diff --git a/code/modules/mod/modules/modules_medical.dm b/code/modules/mod/modules/modules_medical.dm new file mode 100644 index 0000000000..974e7e31ad --- /dev/null +++ b/code/modules/mod/modules/modules_medical.dm @@ -0,0 +1,208 @@ +//Medical modules for MODsuits + +#define HEALTH_SCAN "Health" +#define WOUND_SCAN "Wound" +#define CHEM_SCAN "Chemical" + +///Health Analyzer - Gives the user a ranged health analyzer and their health status in the panel. +/obj/item/mod/module/health_analyzer + name = "MOD health analyzer module" + desc = "A module installed into the glove of the suit. This is a high-tech biological scanning suite, \ + allowing the user indepth information on the vitals and injuries of others even at a distance, \ + all with the flick of the wrist. Data is displayed in a convenient package on HUD in the helmet, \ + but it's up to you to do something with it." + icon_state = "health" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/health_analyzer) + cooldown_time = 0.5 SECONDS + tgui_id = "health_analyzer" + /// Scanning mode, changes how we scan something. + var/mode = HEALTH_SCAN + /// List of all scanning modes. + var/static/list/modes = list(HEALTH_SCAN, WOUND_SCAN, CHEM_SCAN) + +/obj/item/mod/module/health_analyzer/add_ui_data() + . = ..() + .["userhealth"] = mod.wearer?.health || 0 + .["usermaxhealth"] = mod.wearer?.getMaxHealth() || 0 + .["userbrute"] = mod.wearer?.getBruteLoss() || 0 + .["userburn"] = mod.wearer?.getFireLoss() || 0 + .["usertoxin"] = mod.wearer?.getToxLoss() || 0 + .["useroxy"] = mod.wearer?.getOxyLoss() || 0 + +/obj/item/mod/module/health_analyzer/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!isliving(target) || !mod.wearer.can_read(src)) + return + switch(mode) + if(HEALTH_SCAN) + healthscan(mod.wearer, target) + if(WOUND_SCAN) + woundscan(mod.wearer, target) + if(CHEM_SCAN) + chemscan(mod.wearer, target) + drain_power(use_power_cost) + +/obj/item/mod/module/health_analyzer/get_configuration() + . = ..() + .["mode"] = add_ui_configuration("Scan Mode", "list", mode, modes) + +/obj/item/mod/module/health_analyzer/configure_edit(key, value) + switch(key) + if("mode") + mode = value + +#undef HEALTH_SCAN +#undef WOUND_SCAN +#undef CHEM_SCAN + +///Quick Carry - Lets the user carry bodies quicker. +/obj/item/mod/module/quick_carry + name = "MOD quick carry module" + desc = "A suite of advanced servos, redirecting power from the suit's arms to help carry the wounded; \ + or simply for fun. However, Nanotrasen has locked the module's ability to assist in hand-to-hand combat." + icon_state = "carry" + complexity = 1 + idle_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/quick_carry, /obj/item/mod/module/constructor) + +/obj/item/mod/module/quick_carry/on_suit_activation() + ADD_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/on_suit_deactivation(deleting = FALSE) + REMOVE_TRAIT(mod.wearer, TRAIT_QUICKER_CARRY, MOD_TRAIT) + +/obj/item/mod/module/quick_carry/advanced + name = "MOD advanced quick carry module" + removable = FALSE + complexity = 0 + +///Injector - Gives the suit an extendable large-capacity piercing syringe. +/obj/item/mod/module/injector + name = "MOD injector module" + desc = "A module installed into the wrist of the suit, this functions as a high-capacity syringe, \ + with a tip fine enough to locate the emergency injection ports on any suit of armor, \ + penetrating it with ease. Even yours." + icon_state = "injector" + module_type = MODULE_ACTIVE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + device = /obj/item/reagent_containers/syringe/mod + incompatible_modules = list(/obj/item/mod/module/injector) + cooldown_time = 0.5 SECONDS + +/obj/item/reagent_containers/syringe/mod + name = "MOD injector syringe" + desc = "A high-capacity syringe, with a tip fine enough to locate \ + the emergency injection ports on any suit of armor, penetrating it with ease. Even yours." + icon_state = "mod_0" + base_icon_state = "mod" + amount_per_transfer_from_this = 30 + possible_transfer_amounts = list(5, 10, 15, 20, 30) + volume = 30 + proj_piercing = 1 + +///Organ Thrower + +///Patrient Transport + +///Defibrillator - Gives the suit an extendable pair of shock paddles. +/obj/item/mod/module/defibrillator + name = "MOD defibrillator module" + desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \ + The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \ + and a modded targeting computer determines the best position for the user to push. \ + Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \ + and counter-shock the heart, and the wearer returns to Medical a hero. Don't you even think about using it as a weapon; \ + regulations on manufacture and software locks expressly forbid it." + icon_state = "defibrillator" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 25 + device = /obj/item/shockpaddles/mod + overlay_state_inactive = "module_defibrillator" + overlay_state_active = "module_defibrillator_active" + incompatible_modules = list(/obj/item/mod/module/defibrillator) + cooldown_time = 0.5 SECONDS + var/defib_cooldown = 5 SECONDS + +/obj/item/mod/module/defibrillator/Initialize(mapload) + . = ..() + RegisterSignal(device, COMSIG_DEFIBRILLATOR_SUCCESS, .proc/on_defib_success) + +/obj/item/mod/module/defibrillator/proc/on_defib_success(obj/item/shockpaddles/source) + drain_power(use_power_cost) + source.recharge(defib_cooldown) + return COMPONENT_DEFIB_STOP + +/obj/item/shockpaddles/mod + name = "MOD defibrillator gauntlets" + req_defib = FALSE + icon_state = "defibgauntlets0" + item_state = "defibgauntlets0" + base_icon_state = "defibgauntlets" + +/obj/item/mod/module/defibrillator/combat + name = "MOD combat defibrillator module" + desc = "A module built into the gauntlets of the suit; commonly known as the 'Healing Hands' by medical professionals. \ + The user places their palms above the patient. Onboard computers in the suit calculate the necessary voltage, \ + and a modded targeting computer determines the best position for the user to push. \ + Twenty five pounds of force are applied to the patient's skin. Shocks travel from the suit's gloves \ + and counter-shock the heart, and the wearer returns to Medical a hero. \ + Interdyne Pharmaceutics marketed the domestic version of the Healing Hands as foolproof and unusable as a weapon. \ + But when it came time to provide their operatives with usable medical equipment, they didn't hesitate to remove \ + those in-built safeties. Operatives in the field can benefit from what they dub as 'Stun Gloves', able to apply shocks \ + straight to a victims heart to disable them, or maybe even outright stop their heart with enough power." + complexity = 1 + module_type = MODULE_ACTIVE + overlay_state_inactive = "module_defibrillator_combat" + overlay_state_active = "module_defibrillator_combat_active" + device = /obj/item/shockpaddles/syndicate/mod + defib_cooldown = 2.5 SECONDS + +/obj/item/shockpaddles/syndicate/mod + name = "MOD combat defibrillator gauntlets" + req_defib = FALSE + icon_state = "syndiegauntlets0" + item_state = "syndiegauntlets0" + base_icon_state = "syndiegauntlets" + +///Thread Ripper + +///Surgical Processor - Lets you do advanced surgeries portably. +/obj/item/mod/module/surgical_processor + name = "MOD surgical processor module" + desc = "A module using an onboard surgical computer which can be connected to other computers to download and \ + perform advanced surgeries on the go." + icon_state = "surgical_processor" + module_type = MODULE_ACTIVE + complexity = 2 + active_power_cost = DEFAULT_CHARGE_DRAIN + device = /obj/item/surgical_processor/mod + incompatible_modules = list(/obj/item/mod/module/surgical_processor) + cooldown_time = 0.5 SECONDS + +/obj/item/surgical_processor/mod + name = "MOD surgical processor" + +/obj/item/mod/module/surgical_processor/preloaded + desc = "A module using an onboard surgical computer which can be connected to other computers to download and \ + perform advanced surgeries on the go. This one came pre-loaded with some advanced surgeries." + device = /obj/item/surgical_processor/mod/preloaded + +/obj/item/surgical_processor/mod/preloaded + advanced_surgeries = list( + /datum/surgery/advanced/pacify, + /datum/surgery/healing/combo/upgraded/femto, + /datum/surgery/advanced/brainwashing, + /datum/surgery/advanced/bioware/nerve_splicing, + /datum/surgery/advanced/bioware/nerve_grounding, + /datum/surgery/advanced/bioware/vein_threading, + /datum/surgery/advanced/bioware/muscled_veins, + /datum/surgery/advanced/bioware/ligament_hook, + /datum/surgery/advanced/bioware/ligament_reinforcement + ) diff --git a/code/modules/mod/modules/modules_science.dm b/code/modules/mod/modules/modules_science.dm new file mode 100644 index 0000000000..7208210b76 --- /dev/null +++ b/code/modules/mod/modules/modules_science.dm @@ -0,0 +1,135 @@ +//Science modules for MODsuits + +///Reagent Scanner - Lets the user scan reagents. +/obj/item/mod/module/reagent_scanner + name = "MOD reagent scanner module" + desc = "A module based off research-oriented Nanotrasen HUDs, this is capable of scanning the contents of \ + containers and projecting the information in an easy-to-read format on the wearer's display. \ + It cannot detect flavors, so that's up to you." + icon_state = "scanner" + module_type = MODULE_TOGGLE + complexity = 1 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/reagent_scanner) + cooldown_time = 0.5 SECONDS + +/obj/item/mod/module/reagent_scanner/on_activation() + . = ..() + if(!.) + return + ADD_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + REMOVE_TRAIT(mod.wearer, TRAIT_REAGENT_SCANNER, MOD_TRAIT) + +/obj/item/mod/module/reagent_scanner/advanced + name = "MOD advanced reagent scanner module" + complexity = 0 + removable = FALSE + var/explosion_detection_dist = 21 + var/had_research_scanner = FALSE + +/obj/item/mod/module/reagent_scanner/advanced/on_activation() + . = ..() + if(!.) + return + had_research_scanner = mod.wearer.research_scanner + mod.wearer.research_scanner = TRUE + RegisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION, .proc/sense_explosion) + +/obj/item/mod/module/reagent_scanner/advanced/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + mod.wearer.research_scanner = had_research_scanner + had_research_scanner = FALSE + UnregisterSignal(SSdcs, COMSIG_GLOB_EXPLOSION) + +/obj/item/mod/module/reagent_scanner/advanced/proc/sense_explosion(datum/source, turf/epicenter, + devastation_range, heavy_impact_range, light_impact_range, took, orig_dev_range, orig_heavy_range, orig_light_range) + SIGNAL_HANDLER + var/turf/wearer_turf = get_turf(mod.wearer) + if(wearer_turf.z == epicenter.z) + return + if(get_dist(epicenter, wearer_turf) > explosion_detection_dist) + return + to_chat(mod.wearer, span_notice("Explosion detected! Epicenter: [devastation_range], Outer: [heavy_impact_range], Shock: [light_impact_range]")) + +///Anti-Gravity - Makes the user weightless. +/obj/item/mod/module/anomaly_locked/antigrav + name = "MOD anti-gravity module" + desc = "A module that uses a gravitational core to make the user completely weightless." + icon_state = "antigrav" + module_type = MODULE_TOGGLE + complexity = 3 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.7 + incompatible_modules = list(/obj/item/mod/module/anomaly_locked) + cooldown_time = 0.5 SECONDS + accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/grav) + +/obj/item/mod/module/anomaly_locked/antigrav/on_activation() + . = ..() + if(!.) + return + if(mod.wearer.has_gravity()) + new /obj/effect/temp_visual/mook_dust(get_turf(src)) + mod.wearer.AddElement(/datum/element/forced_gravity, 0) + mod.wearer.update_gravity(mod.wearer.has_gravity()) + playsound(src, 'sound/effects/gravhit.ogg', 50) + +/obj/item/mod/module/anomaly_locked/antigrav/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + mod.wearer.RemoveElement(/datum/element/forced_gravity, 0) + mod.wearer.update_gravity(mod.wearer.has_gravity()) + if(deleting) + return + if(mod.wearer.has_gravity()) + new /obj/effect/temp_visual/mook_dust(get_turf(src)) + playsound(src, 'sound/effects/gravhit.ogg', 50) + +/obj/item/mod/module/anomaly_locked/antigrav/prebuilt + prebuilt = TRUE + +///Teleporter - Lets the user teleport to a nearby location. +/obj/item/mod/module/anomaly_locked/teleporter + name = "MOD teleporter module" + desc = "A module that uses a bluespace core to let the user transport their particles elsewhere." + icon_state = "teleporter" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + cooldown_time = 5 SECONDS + accepted_anomalies = list(/obj/item/assembly/signaler/anomaly/bluespace) + /// Time it takes to teleport + var/teleport_time = 3 SECONDS + +/obj/item/mod/module/anomaly_locked/teleporter/on_select_use(atom/target) + . = ..() + if(!.) + return + var/turf/open/target_turf = get_turf(target) + if(!istype(target_turf) || is_blocked_turf(target_turf) || !(target_turf in view(mod.wearer))) + balloon_alert(mod.wearer, "invalid target!") + return + balloon_alert(mod.wearer, "teleporting...") + var/matrix/pre_matrix = matrix() + pre_matrix.Scale(4, 0.25) + var/matrix/post_matrix = matrix() + post_matrix.Scale(0.25, 4) + animate(mod.wearer, teleport_time, color = COLOR_CYAN, transform = pre_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_OUT) + if(!do_after(mod.wearer, teleport_time, target = mod)) + balloon_alert(mod.wearer, "interrupted!") + animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) + return + animate(mod.wearer, teleport_time*0.1, color = null, transform = post_matrix.Multiply(mod.wearer.transform), easing = SINE_EASING|EASE_IN) + if(!do_teleport(mod.wearer, target_turf, asoundin = 'sound/effects/phasein.ogg')) + return + drain_power(use_power_cost) + +/obj/item/mod/module/anomaly_locked/teleporter/prebuilt + prebuilt = TRUE diff --git a/code/modules/mod/modules/modules_security.dm b/code/modules/mod/modules/modules_security.dm new file mode 100644 index 0000000000..098abf8015 --- /dev/null +++ b/code/modules/mod/modules/modules_security.dm @@ -0,0 +1,207 @@ +//Security modules for MODsuits + +///Cloaking - Lowers the user's visibility, can be interrupted by being touched or attacked. +/obj/item/mod/module/stealth + name = "MOD prototype cloaking module" + desc = "A complete retrofitting of the suit, this is a form of visual concealment tech employing esoteric technology \ + to bend light around the user, as well as mimetic materials to make the surface of the suit match the \ + surroundings based off sensor data. For some reason, this tech is rarely seen." + icon_state = "cloak" + module_type = MODULE_TOGGLE + complexity = 4 + active_power_cost = DEFAULT_CHARGE_DRAIN * 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 10 + incompatible_modules = list(/obj/item/mod/module/stealth) + cooldown_time = 5 SECONDS + /// Whether or not the cloak turns off on bumping. + var/bumpoff = TRUE + /// The alpha applied when the cloak is on. + var/stealth_alpha = 50 + +/obj/item/mod/module/stealth/on_activation() + . = ..() + if(!.) + return + if(bumpoff) + RegisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP, .proc/unstealth) + RegisterSignal(mod.wearer, COMSIG_HUMAN_MELEE_UNARMED_ATTACK, .proc/on_unarmed_attack) + RegisterSignal(mod.wearer, COMSIG_ATOM_BULLET_ACT, .proc/on_bullet_act) + RegisterSignal(mod.wearer, list(COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW), .proc/unstealth) + animate(mod.wearer, alpha = stealth_alpha, time = 1.5 SECONDS) + drain_power(use_power_cost) + +/obj/item/mod/module/stealth/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + if(bumpoff) + UnregisterSignal(mod.wearer, COMSIG_LIVING_MOB_BUMP) + UnregisterSignal(mod.wearer, list(COMSIG_HUMAN_MELEE_UNARMED_ATTACK, COMSIG_MOB_ITEM_ATTACK, COMSIG_PARENT_ATTACKBY, COMSIG_ATOM_ATTACK_HAND, COMSIG_ATOM_BULLET_ACT, COMSIG_ATOM_HULK_ATTACK, COMSIG_ATOM_ATTACK_PAW)) + animate(mod.wearer, alpha = 255, time = 1.5 SECONDS) + +/obj/item/mod/module/stealth/proc/unstealth(datum/source) + SIGNAL_HANDLER + + to_chat(mod.wearer, span_warning("[src] gets discharged from contact!")) + do_sparks(2, TRUE, src) + drain_power(use_power_cost) + on_deactivation(display_message = TRUE, deleting = FALSE) + +/obj/item/mod/module/stealth/proc/on_unarmed_attack(datum/source, atom/target) + SIGNAL_HANDLER + + if(!isliving(target)) + return + unstealth(source) + +/obj/item/mod/module/stealth/proc/on_bullet_act(datum/source, obj/item/projectile/projectile) + SIGNAL_HANDLER + + if(projectile.nodamage) + return + unstealth(source) + +///Magnetic Harness - Automatically puts guns in your suit storage when you drop them. +/obj/item/mod/module/magnetic_harness + name = "MOD magnetic harness module" + desc = "Based off old TerraGov harness kits, this magnetic harness automatically attaches dropped guns back to the wearer." + icon_state = "mag_harness" + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/magnetic_harness) + /// Time before we activate the magnet. + var/magnet_delay = 0.8 SECONDS + /// The typecache of all guns we allow. + var/static/list/guns_typecache + /// The guns already allowed by the modsuit chestplate. + var/list/already_allowed_guns = list() + +/obj/item/mod/module/magnetic_harness/Initialize(mapload) + . = ..() + if(!guns_typecache) + guns_typecache = typecacheof(list(/obj/item/gun/ballistic, /obj/item/gun/energy, /obj/item/gun/grenadelauncher, /obj/item/gun/chem, /obj/item/gun/syringe)) + +/obj/item/mod/module/magnetic_harness/on_install() + already_allowed_guns = guns_typecache & mod.chestplate.allowed + mod.chestplate.allowed |= guns_typecache + +/obj/item/mod/module/magnetic_harness/on_uninstall(deleting = FALSE) + if(deleting) + return + mod.chestplate.allowed -= (guns_typecache - already_allowed_guns) + +/obj/item/mod/module/magnetic_harness/on_suit_activation() + RegisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM, .proc/check_dropped_item) + +/obj/item/mod/module/magnetic_harness/on_suit_deactivation(deleting = FALSE) + UnregisterSignal(mod.wearer, COMSIG_MOB_UNEQUIPPED_ITEM) + +/obj/item/mod/module/magnetic_harness/proc/check_dropped_item(datum/source, obj/item/dropped_item, force, new_location) + SIGNAL_HANDLER + + if(!is_type_in_typecache(dropped_item, guns_typecache)) + return + if(new_location != get_turf(src)) + return + addtimer(CALLBACK(src, .proc/pick_up_item, dropped_item), magnet_delay) + +/obj/item/mod/module/magnetic_harness/proc/pick_up_item(obj/item/item) + if(!isturf(item.loc) || !item.Adjacent(mod.wearer)) + return + if(!mod.wearer.equip_to_slot_if_possible(item, ITEM_SLOT_SUITSTORE, qdel_on_fail = FALSE, disable_warning = TRUE)) + return + playsound(src, 'sound/items/modsuit/magnetic_harness.ogg', 50, TRUE) + balloon_alert(mod.wearer, "[item] reattached") + drain_power(use_power_cost) + +///Pepper Shoulders + +///Holster - Instantly holsters any not huge gun. +/obj/item/mod/module/holster + name = "MOD holster module" + desc = "Based off typical storage compartments, this system allows the suit to holster a \ + standard firearm across its surface and allow for extremely quick retrieval. \ + While some users prefer the chest, others the forearm for quick deployment, \ + some law enforcement prefer the holster to extend from the thigh." + icon_state = "holster" + module_type = MODULE_USABLE + complexity = 2 + incompatible_modules = list(/obj/item/mod/module/holster) + cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE + /// Gun we have holstered. + var/obj/item/gun/holstered + +/obj/item/mod/module/holster/on_use() + . = ..() + if(!.) + return + if(!holstered) + var/obj/item/gun/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "nothing to holster!") + return + if(!istype(holding) || holding.w_class > WEIGHT_CLASS_BULKY) + balloon_alert(mod.wearer, "it doesn't fit!") + return + if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) + holstered = holding + balloon_alert(mod.wearer, "weapon holstered") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else if(mod.wearer.put_in_active_hand(holstered, forced = FALSE, ignore_animation = TRUE)) + balloon_alert(mod.wearer, "weapon drawn") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else + balloon_alert(mod.wearer, "holster full!") + +/obj/item/mod/module/holster/on_uninstall(deleting = FALSE) + if(holstered) + holstered.forceMove(drop_location()) + +/obj/item/mod/module/holster/Exited(atom/movable/gone, direction) + . = ..() + if(gone == holstered) + holstered = null + +/obj/item/mod/module/holster/Destroy() + QDEL_NULL(holstered) + return ..() + +///Megaphone - Lets you speak loud. +/obj/item/mod/module/megaphone + name = "MOD megaphone module" + desc = "A microchip megaphone linked to a MODsuit, for very important purposes, like: loudness." + icon_state = "megaphone" + module_type = MODULE_TOGGLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.5 + incompatible_modules = list(/obj/item/mod/module/megaphone) + cooldown_time = 0.5 SECONDS + /// List of spans we add to the speaker. + var/list/voicespan = list(SPAN_COMMAND) + +/obj/item/mod/module/megaphone/on_activation() + . = ..() + if(!.) + return + RegisterSignal(mod.wearer, COMSIG_MOB_SAY, .proc/handle_speech) + +/obj/item/mod/module/megaphone/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + UnregisterSignal(mod.wearer, COMSIG_MOB_SAY) + +/obj/item/mod/module/megaphone/proc/handle_speech(datum/source, list/speech_args) + SIGNAL_HANDLER + + speech_args[SPEECH_SPANS] |= voicespan + drain_power(use_power_cost) + +///Criminal Capture + +///Mirage grenade dispenser + +///Projectile Dampener + +///Active Sonar diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm new file mode 100644 index 0000000000..cb3c45946f --- /dev/null +++ b/code/modules/mod/modules/modules_service.dm @@ -0,0 +1,65 @@ +//Service modules for MODsuits + +///Bike Horn - Plays a bike horn sound. +/obj/item/mod/module/bikehorn + name = "MOD bike horn module" + desc = "A shoulder-mounted piece of heavy sonic artillery, this module uses the finest femto-manipulator technology to \ + precisely deliver an almost lethal squeeze to... a bike horn, producing a significantly memorable sound." + icon_state = "bikehorn" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/bikehorn) + cooldown_time = 1 SECONDS + +/obj/item/mod/module/bikehorn/on_use() + . = ..() + if(!.) + return + playsound(src, 'sound/items/bikehorn.ogg', 100, FALSE) + drain_power(use_power_cost) + +///Microwave Beam - Microwaves items instantly. +/obj/item/mod/module/microwave_beam + name = "MOD microwave beam module" + desc = "An oddly domestic device, this module is installed into the user's palm, \ + hooking up with culinary scanners located in the helmet to blast food with precise microwave radiation, \ + allowing them to cook food from a distance, with the greatest of ease. Not recommended for use against grapes." + icon_state = "microwave_beam" + module_type = MODULE_ACTIVE + complexity = 2 + use_power_cost = DEFAULT_CHARGE_DRAIN * 5 + incompatible_modules = list(/obj/item/mod/module/microwave_beam) + cooldown_time = 10 SECONDS + var/obj/machinery/microwave/microwave + +/obj/item/mod/module/microwave_beam/Initialize(mapload) + microwave = new() + . = ..() + +/obj/item/mod/module/microwave_beam/Destroy() + QDEL_NULL(microwave) + . = ..() + +/obj/item/mod/module/microwave_beam/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!isitem(target)) + return + if(!isturf(target.loc)) + balloon_alert(mod.wearer, "must be on the floor!") + return + var/obj/item/microwave_target = target + var/datum/effect_system/spark_spread/spark_effect = new() + spark_effect.set_up(2, 1, mod.wearer) + spark_effect.start() + mod.wearer.Beam(target,icon_state="lightning[rand(1,12)]", time = 5) + if(microwave_target.microwave_act(microwave)) + playsound(src, 'sound/machines/microwave/microwave-end.ogg', 50, FALSE) + else + balloon_alert(mod.wearer, "can't be microwaved!") + var/datum/effect_system/spark_spread/spark_effect_two = new() + spark_effect_two.set_up(2, 1, microwave_target) + spark_effect_two.start() + drain_power(use_power_cost) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm new file mode 100644 index 0000000000..7f0db2709c --- /dev/null +++ b/code/modules/mod/modules/modules_supply.dm @@ -0,0 +1,174 @@ +//Supply modules for MODsuits + +///Internal GPS - Extends a GPS you can use. +/obj/item/mod/module/gps + name = "MOD internal GPS module" + desc = "This module uses common Nanotrasen technology to calculate the user's position anywhere in space, \ + down to the exact coordinates. This information is fed to a central database viewable from the device itself, \ + though using it to help people is up to you." + icon_state = "gps" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/gps) + cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE + +/obj/item/mod/module/gps/Initialize(mapload) + . = ..() + AddComponent(/datum/component/gps/item, "MOD0", state = GLOB.deep_inventory_state, overlay_state = FALSE) + +/obj/item/mod/module/gps/on_use() + . = ..() + if(!.) + return + attack_self(mod.wearer) + +///Hydraulic Clamp - Lets you pick up and drop crates. +/obj/item/mod/module/clamp + name = "MOD hydraulic clamp module" + desc = "A series of actuators installed into both arms of the suit, boasting a lifting capacity of almost a ton. \ + However, this design has been locked by Nanotrasen to be primarily utilized for lifting various crates. \ + A lot of people would say that loading cargo is a dull job, but you could not disagree more." + icon_state = "clamp" + module_type = MODULE_ACTIVE + complexity = 3 + use_power_cost = DEFAULT_CHARGE_DRAIN + incompatible_modules = list(/obj/item/mod/module/clamp) + cooldown_time = 0.5 SECONDS + overlay_state_inactive = "module_clamp" + overlay_state_active = "module_clamp_on" + /// Time it takes to load a crate. + var/load_time = 3 SECONDS + /// The max amount of crates you can carry. + var/max_crates = 3 + /// The crates stored in the module. + var/list/stored_crates = list() + +/obj/item/mod/module/clamp/on_select_use(atom/target) + . = ..() + if(!.) + return + if(!mod.wearer.Adjacent(target)) + return + if(istype(target, /obj/structure/closet/crate) || istype(target, /obj/structure/bigDelivery)) + var/atom/movable/picked_crate = target + if(!check_crate_pickup(picked_crate)) + return + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + if(!do_after(mod.wearer, load_time, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + if(!check_crate_pickup(picked_crate)) + return + stored_crates += picked_crate + picked_crate.forceMove(src) + balloon_alert(mod.wearer, "picked up [picked_crate]") + drain_power(use_power_cost) + else if(length(stored_crates)) + var/turf/target_turf = get_turf(target) + if(is_blocked_turf(target_turf)) + return + playsound(src, 'sound/mecha/hydraulic.ogg', 25, TRUE) + if(!do_after(mod.wearer, load_time, target = target)) + balloon_alert(mod.wearer, "interrupted!") + return + if(is_blocked_turf(target_turf)) + return + var/atom/movable/dropped_crate = pop(stored_crates) + dropped_crate.forceMove(target_turf) + balloon_alert(mod.wearer, "dropped [dropped_crate]") + drain_power(use_power_cost) + else + balloon_alert(mod.wearer, "invalid target!") + +/obj/item/mod/module/clamp/on_suit_deactivation(deleting = FALSE) + if(deleting) + return + for(var/atom/movable/crate as anything in stored_crates) + crate.forceMove(drop_location()) + stored_crates -= crate + +/obj/item/mod/module/clamp/proc/check_crate_pickup(atom/movable/target) + if(length(stored_crates) >= max_crates) + balloon_alert(mod.wearer, "too many crates!") + return FALSE + for(var/mob/living/mob in target.GetAllContents()) + if(mob.mob_size < MOB_SIZE_HUMAN) + continue + balloon_alert(mod.wearer, "crate too heavy!") + return FALSE + return TRUE + +/obj/item/mod/module/clamp/loader + name = "MOD loader hydraulic clamp module" + icon_state = "clamp_loader" + complexity = 0 + removable = FALSE + overlay_state_inactive = null + overlay_state_active = "module_clamp_loader" + load_time = 1 SECONDS + max_crates = 5 + use_mod_colors = TRUE + +///Drill - Lets you dig through rock and basalt. +/obj/item/mod/module/drill // TODO: Would be cooler with a built-in drill, but meh + name = "MOD pickaxe/drill storage module" + desc = "Provides a convenient storage compartment for pickaxes and drills." + icon_state = "drill" + complexity = 2 + incompatible_modules = list(/obj/item/mod/module/drill) + cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE + module_type = MODULE_USABLE + /// Pickaxe we have stored. + var/obj/item/pickaxe/stored + +/obj/item/mod/module/drill/on_use() + . = ..() + if(!.) + return + if(!stored) + var/obj/item/pickaxe/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "nothing to store!") + return + if(!istype(holding)) + balloon_alert(mod.wearer, "it doesn't fit!") + return + if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) + stored = holding + balloon_alert(mod.wearer, "mining instrument stored") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) + balloon_alert(mod.wearer, "mining instrument retrieved") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else + balloon_alert(mod.wearer, "mining instrument storage full!") + +/obj/item/mod/module/drill/on_uninstall(deleting = FALSE) + if(stored) + stored.forceMove(drop_location()) + +/obj/item/mod/module/drill/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored) + stored = null + +/obj/item/mod/module/drill/Destroy() + QDEL_NULL(stored) + return ..() + +/obj/item/mod/module/orebag // TODO + name = "MOD mining satchel storage module" + desc = "Provides a convenient storage department for a mining satchel." + icon_state = "ore" + module_type = MODULE_USABLE + complexity = 1 + use_power_cost = DEFAULT_CHARGE_DRAIN * 0.2 + incompatible_modules = list(/obj/item/mod/module/orebag) + cooldown_time = 0.5 SECONDS + allowed_inactive = TRUE + +// Ash accretion looks cool, but can't be arsed to implement +// Same with sphere transformation diff --git a/code/modules/mod/modules/modules_visor.dm b/code/modules/mod/modules/modules_visor.dm new file mode 100644 index 0000000000..0e44900a46 --- /dev/null +++ b/code/modules/mod/modules/modules_visor.dm @@ -0,0 +1,91 @@ +//Visor modules for MODsuits + +///Base Visor - Adds a specific HUD and traits to you. +/obj/item/mod/module/visor + name = "MOD visor module" + desc = "A heads-up display installed into the visor of the suit. They say these also let you see behind you." + module_type = MODULE_TOGGLE + complexity = 2 + active_power_cost = DEFAULT_CHARGE_DRAIN * 0.3 + incompatible_modules = list(/obj/item/mod/module/visor) + cooldown_time = 0.5 SECONDS + /// The HUD type given by the visor. + var/hud_type + /// The traits given by the visor. + var/list/visor_traits = list() + +/obj/item/mod/module/visor/on_activation() + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.add_hud_to(mod.wearer) + for(var/trait in visor_traits) + ADD_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +/obj/item/mod/module/visor/on_deactivation(display_message = TRUE, deleting = FALSE) + . = ..() + if(!.) + return + if(hud_type) + var/datum/atom_hud/hud = GLOB.huds[hud_type] + hud.remove_hud_from(mod.wearer) + for(var/trait in visor_traits) + REMOVE_TRAIT(mod.wearer, trait, MOD_TRAIT) + mod.wearer.update_sight() + +//Medical Visor - Gives you a medical HUD. +/obj/item/mod/module/visor/medhud + name = "MOD medical visor module" + desc = "A heads-up display installed into the visor of the suit. This cross-references suit sensor data with a modern \ + biological scanning suite, allowing the user to visualize the current health of organic lifeforms, as well as \ + access data such as patient files in a convenient readout. They say these also let you see behind you." + icon_state = "medhud_visor" + hud_type = DATA_HUD_MEDICAL_ADVANCED + +//Diagnostic Visor - Gives you a diagnostic HUD. +/obj/item/mod/module/visor/diaghud + name = "MOD diagnostic visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a series of advanced sensors to access data \ + from advanced machinery, exosuits, and other devices, allowing the user to visualize current power levels \ + and integrity of such. They say these also let you see behind you." + icon_state = "diaghud_visor" + hud_type = DATA_HUD_DIAGNOSTIC_ADVANCED + +//Security Visor - Gives you a security HUD. +/obj/item/mod/module/visor/sechud + name = "MOD security visor module" + desc = "A heads-up display installed into the visor of the suit. This module is a heavily-retrofitted targeting system, \ + plugged into various criminal databases to be able to view arrest records, command simple security-oriented robots, \ + and generally know who to shoot. They say these also let you see behind you." + icon_state = "sechud_visor" + hud_type = DATA_HUD_SECURITY_ADVANCED + +//Meson Visor - Gives you meson vision. +/obj/item/mod/module/visor/meson + name = "MOD meson visor module" + desc = "A heads-up display installed into the visor of the suit. This module is based off well-loved meson scanner \ + technology, used by construction workers and miners across the galaxy to see basic structural and terrain layouts \ + through walls, regardless of lighting conditions. They say these also let you see behind you." + icon_state = "meson_visor" + visor_traits = list(TRAIT_MESON_VISION) + +//Thermal Visor - Gives you thermal vision. +/obj/item/mod/module/visor/thermal + name = "MOD thermal visor module" + desc = "A heads-up display installed into the visor of the suit. This uses a small IR scanner to detect and identify \ + the thermal radiation output of objects near the user. While it can detect the heat output of even something as \ + small as a rodent, it still produces irritating red overlay. They say these also let you see behind you." + icon_state = "thermal_visor" + visor_traits = list(TRAIT_THERMAL_VISION) + +//Night Visor - Gives you night vision. +/obj/item/mod/module/visor/night + name = "MOD night visor module" + desc = "A heads-up display installed into the visor of the suit. Typical for both civilian and military applications, \ + this allows the user to perceive their surroundings while in complete darkness, enhancing the view by tenfold; \ + yet brightening everything into a spooky green glow. They say these also let you see behind you." + icon_state = "night_visor" + visor_traits = list(TRAIT_TRUE_NIGHT_VISION) diff --git a/code/modules/research/designs/mod_designs.dm b/code/modules/research/designs/mod_designs.dm new file mode 100644 index 0000000000..97f5577aa0 --- /dev/null +++ b/code/modules/research/designs/mod_designs.dm @@ -0,0 +1,392 @@ +//MODsuit construction + +/datum/design/mod_shell + name = "MOD Shell" + desc = "A 'Nakamura Engineering' designed shell for a Modular Suit." + id = "mod_shell" + build_type = MECHFAB + materials = list(/datum/material/iron = 10000, /datum/material/plasma = 5000) + construction_time = 25 SECONDS + build_path = /obj/item/mod/construction/shell + category = list("MODsuit Chassis") + +/datum/design/mod_helmet + name = "MOD Helmet" + desc = "A 'Nakamura Engineering' designed helmet for a Modular Suit." + id = "mod_helmet" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/helmet + category = list("MODsuit Chassis") + +/datum/design/mod_chestplate + name = "MOD Chestplate" + desc = "A 'Nakamura Engineering' designed chestplate for a Modular Suit." + id = "mod_chestplate" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/chestplate + category = list("MODsuit Chassis") + +/datum/design/mod_gauntlets + name = "MOD Gauntlets" + desc = "'Nakamura Engineering' designed gauntlets for a Modular Suit." + id = "mod_gauntlets" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/gauntlets + category = list("MODsuit Chassis") + +/datum/design/mod_boots + name = "MOD Boots" + desc = "'Nakamura Engineering' designed boots for a Modular Suit." + id = "mod_boots" + build_type = MECHFAB + materials = list(/datum/material/iron = 5000) + construction_time = 10 SECONDS + build_path = /obj/item/mod/construction/boots + category = list("MODsuit Chassis") + +/datum/design/mod_plating + name = "MOD External Plating" + desc = "External plating for a MODsuit." + id = "mod_plating_standard" + build_type = PROTOLATHE | MECHFAB + materials = list(/datum/material/iron = 6000, /datum/material/glass = 3000, /datum/material/plasma = 1000) + construction_time = 15 SECONDS + build_path = /obj/item/mod/construction/armor + category = list("MODsuit Chassis", "MODsuit Designs") + departmental_flags = DEPARTMENTAL_FLAG_ALL + research_icon = 'icons/obj/clothing/modsuit/mod_construction.dmi' + research_icon_state = "standard-plating" + +/datum/design/mod_plating/New() + . = ..() + var/obj/item/mod/construction/armor/armor_type = build_path + var/datum/mod_theme/theme = GLOB.mod_themes[initial(armor_type.theme)] + desc = "External plating for a MODsuit. [theme.desc]" + +/datum/design/mod_plating/engineering + name = "MOD Engineering Plating" + id = "mod_plating_engineering" + build_path = /obj/item/mod/construction/armor/engineering + materials = list(/datum/material/iron = 6000, /datum/material/gold = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + research_icon_state = "engineering-plating" + +/datum/design/mod_plating/atmospheric + name = "MOD Atmospheric Plating" + id = "mod_plating_atmospheric" + build_path = /obj/item/mod/construction/armor/atmospheric + materials = list(/datum/material/iron = 6000, /datum/material/titanium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + research_icon_state = "atmospheric-plating" + +/datum/design/mod_plating/medical + name = "MOD Medical Plating" + id = "mod_plating_medical" + build_path = /obj/item/mod/construction/armor/medical + materials = list(/datum/material/iron = 6000, /datum/material/silver = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + research_icon_state = "medical-plating" + +/datum/design/mod_plating/security + name = "MOD Security Plating" + id = "mod_plating_security" + build_path = /obj/item/mod/construction/armor/security + materials = list(/datum/material/iron = 6000, /datum/material/uranium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + research_icon_state = "security-plating" + +/datum/design/mod_plating/cosmohonk + name = "MOD Cosmohonk Plating" + id = "mod_plating_cosmohonk" + build_path = /obj/item/mod/construction/armor/cosmohonk + materials = list(/datum/material/iron = 6000, /datum/material/bananium = 2000, /datum/material/glass = 1000, /datum/material/plasma = 1000) + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + research_icon_state = "cosmohonk-plating" + +/datum/design/mod_paint_kit + name = "MOD Paint Kit" + desc = "A paint kit for Modular Suits." + id = "mod_paint_kit" + build_type = PROTOLATHE | MECHFAB + materials = list(/datum/material/iron = 1000, /datum/material/plastic = 500) + construction_time = 5 SECONDS + build_path = /obj/item/mod/paint + category = list("MODsuit Modules", "MODsuit Designs") + +//MODsuit modules + +/datum/design/module + name = "MOD Module" + build_type = PROTOLATHE | MECHFAB + construction_time = 1 SECONDS + materials = list(/datum/material/iron = 1000, /datum/material/glass = 1000) + build_path = /obj/item/mod/module + category = list("MODsuit Modules", "MODsuit Designs") + departmental_flags = DEPARTMENTAL_FLAG_ALL + +/datum/design/module/New() + . = ..() + var/obj/item/mod/module/module = build_path + desc = "[initial(module.desc)] It uses [initial(module.complexity)] complexity." + +/datum/design/module/mod_storage + name = "Storage Module" + id = "mod_storage" + materials = list(/datum/material/iron = 2500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/storage + +/datum/design/module/mod_visor_medhud + name = "Medical Visor Module" + id = "mod_visor_medhud" + materials = list(/datum/material/silver = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/medhud + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/module/mod_visor_diaghud + name = "Diagnostic Visor Module" + id = "mod_visor_diaghud" + materials = list(/datum/material/gold = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/diaghud + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/module/mod_visor_sechud + name = "Security Visor Module" + id = "mod_visor_sechud" + materials = list(/datum/material/titanium = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/sechud + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/module/mod_visor_meson + name = "Meson Visor Module" + id = "mod_visor_meson" + materials = list(/datum/material/uranium = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/visor/meson + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_visor_welding + name = "Welding Protection Module" + id = "mod_welding" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/welding + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_t_ray + name = "T-Ray Scanner Module" + id = "mod_t_ray" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/t_ray + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_health_analyzer + name = "Health Analyzer Module" + id = "mod_health_analyzer" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/health_analyzer + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/module/mod_stealth + name = "Cloak Module" + id = "mod_stealth" + materials = list(/datum/material/iron = 1000, /datum/material/bluespace = 500) + build_path = /obj/item/mod/module/stealth + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/module/mod_magboot + name = "Magnetic Stabilizator Module" + id = "mod_magboot" + materials = list(/datum/material/iron = 1000, /datum/material/gold = 500) + build_path = /obj/item/mod/module/magboot + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_mag_harness + name = "Magnetic Harness Module" + id = "mod_mag_harness" + materials = list(/datum/material/iron = 1500, /datum/material/silver = 500) + build_path = /obj/item/mod/module/magnetic_harness + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/module/mod_mouthhole + name = "Eating Apparatus Module" + id = "mod_mouthhole" + materials = list(/datum/material/iron = 1500) + build_path = /obj/item/mod/module/mouthhole + +/datum/design/module/mod_rad_protection + name = "Radiation Protection Module" + id = "mod_rad_protection" + materials = list(/datum/material/iron = 1000, /datum/material/uranium = 1000) + build_path = /obj/item/mod/module/rad_protection + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_emp_shield + name = "EMP Shield Module" + id = "mod_emp_shield" + materials = list(/datum/material/iron = 1000, /datum/material/plasma = 1000) + build_path = /obj/item/mod/module/emp_shield + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/module/mod_flashlight + name = "Flashlight Module" + id = "mod_flashlight" + materials = list(/datum/material/iron = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/flashlight + +/datum/design/module/mod_reagent_scanner + name = "Reagent Scanner Module" + id = "mod_reagent_scanner" + materials = list(/datum/material/glass = 1000) + build_path = /obj/item/mod/module/reagent_scanner + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL | DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/module/mod_gps + name = "Internal GPS Module" + id = "mod_gps" + materials = list(/datum/material/iron = 500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/gps + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE | DEPARTMENTAL_FLAG_ENGINEERING | DEPARTMENTAL_FLAG_CARGO + +/datum/design/module/mod_constructor + name = "Constructor Module" + id = "mod_constructor" + materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) + build_path = /obj/item/mod/module/constructor + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_quick_carry + name = "Quick Carry Module" + id = "mod_quick_carry" + materials = list(/datum/material/iron = 1000, /datum/material/titanium = 500) + build_path = /obj/item/mod/module/quick_carry + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/module/mod_longfall + name = "Longfall Module" + id = "mod_longfall" + materials = list(/datum/material/iron = 1000) + build_path = /obj/item/mod/module/longfall + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/module/mod_injector + name = "Injector Module" + id = "mod_injector" + materials = list(/datum/material/iron = 1000, /datum/material/diamond = 500) + build_path = /obj/item/mod/module/injector + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/module/mod_bikehorn + name = "Bike Horn Module" + id = "mod_bikehorn" + materials = list(/datum/material/plastic = 500, /datum/material/iron = 500) + build_path = /obj/item/mod/module/bikehorn + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/module/mod_microwave_beam + name = "Microwave Beam Module" + id = "mod_microwave_beam" + materials = list(/datum/material/iron = 1000, /datum/material/uranium = 500) + build_path = /obj/item/mod/module/microwave_beam + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SERVICE + +/datum/design/module/mod_clamp + name = "Crate Clamp Module" + id = "mod_clamp" + materials = list(/datum/material/iron = 2000) + build_path = /obj/item/mod/module/clamp + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/module/mod_drill + name = "Drill Module" + id = "mod_drill" + materials = list(/datum/material/silver = 1000, /datum/material/iron = 2000) + build_path = /obj/item/mod/module/drill + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/module/mod_orebag + name = "Ore Bag Module" + id = "mod_orebag" + materials = list(/datum/material/iron = 1500) + build_path = /obj/item/mod/module/orebag + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_CARGO + +/datum/design/module/mod_dna_lock + name = "DNA Lock Module" + id = "mod_dna_lock" + materials = list(/datum/material/diamond = 500, /datum/material/glass = 1000) + build_path = /obj/item/mod/module/dna_lock + +/datum/design/module/mister_atmos + name = "Resin Mister Module" + id = "mod_mister_atmos" + materials = list(/datum/material/glass = 1000, /datum/material/titanium = 1500) + build_path = /obj/item/mod/module/mister/atmos + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_ENGINEERING + +/datum/design/module/mod_holster + name = "Holster Module" + id = "mod_holster" + materials = list(/datum/material/iron = 1500, /datum/material/glass = 500) + build_path = /obj/item/mod/module/holster + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_SECURITY + +/datum/design/module/surgicalprocessor + name = "Surgical Processor Module" + id = "mod_surgicalprocessor" + materials = list(/datum/material/titanium = 250, /datum/material/glass = 1000, /datum/material/silver = 1500) + build_path = /obj/item/mod/module/surgical_processor + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +/datum/design/module/defibrillator + name = "Defibrillator Module" + id = "mod_defib" + materials = list(/datum/material/titanium = 250, /datum/material/diamond = 1000, /datum/material/silver = 1500) + build_path = /obj/item/mod/module/defibrillator + build_type = PROTOLATHE + departmental_flags = DEPARTMENTAL_FLAG_MEDICAL + +//MODsuit anomalock modules +/datum/design/module/mod_antigrav + name = "Anti-Gravity Module" + id = "mod_antigrav" + materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/uranium = 2000) + build_path = /obj/item/mod/module/anomaly_locked/antigrav + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE + +/datum/design/module/mod_teleporter + name = "Teleporter Module" + id = "mod_teleporter" + materials = list(/datum/material/iron = 2500, /datum/material/glass = 2000, /datum/material/bluespace = 2000) + build_path = /obj/item/mod/module/anomaly_locked/teleporter + departmental_flags = DEPARTMENTAL_FLAG_SCIENCE diff --git a/code/modules/research/machinery/protolathe.dm b/code/modules/research/machinery/protolathe.dm index 684f27ccad..4057503e09 100644 --- a/code/modules/research/machinery/protolathe.dm +++ b/code/modules/research/machinery/protolathe.dm @@ -15,7 +15,8 @@ "Weapons", "Ammo", "Firing Pins", - "Computer Parts" + "Computer Parts", + "MODsuit Designs" ) production_animation = "protolathe_n" allowed_buildtypes = PROTOLATHE diff --git a/code/modules/research/machinery/techfab.dm b/code/modules/research/machinery/techfab.dm index f93560ed10..110b6c037c 100644 --- a/code/modules/research/machinery/techfab.dm +++ b/code/modules/research/machinery/techfab.dm @@ -26,7 +26,8 @@ "Subspace Telecomms", "Research Machinery", "Misc. Machinery", - "Computer Parts" + "Computer Parts", + "MODsuit Designs" ) console_link = FALSE production_animation = "protolathe_n" diff --git a/code/modules/research/techweb/nodes/mod_nodes.dm b/code/modules/research/techweb/nodes/mod_nodes.dm new file mode 100644 index 0000000000..7b3f79c640 --- /dev/null +++ b/code/modules/research/techweb/nodes/mod_nodes.dm @@ -0,0 +1,123 @@ +/datum/techweb_node/mod_basic + id = "mod" + starting_node = TRUE + display_name = "Basic Modular Suits" + description = "Specialized back mounted power suits with various different modules." + design_ids = list( + "mod_shell", + "mod_helmet", + "mod_chestplate", + "mod_gauntlets", + "mod_boots", + "mod_plating_standard", + "mod_storage", + "mod_welding", + "mod_mouthhole", + "mod_flashlight", + "mod_longfall", + ) + +/datum/techweb_node/mod_advanced + id = "mod_advanced" + display_name = "Advanced Modular Suits" + description = "More advanced modules, to improve modular suits." + prereq_ids = list("mod", "robotics") + design_ids = list( + "mod_visor_diaghud", + "mod_gps", + "mod_reagent_scanner", + "mod_clamp", + "mod_drill", + "mod_orebag", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_engineering + id = "mod_engineering" + display_name = "Engineering Modular Suits" + description = "Engineering suits, for powered engineers." + prereq_ids = list("mod_advanced", "engineering") + design_ids = list( + "mod_plating_engineering", + "mod_visor_meson", + "mod_t_ray", + "mod_magboot", + "mod_constructor", + "mod_mister_atmos", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_advanced_engineering + id = "mod_advanced_engineering" + display_name = "Advanced Engineering Modular Suits" + description = "Advanced Engineering suits, for advanced powered engineers." + prereq_ids = list("mod_engineering", "adv_engi") + design_ids = list( + "mod_plating_atmospheric", + "mod_rad_protection", + "mod_emp_shield", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/mod_medical + id = "mod_medical" + display_name = "Medical Modular Suits" + description = "Medical suits for quick rescue purposes." + prereq_ids = list("mod_advanced", "biotech") + design_ids = list( + "mod_plating_medical", + "mod_visor_medhud", + "mod_health_analyzer", + "mod_quick_carry", + "mod_injector", + "mod_dna_lock", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_advanced_medical + id = "mod_advanced_medical" + display_name = "Advanced Medical Modular Suits" + description = "Advanced medical suits for quicker rescue purposes." + prereq_ids = list("mod_medical", "adv_biotech") + design_ids = list( + "mod_defib", + "mod_surgicalprocessor", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 3500) + +/datum/techweb_node/mod_security + id = "mod_security" + display_name = "Security Modular Suits" + description = "Security suits for space crime handling." + prereq_ids = list("mod_advanced", "sec_basic") + design_ids = list( + "mod_plating_security", + "mod_visor_sechud", + "mod_stealth", + "mod_mag_harness", + "mod_holster", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_entertainment + id = "mod_entertainment" + display_name = "Entertainment Modular Suits" + description = "Powered suits for protection against low-humor environments." + prereq_ids = list("mod_advanced", "clown") + design_ids = list( + "mod_plating_cosmohonk", + "mod_bikehorn", + "mod_microwave_beam", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) + +/datum/techweb_node/mod_anomaly + id = "mod_anomaly" + display_name = "Anomalock Modular Suits" + description = "Modules for modular suits that require anomaly cores to function." + prereq_ids = list("mod_advanced", "anomaly_research") + design_ids = list( + "mod_antigrav", + "mod_teleporter", + ) + research_costs = list(TECHWEB_POINT_TYPE_GENERIC = 2500) diff --git a/code/modules/surgery/surgery.dm b/code/modules/surgery/surgery.dm index a4eafc4b01..9e39ec58e8 100644 --- a/code/modules/surgery/surgery.dm +++ b/code/modules/surgery/surgery.dm @@ -68,6 +68,15 @@ var/obj/item/surgical_processor/SP = locate() in R.module.modules if(SP) advanced_surgeries |= SP.advanced_surgeries + else + var/obj/item/surgical_processor/SP + for(var/obj/item/surgical_processor/processor in user.held_items) + SP = processor + break + if(!SP) + SP = locate(/obj/item/surgical_processor) in get_turf(user) + if(SP) + advanced_surgeries |= SP.advanced_surgeries var/turf/T = get_turf(patient) var/obj/structure/table/optable/table = locate(/obj/structure/table/optable, T) diff --git a/code/modules/vehicles/mecha/_mecha.dm b/code/modules/vehicles/mecha/_mecha.dm index f1e4d4468b..3823bfa1dd 100644 --- a/code/modules/vehicles/mecha/_mecha.dm +++ b/code/modules/vehicles/mecha/_mecha.dm @@ -817,7 +817,7 @@ mecha_flags &= ~SILICON_PILOT AI.forceMove(card) card.AI = AI - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null to_chat(AI, "You have been downloaded to a mobile storage device. Wireless connection offline.") to_chat(user, "Transfer successful: [AI.name] ([rand(1000,9999)].exe) removed from [name] and stored within local memory.") @@ -856,7 +856,7 @@ mecha_flags |= SILICON_PILOT moved_inside(AI) AI.cancel_camera() - AI.controlled_mech = src + AI.controlled_equipment = src AI.remote_control = src AI.mobility_flags = ALL //Much easier than adding AI checks! Be sure to set this back to 0 if you decide to allow an AI to leave a mech somehow. if(interaction == AI_MECH_HACK) @@ -1083,7 +1083,7 @@ AI.linked_core = null return to_chat(AI, "Returning to core...") - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null mob_container = AI newloc = get_turf(AI.linked_core) diff --git a/code/modules/vehicles/mecha/mech_fabricator.dm b/code/modules/vehicles/mecha/mech_fabricator.dm index bbbfa7f1bd..29cc88a563 100644 --- a/code/modules/vehicles/mecha/mech_fabricator.dm +++ b/code/modules/vehicles/mecha/mech_fabricator.dm @@ -57,6 +57,8 @@ "Exosuit Equipment", "Exosuit Ammunition", "Cyborg Upgrade Modules", + "MODsuit Chassis", + "MODsuit Modules", "Cybernetics", "Implants", "Control Interfaces", diff --git a/code/modules/vehicles/mecha/mecha_wreckage.dm b/code/modules/vehicles/mecha/mecha_wreckage.dm index b9f299731a..70c543fbde 100644 --- a/code/modules/vehicles/mecha/mecha_wreckage.dm +++ b/code/modules/vehicles/mecha/mecha_wreckage.dm @@ -35,7 +35,7 @@ AI.death() //The damage is not enough to kill the AI, but to be 'corrupted files' in need of repair. AI.forceMove(src) //Put the dead AI inside the wreckage for recovery add_overlay(mutable_appearance('icons/obj/projectiles.dmi', "green_laser")) //Overlay for the recovery beacon - AI.controlled_mech = null + AI.controlled_equipment = null AI.remote_control = null /obj/structure/mecha_wreckage/Destroy() diff --git a/icons/mob/actions/actions_mod.dmi b/icons/mob/actions/actions_mod.dmi new file mode 100644 index 0000000000000000000000000000000000000000..84fcbc00dbbc38bf7ab1276ea01f8a6c9bc2ce3d GIT binary patch literal 3408 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 literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/modsuit/mod_clothing.dmi b/icons/mob/clothing/modsuit/mod_clothing.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f8dba0a00660f745613af152e3fdf3ca71e5b8a3 GIT binary patch literal 133028 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 S}Of6FP|FGz=VE$Fud&Ntn!G`c< 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�E`r+Co^9ZU3GS^)=~Zv8z!aIuxQ8z1C^U(M7USoh81rrL zEe~5{dyWpTGR)B;pr6;*a=v5KE(YptuUl&md2_LpMA zIkmRB%NL9AI7w3>23T$-`N;gl!h_?3zG@fDp@&|*X~Pg5cSESA#GOX4LcQKK!gE#J1 z#3gP=W6PHX+L}k%I!ZhI`pXLF<065qelO`IraF)B1WCUx3kR@AOxpJ_v`qSZkzZrz zY<$g_QswxmU}L0U&rH<4-CnC`nX{dQgJa!ruo#tectRAlZlH}Lm|0}vSV=`V_&MM- zG7GjdJ^eg?yK2}{g4n0lk{zX^$RZsBsga|S!a%SLoR{kBdrzMVhN@E!Tx{<>vo@9) za#=K469dCvt7KrJAAQ=&4p~^Rd>&p&SMBB|&|H6$pGA&U@^eq^^OM;og0EKA^Q)oG z(xcrGuScF-x$|si#N8C{nF3c-4_P;k0m`StFnjaL6D$$R2d|Jae7>D|4!|4O=W+2G z`ZhG2=ThLF`0x59%N6$Nc!1Z_oZ?eY3x7nd3T064oc7OV{(%&3T;4F=+ zPV;`?pfT{H=|j!A$q^Zs1{_E*O2!jH`b9Y~CE0OyZPBEa%6CkZQLUcR9gJyRho^S3 zW>6YAN-EW$UeE&|yx;|s4XJC&$2P@Ut0j7qyTT(sX$vKrf{9daJ|c~%UKUy!T)VweIZ0qC9?4A#Rvf!uj%ds_?^C9Tb)GQ6mU zDejv8Rdv@2cOdKOV7vDf4|k;1=oIQI-3kbXe7h_KK2hAZt`O};ucWvcSmfR`&(js(5KHb~OB(VD|Dvo7l!k)fHURpT&d&S4f>Gf3=-e7v;zM|+k z!4??Ip-@NF=;pJAhQi@6aukxPdph6#$5kFU%eqiQclVX)3R4-%CR^v`_RTn89G}<5;9mpq`5d|p@_w2#*SgbEy^tF+eu7q{5(Y!4M6+Et=z}-3~u@Ki+)4H zLxArXPR0?z-n|P~P27DL(}-rZ+W(}LUF9X!2uN(Id) zI<{^?dvh24?s&^)4=rekPX=IVJ+r+%783HMtz=em7Ypu?Y2whyr=KP{p6}cn$OL;q z_XpR=MUDts1w7Wkj&(;!oTq9&jOB5M7rz+SNNZ(zO)?8W$pXp2zMJcf=MNt}+H+$G z{hpSj3viGmm=^jsgRaEtMree_T^TkLJYxc?5D=j~!}#Du35WWy=SsX_#!sK*=fR0R z`~=Jp(P!>Cx%uf9iAIKz*9;&viAC^)IkWeZ*dtqTLiJl~ulGl+Hcn8Uq}|iu*w1Mz zrycb)?(JDoK_BHbkbL*?z_RabZ^m;iu4p;lb_rZQn&VY9etdL2*-_hT;;tZH*6s-^ zHMEiJFislwIGkfnoY?@nU_Ke^_Sw+yK)fqm_4;)w4~q*?jbs4HJ&?fx=$z|PspDQp z0H9Qk-1NmOT-S_zcnnh@eEx(U9V!RwE7dp?iD5*wlqln??mQ4jOi2&*J}Zy=v~kc$ zwdUPWB0?CLdH*FhqS!}HX5Pn_pe6O>2`?euau^)4(TDDf)vs_xCM2+3sf>K7NtmIt zs!N!st8eqc_|FG8E&Uft*p;0!KHb&x8-ZM{9LV4tmLBusHMiGw+T{YqG0^&)W@G2B zdegz2Di5aop%M-~^)Z*dK2F!p26sl@W6l!umxycRS^*Pn(Q?LB^3GukQQJVWCyid`yY#2pu?58e1-?E=`XhxOZ7pb{&vLrI=I zya3NS`-E^ocoF%Xd0Z#5Hx<@KIsw4e;#_!#Q>*$Lymmsz$}bOy2<*z4i|+69C@jn5 z`HZ^Vs0Y};B;HtgeAabyBRu^~AtfhuA(+7=e@5?at$66YKpI1fcR}w}|H&#I1`~$d z_};@mgz)tJ-5O00fZUoFi&7iFPXhKG2Ea<_8cl{TkDgnj(hJWWC6@|jdmA|ewYEK$Z&->oc!KY#4 z&vjuE*fD1wiMo~b@ao|S`?OYR-kh4l-}Dr8yBJ9HU5m*!HZHtu)X46H2q0c&#lCckh0*5DCDk=*hZ9`1Iy*MgUso@H*zN zFq(s#qvPhx@R#5cY#d`2iiRLay8-67vkJ-pL$Dwsk zaxC^NH45DNI}aVyx4l0Wj@T*=;Bd7j4L*rGBkS>6f0nEC9^WyR-wz5-_8zBS53Rk` z>M(AZlh?#u4_jP4#`i8I0p27I9_%gk%T+r%=&dv!?dK1=G&EG2A%|8NVND-ztyPaz z+U_s8IjX5PiC$PLq&)rB#&BcIr7I^jNr=%zd+e=>WSbo$`xhp9=p*rZoX0E;Fmuvt ze0&d>A3vEZ%@_#$a0$QVKt=u-{Nz(Ma4Q1MFl~L~)Vn|F0T&D#!v3s}5WIbxbk@c= zdT^lLGG|bzlWn1sKU{LG8y=uFui@u-^LqAINk>W7EJIDj3u>Rb`1q2JCoEx6_Rf_n z605VG{tdLbxw#i$*@(z~B(GEjdGurHREXf(wO|HwMQM!%e1(QJq)#O&`uOdG?%iCj z?>=8zPJXtZ_!bu1od}R4X+eq+)5~?ou z<8eiy;5!Jo#{Eb^-apebwMxhqBBNxpIoDV=wi!=`{A!*@8|O>}PYMfWh;mZV-_Qc> z%PPh4UAXg2dbU8ogtpI);y^bm*xBVZW8u5$=Xks1KE+mXjc5rM>zHp*{8(6*V@buk zR68a+F+wZo)$8siC6gQY=tIQlpSvOF{CF%|1HU=fgB>T3KHVrchW8%f<(pn4o3mZ{ zlqepe;&USMqPkkK^&QytXpC?$g1{@+ACqFJitQxfB2L$x8BTSOM3K;KJy{tXX zi$i*Dea*_c5uH#WEJ5E-3k-=Dyw+{Cx&1K-L9&#NvHqKtA$PDSTigX{nQY~|?q^+WppsRz^AN8p)_?UHIaRPOw!^)IwCk1I6TSs$T}so1%`~GqUFMyb z*O0L7!wiXUCM-15Y+Q5pwu}>zwYL;E>8QNT6Sgw1r1^MPmL0Ts!@8v=gJQ-tZb8p4 zYvCjuCvv2>XG9`2;O7=i9+jFe-Z(h$oEX{>IdkDmpjrtVkQ)MBLY0Nu3y9Z5v32aYUVy`n|O zamLzc#NJeYi~ZIDG>snx&Lub*)$HDYcz$(P&7u4=Tt^j>Q7vTZi4dfVI}n^g9)p=S zn8uP^e>N8(PCCaBSHC6w%0&ffj-#CE!tNa)%@&bkpe&%Z&4!WxV=r9|y)nru&PqLj z(9|7L!p3Plpe-Dy#sY>$3=430-agdlw?q8c@l*>eGEyZNMdVfYQJDS3^Ya1j(g{gP zOvPK0I!Y;!ePQ3)y(ETkVh!w$E zOX24EmUV3$qhBqfCTg#kClg*v--hxCh!l{wv7MJa*tJuF(?2*bI(KjBc4D3g=<`Q7 z{D?nEP`wNB&yLbK{rJ$#x}gdZ4@N&$v5B^XSUkbcsfWUY>5Vo2m#?N8V zF8zil-RoYA%!So1p0vk01%_{S1RkV*!boarnD=i?}{bkmTaMlwjtv-ap zJ_x>Qb3H>21gx76aI>E(`b#(VP!hdJ(RMII3~GKqH4SYOBBw%x!F??h#w=2F>4+-k zVoJ6P@i*o#|PPg&hq?RK7B`1e;e(0jv#9*-q z=!~$iuoBy$>lDu_31Hjl^h569#fw7~%$NL{Oa0_^3sznV1HSpwhB3dt%1TF1pSz>$R?FB!;-(a&A?cSaJ|vdaiBO^4c3)Y%u{S+<&K844 zT$|v7&?eYHKIp9Y4Ux?!jD`S)+5hIFZ;MDM-uXp?v88(=B>VB(+Gg4AG*5ZOuVthr z{xg60_k{N_!ePP+Iu3!G6U=@QDccz9lpRsWAh4A^9_e#tBKtXiwiwDdzA3x;ejJN; zceWVBT93aYNXcw_ugzlj39>u5h#&2Y{!tN$D|nqx>2jdB!WQ;>kO4k3IV+O;N7WHvP3(hT&9kNa9oJEKN9Zrq2-pEMjevBwA0P<`stI zrwFKNH?|DLQXP8u;N&o-PT9*y<0M2L*&kv8ryG)wy(vYZYr4fv=A}&%E;OJ^^&9Fh zFTEe}a%?&8R$tCPHBiya`s?zK9^A$J;S1BPO5l>=t@Tl=7S}7(;XZ!DRVPA%cD!>z zPEL-l;~F^3XGtM~fPerm&mK)h#-%Gic)m{v+4|@|{SYac9wm9Q?*$ZV@CS;U5WvKZ zNIx*>Qj3BM^!Kq!I(szuh~Co=g}y*t63cMncDp`0Np|3~Q z&^iQ$>gy819?J_{|C_ASXy3kd#L!vCFpY?q_NFccDykJPOcr-<>FTn4kl=)Z`sa@+ z-y>#qU)-NsS+!bGPC*q(yuIS{%lsgJUG1tP&=!`a;oBIKTa@6g1SE^!Cd4ThA|~T^3=|a9`g#zB79jA08@6ch#E}+;Mcfct{p^EmpMZ ztRYlSlG)&v8n5AZRwX4Rz0^H=n5lceE-3MMZ+32RG}-oEYjc;)*7$F3`^j6IDZZOL zpOuFK2*=K{{Ps&HIKRzb-Gw^qP?JlD%_IVK45JdY%pUYKd^|rDQWT)lgT7SVb5qMZ4xPjTWhTeW^N zCjw2WNJGNYQ|f1Pdq`DqzW@!h(?Vy=_4KU1-x>-r=~N2~Fyx&o;%YsCZQC&l5a4f9 zP9HW3r3andcF2m#W4`n9Yi{0NykP^U1Iq&)6q83y~|MB53XVCX;nkprhm9bs)zst`z{1Al0-ip z=Y4ID+x+u!jdA7^q@+-{o(#=wU$n#V-*6r+zeU-HP%4IAsTp)#h;GU%ywQuS5fW=y z8a968ne&Zow?FR8&~NP=bz&gHyYTKw4XUoLu5RFu99LKL-grLu5D$=amQQr;*>8D8 zbic1(hjCWMMv(Y&6K6pY#wn(brp<*c3L+6Y8hR~`hX$~dgJN9_WB9iCZ;wUkVbgY#>fA77>96B=S1Q$@eII&mgbG8-DwPzFyc& zZa-91?xkYs0QFw_Rh!A{_u4iJRc?Neee5B95p97l!Yj#4PtIQ6Bpx0x;Vo6w{=UU;d zdr0u9VPO=AA&NMTRi>xtUFd$t6)}){;J!G%NB|tWYO*wOs+6Z9l7MJ1*Hr~MFMiBadYRZq65rBbCzD9x5 z0r`RSkn$%;3<(l`NkTkfuyY}v+j=++D{F6Qh^M@KZU4likVXVQ zm58?Ld-C%p1?=aDUE5Q&?D~HsXHPfD<<*hd-mZS)D*ty*Wv(H~ zQU)lZcgCh*HA~ZWl~VLZ6|U1sP;ermDF(GB3%#PLYyBkWl=fFt^zVnT-X}7Qp*b$) z`h{L6-{?mhM+OPXfOlX@35+j}y2XvlQcIaxUe4Z9EN5*}`7>=Xl%@8|qJG@$o>ZO1o0Rct(55BSeNr=DPYTX`}FJp4$|0PzZ7XR;J_3s=4 zZM;N!_Yy772>D{9*{$5GhDVZ$51vQ?8>ARKc7lN8G{JoGn zr5Log+;>ZR8B^@}!wmP``|m&|5j2UFP@t{7`M`>4hg+{9yn1vu)`7>;9CU1 zd6Y!!D{mw2zW;Io3Pk}*+LwT2)l$rkw`bQfLd;Ro85x`u9I}Q!exAVvW1j;E4W2%I z!>_wg@B;<|>qfYQU8^z@3)2{~^2%%5blj5zu@E3@0OWiHAoKC(na8&sg6WO6+*2R` zEWkSe*U2ORG}pf6+=YU6*G|_Fm8igXr$aUsR8$J#W-TrYSt;B8fpVsmbEhx_E3+)C z|3JFRX*y*@vPgUL&dc7hACh~Nz%4qzma!2{P$zX zU{-y}Us%_EX)N5sRBJ?$!NdW(jWZNX_;b#W&4-x{5@ieL(0II;zPH1PEwJR$x3eTE z?m?8lpjiDiu#JU|{#2LNKNCNRtB|-2g+DACT*fR<%0b_hJysCcSYh~%FQYJpefV`R?NU{aXk4k>&&Cn!|q%ZgCr={!V7mYFHf#Rq1x;5{(EUh zE9;2pXHGXB>_q>Tg2aqPZvkhwvpit28FYZRK76d78%Wnh1^yfYnvW_^fMd{BIOBW@ z)l@NK3ubvB#rkCF_0gdJj`^qKS~5$AjzzwI0Wt?}9p3AIK<{^4jNT4y3t|Bp!NT^e zPa^c8C4|KiOnsi6`Xp5hKu75H!5MZgnwV-}^4ku+)7u~gtphDF2 zL5+`gJz$rBlFshgvz*P81|e6() zIPmSQINfF%=L4-(HjY9({`Il?A@%&lsc$LQ zRE9@@B~q6Un6U!f0MvAqh1lQ*)V7at9T!vIgd`!Z0iDBxB_A+9Qvt@VMeE9q_{-xfW z%7bV@FnKqQGp2A*#31u9&r%RB^)G;8b05AChZrro6UCyK0sux2;sPtzhqVugd1JA^ zg71h8+1x4^~ET~m1#)Q+WrW)a9iuf6n|&TVYCtwa$rIcjK^K+a}_H za~Q&9`~JY9oQq~=H!{g_AsKJJ`0qLRWoF6Og78>kZS5lf9d7hWEvMt}lH}wR)_Hkw zA>e3Qcw*|X9tybX4^}uH=8w{7(vpy3!(&f|a3vo<2e@OyfzE!HKwA!dEakh^e(*HN zQ%(mG^75}nH!Q5hKO`4aUYw5SRTQhjsxU5rtBD=A<+MKQWQaR5dMP{AF<1L{|D_=| zjRiT$@2|(lgIeHB2?&%p9!K2A`S$wITHLd{{Z2*K;+~^Ca9bmMP*z37ZGVG*>L3GY zTwRh7zfc4IasTFjHB3T7xh)9(zqZTUa=v8sAlO2h}a^ z4!k`x>q&<-V|VT-Ty&ClK6h-D@cZKD>ULyd%KUW84i)ng7!4b`g~Z4)&X4l@!HKU_ zfJK+wYP3C2`N1Q`_o`@k-CLmkfrq(|Cjd~rTw1bqiygrk)T4@aTIBima00L%T5=bNIT9a2Z&7RL(2 z#N124v{;6bNq3IzM42#9g6Pco-x55v^v_RNgyhCb4R@|-{eYa%xYwBlXz4&C$Gr(c z+nHA-wXNMz<1IGk+`8X2qbW9`7C*(>ua^hce`SB&cmLqwMSZPG_1c)JA4c|%_*J+2 zgYQbVU#FXJoVa(Ib?nBe z*t~%E;h*I_|3(hh-Ls7&Ou){noFBUcnTA!}yM$jS^B8$^MAEg|V{`ZPX>RFvV`F1+ z(WAddMsEB`f=W+XF8mo?cBSONr{sgY(>OzI-}sb-^dCQeQo~H!!ssP^4+UUNR^_vW zM^3j9G{3)V%eN^Xl*V=&aTUJ;EA+CB2sB?_&f2;GyT1~f3inL@6%790*g2zwImNST zNOvtLd3}U7`sA3SqwzWMg9TS>*AAT6{c$o`xMsfEHTux2FJ2-p3{;u)ub4PCoZ`Tp zC%eq@9?4U}A6v26RvtL67}DLny_ocLDp+SvPs_~A70wt^5wvn<%QpteEZLX8sucVw zS<9~riP-f;S8wwsD6i9=w5sl$`A;==?7r0nKi@A0yZ_|wI2}{v7IMH=!7ytH~7q2Lq zj&{$k%2-{UP7xDfWQ8;~z8Q8+wOS4Ds)(-eze3U5EhS^)**{Vl3uOI0D;+WsOY0)MDS+tq> ze52P-Pr5^NZymk2H}XxoBTUv5r;^fx(P*?5T?*k1I~gbwQ0RC0I1;7Wk)9(s#D{YR zYaYGdTBFD$Ys*mvP$szyo;$1C}s9O2 ziMicRaj|ORkaD{@j@G-u_{aPXueY~%!o|i{6hbh#8FusMNvlAjkWtxpq?Q>@>thNA z#a@47+%V74pN*8TF#i4XJ3FoU^-tmp3F|JB%;t@KVT#Ewo#SCN?F~!M6ZH9XQQmQT z#@^&~jQ&}IsK~V7SC-hntMk|xk{~LKnVp*M44$t3I^VQ2z3`~WM`;Qp)vZH7kDxji zP=w>;-cpt3!MJKgP7V{CB?=<*-G5gWBp<|d=Q48W1f1ptLfE@=GIiK>y28Ha`KF_) zr1^X40@~`mH3OyQ&wX+4czsvKjdiDs*==Oc?IYg|N0obVeJ6Y#Y3$~(vm%!*)ouwY|Wt(*NfBhw9EhEQrL|sTR>95oWni2`IHyn%pjxsPdCD^J`k4}cs}~X1bQ^Ol2*(B zU;DoHz}@&ejq$6WODgcJ1C``s zQhaT($o0DTMVM6SDSSPCD%w&0!2`0o`g%?5pK8sgFvFu&>+M3j#NAjc0#rDZy6b=~fI*vJu3$D1$&udm3XL z2h?*Oi;6U9t-iOaR@n6waT4zSFkdjD9>S1#Ex{ohz54l6i`jWGFXtYG@+^(4AdE(w z14v5wWn&-ccXXP`aSOO*>v$p_jX84S#E59$E!Hvh{V3K^vWX{H>!)dBVV~yY=G9j_F3QC(U{hXUcrspO z)62CcaS#&|+t>sMfB88GmTvD3BK$l}Rr}+05nuoL2Yl3uj1LcvGbS%SOPF<*+-^@y z3z_fprMd9dw0b;-zoU)nT%^6ihvR2S^z`&(X9N{l?u9NKcf%;D%oe-jkGq|y)W3ZE z=-LNinPg;SI=d>FeI`ds>QJZlGUyp94knCIPj4%hr@IQ=SKX#%eV5w@-_}^r)*_^A zbjKmoy-i^2@82-9ho+fBm3oyQ?U5A+*0GfiAXRdTi_<+={BSb&?hRTe*ue+wS57!S zb|P-%?mBS;tX=jII`+8h`&&8XfqC`#>@)tHw=wzQb3P*%O2#)W0<83RiepjH6S_c6_JFAGO8nb;2Zh1LzSn_2dyX%HcpFtHpiz6a)fLO* zvcIA^3*0J86)qUG;Jx8N*aStB`&rIWKGH^E5qBnuXguGSEA-QkbnauYEv4)cfAM@i z%AeLo_6;ouTr+(?Aj`9fIiHdTw{p(sA^`_UiHSFxjT+jZwp8yUWJ!kL$V00fFgkcG zeYAeu;F6h)AlglRA;JUmV+AW2arBZ|e%4mJ&B)Ct8ua5z#vt!|SA7}hrQ1>#sVitS z$KEaFcGUjiVMaa??<$)Sw}fkUL5#hVike#FCDL=$7eii==MT3O?H5Tn5-j;@U|EU` zYlDc%8BATrtroXuTWF_7m-DUp%5fJ+2%a;d6kHV2& zJLccFo5>~pj<=t-MDNZdgq$l>o0h{}4Gs>zKFnhkhMcy!Emeq9&su~!W4LThT!H!% zrip=OsSrscV(b&U@3%X-qIs>BrZLs4m0d5QrFTQk-S9na;h<0;b5V3qybU$Rth20n>F7#ft{NTaz-e!4k582XRyQ(un`fPy z2rA_Q2Td3vt(%SBGYIGfz9nZ|(~7tb?6uT+_MU)V$(6!j)mE#NiFxi=nE_Jq6v`9{ zC-F^#^mjIGjJMRj9p6kH09dGZNMiRI$R%P>z&csy<^zrjvF^8={S=WET6Rl03`*7m)<<&SlQTUotgRkyp2&% zotG|%X^)HU!Zp_FWPu*ikQVT#*T8!w47*-Q{);EwFX*o!h+K}mtbY!(-9klR`fDd7 zIM}rO&;G#2tBq4(-F}>SI|1*(mMxe`s%8!4WnwuW#Pu7A)doc ze$i`(T2wk0KI9vJR9m;PxfPOj;$$)YX%%aK)#a#5%}w@>l* zp6xAD){7)z;o*az*sHVTi$4@hnsirtZhlhd0sEV0OY|dZeI``HGPom(larI*oSgWy z%{pHZ7N){rFt#RI+oxyqX`d&Zh70+iyPyC1lTVJ}@>RT?Cur72+B7{9DDgU@XwB6+aPQqD#Og%8}{K7W=+$T5Up zrMu9#cX}3!mJe)9a9Rg5Xpbg@^w}J_ z$UCKfO9Y4Vk`H^o>Nc`LS6LiwP2K~?%bEDbUX4HS=A;L()Z60X7k-#Nma~d)oE_g; z+f|Np5K28>AS?NwwWV?^Hv^gWhyqW>s#?l^0)X_npZrb-v3x51YpG(NiHGzcjDmna)zNYnpTn`m`qC9$%EEo?fV& zJB|#kHZKLvb?|F}VeKW4dN%N2x_p@s1{lCqU_SXeh4*e>78ApPQ@J$P-a!IO>9ex) zi)4UG-9?ZRSXlj7PcKPirTote8wZEsfm;^hfrpV$*|$fcZmXBhpFa*gzC>oH9 z@OAWs_?bZrpd=|bS>9kcV%~xH4*0()$Y9KHkvUn(3owdu6<%&`-3X+z*qb#`H{o@0RQ0>&^2{#e2aG!5{1nE{Q6e&eE7zr^RwU_ z$&M(RwolcSdWZu>_sn!umk^5LAoUzPB3eL`BlD}P856FoM)zsC178e&4KM2}# zP&wirLM$Y<^5=~XuB`K{tN!HQv@EV|s`ZK_I8tL0Xg})Y(tMA9lb;8>j)U{N`?USgi4xP01%TAOzJMT>$-OrNxB0+LK3p!qx6pe3Wb-01dXYLST=*)ibnv##uRf=wRoUH_uq2Z zs=xApUWuG11CuM@>A=Mix+kwdzTd{yI)$Wuu(W%4sC2WP*wN)p=YNNowJ>kpS1)_- ztMte!%>)IC`s1SmaC7@~PkI*eF}+m8URt#?7x1j|*{I%6G504;*i8!{hWTkdA_#Xy zSQ^svr4TFgK6vcbL4kGW(|^~_|=h5RO+p!Z{XkFI_20bBvNaknon zvZJG;Vo{5RE&0wQmG<|&Q*i*@cjDq$zww2E{EJ5)Tik`HC2P)g-1)ZZa5jAHR)B@m z!!t*2-P2vkP(%wvaps=y-qrE-6CZ{$f;$a`p@NcFI66h!zyNGZ;tJ>@pN|1PDRR@K zD=9|~$y?La)olfMEO2=^?92K&#z9Mz2QMc(Tf0(0oBzs;_(p}*%kDX7Nn6OzTQ$Vt za37gV79Q3PwzgF1{h#Z$5e^{`e=9Z&UlNA?bwHH*=4r!AxhiK6YJl`}v51?~bl2jQ zH+%XSzJP=5rGNrspmEeF%?jSB9I?PJRjg@gvChb&FMOj#>Lm|fiuEbhEEBa-5b1Po znisUZd|9j2;R!v<;S7;5QLCwJl^&@B)Rdyo`!}EZ(NpG74xDyBrW0|X?_vUFR(p6O zD+%*s_B*-dNO2KCpHq_+!F1z{^H4l_-7;mgPryP`*7WE;SkS4b!f)=I`xHs8udjRG zl6wqX9x!2a0R8dhRG6SZOv|~kX1}GVwwWkU_o3YBETFEg4pm~-bUfO3R}CcwhJR<0 zRnRFDSM&kP>FVi8DV=4eqEjBxmiL<@q_oTNS#ulKOmb%8k7|MJlRdd$kKez>4;c!? zwg_OQYwDPZIv*E!DjmP zhTp{KB;-pnbk|6e93p6oF<1LVBP}!2MSqL={up4k)x(#FUFXcWIO5Zes6(o%EplP+&v}PK@%+gcqj7W( zZx~T9z^VZyiTxhl;sxFwxMp#A8S~|GoHY|;hLuv1+78U1dU!4kh6K;`q@>u81aH$e z$-8@K6;rjFXhd=M;^~MZ(^t6UkYU^gX5aZDe@=u^6MruXzAut6BuIKZ?aa` zSw$_W@mzoM;>^2eK0R;mxB7VdalHoh6(Bp&Z+MMNcW+)Q-4J{Im9sZsqpvLA-^vE7 z1J)TP+rge>rjLxc@j=z+=IVXVgxxDDDy*=eY0r)wSXbAb#d1U?+gRxH zr6pNYY`G$-5YB8Ma?$`}1z^odd!>KA5v=dkjLZ)8hVHnmfwwxvhQKHmHkXNazE&_< z)Ue;4^yd&1xxkaIlf35BH)&~}Fe(~qgT^68Mhwef6@Vo74vrNLK7GMVG=I2l=xkNk zkWC^Tq|jqa!raJbGLIDs4~9BQ9CK6Nw7KBT%8|6ho>AB#^gEVaU2UB>v88H%cW(Uu z0q!c)SdMBSZEACLs~w#c+zC;eCrnU7qH$VCh(;$ISKEOf_z3%42O>E{Z5X)PKj~0b z+sV{P9jy24eE>m%`e;*Q+|QnjN4MD2K+gb@6M*os(I^F)jA^^#OD-x}IJY7mQwy*e zDw?^d2Ywp}OcEX!2%iT%NZgfB1u-1ww}Ul*+x_^HeAja6puC9<_?QwHyxI|G3KuyQ zQTzKqnyI+RqSApKTLm5M?P92~L`QoGGXSn9!ajts!l<-Y*(=xDk2S`CEQC6FqWo7U z8NH@mc!`Xm%%|(gd3rx#X@`)#TTCYS8hE&*u)fubje(+gJQ9$V0rUsZ9)h|Kj$T}Y z&t%=9$CIBh%o+o7PY;owyJ`r)diE3_iAv@HFtV`Q{n8XA;hO}A>Du1>2C4AW>ca1b z0VW3SrZQt741u+1YHAAMzo z+VGDiQaV+<;2RE1vW$Fi!H3bA39t)kw<};4-3KOuYOFbtgYEvQS}YHq657tdAC`8Y zMrOn%7jrdfIb#|d^uY~G?_I^$UB-b0lVl}{#Iac$xA2iV8IN}IuKjul@9D^vTf1({ zF0?GL>cg+6$|U=~CzU3MDuvQuHv#ubLK(I5Tn6`UnPVwS_U2P%o&FLep( ze7*j4d3L~u%AXd8>Cw+C>~af=w;k_~E#M=X?>tZb(VU9Yj_}oM5Ey8)Q>G;*?l=Ae Dwxu^< literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/modsuit/mod_modules.dmi b/icons/mob/clothing/modsuit/mod_modules.dmi new file mode 100644 index 0000000000000000000000000000000000000000..1001ae77d2d6587ed77d841c90ef354b7b0d9cc6 GIT binary patch literal 14775 zcmc(GcUV)+w)aK^R8T}kKxsx10RgdqfDlv=q>Bnlmm*RE(mMgM&;$Vmkt#(%dJ82$ z5b0HV2@s_BDhUvhd=uaIob#S@&vT!9zxzGk{Uf_&_RN}@wSMcjX4VeWR98HF=+q$y zf)3wRlGlQuec+O2`~W>T_4M{lgPUfL2alZO%^gi0ET21B+Sx*oTU=UHr)|omqYa&F zC$t?8-@9F;C91ET`IU26NACEIhMsL^Y4N}fyo@FSI~pRD&cNX0smuX;j{_{QpgSW=-#+%=x<2y$)wv_dEQ^Jj zOefQc80E$3XZhE97q>;myhLrQRQkSOf^Ku(7JPo|Z1Yy;23rWN(;HRy2F6Mj-mo3{ zhRgnb#%CV3Kd*bR?8iy3oJ)zlan{44=E&m-CdXzoRfi%vgU1dW%d|Ijj=~E0W7_2L zT#^9^ku0bL!q}UD5s$R5&s`#<0-Dj=L*ERnlOCj1N%P)L{iVGtQP+1;`Qfv<*@sOp zn&}p}Zq~EYufCXd6jxs9RPr;S&+3eLa<$j{uuaRYWWSSWRWw; zoi;yoqT*#$CvQ%u>RIUN&T)0@JuYm2PZNBv2;M%8Zfom^W4>#vLuh3lpxi$7=8X5& z-O*5*NX1~j*WB2IErV? zdMe3=d(|68BF=Cpl$sEWg^Xw}ZxMLQ5vRBzh!?smfAfJ`-0~>W>0w{Y+WPFNFA@7p z<(n_Qr)g20WFB77uaL1lMgfve`9 zE0=?AVF!4uPaO+5dHK`BuiKLqW9(WVO7GpaspI{SKnTm9Y@eQ)NpK|WI1>m(CmD~e z3=t(eWeF>@OO7j5EUkqX*YDlGf4{DiOaoo&lJsE!idQMowhB)9DP`LtLJ|^+Qqt(O z+?6*8c`$}FB+Ff)*GeBnXfoo*iY@ydV;^Ye7L0H+VTc;nPKvr$;pph-^gez1)S^YI zQonf$$zq3>WD={n*s0p8$4Nmi9=TJx!xD^}aC{=c{JCQPyV%&Xc^JG^Eya^mqNDIo zK4uvCwZN^pl_YZE!XOM*nz-ZHgj+nBx=yf4^yj7x>HRbw7T%${O>%d8sylW<8vDkI z4q9`h<9+rbzw>4QjqjDvL%!e6FTZ%P4}qY8AVR9w!KBPgfn;*(COh=wNo$lrb*>?O zc&y|ZTnvBOzMAHj>MT%=upVluFn4<+`r~_(jJUE_UKR;w7=4}2I|M;c1!AbMRZs{m z;ILf}S9(08#&SN*Ptu-or{l(5Mu_Y9bp;5D?>(2=q14)9J8|ufe1i0^!mRQO;Ej!u z&(Se^SClfw=np_J@5peevs=4^}At_?5^T z5cI8<56l3QJm`V1-vw}a=_nmI(kFvMjhz2UNWFTnF&G6wa=VW}nHsqh;1Bi-mNZGG z^9j>P2zp`B#0unpex7?aSrzO z?OT*Mb$TWS6Z53mN55R*g`ja+Js}8aK`acGvoH(vKriwJCj{+(zsw5iKk75G|G>ZN z>R&{-2g(`qQnB*y<6^U|J*{rtjC!J-OwlVueB8=ui9bkTj`3TU!1{GR>}PnWcPw-r z9J6WDve+q1QGt^he-5dQ$7%@|$|tO?b~|>NnTyidzZ(AdGGb2vve};g@+v$W>2uSH zo1?5(Z?j3=dMeTAosq3B`?`>LSs181WcXV6a5kKulLC&d;4TD7-&(hx4&@8XR_bS# znLbH18In?wryjE=LSKc)Z8{h%>uj;nKMCr~1vk@$iFx6J>zJik>$>1|I{A0@`Dy&@-SaCr}9z~t1(1(HYC&oi%=>ySJi?=LPce%$j#eTA|! z{`u@3RvN2~uy(%y3HN}`s)cA6bRhAE!9LC7nm^kfYh8DY3JCCeTFcfUCDd+KN^x_a zDv4}&SeR>t!ARxLrI`aARtKh#L(`E{g{}O70Zql3k)70{go{R;Lj)|nq}yCTfD%$< zq~mt-$dw)1pR5)8Anyk(;}Y;F%DN>upGWdm)_OA6kQ>OztfC*cVtyLQ$x1r^G9N0X z^dye9eYfV1omSa+MIOmwJpixVRo0_m`W`>?A)mudtOx7TX^ymguf~Z}TP8a4;3RyX zAKW@rlbIq)lsZWFibwLmtubb9soHbr$f|WyTn8|kWBb{W43*8TKMKm%V9bVuXr(=_ zwezC48)s^RZ@7)}K!lft(9!wWfL@GR{2uEE#=MPjXJp`wd>=i^cC75dOntWx40%M_ z@z5V9ffCe|YvO3ZIqoy{<_{nOm?3vZP^7x`YqtL6TqKK-(7>bmdRLCk`3R}hNIQwj z80q@m_VN_2`psBJMLoM2^@DBIWv{?n4Fce;mQD;TM|@*5?`V*3?_5)7k>5*Jp5qdX}%c4{hAQebiENBO7}Hhm96;3vQL?a=JI}4fR!}`c3$3o&ZAoc zDxSo9L&cU4lVndPFXo77lro-P#?h?-V_VGR;L`&3m2_l3^wfQ3KAp>sxNDu)vY1!( zRqRt+lzQ&yT4{=-x%HN4$KHEuPa?qsZ3b?p>=dy$an)j78+5f=U ze*Et1jj#$|CNPC0N|8Mddn_m)zmn09qD(?r0&8% zknibP(fo~#jdP-+qLw_Fbym?<_g%4|8DBYR`(%rz#v9edf~LUZGM7PdfvRcotY1;s z;uHJ6=CGW-bNA}052ZNSD3@%POz}5Xo_#HSD7^c}&36#=T<5Drl@;B1T_AUJYis1@ zEK>0Sizcy0@vIB+A=c1q{SgaG;GLA@VIEaO!?AaCFOFx4}Qef7r?<*^Bu(0U8l1mOWO0_$tZtf|e4T)5{Wlzl{ zBwl5_SB`in)#t9ZKN3=r+4(sJG5jn)xlESB;j=l1!ja}Q(k^FrXh zygk~`l24hs&VAAm%r?U^!lU`^_Vw`4&PS{{InE}Ng)IBu(}4Ut`(a&24Myj6 zymnL^9M_RetVZMr)lAI)wa(^n2-=#IHOJW+FRRGJgl+pNyOq#}w(6#1QB?q1h z`Cv9D9%2^i&t;1W+SaeS8orR_riv0h?X8X-%2>f)KD={KLiWG`KPSRyU%x-|7~4H0 zkt@vLcj4Mg+#d+J#o~xZS;BYz7(K(^R(&Bq8X$qM=YJr3|0SFM8#4rc6@r$wm6xp+ zSM%T^rBjJfi72yXoCcp1oQf>LX+IK92X1K`Gdg8||l z=VSvodv!c-?((+T7TXm%qOFX10OV$MB1I)kV# zYz3=sgZ(FK$QOQ@-0ExSG3~8UdWA!h)_1LGaG!BsN=Z15hxEt?`O6gB+C6V$Ex17k z{fsD}tNDag7UqhE9(AjWh<8Gu_*@<>d3y2tbaYH?49n$WDNQMObT?giuNoB~m84oPz0#*@ZN(##^U5;)!GbGLRZRibP#+lnmd@n05o z;M=H@c@#Xz%Rt^oSZikv*D67t?eq@jKVah6-P=2-EOO}3)5kZPTyJ(>RH+u($TQkb zzCqkjfniQso|^8Eee~vkZI7HxaUfoS>WH&(`!)$2(nb`sr^7)fK>kposGZE#<1~Y2RYrAj%Ux*wC{{9~k zlfQw~znl4g#B_g9o?Dq|Y3)+{5r`5%*3WO{?cU&z7^PTjOf{2`Xbue(6|8TyiK(Vo zd7lJCx&R&3Wnku7&snv+&(FM#Wt^2S%<+E{`kNCINPy*UEC?Y;a5P7lm2`FI;KvL5 zeAfc5ii_`Z`6Gmd5!ycF)FxxNg$KpIenNrMkihn!;P|Lfj^Th~(s?9Hc+!l1j;v~| z)KFv`q@;0y(bo|+q`kzby4PtNd&9lZd8#QKyzVLNLK$s)r9*n@H$dn6N#9>;N9al5 zak*2`&><0<;)d!+)2$9Tqnxp(spd%Gt;VT9B{O4L5wur?HA&xP=iHfDZ!;$aCP>zgdgKi`CnRU(fhigR%kR;$fD#Kfi4@ zkP>qut#8PW?(U~D`985*AhycY|74FQk|NbTSzG(dBXAF}TWHERl(2v>bGyBc zmaeVjs1as!)s?c2*N%Q{8;X3U4V~9Wu&DykNfOS;OZ^8cM*C8XF@d%-;tD+}Qg;ygXYi{Q3F{RSH*;Dmi)i{dsb1&EC$5P@3CJWp*p%pk=_sUQuG7Lr1760(Hv+!>{_rI?pnk%_OwqzAPZiQ z*dl>gFcYXmDLKVwX5mM@Jk6z?61=hVd27S4Ozh6Pj9XXnADuoSw~|Yr*rvC|I_auZ zZk~^iI_xOTXV-E;a!5b?>iIruEB)lfERXvO$V*-Q+`?cj%eGCB04@bu+*Mkq(4`e^ z!xa})7C?~>QuEBAtm>~ir^IKQ#uf^T6E&o*Bou=j#*VSrJ292X;6umg#@}4AD^YRN z+&_QY5@kpEz<<1W_kuQj%$D`NSJsWJ=AAyBVf|&hu4Fr^wwseG+O^+l(;UhZj!+1$ zK9g77J!55KrDar|>?L>83B;-TomJ6Jn7KQ8p7QbSL-wl)`r$ILQG?OK6md=q3Jm7B zf;}c6AYAHzHw#um^{Nu2VZ=RI`pQ#8&1`6|Z{h9!`N;Z-&NWkHM`z-RE*Z%N0zoHB z;#hH9ouenK8P4wX6tFi7HF>Lpx>G$GX^vL;%Zz!#3mAUhc)W8!{E{e8`2M~yd8&w8 zi{dKlwP~Vi8lu^;!&?v5DIS07hfg7SHmAcS zjRL0k%@W)YjCQZiR!hIaW8IEBRmVJM42=3>yTyINylpsdUZ)EEBO5yBI8%YfJz@Xe z>Xmg1R-I8{u`{8hq7u7B#RLW4Pw#;w$HJ>&XGU3%IU7imRoo)hcPF23Zt^Pxv5AyK zd zF_=R-8ezG_QH$G4!%DbzQ}2N~=Z2{-yQqtnb1TyRYFoo-oGFg7?aN7P_}2TG?LO6p zR?#$$Y|&EF1Kn(^Osv7D3(i|zak+dfoJQhv;4jvF^K~rfDPdTl&*%&dB{74<&~N96 zI4FzvVF>qAxaTD@azoq14mu&}Su0wJYQn$u1;+b$p}uso$hxFamYnh-Dxj&dZ|ERD zpK~-SGImSrv#rR9yWUz4u$k7Awsq6=XfdJ;zQ8_U|1A5O$ zZF{?D?f3SecT;ugT?l?CAh>$cS%Pd#npNZAQ_J{;@WQ-P`kwsB}z znuco46x}rrJ?u7Boc&wu&#jke4WNu^+!YD*;fl?hpEwoh6Ef#3d3aHypB+qs28%kU zg<1^UW1sE4WTSZIG4|Z~5Rn*(=LrXW=WWZHz_ez9Bnoe>~Gf!4- zc|{kTp6z9Uj;a*>KF|Q$X1;epQ_N`^1B8T)q`k_L+2oxLhDD)_+M|=kK`m$nd9wt@ zH~5IN=yZEwA(-qQG}922`CsSD-I z%AByV5bq>L-=ss`TW-9^FAn+W=EhxqC@+6%Sh{%ZSMLuQb#PBsg}*r_vbsBpylmU> zC9;Raq`cyP?2V3C;L9n5@9n#UWy9wUot25ln^Cmh7Z3Elwe{k& zdzvv+21_=aa`HN)pAB&L>;j!zK01%I0_Tu0?P;F(q30vq4E&z;QT{TJ0_Kk~x?$t} zQf+A{Dcb#>Yh|8Msbud!m9r#p*Y4qrA6ye?<+jb+4*BjnRpt{|#0B|%rs`LVD7;?B zl8#Y0=wiCrAcC1H4YawIrj!^&33;J9&q$4Yj_Sq*`Uu8%jx#$LK_ii31VBf8d;eH* z{-4D~f1w=ZTG0FVQF>I{P)9je#OJz@R*?A!73Efgz}CYdm@${{Qe@ApR-48pSMu+_ zzF!9{a7&uvL*TKqbB>vw*`}_hmWY=DeXVeur-Q+cA(nrufeQ*gr2k|TU{?h?v^jLR z9feX$O)Va2;gHc5Z(CLsIEf*Kg;D(l3yb^qXM#CEw(ihI#(8d9syr2&Mn-+oW)}r< zo7xuEJd{swg*Z#hhsDMTo1LrVNmDVzlKehkgW2rp=gVLvfeeuT%MQGpqO4V;Y1KotHQm;WHY{=E)8-Gn{R|LoW8l3GT6i*8G-$3tlnD1k9o@xYDcbYgOX z3vFa5y^9*(XE<~6;IN4~_UE2UZ{}^EQ-PWeGCM=kvss)U4*lTu;JO z&=Sl1%0d)Z$PP?}Y`X?Ei!(j-A_yl>Fjh$bMX0{BJ*!V`EVFi5ER z_b9$FNdhA92G+?+j@Z1LSSp46Ky?G$g%mfzHx(VPtBy68@;)=o`{=~9w#O4tpb-{d z5cc-$fks~)(>!mwq-tT6Qx(LoZ0G@*-y@afn1&WonVAcX?Q4rl-mr~7vn3?B8s&ah@Ef2SX@D(6 z*$g;tYE<%JiMI60CCAjxF}3u-Yzlqbo$?jR7YAUBklMfV`>cRN18q$V^7X(*bN_J0ut^I|j z$iLRe3zXOM-2K{!GR85Tm@(xI00Zs7v@JvLLr6SenkXy%C%9FiVxiL&jm;nKHv|VX zMJ&HDd(&R(^C!-goV* z;y2hm)2EqRkvhM;>`joE3E{T(^ej>H^n3$oVGpZzOTo?`@Ob|n;mTv1o7|p!Jz;*^ zq@Jy=bfA1u@w3P!mx^7DehtBqAhmQSe9vk@SlC$?PXqgNi;ZC)Pax=OfN8RPu;F)= z8nDr4xyRres^M37`d>vO!0yC%kKzE1TCyq!P60Wxo;jo(U^3CGNIR`}v_V$Xdl9=%V}E`{)VI}*$eh=ERhGOLHC_Qy|ds1 z*?~pyf87}Szgai_r|_)l!@eW{TvYDtP?*!R>{PPoO7TbNY3Z&g>)RUdZJ|#0ujBL# zPJa4Gb6ny7Cmb$_K{ejF*$~i5PDHxl62R4e4}J;Z8B``-f(M`)t3~m*|D*v=b7cCH zFeXnjIVdjAC;_|!=zUj;zTh~5ihbuPRPPOtEi-Sy`364dZX+0Brk>I9I3h}3S-CYQ zPG$%eA$+aJnJ_LpDyna_QLs2BQx5Z#uRvFrDU~t}`jhel^Bw3% z5muUkpSFm-`D14og4p7zxd7^xdJA!mxTvNgwRHO8#B3_VHJC>N2suLxOLxdvv>6lv zM*cz^9~4NH=$R2s29Jjv zo=)AitUBQ8<&uME3t8vMDVCR?$>~tvev!J;?cz{mDA?Qn3Whg4`d1)}bzp+lLi<&q z`HT1P@jK=!_uNZ6-tDq}aBZzTXW@H##zh%0^@~Hfvojbs6%=8V>3XlA{N*Q)_8plN zJNo)J20-KSa^6SZ=?zGk<|!VjZzqdgg@@5JaQogZW`(Hk2oUGTg{0z1a|}R5ozB|V zQbm6Ss16wRh4F?@cI8KO;dx&^WF=-gj-b@R(`ydy4swX$i*(FI^qqOvq0!CgA-j}}?Q zO@4D##pLBtPESNML-gn0F34_O@U^3tGw;ch zJ5tNLqZllrOt^_C`2Y>-D>dzHwhZ}Nb}unp6YT7r8-3BN4rH}U=i;(2|7IETdn%Mr zRi{n!NdCT1P3R{@7u_p))yjA{<;8=Mf=kCJMObR3@h(mvB1#wgO?}S};cY{z@L~Jt zA?aSm6y320$aLbZXeu(>mBuHjkzpOCzkA=PiCyIO)CPcjNi#|I;8Bp(;r}~-;(uWY z4eTy<>p~%vXKB}{wqS%!$D(i~ba|ByRkMeWYz!{iHX_s~e^I?Ju6?=cSbqVtE~jCA zY8rF_tN>8MFhKZNScdcro(c^{bUQ4XIlkiiO?H9G_m3@H&Ppx5krS_NA8(U87q)EX zSpOId9YynjY)Xzy@>vmyms{)yc7Xx;Fx9Ojo}%Rvs}K8T{JRJuW6-I7`gMM&_m2to zi{~X8d_IQWp{mR-$`t0HEboyDtg)@2oD{L#XqNSh3XAgcses9WGJWjP0ZL(jS?p$0 zx%-8~qmxrcdeYOtGIS>#Za)h1OA4zpsTDg4Sb26WPjG+|_NT6}Sjn`$@Z(o$-pi|K znIEL|W7wrz;h#R~Qqwb7glVj_K%U29=<3#VTk{|B&e?maVA7-Z8Bf%$cZ-095j~bn z;0`|l<49S4qhZ7nbERt4_3)A5yCUl-e6uS%AKs$p+N1Q5IFD z3a3YLS1Ugay?zk}qiUNK_fSlKutED->6{oHBRH2 z??)K;j!2jWrA;4`1MEjN?z&-bWOY^5_jNpMqKqs3?`ry*YD+vs`DOD7u^%9id}`?Z zA-HR+%1zuUOr;#j)hPEBkghv6QfcT!ur^Y79W3aKaC-{V$+-@QS=z0>1Azu?d6}zw z)Vb|HtNSQMH=nY@c5bvNE=c<19bhuIx_#)0-lMs@ZU;q9Q4vMZd# zP5efN10Iew<*~G}QAM+qv=x8~*T%JuziGO-)WWAQm19&w4TLdQ{|_3H5zBruC2mpOA-U! zB*_@g&D0Qq7(TV{nAtL(YNi8nydOlXa23D0Ri;qVY^^EGc98>yo-#iae1lwPuJxEv z92rXL(N>7JTdTOe;m4Rf(vWEC_80e!`aPj3JMxA-@5V-VtKB0Q4C6K-QTWtcL02rZ znKH`t_SkD!P3w9h&MT{Kroob>h7W@LoXB&G)6{m7>2Oil75$5W9lrikdtGcTZPs5v zG7C7mA6sSH%zLN6SiS54_hEMo4A{%Hdl6a7VBWh8cD@7zL>u9<66*E`Avs>IRSykr zZ?{+*G2a#xt1yp+mZ+LLS=e)IalW88BtMnD0dX3ZYq2G%-#U<$!oH~k)1%%5@VDYx~ z?rHxL&%$z(rop`xWQOO0?^_7-_dMA3cH7zW_8;fJ*vOtM+Mv zs;p=FbedI!-%O`PeJ|Wvdl-rx_So)mp;~?KjlwHAR}P>-5Q2#=m_IQ^QoV-a4Xe@< zTbODf?|ZH@Ob4K((Kpco6u#;dRy3*(m{5#+30m}2vx!PCa<6)5`l)UATeb9j9;$z? ze-G%PYqt^2U>QuSG|Q)E^}IT#9Xfs+L3Nm^=(@-DjkQhWStBI@)HZHl`D--5lI{gu z&d6NApLGzwq1t#Fvi6*h~~P!A>Q(PMT9pE;s#^}(f$oT6+ozM|Ch$<6Lh zghW4zOTk}_xx(Qn);8NH)LpCLeOttrpE$+`hV00O#C3~3QYh{19x}pLv}*4)P`_Y) zpR?B5+NsV*Gx#ZJ=~H}6qWh>;FH-gESd4r7)gj8rP50%Jfs)Dt*}8hBB%%aHeB5<2 z)(!*#Kmd99eVec(?>$kLa8}`smG+&>m2=t+l#reF(x8^NOK54+Mk9H%woYC7{%MuY z`Vh=z%uYYKvI(<4{lE`NG7N^ct@w5du9`Y|JUrG#M$*jFg@@-C`FIJJ(5TNo?}Nr| zd@!wTW866c`VPl6@?p$v<%NGT@w;C2xji3MQsJUn+ey}>ZOb-33v$7#Eyrfj$p-ix z8{5n7dyRY9c{MC74e*BF1!JVh)K)!azlWtgn{waic*E108*7{IBrE%Ytm4oSnMQg3 z`TbN}v=+sM+fLDOJsrXJc8Q1vBD%`%J(9ieQZ(sPY_x9>3=IOY1x!D#QWCSOFz&iz zab6nHZtYsRCLYWt(_37Vo<9~o%SY@@qmv%q#92TVsn5&|H@O;A)tek_Ho&Lc0 z*6-1bazm@NuUcybk$j|SBe8b-3ONKmnP@A$t}=F8*cI#T^@FI+QGzd+IuRKxX`waWh;)|d>$u8{+& zB*qv1S+_X4NZUz-#Ej)fw!e<|yFpN9FxW(u8XH_bXgr`M@o3d+yC9qWkMRw@lMq{s zK!<6hQ6l0tr-CrV(~^7Xn5NJb=GRNOj>+X`BGumnPwiM@b@oPaP2B^y<0Y7M)LvW9 zUBVS}2|d9^W&?*ONYyu#Uu>4!YqT+jiYyRxb7uQkjYW$sYHVlCbbedjY#y$ELE&uY z-xQ9&yr;z;@<)(q zJ?j>vb-V_Mr5_7P$+G-zE6OqVs@JxklUFi$8P7v3>S##S2939PizC08t)p=aru&}fgRZ+q7h07mD zVm=wBw=B(42O4fp+Y<2w2Fnp+NHCka7jsTyMm=27JVG_k^Kvrr{3YqgyvRm|DvJDz zt6lU0Cm}hjZe5Uv2K}s?g?Lj~*>L96AMwkBbZm^0Ywl&?RVjSqYTWiHeB>sLZ^+i$ zJkfk0$2mCVke;Y9$i95Mv!kN~(zU%N7a84ts@xi-JdtQ@9wrVmqb%B9rkEo4Is$Q| z?=pTAUf!C_O~tUo@~4&BS6n+wL&0`zd~hy7`UJv+U_n67>TNc1mO5ipk2*}aQl2vl zK~0Z966ReCi_*zuX=(Jd+kn_xmM0gY^*v(t76!r;M9P0%W;r;U_HppzB%$#j#_=-g zlePIze7gDWwE>Slz8klw5@#8~qwwhCPQ`w`djwjQ>BLocCHdX4yD1`~FYf`tPk{br zy6z`!$}l%0;rYET(mu0hRB2!^AWzsxk(XHKE2i6^sn83N>H(MHF1c)J{YyAXcK z2UTZm-?(Zdc$tr1ox0ck5KN7SF$wiP;f)JVqLt@|57t^%8Zz2Clx7p<-Z!H@0?@mH z4jvipZb`kC_V%CLP#8#ojeS_UdBzflvaebFF4a}vI9iQJ>0S0}>SuHUgK^H*KoF$5 zYRFXGZ_s}po?5Z{93&=(i?QjSqdwD$FOJ-ztPoe5J~E0Z?-Ut`BXn6g9KR`SfM=I*1*w+;Cmpmi_Xk)Dy>hjSX43R47cwI$#(l}>K^0?QGG#bZn34MWoyR6=%^@= zib&BK?O2Vw{#GwqEmm9MsS!p~YJl9;?-FlKxloj6lrc>^v~+?eNbnX2r}_PV`uo1? zs_xz8vYrazbSKxH($kp8Qp_%tz41dB`EesfGr`ZJ*)nvJns~9Z6A6RCBKb8?p`4P( zc1Idl6qm?pEqQUNrzL9rK)SB6SxX&{Xgq1-3V)0g_uTE@$@OInKu!NQl1BcS+x;b} zHtC5A_a4Y?=%?-qP9O*rrRSS1v10Pxa$o?!XR9VWb^2fvy0Rvw%DsxoV%2MeqGxUDFQwTBCADThF4{Zt?b#ps zQUCM_%HIRRKfLDu$a()(Q_=^a9O6Lk+d7KK-!w_#nC-{c6B8yX^3+KST=mRncWy8( zl|ipdg=dG!o2D{Ob^;dCEJi+XoT_6-vZ)nJseR;Cl$P3MRy7C;4$ev8;zA{;N=*ug zh@g@c!<5Hf9u(jiadvhNuRM7C9B2yfmGLoRx-N&GVvO*VB-7EIZH<(v2Fg|*JDI3V zF$_a`sb)?!AN+uo$80{|Gdcxph}P$(oFNjP>@n0$O>AS{8}F6OoF40OI5>`GIMSqJ z(e|UO_i?q9>1!`S4GnI>UaL8a|CL_cRGnG~MJ@y*3%)D?NxNl2)NE*1Cb?VGHe)}@ zj&M@!MzQ-#knmwk(Jf%TJSohze-ILOuBd8WXv_|C?WeZ*G@nOu9n1ETA0`u z{_z)jBt%iz9vky0&gOV8ne+^o>ooBhT4MtgtA_0aM4mwS{x?Di3Xd~;L){4g literal 0 HcmV?d00001 diff --git a/icons/obj/clothing/modsuit/mod_clothing.dmi b/icons/obj/clothing/modsuit/mod_clothing.dmi new file mode 100644 index 0000000000000000000000000000000000000000..41ebc1a2ba8204c281f2dd90043fb02b8977d72d GIT binary patch literal 77817 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 Mx`A4iie2RY07AMAfdBvi literal 0 HcmV?d00001 diff --git a/icons/obj/clothing/modsuit/mod_modules.dmi b/icons/obj/clothing/modsuit/mod_modules.dmi new file mode 100644 index 0000000000000000000000000000000000000000..037e7fe69634af68cdcaa8fa45a80a23deb22746 GIT binary patch literal 52753 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

y_IAJyFy0(>3<>g&B`B3I&LQ0>$I5 zW~0XwAga4&QUko|-y*LYV&FrT?lT+$lbA1KYHI(pI3B~U;`yfQz4Hc`{ve}UcEAP+ zWrFUs(T^J}h_8R&=ul;KWBYzV#8_WP#ujR4Nv&Z;I*{>-^kc-JM*SnF3ZOiXa6r%T`CGrC8g4)r8W6kN4MnWeGH^B}dvB=Ta}uOXS^57nM9O zVQ)nx`f2uMgh>i@LWU=!Ho<$s%t8m6OnVSwRv~dK} zwjZ%9^V-iOEGD1Yf?1G>yT1nI^gK4wbI>;bIGNvfKRPn4c-HY53~LUku1XKIrjScW z5mKkrDt9_QTtVc$QsuvLVLln{jw*2=%fnILm?hL$L|;~f>{xm^1bW|92@fQ30}n&t zY*cdOwdCVB&Z%oHfGZ6QF^{;WqxQC-ncPjI^svlb`}F>reM5(}^S4J6YV#nG`i*$O zg~L3n<#j$JXS^ff%BGpR#Quj|=N_>|DogEFJu1o6VIot(*x9?%D%gs=lZKu`sNR58 z47s?jng@RczLy8b$Dqz7KE$YmXf&bG^IUFZ!E7I|gC!@RrbKmT+B8OABq+h7lTPF)^aC@~`FR=f>e@lX+CIYnYPpp7J$HPMa27{g2 zuA%qP!{kptaw_OJ_e1-JbtxTJ2=sLEzR|N&c5w~eo{ts#=&G&JoVn{i6P~LwV<0&p z#bX|`Wg3&ftwaKzp8)N(wX;)g)EDsqLNAwAloXX0f+p+!kIiEE3_)eq#d>!jkDffX z0vWGl*7uo%Hw-x-a<9F;cb_Ae4>A1W^?*WB-jd*NsAIG<1d#-}Ej0N)W#0T!(UZuY z$|!=K%Ck}A7Zw4;fe7+}UpF6h zR5a*;ufLJSFs-PWKM(hWzoi&L;cgzbz^+s%P%yL`o1AQNb>FfEkBh;R! zPOIodXFThh_S)0sG`zO?5n7=~fRJ=lpiumgG3eCiUUE+83#(-@ zl0x%#wFV*^rZrG>rB5avTLO1jCh>bzv1nM^H0TXsWAiH;k+j<`j{U1=2@LnyqzH)X@3|(t#PxgYTA1CN?O%A*7RGM(%Q`t^UA{6=!?{j+y*22r11)J(O?XN z&ED{>?d^@@SoetslEz+?B z#43ug=2L-O!GJad4K#1waE;=l@;*jll&X6?uQskhBz1U$CHv8Q;N&9sVWJoN+{)F39#UxD8Tb%oxZ4EGCE*Qtem z%zT2+1q*u1*GamZl7<5No*T8j0A^%nPCSGMpwp6od3+k#v2c7S8`AhS7ZE}FlcA6l z4~dY_oWc8{0W|upZNIV366Q{hv!%Bv9KKwr^&dI@X~lup)7K^Q_;2MCI+_BBAb%I~ zI#PgxxSx}cZ8^kUU7vBKOd#P;?U@Z0>}~4GeB7TJF_qaRLjm^){I)u~l>b)Kzki0d zhmNSAh8y=z!@H>k3)N#aF3PF()R-8l%eNP=Pm}$p)L#w%CkP=tUeeFIV~Rlc@5D^E zl-FqD`H2LY-rf(<1Zcz@DHblPh(a!>&iEb+{}jk-cQzd;kr%t8J@ky%#HVi0v6|X8 zmYieVjJB_)$yYoUOhly4ejjU2tmNO3S@k)_mGx@R=JIG>GU%#E-Ly~y>2=V-gkGQX zZ?OZe^NM3cR^r|K<%9HZR=VqqL1)J^bfm2x8Ih_!Lb}c@*!-NqfaWbV$)Pryo&&N? zHCaiPhCWSyB_$D*#JSDv)I>)tKdhWMSMC-nskB-x?W1|i-Cd?plh+-BJ=Nr}OFTp& z;7RCP%vmEXzX7bTd=FG-6+L+CE@irHbj@j8hn%`Lq*a`ag1_(AGcF(!Cm>YvAlqJG zD>N`uoWBGSH3hf|-mh^V&%H;Kl8law1L`}t8m%ASkthgscj(u zLJ-cl(#**B#(q|)SL1{;%9?lXQ-yk`AB=X<)L0R+} z)fPVI+;g2t&ln{eW+}Aj;42dv8X7%xbG>1M+UFaG_A8sN+P@^`Xzsn(jR-`TA@OGquoK8Q$2z>g;V1kI=A4Ca*_pY;GV$N} z(9w^X05TB0U5={!$=)fxl0gh*@PWg4?5IJEZ@-A_`KQoRyiWq?JCY%7WBr8LQm*<{kK^pIKl@_@7e_Sg!jIwsE9ru|ztj>8E}kM3aT|lHx{&0XnQ#LEs4c<$`$8ISHOKWGcfL!iPS$e zO`q5qWdP_y9Rkv&kO&$+3~c`aMMXa~IWmE(kFJ{ni;1h!sMx&kpQF8>FZTE5ec-0D zMF%xaT%xFCXpfCgGwOI=C{H3Qc}X?w@lN}MXt8@^*aPMzhVS>S;Am$yekgg{n%6s7 zeus}9aniK&IX9)7451$Q4hQpXsKscg*0bCuTtQnqvqraP8#3v9@xXV2xNVos>yM_3 zl@O8y{!udeSwIdr5arn3^;pNvCCpk?87tJ|00xy%)H2>Cn_ZB>X@$z9P5Mbz-qjb- z=e67Duw~&e_dBLF*0$){Tk=O`Ti8=6|7(@I^OMmr&R6YaI_RH!~jaAs|jd_0ib3%ZM;C|Zn9uK#m} zi5rd(zs?gg7)y4{MbW0PDDN^dxcMm`ra4R$`L@TA$-rs{{3}0Jp}Z#}RsofXZGHb# zv?}?8C+MI$bvh8S*+gjPBNxRKOVgaUosq&eo>IrsnLqY%0-dk(dYI0=ChHl073k+8zrgxYTI+l9|asyQ@#czqls##9F$qGIlE=NLlpnr@mYJ z$Zj6Svq#atqF*tsR-2v&Irg4kT?~0ZZIfK27%N`dT+Zl~&M+7WZTxELbICG<8&U1} zL_aMpRRAw;^Q_Ln90yQzyCTVydCNiN5e9n+NDlkyz%quyddL>nK!tUUf3u;$tGX5M zqJ==AlL!to5ev!C)`~RW5>cJn=M#(uVB@g7^k3yX4k8qsGD*DRFJ782;T0_?GudRG z50bW21ZLsjQM<5RpXk)Jg*azrDABU z)OvNQ=l4@QWWJFRVN_IAkp*AhSr8?IzTEdqBz(De2PDQMyg`0%Vl>@g^Gj(MHvZfG znp&(k>H<~^n!^-iDrD3O&Dk$6YFU@Qp0t0juwVaq2W+xE#Y*+^?H|Q$>h+eOrWGV| z1Ky^iF?|&6Po|7YVRIJVo>!w|kAv4Aq zo9OcpBK-NVN&f7Zy0wmdnka*GVq$1#D;^P2zgp`2-3sc=NojE+INYYz0z(3=SyQHP zq(b^gbm=GmHxp8{$GO<{eb8fXz?%PnuymCNZ@{AC3;jNlSPT#ZejVz#J}>t3<3w$} zfvV!lMD+EZ)G^$7eGK(}S;Sx@W&3JxA^?!rGun+Pz{;3;eWS7YYuKaZZunuez!JyN zS;sN}^OQ-UCOd`Dc|laiyRT~)75K_(c<}jVpESsXr=k0bGH>JD$dcD2-T69+KZ%3F z=K6A^TGg}zPGxhzRu=h%%2JyGJoBXt_9RR17nuHmnn@(XpE)%Ws_arsjtmWUd{*gG z7JutyHdtbNnD-q*#`9xAuQh9A2H|&mk3N42!TE{-HE>vceMZuMAj&YtK-QJnC9>CU$ zxjsNGP!lOSUNf^W?4r6bJr zT%U&X(FmLD9PdqAXw^Y@5UY16|4v-`Sa-#*b&wN=BQ)`u10U@~riQAerbMs=;orDC z1lRLwMtAG4na5a1tJF z(oc3m2NSs=wU#pnjP=dr@QK$?7nINMQwd#FiY{%j+T>OX?BErtmh|~g&IjG zR2NmewkIB^g8dn<5lGL7k%cw`=SbT(RAn98+hX6~lLQoo6n;upqQuz?mPOeLBf(wx z)BKv+dN#Ax>wyc8GZDD2TYtgk0iD>jO(p?i91-_2H7(h>))Pwnd>Q0l4i>vaSP;*C&55 zo0=&xItj6w=HRry%lm!Uh81C{Wh2BoqDLD}#M5W$m$<_kef2ThiTaxa)vop02+*-S ztFFMfVS01h4^dK)kEcYpKS+nxwEv{2?AeNpu!l%&M2}O`w2pc?lXPgZ@^jhx_Z(+> z*XvHEj6Y{{+l^!>&@(!@vQ^hu>_R-E_^M zd_z=HPG(X`RRL4#4D)DtBQ`HD&#a<>Z!gu$k4I)_~q47ARMjY_vZ>oalC4P~&L_*R&P4Fjco^m`brQO5qQ+ z+BlQL&uNT3J8~>*Z?${6A9)KmOqv%W>Fghl(;4*uy;A<0PO5(OJrf_F&cR#*`u`#9 zEra3;)^6b$2=0(Ta1u1QYcdcd5Zv8@yIasf0t9z=hakb-Ex5b8yZhao^S<>}-KwuH zKbQ^7Fufn^r`KBDvopa@{>Om~bw;>917!L;Vt-GbYrTAit<+O_@F6EhE$nXgQi$*43tC)tN{PiUcEl4Rvw)3P2d zf(<>a8m5+c)hNntY1kWMr+50f9fgGMs^P4-Zh3O59rol4fjzigJr?IWQ~#?4=&?JT zWdV>*eNf%q2p%PL!?{W0514CvRL-62sVh-z4(h@6Bn-enZ>o+82c9MV3%6NVA9YR= zW^5frg8T+#h`7lRE~0t1F+fyO37<+9PQ$uK45s>H$E)@xh@S^JJ*%}{U3$Zrtza5G zAJCwg&P&}Be->{I<|!dh7O*b_T>c|F-4PQFs8AC<&|!=V$@#;9E#USp3V-Qx!~xVRsEbA&30HlI@yLr@BNuW30C4ogr-7mz%}Tjc|TO zAYT>L9j!@7+H3W=FS)p0?y}g|v$5x^%>(3>e==p1Holtf%V5#XQAH+~jJ49)JQ|ea z-2&`9FDEYhS$-ZUVR@-VRIDzuu1Zzh8hf}C17eaOTmJ0-K`125ZseE7agj!~U9Q9N z<4?CD!?LfMMu7})`t1alT{l# zFenvPqhO$=rDXD`1&PZ(XGYB($BHT(Ml@#-8$Z_I>?+lH#gH977vUl+PQ2{KWA4z{ zh_RDJ%UHbo$>;DGd1^dYB0fC!km=6me&Px>G_7<@RhD6PI^U5rL^v8UXZ*)51b~;Qjqv#DI z&NiLM^Yiy-wd_Wo{@JJHDhh))QM!aI2t?*qyiU&Stg7qPzKDql4Je%dxvt7B4+F5X zoqbpEe)@zmn|#AchTS6q84bZYo}&Q(6*=trFYt-#ZJoR8HQs-PPl3EOEicxCz*$+v z(gmQ$5&#D(Ox7sTsfdGI6T?}r*__+maT!$qjW!m=BoKC`t+%Pt7ynNle7w=LBGM z10$o+W@E1G8yZ8P!Ue6~RPEgd6}EBnA)Vqlfi#N zZKFXH%^-3VpTh_-0=;cz3>Ppm(;C&Rgw!rJ%=UPL zD)9l!jw-RN05uWAVG;^R7`1`wMT#dyq3e$q=f$IR_cXJzJ5y_CkqekA+c=_E=eS8@ zdgRzMB~Gpd^a?r>?CDPDhCI33BQ+33hI2<-9mpE0;rqgvjOHUyP|cNCCn1?PP5?;Q zH@mH#(X(9_R-- zZ6{CL#28v$M<>`sD7P%XRWbnZ^z-+l{aXMVeU=n6b&HnV;#>1IJi1vQPPEdlZfYbT zTa9PmHBf2bj%u-(Q3l|w#fc>mGZb(zo~;ghN&%S~zj8KV7h~ zh71m(PDxhPu5uoEnlH`E48`<>dr6<)SeFsZVQ6@cZiN+!pDM%+5y$f3WR`_{hQhyU zegrUS*aEMQ)hU;z_t3?~LmQPCrS{RG3srC2_J34A@8y!`JV|*YWtb-uKxQ^)E%}OBJ&Qwz9Gw8hW&59&&`Oe#^0nz@;)Ev!#d9@ zQIdabjb|e@R2#U&*Z%u?=GX&6RS%@T{_`)YRY5s7K3*s_IjSV2PoHW-fT`)!=gnx9 zsY2s{A(FjXcwBqhoy80h%_r~KI8?C#v?EbFM*Tl#5U#2+Uc$eIg=GyXxH`p2(2~lN z!5?+1$O7{50u2|U9m7uy3Q?j1Aq2c&c`~PL$TOwe>*YbmmlZ|2&j1@`QSG^|k(W;zSTu0J zA2o!%+^g2|YqrWo{1ot{`IeLMCZ!}eUmOs>Sso*6c+t$qU7up%Hz*ZALDvCChwF;_LsSP`$)`qabdS=rFUIeQcuQvSflN{ql7!1^HR#u%0rugp?V_ULKZ=OdsMinX6|-!MDw z>!Ux(L`6lV?TzOKk0tmzHC7t?AOR)l&-;iwP?I``_kR$Mo~Q4=HP&kwse}1cPrceL zv1};AFr#M`pW(;PQk*c(8!DZ&x1^6@0rBrw{xA!=9~RjY7E=!TH26}D$ZU$N?8cE! zAHx!aMDLh$AR`P9LRv2ithc~5OF&qZ(?{uMk`!{VOeWAQ{OBI|ARkV`^E$(^lOJz> zzt{mQIiq9#qcSl6@-}E<;=6dQ`ycQKIx)2Wa3|8XM`hW@V0ucT?6akdeIEix($4P< z>LEtAS6rf_{BY;GLSA0II!jHCMJp;Qa`6j|#eUzCVXhgz;i2fy8Wk@9-32PFZPt)L zgXc5478pICZ-i__nug~ilX(rb1Bp>p`s-;<)~!!PKLF;Kl9Eon`Cj6?HI95iiRnK< z9i1oIAM^4c&KslFWNW#2(jAbA_JSKp1jl{8RfMmndL^fmsbWA4#^OXPxRaLy;2zR& zaxU}fz@ETdo|5`x;bQFlqhpX~{G2QP^oN+o_K7Wm?pj+gXwbzlY^+=C3eg3G6KBOq zqh*DRfPOn^!al6G9L05Nsd4o%46%)x*=gEVJc`%;Ij_r0JinN0L$4Joun_v$F2lod z*N!4JXMuOL7!f(ywV!Q`*SSDm8XvYoMW@d%I8P=5m!tIX$c6PpH?|_ZR^IY=eL$y6 z%WNt@uTCK$Y)gwz`34Exgg7ZHTc(A40$QUoJ%K5>RX~Hb{2LW!lMeInvGg8iCCT+p zxp9ezWABBfb)Pg--GYdGd>Ec?n4bDj5g*Vcfy{1{1tK)#=XYIw#c^Q%T@oUsFDi~PS$RJ#Is)L@FU6=mW(~BT! zzTk=J6^ZWmF?KzCin~h=v@%mKhrwI#cEDeymkViMt6?y~N>8DJ+T{^ly8abUPyA#e zz@+Cawb0=fw>(9yB7d@Dd8(2~JG>&E7Or=!UOz&!waq&Ngj z_JT9`Hl^rorIXH%3s=QL?_i4Kjndz-oKLZUA}2Uw0~@82c3R}67sW$kiMkIrIzLH&2+e5{_*|r`Lkxc zI8sV5AjcU8nt`t6Y$Wb?CPP$Y|0Xh_3V3(hl}hp_kmlX#C3iec%Y^Vx^M5RNi0C(- zq~Xj|%Hx2ytfy1l@r|D!ok`O*I}V!Wuym#p$8<2fwr@7&%SK-hD^Nk23Jpz+vv)Ym zFFpHLXX%$WQ>e^nG%J zc6p7&rTSDE3P6=@>8mUSt-4N4H==hyOR{20Sg3Y7*kMOFz6*+_u_kaYvzLm-;?|y}-_)@ei$baugd5 z{0{3K=8p)EoyX_8l!4UP#5Hu^pV}jABQ_&noR{O(jvqXS?^5jFqr&^PGs6u+UoU>( zCV*Lhi%xoGSUu+VsQzlY@LjsVMP(amU^{SOFV%I>0o2Q zzpIDe%^48fnD!o~-9>@t{n&aB)!55NAf}r%tWAIW7`c@wB*$nF& z8$zX8jd^E{#pa|!Y!;k{oQR=hz;mIG>{S=2f;+=YSG?Cfq3nx{i~(gj&IX2gnL+{u z?eKb59{y`hd^hB4!w(zpNFS-0d@9oS>)N9jyPZt!T4{}>%3@>`Kg(UCq%@^J~N zcLys(XZXj(ODrbuMN_GVJT@+_(dgCo>00Nv)J|X|Vs7=xECFU)u_{!N#C$FCe5APG zYPtRX@v%8yq5FFNwSyVrUtGa*rm64`^Vna~ka*py4j-(oJo+0P7mz@H0pU{*aG^Zg zR{6utc+ZYa7@)sb$tIw-+nKC?UVVQ3;z7(ONAWyn-@r@mzdV9E1Q(TKkR7)f?tCVv z)y4BHxtRSsPlCmI=Hx-r;sa^B^TzZ)e*EZaZwJ47_f9a;*BAEC!t%$!yUe7jfUE*U z5SjIgHqD=+(r+Rna708zr9t?-H8jja@?e76J~3@iBe;YRRS`wuy zPSNCx_PDuOICnOr`ETABxY(aN9_t`R~~uKahEhmV9eWBVD;_ys)93zrKX&+0`B*1Z$ZY5FbcR| zaHNCY!l^GjgFhn$^voQ+C)4T6M%xdL280btOm8VAMbY7mU;r%3@hDQ=JNb+mu$#C;=5C#BHhhz! zHestA6GwDZ!q#s;``{Z9$64{3C}^fzIdP|sRh6hu%i}ZvPS^X~mM!GJx|=B!s?iK* zUmvRzNNrdK3yPYUxp0Fu0)d|Yy#RPRP}U0WMq8!k*mK)$*weyiZF1Pb<#(pM={@$W zrV6W}?pbkfbU%*COFD!jpAeJ6GQP>y6=HJ$9!qJD#q%zziy?4Sx1Dg?hyxOsu3PGCMPW43RQiKA|MDRPa>rFsQSn*>27?|!AZE`)n#|!y zobLoUXdjIksMXZw?$e^Mm3lw^_WFzZ+}<`Q;~kwZZ?oI>^{wK4M&|V!qE1NHqLXze zzbd={e0a9@d)7;q*QxSjdtHX^DV1>YQo-1$-8{WBZd=2~h+k`DWK>AvL~pgMGQQS! z<=u-oCZQHA_xNrvJ1~oG+BrcQ?r$-r`Vi-@tKSOUL)C*S*4Sgg`&cqV)hJ?rc&RL? z^UFk?8@-{L{3VTgjCC%P8*t$uDPRt$n zL5S2h`H91Y`)B*w;kR307uq;B-QeS-XkY|P&rs(=`XT#$rK1LRn${{(>XLozbHw zMaweGu?lqz04O1q@yjFSDz>gTn*kf+;}3Uw>}gxb5F@y?QCa=$w7fox`DM8 zT!)a&Q`GLAcl|Q<{CT^@W@@^pu3#1ForD3((dn0GOV8@yb2-|O=AIix!8evzBc&Ib zDi@2UNSh>0Ev=TEfqcr4GG{+8EGQUNot8JrxfuUve7YO)!3V35b3m?P0ZrKM-qpR~ z>|G{)Y2%VW^A##<#%si_2QwY{>fXEPuSRE-de9or>4v6eI3~LF@K*c`&{T z7Lb*G*Ir^Ygq*YATu3g(5aGXI`<&^Et{w85QrJz~Wqp$310DoP{Zk01vc6rO1!2@Z zMkW7as{al2k3Wu^xPAo|JO$3!&a#4*-1zo-aXlZ)7R=)AfF(9j{D zU@%0Rp<;?CbbuKqs%4P7JOmsx6x1YmTz4ZzAD!r0F-3x4KCG+NIQ&xgAOM3gKYkGU z2psMR1x}*LgNK7F6!}sT>CbTNHWmY><`wO$R(kO6+95xFF%7->%5%RKjX}S;@9}lr zJ7+s1_Z}d5ws7fH1x);ehPHqpV!jK#Qw35o@v+Cf%cC5%jZU0OIDA6Iyv+_BN@%cS zE}Ntj0N8LUX>mAp?F1%&I3=XI{H25G?9In4P4CLb)RlYt4+;1@_~ry`8z0H}$pjS6 z+i%OWN9n4!RptAtGKtlHiLqd%O;hYVI@RtJ}JOi zUps#Z@88#W;)D(*->mDI<;j`OTYqC9TWUl=9Ad-g^;DN9!~hvkkb*%~_7wn2nIic$)>n|-HoXsp?VLG7}0uUss8$O zJ~x|#{UlZ*BZUa^TtFEwR3J-pJ%0Dv0LL+EA%k4@>s9{Mv-RCto}g!@eb|NtCBKxt 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 E4>yQmL;wH) literal 6737 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 literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/ballin.ogg b/sound/items/modsuit/ballin.ogg new file mode 100644 index 0000000000..e69de29bb2 diff --git a/sound/items/modsuit/ballout.ogg b/sound/items/modsuit/ballout.ogg new file mode 100644 index 0000000000000000000000000000000000000000..f911f1a6a61dfc1d74745d695f7c90a0fc83eb7c GIT binary patch literal 9842 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 UQzIgcpB}BhJOfy?7sBAb06=9^kN^Mx literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/flamethrower.ogg b/sound/items/modsuit/flamethrower.ogg new file mode 100644 index 0000000000000000000000000000000000000000..447245d50b6e59fd0646e2fc93712cdfacb6a92e GIT binary patch literal 49116 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 D+@;;L literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/inflate_bloon.ogg b/sound/items/modsuit/inflate_bloon.ogg new file mode 100644 index 0000000000000000000000000000000000000000..9b030d66ced74423bf5d4190b2dad7424d52f9e6 GIT binary patch literal 16773 zcmeIZWmsIzwm-PhKyVEZG&q6a?(WvmxVvkB;1FDc2PZf*?iM5=Sa1mL!JXjFGp0kFWo693)a$TJz^L|p?z3ghnRVq)$3 z%z%|Bf4%@fKm*L*Ycq`Uv*mxMXUk^^%@`RMmgv*}OfTU6X$cLgpkVB7!O8QEo9i7b z3(K>SThayx62e+*#|{<%_%iEF?BA^t`OO*nbt0yjD=DC=yBVItveK&?e6{aj+z>7ABOpLmrGF)|?(x&I?th z;*?PdLgd{c4*t$a7y0oAOEZ2jJSScB#|@VLUqL8h;psuLoYzFbmZBf<|LKEDR3B}Bmtyhvoh2LMbFRop&j z;(>VLff`~IBs6UV0Du9Ipn5Wq1v0T4G6_`L3Dke{Rs@7`u=a0e`)e)(04l1elFqm< z{@R%V0MZwp$U?2iLaWH_@K~ha&~jKH007{j-EfGj2}mbNjH-iY8toVUBkQJ^6aF=a zVu(3mZBdFC&H_h>_}356+X%plWcd;BUmyn%$f4&USMaW6u7A-+PnWCVCCQX&@Jz^v zY~kI`bR8Mk%48jZQhAx$sOeC>?aUuvv|s*1(bjm5r87M9oJV$zGO>E06itO^TzX6c zltQSmj!l=Zfl@Lpo}di*XP)bGQ-6!So?YThoabsudrL~jSPzs^?%iF^#QblSzj}W` zhK^SRGc?9{ksfJc+lpKY%Y=w+SM+L!1(_%)Q*3X1$EqNS4~aV286-#h58$wX2ogmI zE=cCT3X^b(Py&~q^u=F3$}yCd(Kd8S$|-PzpeNIQnTlr*0Md~ z-A)gx*U+)8XaLF47bbyT{>6_RioF;jp;?^jbIT^-^u?JjFBwYyfs_2%H2|P|N<5B5 z^6&hIcod6T6&sqFCfPVA)g-}g<})d7+D*Q?vmyFdzDv-2?Pjc%Vy^u^@;^g|KIr7o z$^Oqk=z9rVhj@3Wk}&^km{5lTPPo#4=bLOTmHY(N@C2js8HX~CpenB9BnNmLPhXYW zUX{yyl2c!eOCPLZubE=6+vv9N*?i&3cjZ5_{)@ju#0CJq1WNjZH}nbXJh4==B3Atj zfC%FA6B+rNE_R(Kfl4-k+B(6~Go>UgeK#$e0rFP`z_KBG(A%}OQd!ZDw zEl4$GzyqO!pw0^cFwi?UI z$OMPTnE*8Zs}X2NCjwX}5?KGLGmgS>jKc}2LRXLfb^5>eRSoS+0&7g*Kl*}pBryK} z#<>31H~arL@c(rLFri!BD)ehaflE~T1_;LioMf=6kQ3mC;bc+}6oZPsalj;)i%x#A zW>Ne%7F1Ay=p=b0APW_YafHA5wW3pmk1JM61rT!r>XHBbwrAdCqF6v048168JbzPoBsH52Cm=)w;Rr~&|D zPYt6Yj$}fCbvkV%mF%Q|GOl&{wr95W_cMX#Vdq(;V@j%WD5e%!Ll{^T!FbSkW%U{M zprRkYfsoL0ct8vmAdWQAPT%s(rj0BrP5-AA$#D)vHLz?#k!LnESh7wpg48l9o(Vi} zQR-lD$iLVS$R4yKWn8E>c*@4$tD7Zwxq9_0`qLL-&%{R0-k}&Q_O+q8si`o zb#!8AupIp*F`6N&dOR2fLnN2tEo=ZC0CW));i~;)p`j?iBfF}KyuGKUi!knaZeIR4jL&b$kBHJ1CQU%& zBOCxw|BH5h{}w!@=wG-&FaT<-=`-9=q*AEFP3|)EYGk(VfhEN)^~Qg�LbHda7A0>w;k#?5>#C6KYL@?gFe08Zdv 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 literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/loader_launch.ogg b/sound/items/modsuit/loader_launch.ogg new file mode 100644 index 0000000000000000000000000000000000000000..513118f3c682d0c6be6232c4ec14668c930b85cc GIT binary patch literal 17220 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 literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/rewinder.ogg b/sound/items/modsuit/rewinder.ogg new file mode 100644 index 0000000000000000000000000000000000000000..2587562dc117cba584ce7de96a5d626ed340a9b9 GIT binary patch literal 30358 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 HM)3at0Kjnb literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/springlock.ogg b/sound/items/modsuit/springlock.ogg new file mode 100644 index 0000000000000000000000000000000000000000..8d0013d2630010e1c8cff6b25aa4389f5f17d9e0 GIT binary patch literal 11936 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 literal 0 HcmV?d00001 diff --git a/sound/items/modsuit/tem_shot.ogg b/sound/items/modsuit/tem_shot.ogg new file mode 100644 index 0000000000000000000000000000000000000000..50905b95f1128d1563c78c2b65d297c34011a827 GIT binary patch literal 12742 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 VlK2@BIDg~9{RRF0k52>8{{@XktPB7E literal 0 HcmV?d00001 diff --git a/sound/mecha/hydraulic.ogg b/sound/mecha/hydraulic.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3281ed2dc0f04f79fe314f8ff9ee7b82ccd8ebfd GIT binary patch literal 27124 zcmagF1z29cvM;<|+@ZLY;ts{F#ogWAU5XY8lmewV6e#ZQ?(XgsFAl|}c!9#V=zs5X z_IK`m&RtJPvob4_Wac-MNt##D(oz+G0{->nQ~gt*NKb}?kU-oWolUG=o~s~YrT_ZG z1M;`f2vK})`Crd-%V)}*g()7!o2UQZGX(t)BLYG-Yt@s~ZRG$|Vk zD;oH)le4*txq~a+Gj9m&KTYXGL^U7)0$9T;N80B%8LbWg7yw{INrx6| zAx)PTmqqKD7$@~y>SGB>j0@?*Hw|a)|93{pVTJ<$Fn}K|Vr0%wX`69gOMIG0=S*H} z1)c&@_)z6_Uc~MzYEy^&+I(AwaXKmlRBc!Ql#7rQ*=KB(=gcISEC?UWz7RVPk`<&n zBheRT`XjLok_O1J?dQfS@a-4oMDiWb)=r8bGu2MZ$g$39n3lJ}>3h43^X{hpD?|J{ z4^nU}B5(v|7$OMI?1Sm@6P-a;|4fS%@B^m_NPfkZuEHLvA|9KfR6J)?#^Rh}7gtr2 zR|g+AeNA`sd3U#YcOUJ<&$^91+Kr!e7e4FXd^W}p`d7O3S-W{of2U3g0Wv9g{Z(_g%R6Cq2p zh_~@WV2?KbD;7VHEq)e)D9S%Qfgc2CZIdQXCSQ#4q9yNS7GbB%bcLv;&@>e#ru@~Q z-8jJ(s7t!xq`u6g$z+#tX_Vx=e@dR1Dez@Q(_kIJZYo+ofid`<^>i|P(V`aER(mq} zXJHdISPF?tp{Z+9`-k7ZU{Pd{I^M;*0k#NPO0jK1)CWty%~DUs5TEP*CwzoJy%{gy z_ow-j`b5H+V3XyO#ge#2p~Ysh4$|e4L_|u+6a^@$5YXhg`v09dDF6gw{6+D!+!^J>i&)R&1Azsk`1lE694geZW;9r}JGYMxMNDWXBLHtL-|F)cW*aKgQ zhrUwER#VDPGmf2eC|+<(VTmhq$gAS$PvN-D;F_y)>CbSQ�Tvx|=W7o9j0CXxIPC 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 Y0Px@1z?|Gxl7|7W5k}1^heBJZ0d-haEC2ui literal 0 HcmV?d00001 diff --git a/sound/weapons/revolverempty.ogg b/sound/weapons/revolverempty.ogg new file mode 100644 index 0000000000000000000000000000000000000000..81ddb1e2e0e2f20f80319579a6c0e59a89ce1e51 GIT binary patch literal 9578 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 { + switch (param) { + case 'red': + return [ + 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0.25, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, + ]; + case 'yellow': + return [ + 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0.25, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, + 0, + ]; + case 'green': + return [ + 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0.25, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, 0, + ]; + case 'teal': + return [ + 0.25, 0.25, 0.25, 0, 0, 0.5, 0.5, 0, 0, 0.5, 0.5, 0, 0, 0, 0, 1, 0, 0, + 0, 0, + ]; + case 'blue': + return [ + 0.25, 0, 0.25, 0, 0, 0.5, 0.25, 0, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, + ]; + case 'purple': + return [ + 0.5, 0, 0.5, 0, 0.25, 0.5, 0.25, 0, 0.5, 0, 0.5, 0, 0, 0, 0, 1, 0, 0, 0, + 0, + ]; + } +}; + +const displayText = (param) => { + switch (param) { + case 'r': + return 'Red'; + case 'g': + return 'Green'; + case 'b': + return 'Blue'; + } +}; + +export const MODpaint = (props, context) => { + const { act, data } = useBackend(context); + const { mapRef, currentColor } = data; + const [ + [rr, rg, rb, ra], + [gr, gg, gb, ga], + [br, bg, bb, ba], + [ar, ag, ab, aa], + [cr, cg, cb, ca], + ] = currentColor; + const presets = ['red', 'yellow', 'green', 'teal', 'blue', 'purple']; + const prefixes = ['r', 'g', 'b']; + return ( + + + + + {[0, 1, 2].map((row) => ( +

+ {[0, 1, 2].map((col) => ( + + + + {`${displayText(prefixes[col])}:`} + + + + `${value}%`} + onDrag={(e, value) => { + let retColor = currentColor; + retColor[row * 4 + col] = value / 100; + act('transition_color', { color: retColor }); + }} + /> + + + ))} +
+ ))} + + +
+ + {presets.map((preset) => ( +
+
+
+
+ +
+ +
+
+ + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js new file mode 100644 index 0000000000..1ddef04399 --- /dev/null +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -0,0 +1,752 @@ +import { useBackend, useLocalState } from '../backend'; +import { Button, ColorBox, LabeledList, ProgressBar, Section, Collapsible, Box, Icon, Stack, Table, Dimmer, NumberInput, Flex, AnimatedNumber, Dropdown } from '../components'; +import { Window } from '../layouts'; + +const ConfigureNumberEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + + act('configure', { + 'key': name, + 'value': value, + 'ref': module_ref, + })} + /> + ); +}; + +const ConfigureBoolEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + + act('configure', { + 'key': name, + 'value': !value, + 'ref': module_ref, + })} + /> + ); +}; + +const ConfigureColorEntry = (props, context) => { + const { name, value, module_ref } = props; + const { act } = useBackend(context); + return ( + <> + + + + + + ); +}; + +const displayText = (param) => { + switch (param) { + case 1: + return 'Use'; + case 2: + return 'Toggle'; + case 3: + return 'Select'; + } +}; + +const ParametersSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + malfunctioning, + locked, + open, + selected_module, + complexity, + complexity_max, + wearer_name, + wearer_job, + AI, + } = data; + const status = malfunctioning + ? 'Malfunctioning' + : active + ? 'Active' + : 'Inactive'; + return ( +
+ + act('activate')} + /> + }> + {status} + + act('lock')} + /> + }> + {locked ? 'Locked' : 'Unlocked'} + + + {open ? 'Open' : 'Closed'} + + + {selected_module || 'None'} + + + {complexity} ({complexity_max}) + + + {wearer_name}, {wearer_job} + + {AI || 'None'} + +
+ ); +}; + +const HardwareSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + control, + helmet, + chestplate, + gauntlets, + boots, + cell, + charge, + } = data; + return ( +
+ + + {control} + {helmet || 'None'} + + {chestplate || 'None'} + + + {gauntlets || 'None'} + + {boots || 'None'} + + + + {(cell && ( + + {cell} + + + + + )) || ( + + No Cell Detected + + )} + +
+ ); +}; + +const InfoSection = (props, context) => { + const { act, data } = useBackend(context); + const { active, modules } = data; + const info_modules = modules.filter((module) => !!module.id); + + return ( +
+ + {(info_modules.length !== 0 + && info_modules.map((module) => { + const Module = ID2MODULE[module.id]; + return ( + + {!active && } + + + ); + })) || No Info Modules Detected} + +
+ ); +}; + +const ModuleSection = (props, context) => { + const { act, data } = useBackend(context); + const { complexity_max, modules } = data; + const [configureState, setConfigureState] = useLocalState( + context, + 'module_configuration', + null + ); + return ( +
+ + {(modules.length !== 0 + && modules.map((module) => { + return ( + + +
+ {configureState === module.ref && ( + setConfigureState(null)} + /> + )} + + + +
+ {module.description} +
+
+
+ ); + })) || ( + + No Modules Detected + + )} +
+
+ ); +}; + +export const MODsuit = (props, context) => { + const { act, data } = useBackend(context); + const { ui_theme, interface_break } = data; + return ( + + + {(!!interface_break && ) || ( + + + + + + + + + + + + + + + )} + + + ); +}; From bbaf55a8f530e43b980bc432f36be99cc96d5027 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sat, 10 Dec 2022 22:30:46 -0700 Subject: [PATCH 021/384] Fix pAI shenanigans --- code/modules/mod/mod_actions.dm | 16 +----- code/modules/mod/mod_activation.dm | 3 + code/modules/mod/mod_ai.dm | 70 +++++++++++++++--------- code/modules/mod/mod_control.dm | 27 +++++++-- code/modules/mod/mod_ui.dm | 10 +++- tgui/packages/tgui/interfaces/MODsuit.js | 18 +++++- 6 files changed, 95 insertions(+), 49 deletions(-) diff --git a/code/modules/mod/mod_actions.dm b/code/modules/mod/mod_actions.dm index b280ffdd70..ee28771ef1 100644 --- a/code/modules/mod/mod_actions.dm +++ b/code/modules/mod/mod_actions.dm @@ -5,8 +5,6 @@ var/obj/item/mod/control/mod /// Whether this action is intended for the AI. Stuff breaks a lot if this is done differently. var/ai_action = FALSE - /// Whether this action is intended for the inserted pAI. Stuff breaks a lot if this is done differently. - var/pai_action = FALSE /datum/action/item_action/mod/New(Target) ..() @@ -14,7 +12,7 @@ qdel(src) return if(ai_action) - background_icon_state = ACTION_BUTTON_DEFAULT_BACKGROUND + background_icon_state = "bg_tech" /datum/action/item_action/mod/Grant(mob/user) mod = target @@ -53,9 +51,6 @@ /datum/action/item_action/mod/deploy/ai ai_action = TRUE -/datum/action/item_action/mod/deploy/pai - pai_action = TRUE - /datum/action/item_action/mod/activate name = "Activate MODsuit" desc = "Activate/Deactivate the MODsuit." @@ -70,9 +65,6 @@ /datum/action/item_action/mod/activate/ai ai_action = TRUE -/datum/action/item_action/mod/activate/pai - pai_action = TRUE - /datum/action/item_action/mod/module name = "Toggle Module" desc = "Toggle a MODsuit module." @@ -87,9 +79,6 @@ /datum/action/item_action/mod/module/ai ai_action = TRUE -/datum/action/item_action/mod/module/pai - pai_action = TRUE - /datum/action/item_action/mod/panel name = "MODsuit Panel" desc = "Open the MODsuit's panel." @@ -103,6 +92,3 @@ /datum/action/item_action/mod/panel/ai ai_action = TRUE - -/datum/action/item_action/mod/panel/pai - pai_action = TRUE diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index c0b1300dc4..ef897d77ab 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -122,6 +122,9 @@ module.on_deactivation() activating = TRUE to_chat(wearer, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) + if(ai) + to_chat(ai, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) diff --git a/code/modules/mod/mod_ai.dm b/code/modules/mod/mod_ai.dm index c7356e41f0..8bc431146b 100644 --- a/code/modules/mod/mod_ai.dm +++ b/code/modules/mod/mod_ai.dm @@ -10,6 +10,9 @@ if(!ai) balloon_alert(user, "no AI in suit!") return + if(!isAI(ai)) + balloon_alert(user, "onboard AI cannot fit in this card!") + return balloon_alert(user, "transferring to card...") if(!do_after(user, 5 SECONDS, target = src)) balloon_alert(user, "interrupted!") @@ -65,7 +68,7 @@ ai = new_ai balloon_alert(new_ai, "transferred to a suit") for(var/datum/action/action as anything in actions) - action.Grant(new_ai) + action.Grant(ai) /** * Simple proc to insert the pAI into the MODsuit. @@ -75,8 +78,8 @@ */ /obj/item/mod/control/proc/insert_pai(mob/user, obj/item/paicard/card) - if(mod_pai) - balloon_alert(user, "pAI already installed!") + if(ai) + balloon_alert(user, "AI already installed!") return if(!card.pai || !card.pai.mind) balloon_alert(user, "pAI unresponsive!") @@ -88,13 +91,13 @@ if(!user.transferItemToLoc(card, src)) return - mod_pai = card.pai + card.pai.canholo = FALSE + ai = card.pai balloon_alert(user, "pAI transferred to suit") - balloon_alert(mod_pai, "transferred to a suit") - mod_pai.canholo = FALSE - mod_pai.remote_control = src + balloon_alert(ai, "transferred to a suit") + ai.remote_control = src for(var/datum/action/action as anything in actions) - action.Grant(mod_pai) + action.Grant(ai) return TRUE /** @@ -106,10 +109,14 @@ * feedback - Whether to give feedback via balloon alerts or not. Defaults to TRUE. */ /obj/item/mod/control/proc/extract_pai(mob/user, forced = FALSE, feedback = TRUE) - if(!mod_pai) + if(!ai) if(user && feedback) balloon_alert(user, "no pAI to remove!") return + if(!ispAI(ai)) + if(user && feedback) + balloon_alert(user, "onboard AI cannot fit in this card!") + return if(!forced) if(!open) if(user && feedback) @@ -129,41 +136,48 @@ * Simple proc that handles the safe removal of the pAI from a MOD control unit. * * Arguments: - * * feedback - Whether or not we want to give balloon alert feedback to the mod_pai. Defaults to FALSE. + * * feedback - Whether or not we want to give balloon alert feedback to the ai. Defaults to FALSE. */ /obj/item/mod/control/proc/remove_pai(feedback = FALSE) + if(!ispAI(ai)) + return + var/mob/living/silicon/pai/pai = ai var/turf/drop_off = get_turf(src) if(drop_off) // In case there's no drop_off, the pAI will simply get deleted. - mod_pai.card.forceMove(drop_off) + pai.card.forceMove(drop_off) for(var/datum/action/action as anything in actions) - if(action.owner == mod_pai) - action.Remove(mod_pai) + if(action.owner == pai) + action.Remove(pai) if(feedback) - balloon_alert(mod_pai, "removed from a suit") - mod_pai.remote_control = null - mod_pai.canholo = TRUE - mod_pai = null + balloon_alert(pai, "removed from a suit") + pai.remote_control = null + pai.canholo = TRUE + pai = null #define MOVE_DELAY 2 #define WEARER_DELAY 1 #define LONE_DELAY 5 #define CELL_PER_STEP (DEFAULT_CHARGE_DRAIN * 2.5) +#define AI_FALL_TIME (1 SECONDS) /obj/item/mod/control/relaymove(mob/user, direction) if((!active && wearer) || !cell || cell.charge < CELL_PER_STEP || user != ai || !COOLDOWN_FINISHED(src, cooldown_mod_move) || (wearer?.pulledby?.grab_state > GRAB_PASSIVE)) return FALSE - if(wearer && (wearer.pulledby?.grab_state || wearer.incapacitated() || wearer.stat)) - return FALSE var/timemodifier = MOVE_DELAY * (ISDIAGONALDIR(direction) ? SQRT_2 : 1) * (wearer ? WEARER_DELAY : LONE_DELAY) - COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) - playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) - cell.charge = max(0, cell.charge - CELL_PER_STEP) - if(ismovable(wearer?.loc)) - return wearer.loc.relaymove(wearer, direction) if(wearer && !wearer.Process_Spacemove(direction)) return FALSE + else if(!wearer && (!has_gravity() || !isturf(loc))) + return FALSE + COOLDOWN_START(src, cooldown_mod_move, movedelay * timemodifier + slowdown) + cell.charge = max(0, cell.charge - CELL_PER_STEP) + playsound(src, 'sound/mecha/mechmove01.ogg', 25, TRUE) + if(ismovable(wearer?.loc)) + return wearer.loc.relaymove(wearer, direction) + else if(wearer) + ADD_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT) + addtimer(CALLBACK(src, .proc/ai_fall), AI_FALL_TIME, TIMER_UNIQUE | TIMER_OVERRIDE) var/atom/movable/mover = wearer || src return step(mover, direction) @@ -171,8 +185,14 @@ #undef WEARER_DELAY #undef LONE_DELAY #undef CELL_PER_STEP +#undef AI_FALL_TIME + +/obj/item/mod/control/proc/ai_fall() + if(!wearer) + return + REMOVE_TRAIT(wearer, TRAIT_MOBILITY_NOREST, MOD_TRAIT) /obj/item/mod/control/ui_state(mob/user) - if(user == mod_pai) + if(user == ai) return GLOB.contained_state return ..() diff --git a/code/modules/mod/mod_control.dm b/code/modules/mod/mod_control.dm index ca4ec2a468..5b0fda2a13 100644 --- a/code/modules/mod/mod_control.dm +++ b/code/modules/mod/mod_control.dm @@ -19,7 +19,16 @@ strip_delay = 10 SECONDS slowdown = 2 armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) - actions_types = list(/datum/action/item_action/mod/deploy, /datum/action/item_action/mod/activate, /datum/action/item_action/mod/module, /datum/action/item_action/mod/panel) + actions_types = list( + /datum/action/item_action/mod/deploy, + /datum/action/item_action/mod/activate, + /datum/action/item_action/mod/module, + /datum/action/item_action/mod/panel, + /datum/action/item_action/mod/deploy/ai, + /datum/action/item_action/mod/activate/ai, + /datum/action/item_action/mod/module/ai, + /datum/action/item_action/mod/panel/ai, + ) resistance_flags = NONE max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT @@ -74,10 +83,8 @@ var/list/modules = list() /// Currently used module. var/obj/item/mod/module/selected_module - /// AI mob inhabiting the MOD. - var/mob/living/silicon/ai/ai - /// pAI mob inhabiting the MOD. - var/mob/living/silicon/pai/mod_pai + /// AI/pAI mob inhabiting the MOD. + var/mob/living/silicon/ai /// Delay between moves as AI. var/movedelay = 0 /// Cooldown for AI moves. @@ -167,6 +174,7 @@ for(var/obj/item/mod/module/module as anything in modules) module.mod = null modules -= module + QDEL_NULL(ai) QDEL_NULL(wires) QDEL_NULL(cell) return ..() @@ -261,7 +269,8 @@ . = ..() /obj/item/mod/control/screwdriver_act(mob/living/user, obj/item/screwdriver) - if(..()) + . = ..() + if(.) return TRUE if(active || activating) balloon_alert(user, "deactivate suit first!") @@ -307,6 +316,12 @@ return FALSE /obj/item/mod/control/attackby(obj/item/attacking_item, mob/living/user, params) + if(istype(attacking_item, /obj/item/paicard)) + if(!open) //mod must be open + balloon_alert(user, "suit must be open to transfer!") + return FALSE + insert_pai(user, attacking_item) + return TRUE if(istype(attacking_item, /obj/item/mod/module)) if(!open) balloon_alert(user, "open the panel first!") diff --git a/code/modules/mod/mod_ui.dm b/code/modules/mod/mod_ui.dm index 065f3f6748..f119a895b3 100644 --- a/code/modules/mod/mod_ui.dm +++ b/code/modules/mod/mod_ui.dm @@ -4,7 +4,7 @@ ui = new(user, src, "MODsuit", name) ui.open() -/obj/item/mod/control/ui_data() +/obj/item/mod/control/ui_data(mob/user) var/data = list() data["interface_break"] = interface_break data["malfunctioning"] = malfunctioning @@ -16,6 +16,8 @@ data["wearer_name"] = wearer ? (wearer.get_authentification_name("Unknown") || "Unknown") : "No Occupant" data["wearer_job"] = wearer ? wearer.get_assignment("Unknown", "Unknown", FALSE) : "No Job" data["AI"] = ai?.name + data["is_pAI"] = ai ? ispAI(ai) : FALSE + data["is_user_AI"] = ai ? user == ai : FALSE data["cell"] = cell?.name data["charge"] = cell ? round(cell.percent(), 1) : 0 data["modules"] = list() @@ -54,7 +56,7 @@ . = ..() if(.) return - if(locked && !allowed(usr)) + if((!allowed(usr) || !ispAI(usr)) && locked) balloon_alert(usr, "insufficient access!") playsound(src, 'sound/machines/scanbuzz.ogg', 25, TRUE, SILENCED_SOUND_EXTRARANGE) return @@ -77,4 +79,8 @@ if(!module) return module.configure_edit(params["key"], params["value"]) + if("remove_pai") + if(ishuman(usr)) // Only the MODsuit's wearer should be removing the pAI. + var/mob/user = usr + extract_pai(user) return TRUE diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 1ddef04399..3d64a6773f 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -467,6 +467,8 @@ const ParametersSection = (props, context) => { wearer_name, wearer_job, AI, + is_pAI, + is_user_AI, } = data; const status = malfunctioning ? 'Malfunctioning' @@ -510,7 +512,21 @@ const ParametersSection = (props, context) => { {wearer_name}, {wearer_job} - {AI || 'None'} + act('remove_pai')} + /> + ) : ( + <> + ) + }> + {AI || 'None'} + ); From 52aaef29f46e0aabedf16a3282fb4c54a2c55cb6 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sat, 10 Dec 2022 22:43:51 -0700 Subject: [PATCH 022/384] eslint throwing a hissy fit for some reason --- tgui/packages/tgui/interfaces/MODsuit.js | 4 +--- 1 file changed, 1 insertion(+), 3 deletions(-) diff --git a/tgui/packages/tgui/interfaces/MODsuit.js b/tgui/packages/tgui/interfaces/MODsuit.js index 3d64a6773f..81e604c579 100644 --- a/tgui/packages/tgui/interfaces/MODsuit.js +++ b/tgui/packages/tgui/interfaces/MODsuit.js @@ -521,9 +521,7 @@ const ParametersSection = (props, context) => { content="Eject pAI" onClick={() => act('remove_pai')} /> - ) : ( - <> - ) + ) : (<> ) }> {AI || 'None'} From 99ad8cc1a5d30c26f411fd066df154946e162c02 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 15:19:03 -0700 Subject: [PATCH 023/384] pai panel, force deactivation, and rad protection --- code/modules/mob/living/silicon/pai/pai.dm | 7 ++++ code/modules/mod/mod_activation.dm | 14 +++++++ code/modules/mod/mod_theme.dm | 42 +++++++++---------- .../mod/modules/modules_engineering.dm | 4 +- 4 files changed, 44 insertions(+), 23 deletions(-) diff --git a/code/modules/mob/living/silicon/pai/pai.dm b/code/modules/mob/living/silicon/pai/pai.dm index d18014f4d6..1a7747ce89 100644 --- a/code/modules/mob/living/silicon/pai/pai.dm +++ b/code/modules/mob/living/silicon/pai/pai.dm @@ -200,6 +200,13 @@ /mob/living/silicon/pai/restrained(ignore_grab) . = FALSE +/mob/living/silicon/pai/can_interact_with(atom/target) + if(istype(target, /obj/item/mod/control)) // A poor workaround for enabling MODsuit control + var/obj/item/mod/control/C = target + if(C.ai == src) + return TRUE + return ..() + // See software.dm for Topic() /mob/living/silicon/pai/canUseTopic(atom/movable/M, be_close=FALSE, no_dextery=FALSE, no_tk=FALSE) diff --git a/code/modules/mod/mod_activation.dm b/code/modules/mod/mod_activation.dm index ef897d77ab..886ba0fec4 100644 --- a/code/modules/mod/mod_activation.dm +++ b/code/modules/mod/mod_activation.dm @@ -125,6 +125,19 @@ if(ai) to_chat(ai, span_notice("MODsuit [active ? "shutting down" : "starting up"].")) + if(force_deactivate) + seal_part(boots, seal = FALSE) + seal_part(gauntlets, seal = FALSE) + seal_part(chestplate,seal = FALSE) + seal_part(helmet, seal = FALSE) + finish_activation(on = FALSE) + activating = FALSE + to_chat(wearer, span_notice("Systems shut down. Parts unsealed. Goodbye, [wearer].")) + if(ai) + to_chat(ai, span_notice("SYSTEMS DEACTIVATED. GOODBYE: \"[ai]\"")) + playsound(src, 'sound/machines/synth_no.ogg', 50, TRUE, SHORT_RANGE_SOUND_EXTRARANGE, frequency = 6000) + return TRUE + if(do_after(wearer, MOD_ACTIVATION_STEP_TIME, target = wearer, required_mobility_flags = NONE)) to_chat(wearer, span_notice("[boots] [active ? "relax their grip on your legs" : "seal around your feet"].")) playsound(src, 'sound/mecha/mechmove03.ogg', 25, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) @@ -170,6 +183,7 @@ seal_part(chestplate,seal = active) seal_part(helmet, seal = active) to_chat(wearer, span_warning("[active ? "Shut down" : "Start up"] cancelled.")) + finish_activation(on = active) activating = FALSE return FALSE diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index ed183557b9..679032de3c 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -14,7 +14,7 @@ /// Default skin of the MOD. var/default_skin = "standard" /// Armor shared across the MOD pieces. - var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10) + var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 5) /// Resistance flags shared across the MOD pieces. var/resistance_flags = NONE /// Max heat protection shared across the MOD pieces. @@ -92,7 +92,7 @@ name = "engineering" desc = "An engineer-fit suit with heat and shock resistance. Nakamura Engineering's classic." default_skin = "engineering" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 25, WOUND = 10, RAD = 20) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -128,7 +128,7 @@ name = "atmospheric" desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." default_skin = "atmospheric" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10, RAD = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT slowdown_inactive = 1.5 @@ -164,7 +164,7 @@ name = "advanced" desc = "An advanced version of Nakamura Engineering's classic suit, shining with a white, acid and fire resistant polish." default_skin = "advanced" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 10, RAD = 35) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -201,7 +201,7 @@ name = "mining" desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." default_skin = "mining" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15, RAD = 15) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CHARGE_DRAIN * 2 @@ -236,7 +236,7 @@ name = "medical" desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." default_skin = "medical" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10, RAD = 15) cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 1 slowdown_active = 0.5 @@ -293,7 +293,7 @@ name = "rescue" desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." default_skin = "rescue" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10, RAD = 10) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 @@ -330,7 +330,7 @@ name = "research" desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." default_skin = "research" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 10) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 @@ -366,7 +366,7 @@ name = "security" desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." default_skin = "security" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20, RAD = 10) siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 slowdown_inactive = 1 @@ -402,7 +402,7 @@ name = "safeguard" desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." default_skin = "safeguard" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25, RAD = 10) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -438,7 +438,7 @@ name = "magnate" desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." default_skin = "magnate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20, RAD = 25) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -475,7 +475,7 @@ name = "cosmohonk" desc = "A suit by Honk Ltd. Protects against low humor environments. Most of the tech went to lower the power cost." default_skin = "cosmohonk" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 30, WOUND = 5, RAD = 0) cell_drain = DEFAULT_CHARGE_DRAIN * 0.25 slowdown_inactive = 1.75 slowdown_active = 1.25 @@ -509,7 +509,7 @@ name = "syndicate" desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." default_skin = "syndicate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25, RAD = 25) max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 1 @@ -546,7 +546,7 @@ name = "elite" desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." default_skin = "elite" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 30) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -584,7 +584,7 @@ name = "enchanted" desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." default_skin = "enchanted" - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30, RAD = 5) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -622,7 +622,7 @@ name = "prototype" desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." default_skin = "prototype" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5, RAD = 20) resistance_flags = FIRE_PROOF complexity_max = DEFAULT_MAX_COMPLEXITY + 10 slowdown_inactive = 2.5 @@ -658,7 +658,7 @@ name = "responsory" desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." default_skin = "responsory" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15) + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15, RAD = 25) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -716,7 +716,7 @@ name = "apocryphal" desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." default_skin = "apocryphal" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 25) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -751,7 +751,7 @@ name = "corporate" desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." default_skin = "corporate" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15) + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 20) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -787,7 +787,7 @@ name = "debug" desc = "Strangely nostalgic." default_skin = "debug" - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 0, RAD = 25) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = 50 @@ -824,7 +824,7 @@ name = "administrative" desc = "A suit made of adminium. Who comes up with these stupid mineral names?" default_skin = "debug" - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 100, RAD = 35) resistance_flags = INDESTRUCTIBLE|LAVA_PROOF|FIRE_PROOF|UNACIDABLE|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT complexity_max = 1000 diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 9bd391bd22..49e8decdad 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -92,12 +92,12 @@ /obj/item/mod/module/rad_protection/on_suit_activation() for(var/obj/item/part in mod.mod_parts) - armor[RAD] = 65 + armor[RAD] += 65 rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE /obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) for(var/obj/item/part in mod.mod_parts) - armor[RAD] = 0 + armor[RAD] -= 65 rad_flags = NONE ///Constructor - Lets you build quicker and create RCD holograms. From 9a969b304c2cdef445964702bf3220533c3d3423 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 15:31:00 -0700 Subject: [PATCH 024/384] Radiation protection balancing, needs looking at --- code/modules/mod/mod_theme.dm | 32 ++++++++++++++++---------------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/code/modules/mod/mod_theme.dm b/code/modules/mod/mod_theme.dm index 679032de3c..135cef31b7 100644 --- a/code/modules/mod/mod_theme.dm +++ b/code/modules/mod/mod_theme.dm @@ -14,7 +14,7 @@ /// Default skin of the MOD. var/default_skin = "standard" /// Armor shared across the MOD pieces. - var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 5) + var/armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, FIRE = 25, ACID = 25, WOUND = 10, RAD = 0) /// Resistance flags shared across the MOD pieces. var/resistance_flags = NONE /// Max heat protection shared across the MOD pieces. @@ -128,7 +128,7 @@ name = "atmospheric" desc = "An atmospheric-resistant suit by Nakamura Engineering, offering extreme heat resistance compared to the engineer suit." default_skin = "atmospheric" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10, RAD = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 75, WOUND = 10, RAD = 0) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT slowdown_inactive = 1.5 @@ -201,7 +201,7 @@ name = "mining" desc = "A high-power Nanotrasen mining suit, supporting more complexity at a bigger drain." default_skin = "mining" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15, RAD = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 15, RAD = 0) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CHARGE_DRAIN * 2 @@ -236,7 +236,7 @@ name = "medical" desc = "A lightweight suit by DeForest Medical Corporation, allows for easier movement." default_skin = "medical" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10, RAD = 15) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 60, ACID = 75, WOUND = 10, RAD = 0) cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 slowdown_inactive = 1 slowdown_active = 0.5 @@ -293,7 +293,7 @@ name = "rescue" desc = "An advanced version of DeForest Medical Corporation's medical suit, designed for quick rescue of bodies from the most dangerous environments." default_skin = "rescue" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10, RAD = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 100, ACID = 100, WOUND = 10, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT cell_drain = DEFAULT_CHARGE_DRAIN * 1.5 @@ -330,7 +330,7 @@ name = "research" desc = "A private military EOD suit by Aussec Armory, intended for explosive research. Bulky, but expansive." default_skin = "research" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT complexity_max = DEFAULT_MAX_COMPLEXITY + 5 @@ -366,7 +366,7 @@ name = "security" desc = "An Apadyne Technologies security suit, offering shock protection and quicker speed, at the cost of carrying capacity." default_skin = "security" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20, RAD = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, FIRE = 75, ACID = 75, WOUND = 20, RAD = 0) siemens_coefficient = 0 complexity_max = DEFAULT_MAX_COMPLEXITY - 5 slowdown_inactive = 1 @@ -402,7 +402,7 @@ name = "safeguard" desc = "An Apadyne Technologies advanced security suit, offering greater speed and fire protection than the standard security model." default_skin = "safeguard" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25, RAD = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, FIRE = 100, ACID = 95, WOUND = 25, RAD = 0) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -438,7 +438,7 @@ name = "magnate" desc = "A fancy, very protective suit for Nanotrasen's captains. Shock, fire and acid-proof while also having a large capacity and high speed." default_skin = "magnate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20, RAD = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 20, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -509,7 +509,7 @@ name = "syndicate" desc = "A suit designed by Gorlex Marauders, offering armor ruled illegal in most of Spinward Stellar." default_skin = "syndicate" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25, RAD = 25) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 35, BIO = 100, FIRE = 50, ACID = 90, WOUND = 25, RAD = 0) max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT siemens_coefficient = 0 slowdown_inactive = 1 @@ -546,7 +546,7 @@ name = "elite" desc = "An elite suit upgraded by Cybersun Industries, offering upgraded armor values." default_skin = "elite" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 30) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 55, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -584,7 +584,7 @@ name = "enchanted" desc = "The Wizard Federation's relatively low-tech MODsuit. Is very protective, though." default_skin = "enchanted" - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30, RAD = 5) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, FIRE = 100, ACID = 100, WOUND = 30, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -622,7 +622,7 @@ name = "prototype" desc = "A prototype modular suit powered by locomotives. While it is comfortable and has a big capacity, it remains very bulky and power-inefficient." default_skin = "prototype" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5, RAD = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, FIRE = 100, ACID = 75, WOUND = 5, RAD = 0) resistance_flags = FIRE_PROOF complexity_max = DEFAULT_MAX_COMPLEXITY + 10 slowdown_inactive = 2.5 @@ -658,7 +658,7 @@ name = "responsory" desc = "A high-speed rescue suit by Nanotrasen, intended for its' emergency response teams." default_skin = "responsory" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15, RAD = 25) + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, FIRE = 100, ACID = 90, WOUND = 15, RAD = 0) resistance_flags = FIRE_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -716,7 +716,7 @@ name = "apocryphal" desc = "A high-tech, only technically legal, armored suit created by a collaboration effort between Nanotrasen and Apadyne Technologies." default_skin = "apocryphal" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 25) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, FIRE = 100, ACID = 100, WOUND = 25, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 @@ -751,7 +751,7 @@ name = "corporate" desc = "A fancy, high-tech suit for Nanotrasen's high ranking officers." default_skin = "corporate" - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 20) + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 50, BIO = 100, FIRE = 100, ACID = 100, WOUND = 15, RAD = 0) resistance_flags = FIRE_PROOF|ACID_PROOF max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT siemens_coefficient = 0 From 7ecca07fcd6290897e581bdf36be2d52441b974a Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 15:46:19 -0700 Subject: [PATCH 025/384] include modsuit for protection --- code/modules/mod/modules/modules_engineering.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/mod/modules/modules_engineering.dm b/code/modules/mod/modules/modules_engineering.dm index 49e8decdad..813c168c2f 100644 --- a/code/modules/mod/modules/modules_engineering.dm +++ b/code/modules/mod/modules/modules_engineering.dm @@ -91,11 +91,15 @@ incompatible_modules = list(/obj/item/mod/module/rad_protection) /obj/item/mod/module/rad_protection/on_suit_activation() + mod.armor[RAD] += 65 + mod.rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE for(var/obj/item/part in mod.mod_parts) armor[RAD] += 65 rad_flags = RAD_PROTECT_CONTENTS|RAD_NO_CONTAMINATE /obj/item/mod/module/rad_protection/on_suit_deactivation(deleting = FALSE) + mod.armor[RAD] -= 65 + mod.rad_flags = NONE for(var/obj/item/part in mod.mod_parts) armor[RAD] -= 65 rad_flags = NONE From c59d1833e0d908ae7d0b1bcf58ef77a3d011b0e3 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 16:27:45 -0700 Subject: [PATCH 026/384] fix backpack module, implement ore bag module --- code/modules/mod/modules/modules_general.dm | 3 ++ code/modules/mod/modules/modules_supply.dm | 55 +++++++++++++++++++++ 2 files changed, 58 insertions(+) diff --git a/code/modules/mod/modules/modules_general.dm b/code/modules/mod/modules/modules_general.dm index f7f7dfbfb0..314bd915f1 100644 --- a/code/modules/mod/modules/modules_general.dm +++ b/code/modules/mod/modules/modules_general.dm @@ -51,6 +51,9 @@ if(!holding) balloon_alert(mod.wearer, "no backpack installed!") return + if(!istype(holding)) + balloon_alert(mod.wearer, "it doesn't fit!") + return if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) stored = holding balloon_alert(mod.wearer, "backpack stored") diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index 7f0db2709c..abd036753f 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -169,6 +169,61 @@ incompatible_modules = list(/obj/item/mod/module/orebag) cooldown_time = 0.5 SECONDS allowed_inactive = TRUE + /// Pickaxe we have stored. + var/obj/item/storage/bag/ore/stored + +/obj/item/mod/module/orebag/on_use() + . = ..() + if(!.) + return + if(!stored) + var/obj/item/storage/bag/ore/holding = mod.wearer.get_active_held_item() + if(!holding) + balloon_alert(mod.wearer, "nothing to store!") + return + if(!istype(holding)) + balloon_alert(mod.wearer, "it doesn't fit!") + return + if(mod.wearer.transferItemToLoc(holding, src, force = FALSE, silent = TRUE)) + stored = holding + balloon_alert(mod.wearer, "mining satchel stored") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores) + else if(mod.wearer.put_in_active_hand(stored, forced = FALSE, ignore_animation = TRUE)) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + balloon_alert(mod.wearer, "mining satchel retrieved") + playsound(src, 'sound/weapons/revolverempty.ogg', 100, TRUE) + else + balloon_alert(mod.wearer, "mining satchel storage full!") + +/obj/item/mod/module/orebag/on_uninstall(deleting = FALSE) + if(stored) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + stored.forceMove(drop_location()) + +/obj/item/mod/module/orebag/on_equip() + if(stored) + RegisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED, .proc/Pickup_ores) + +/obj/item/mod/module/orebag/on_unequip() + if(stored) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + +/obj/item/mod/module/orebag/Exited(atom/movable/gone, direction) + . = ..() + if(gone == stored) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + stored = null + +/obj/item/mod/module/orebag/Destroy() + if(stored) + UnregisterSignal(mod.wearer, COMSIG_MOVABLE_MOVED) + QDEL_NULL(stored) + return ..() + +/obj/item/mod/module/orebag/proc/Pickup_ores() + if(stored) + stored.Pickup_ores(mod.wearer) // Ash accretion looks cool, but can't be arsed to implement // Same with sphere transformation From b75ed8df9f3a5cbb182997477a08267d9849d4ac Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 17:22:11 -0700 Subject: [PATCH 027/384] Fix microwave --- code/modules/mod/modules/_module.dm | 1 - code/modules/mod/modules/modules_service.dm | 2 +- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/mod/modules/_module.dm b/code/modules/mod/modules/_module.dm index 5bbd96bd68..d409d0c63b 100644 --- a/code/modules/mod/modules/_module.dm +++ b/code/modules/mod/modules/_module.dm @@ -133,7 +133,6 @@ update_signal() balloon_alert(mod.wearer, "[src] activated, alt-click to use") active = TRUE - COOLDOWN_START(src, cooldown_timer, cooldown_time) mod.wearer.update_inv_back() return TRUE diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index cb3c45946f..8f3ef14913 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -60,6 +60,6 @@ else balloon_alert(mod.wearer, "can't be microwaved!") var/datum/effect_system/spark_spread/spark_effect_two = new() - spark_effect_two.set_up(2, 1, microwave_target) + spark_effect_two.set_up(2, 1, microwave_target.loc) spark_effect_two.start() drain_power(use_power_cost) From a4631070a8b9e1906cfa8d0455b3da5e53b1d42d Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 17:42:13 -0700 Subject: [PATCH 028/384] revert some changes --- code/__DEFINES/ai.dm | 6 ---- code/datums/outfit.dm | 35 +++++++++++++------ .../mob/living/carbon/human/species.dm | 2 ++ code/modules/mob/living/living.dm | 5 +-- tgstation.dme | 1 - 5 files changed, 28 insertions(+), 21 deletions(-) delete mode 100644 code/__DEFINES/ai.dm diff --git a/code/__DEFINES/ai.dm b/code/__DEFINES/ai.dm deleted file mode 100644 index a83f02135c..0000000000 --- a/code/__DEFINES/ai.dm +++ /dev/null @@ -1,6 +0,0 @@ -///Mob the MOD is trying to attach to -#define BB_MOD_TARGET "BB_mod_target" -///The implant the AI was created from -#define BB_MOD_IMPLANT "BB_mod_implant" -///Range for a MOD AI controller. -#define MOD_AI_RANGE 100 diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index 0718e54cab..e85a29ae6e 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -79,10 +79,6 @@ //Type path of item to go in left hand var/r_hand = null - - ///ID of the slot containing a gas tank - var/internals_slot = null - /// Any clothing accessory item var/accessory = null @@ -105,6 +101,9 @@ */ var/list/implants = null + ///ID of the slot containing a gas tank + var/internals_slot = null + //skyrat edit ///Slot for underwear like boxers and panties var/underwear = null @@ -170,6 +169,8 @@ H.equip_to_slot_or_del(new uniform(H), ITEM_SLOT_ICLOTHING, TRUE) if(suit) H.equip_to_slot_or_del(new suit(H), ITEM_SLOT_OCLOTHING, TRUE) + if(back) + H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) if(belt) H.equip_to_slot_or_del(new belt(H), ITEM_SLOT_BELT, TRUE) if(gloves) @@ -183,15 +184,25 @@ if(neck) H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) if(ears) - H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS, TRUE) + H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS_LEFT, TRUE) // Sandstorm edit if(glasses) H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) - if(back) - H.equip_to_slot_or_del(new back(H), ITEM_SLOT_BACK, TRUE) if(id) H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) if(suit_store) H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) + // Sandstorm edit + if(ears_extra) + H.equip_to_slot_or_del(new ears_extra(H), ITEM_SLOT_EARS_RIGHT, TRUE) + if(underwear) + H.equip_to_slot_or_del(new underwear(H), ITEM_SLOT_UNDERWEAR, TRUE) + if(socks) + H.equip_to_slot_or_del(new socks(H), ITEM_SLOT_SOCKS, TRUE) + if(shirt) + H.equip_to_slot_or_del(new shirt(H), ITEM_SLOT_SHIRT, TRUE) + if(wrists) + H.equip_to_slot_or_del(new wrists(H), ITEM_SLOT_WRISTS, TRUE) + // if(accessory) var/obj/item/clothing/under/U = H.w_uniform @@ -207,9 +218,9 @@ if(!visualsOnly) // Items in pockets or backpack don't show up on mob's icon. if(l_pocket) - H.equip_to_slot_or_del(l_pocket, ITEM_SLOT_LPOCKET, TRUE) + H.equip_to_slot_or_del(new l_pocket(H), ITEM_SLOT_LPOCKET, TRUE) if(r_pocket) - H.equip_to_slot_or_del(r_pocket, ITEM_SLOT_RPOCKET, TRUE) + H.equip_to_slot_or_del(new r_pocket(H), ITEM_SLOT_RPOCKET, TRUE) if(box) if(!backpack_contents) @@ -223,7 +234,11 @@ if(!isnum(number))//Default to 1 number = 1 for(var/i in 1 to number) - H.equip_to_slot_or_del(path, ITEM_SLOT_BACKPACK, TRUE) + H.equip_to_slot_or_del(new path(H), ITEM_SLOT_BACKPACK, TRUE) + + if(!H.head && toggle_helmet && istype(H.wear_suit, /obj/item/clothing/suit/space/hardsuit)) + var/obj/item/clothing/suit/space/hardsuit/HS = H.wear_suit + HS.ToggleHelmet() post_equip(H, visualsOnly, preference_source) diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 75dfb0e14c..afceabf2a6 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -1303,6 +1303,8 @@ GLOBAL_LIST_EMPTY(roundstart_race_names) if(ITEM_SLOT_FEET) if(H.shoes) return FALSE + if( !(I.slot_flags & ITEM_SLOT_FEET) ) + return FALSE if(num_legs < 2) return FALSE if(DIGITIGRADE in species_traits) diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index e6aac9cde9..be6508dd96 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -47,8 +47,6 @@ return ..() /mob/living/proc/ZImpactDamage(turf/T, levels) - if(SEND_SIGNAL(src, COMSIG_LIVING_Z_IMPACT, levels, T) & NO_Z_IMPACT_DAMAGE) - return visible_message("[src] crashes into [T] with a sickening noise!", \ "You crash into [T] with a sickening noise!") adjustBruteLoss((levels * 5) ** 1.5) @@ -755,8 +753,7 @@ return pick("trails_1", "trails_2") /mob/living/experience_pressure_difference(pressure_difference, direction, pressure_resistance_prob_delta = 0) - playsound(src, 'sound/effects/space_wind.ogg', 50, TRUE) - if(buckled || mob_negates_gravity()) + if(buckled) return if(client && client.move_delay >= world.time + world.tick_lag*2) pressure_resistance_prob_delta -= 30 diff --git a/tgstation.dme b/tgstation.dme index 31ab41768c..24d15d2289 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -26,7 +26,6 @@ #include "code\__DEFINES\achievements.dm" #include "code\__DEFINES\actionspeed_modifiers.dm" #include "code\__DEFINES\admin.dm" -#include "code\__DEFINES\ai.dm" #include "code\__DEFINES\antagonists.dm" #include "code\__DEFINES\atmospherics.dm" #include "code\__DEFINES\bitfields.dm" From d7c1ced5d60777a8338a6ab846dfed3dc4651459 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 18:02:08 -0700 Subject: [PATCH 029/384] fix microwave for realsies --- code/modules/mod/modules/modules_service.dm | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/code/modules/mod/modules/modules_service.dm b/code/modules/mod/modules/modules_service.dm index 8f3ef14913..85ebfea132 100644 --- a/code/modules/mod/modules/modules_service.dm +++ b/code/modules/mod/modules/modules_service.dm @@ -51,6 +51,7 @@ balloon_alert(mod.wearer, "must be on the floor!") return var/obj/item/microwave_target = target + var/turf/microwave_target_loc = target.loc var/datum/effect_system/spark_spread/spark_effect = new() spark_effect.set_up(2, 1, mod.wearer) spark_effect.start() @@ -60,6 +61,6 @@ else balloon_alert(mod.wearer, "can't be microwaved!") var/datum/effect_system/spark_spread/spark_effect_two = new() - spark_effect_two.set_up(2, 1, microwave_target.loc) + spark_effect_two.set_up(2, 1, microwave_target_loc) spark_effect_two.start() drain_power(use_power_cost) From 7913a12492abb2991644e50845aee23ba78ccc4b Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 19:35:16 -0700 Subject: [PATCH 030/384] suits rechargeable from recharge station --- code/game/machinery/rechargestation.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 634ffec74a..1bd795e4f1 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -10,7 +10,7 @@ req_access = list(ACCESS_ROBOTICS) state_open = TRUE circuit = /obj/item/circuitboard/machine/cyborgrecharger - occupant_typecache = list(/mob/living/silicon/robot) + occupant_typecache = list(/mob/living/silicon/robot, /mob/living/carbon/human) var/recharge_speed var/repairs From 7bbed1410bf054fe803f0c744c5bc5ddbffcdcee Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 19:36:08 -0700 Subject: [PATCH 031/384] allow lockers to be carried by the clamp --- code/modules/mod/modules/modules_supply.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mod/modules/modules_supply.dm b/code/modules/mod/modules/modules_supply.dm index abd036753f..e3c70fa570 100644 --- a/code/modules/mod/modules/modules_supply.dm +++ b/code/modules/mod/modules/modules_supply.dm @@ -51,7 +51,7 @@ return if(!mod.wearer.Adjacent(target)) return - if(istype(target, /obj/structure/closet/crate) || istype(target, /obj/structure/bigDelivery)) + if(istype(target, /obj/structure/closet) || istype(target, /obj/structure/bigDelivery)) var/atom/movable/picked_crate = target if(!check_crate_pickup(picked_crate)) return From dae51909410406f83e96024025ef23f74e7f9246 Mon Sep 17 00:00:00 2001 From: Jerry Wester Date: Sun, 11 Dec 2022 20:45:46 -0700 Subject: [PATCH 032/384] Remove sandstorm edit, fix suit storage --- code/datums/outfit.dm | 14 +------------- code/game/machinery/suit_storage_unit.dm | 8 ++++++-- tgui/packages/tgui/interfaces/SuitStorageUnit.js | 10 ++++++++++ 3 files changed, 17 insertions(+), 15 deletions(-) diff --git a/code/datums/outfit.dm b/code/datums/outfit.dm index e85a29ae6e..8327260449 100755 --- a/code/datums/outfit.dm +++ b/code/datums/outfit.dm @@ -184,25 +184,13 @@ if(neck) H.equip_to_slot_or_del(new neck(H), ITEM_SLOT_NECK, TRUE) if(ears) - H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS_LEFT, TRUE) // Sandstorm edit + H.equip_to_slot_or_del(new ears(H), ITEM_SLOT_EARS, TRUE) if(glasses) H.equip_to_slot_or_del(new glasses(H), ITEM_SLOT_EYES, TRUE) if(id) H.equip_to_slot_or_del(new id(H), ITEM_SLOT_ID, TRUE) if(suit_store) H.equip_to_slot_or_del(new suit_store(H), ITEM_SLOT_SUITSTORE, TRUE) - // Sandstorm edit - if(ears_extra) - H.equip_to_slot_or_del(new ears_extra(H), ITEM_SLOT_EARS_RIGHT, TRUE) - if(underwear) - H.equip_to_slot_or_del(new underwear(H), ITEM_SLOT_UNDERWEAR, TRUE) - if(socks) - H.equip_to_slot_or_del(new socks(H), ITEM_SLOT_SOCKS, TRUE) - if(shirt) - H.equip_to_slot_or_del(new shirt(H), ITEM_SLOT_SHIRT, TRUE) - if(wrists) - H.equip_to_slot_or_del(new wrists(H), ITEM_SLOT_WRISTS, TRUE) - // if(accessory) var/obj/item/clothing/under/U = H.w_uniform diff --git a/code/game/machinery/suit_storage_unit.dm b/code/game/machinery/suit_storage_unit.dm index aa351e6c90..ca57e8457a 100644 --- a/code/game/machinery/suit_storage_unit.dm +++ b/code/game/machinery/suit_storage_unit.dm @@ -499,6 +499,10 @@ data["mask"] = mask.name else data["mask"] = null + if(mod) + data["mod"] = mod.name + else + data["mod"] = null if(storage) data["storage"] = storage.name else @@ -529,7 +533,7 @@ if("uv") if(occupant && safeties) return - else if(!helmet && !mask && !suit && !storage && !occupant) + else if(!helmet && !mask && !mod && !suit && !storage && !occupant) return else if(occupant) @@ -541,7 +545,7 @@ if(!state_open) return - var/static/list/valid_items = list("helmet", "suit", "mask", "storage") + var/static/list/valid_items = list("helmet", "suit", "mask", "mod", "storage") var/item_name = params["item"] if(item_name in valid_items) var/obj/item/I = vars[item_name] diff --git a/tgui/packages/tgui/interfaces/SuitStorageUnit.js b/tgui/packages/tgui/interfaces/SuitStorageUnit.js index c6f66a79d2..c7ac915153 100644 --- a/tgui/packages/tgui/interfaces/SuitStorageUnit.js +++ b/tgui/packages/tgui/interfaces/SuitStorageUnit.js @@ -14,6 +14,7 @@ export const SuitStorageUnit = (props, context) => { suit, helmet, mask, + mod, storage, } = data; return ( @@ -89,6 +90,15 @@ export const SuitStorageUnit = (props, context) => { item: 'mask', })} /> + +
+ + + + + ); +}; + +const displayText = (param) => { + switch (param) { + case 1: + return 'Use'; + case 2: + return 'Toggle'; + case 3: + return 'Select'; + } +}; + +const ParametersSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + malfunctioning, + locked, + open, + selected_module, + complexity, + complexity_max, + wearer_name, + wearer_job, + AI, + is_pAI, + is_user_AI, + } = data; + const status = malfunctioning + ? 'Malfunctioning' + : active + ? 'Active' + : 'Inactive'; + return ( +
+ + act('activate')} + /> + }> + {status} + + act('lock')} + /> + }> + {locked ? 'Locked' : 'Unlocked'} + + + {open ? 'Open' : 'Closed'} + + + {selected_module || 'None'} + + + {complexity} ({complexity_max}) + + + {wearer_name}, {wearer_job} + + act('remove_pai')} + /> + ) : (<> ) + }> + {AI || 'None'} + + +
+ ); +}; + +const HardwareSection = (props, context) => { + const { act, data } = useBackend(context); + const { + active, + control, + helmet, + chestplate, + gauntlets, + boots, + cell, + charge, + } = data; + return ( +
+ + + {control} + {helmet || 'None'} + + {chestplate || 'None'} + + + {gauntlets || 'None'} + + {boots || 'None'} + + + + {(cell && ( + + {cell} + + + + + )) || ( + + No Cell Detected + + )} + +
+ ); +}; + +const InfoSection = (props, context) => { + const { act, data } = useBackend(context); + const { active, modules } = data; + const info_modules = modules.filter((module) => !!module.id); + + return ( +
+ + {(info_modules.length !== 0 + && info_modules.map((module) => { + const Module = ID2MODULE[module.id]; + return ( + + {!active && } + + + ); + })) || No Info Modules Detected} + +
+ ); +}; + +const ModuleSection = (props, context) => { + const { act, data } = useBackend(context); + const { complexity_max, modules } = data; + const [configureState, setConfigureState] = useLocalState( + context, + 'module_configuration', + null + ); + return ( +
+ + {(modules.length !== 0 + && modules.map((module) => { + return ( + + +
+ {configureState === module.ref && ( + setConfigureState(null)} + /> + )} + + + +
+ {module.description} +
+
+
+ ); + })) || ( + + No Modules Detected + + )} +
+
+ ); +}; + +export const MODsuit = (props, context) => { + const { act, data } = useBackend(context); + const { ui_theme, interface_break } = data; + return ( + + + {(!!interface_break && ) || ( + + + + + + + + + + + + + + + )} + + + ); +}; diff --git a/tgui/packages/tgui/interfaces/SuitStorageUnit.js b/tgui/packages/tgui/interfaces/SuitStorageUnit.js index c6f66a79d2..70bec672f7 100644 --- a/tgui/packages/tgui/interfaces/SuitStorageUnit.js +++ b/tgui/packages/tgui/interfaces/SuitStorageUnit.js @@ -14,6 +14,8 @@ export const SuitStorageUnit = (props, context) => { suit, helmet, mask, + shoes, + mod, storage, } = data; return ( @@ -89,6 +91,24 @@ export const SuitStorageUnit = (props, context) => { item: 'mask', })} /> + +
- - - - - ); -}; - -const displayText = (param) => { - switch (param) { - case 1: - return 'Use'; - case 2: - return 'Toggle'; - case 3: - return 'Select'; - } -}; - -const ParametersSection = (props, context) => { - const { act, data } = useBackend(context); - const { - active, - malfunctioning, - locked, - open, - selected_module, - complexity, - complexity_max, - wearer_name, - wearer_job, - AI, - is_pAI, - is_user_AI, - } = data; - const status = malfunctioning - ? 'Malfunctioning' - : active - ? 'Active' - : 'Inactive'; - return ( -
- - act('activate')} - /> - }> - {status} - - act('lock')} - /> - }> - {locked ? 'Locked' : 'Unlocked'} - - - {open ? 'Open' : 'Closed'} - - - {selected_module || 'None'} - - - {complexity} ({complexity_max}) - - - {wearer_name}, {wearer_job} - - act('remove_pai')} - /> - ) : (<> ) - }> - {AI || 'None'} - - -
- ); -}; - -const HardwareSection = (props, context) => { - const { act, data } = useBackend(context); - const { - active, - control, - helmet, - chestplate, - gauntlets, - boots, - cell, - charge, - } = data; - return ( -
- - - {control} - {helmet || 'None'} - - {chestplate || 'None'} - - - {gauntlets || 'None'} - - {boots || 'None'} - - - - {(cell && ( - - {cell} - - - - - )) || ( - - No Cell Detected - - )} - -
- ); -}; - -const InfoSection = (props, context) => { - const { act, data } = useBackend(context); - const { active, modules } = data; - const info_modules = modules.filter((module) => !!module.id); - - return ( -
- - {(info_modules.length !== 0 - && info_modules.map((module) => { - const Module = ID2MODULE[module.id]; - return ( - - {!active && } - - - ); - })) || No Info Modules Detected} - -
- ); -}; - -const ModuleSection = (props, context) => { - const { act, data } = useBackend(context); - const { complexity_max, modules } = data; - const [configureState, setConfigureState] = useLocalState( - context, - 'module_configuration', - null - ); - return ( -
- - {(modules.length !== 0 - && modules.map((module) => { - return ( - - -
- {configureState === module.ref && ( - setConfigureState(null)} - /> - )} - - - -
- {module.description} -
-
-
- ); - })) || ( - - No Modules Detected - - )} -
-
- ); -}; - -export const MODsuit = (props, context) => { - const { act, data } = useBackend(context); - const { ui_theme, interface_break } = data; - return ( - - - {(!!interface_break && ) || ( - - - - - - - - - - - - - - - )} - - - ); -}; diff --git a/tgui/packages/tgui/interfaces/SuitStorageUnit.js b/tgui/packages/tgui/interfaces/SuitStorageUnit.js index c7ac915153..c6f66a79d2 100644 --- a/tgui/packages/tgui/interfaces/SuitStorageUnit.js +++ b/tgui/packages/tgui/interfaces/SuitStorageUnit.js @@ -14,7 +14,6 @@ export const SuitStorageUnit = (props, context) => { suit, helmet, mask, - mod, storage, } = data; return ( @@ -90,15 +89,6 @@ export const SuitStorageUnit = (props, context) => { item: 'mask', })} /> - -