Skip to content

Commit

Permalink
Оперируем синтов (BlueMoon-Labs#655)
Browse files Browse the repository at this point in the history
* Добавил операцию очистки реагентов для синтетиков + минорные изменения

* Изменение пары звуков и фикс хелпера

* Правки текста

* Добавил комментарии о том, как проки выглядели до изменения

* Убрал нихуёвую такую ошибку, и мы ведь это затестмерджили, бляяяя

* Update tgstation.dme

* Update tgstation.dme

* Update tgstation.dme

---------

Co-authored-by: Марк <[email protected]>
Co-authored-by: Марк <[email protected]>
  • Loading branch information
3 people authored Jan 9, 2024
1 parent b47e7c2 commit 28bf951
Show file tree
Hide file tree
Showing 5 changed files with 123 additions and 3 deletions.
2 changes: 1 addition & 1 deletion code/__DEFINES/is_helpers.dm
Original file line number Diff line number Diff line change
Expand Up @@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(turfs_without_ground, typecacheof(list(

#define ismush(A) (is_species(A, /datum/species/mush))
#define isshadow(A) (is_species(A, /datum/species/shadow))
#define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz) || is_species(A, /datum/species/mammal/synthetic))
#define isrobotic(A) (HAS_TRAIT(A, TRAIT_ROBOTIC_ORGANISM)) // BLUEMOON EDIT - уборка хардкода [БЫЛО: #define isrobotic(A) (is_species(A, /datum/species/ipc) || is_species(A, /datum/species/synthliz) || is_species(A, /datum/species/mammal/synthetic))]
#define isdwarf(A) (is_species(A, /datum/species/dwarf))

// Citadel specific species
Expand Down
4 changes: 2 additions & 2 deletions code/__DEFINES/mobs.dm
Original file line number Diff line number Diff line change
Expand Up @@ -51,9 +51,9 @@
#define MOB_NANITES (1 << 10)

/// Helper to figure out if an organ is organic
#define IS_ORGANIC_ORGAN(organ) (organ.organ_flags & ORGAN_ORGANIC)
#define IS_ORGANIC_ORGAN(organ) (!IS_ROBOTIC_ORGAN(organ)) // BLUEMOON EDIT - фикс прока (кривое, но и так сойдёт) [БЫЛО: #define IS_ORGANIC_ORGAN(organ) (organ.organ_flags & ORGAN_ORGANIC)]
/// Helper to figure out if an organ is robotic
#define IS_ROBOTIC_ORGAN(organ) (organ.organ_flags & ORGAN_ROBOTIC)
#define IS_ROBOTIC_ORGAN(organ) (organ.organ_flags & ORGAN_SYNTHETIC) // BLUEMOON EDIT - фикс прока [БЫЛО: #define IS_ROBOTIC_ORGAN(organ) (organ.organ_flags & ORGAN_ROBOTIC)]

// Organ defines for carbon mobs
#define ORGAN_ORGANIC 1
Expand Down
1 change: 1 addition & 0 deletions code/modules/surgery/purge_corruption.dm
Original file line number Diff line number Diff line change
Expand Up @@ -82,6 +82,7 @@ Has a version for organic people and robotic/synthetic ones, considering robotic
var/purged = target.getToxLoss(TOX_SYSCORRUPT)
target.setToxLoss(0, toxins_type = TOX_SYSCORRUPT)
target.radiation = 0 // BLUEMOON ADD - т.к. у них не процессятся реагенты, пока нет возможности вывести радиацию кроме как этой операцией
target.drunkenness = 0 // BLUEMOON ADD - радикальное отрезвление синтетиков
target.Unconscious(round(purged * 0.2, 1))
return TRUE

Expand Down
118 changes: 118 additions & 0 deletions modular_bluemoon/vlad0s_staff/code/robot_purge_reagents.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,118 @@
/***
* Убирает все реагенты из ((крови)) синтетика, что может очень помочь, например, в передозировке систем клинером / синтанолом
***/

/datum/surgery/robot_purge_reagents
name = "Emergency Reagents Disposal"
desc = "Операция по удалению всех реагентов в системе робота на случай загрязнения инородными субстанциями."
requires_bodypart_type = BODYPART_ROBOTIC
steps = list(
/datum/surgery_step/mechanic_open,
/datum/surgery_step/open_hatch,
/datum/surgery_step/mechanic_unwrench,
/datum/surgery_step/prepare_electronics,
/datum/surgery_step/override_safeties,
/datum/surgery_step/unscrew_liver_hatch,
/datum/surgery_step/eject_reagents,
/datum/surgery_step/mechanic_wrench,
/datum/surgery_step/mechanic_close)
possible_locs = list(BODY_ZONE_CHEST)
target_mobtypes = list(/mob/living/carbon/human)

/datum/surgery/robot_purge_reagents/can_start(mob/user, mob/living/carbon/target, obj/item/tool)
. = ..()
if(!.)
return
var/obj/item/organ/liver/liver = target.getorganslot(ORGAN_SLOT_LIVER)
if(isrobotic(target) && liver && IS_ROBOTIC_ORGAN(liver))
return TRUE
return FALSE


/datum/surgery_step/unscrew_liver_hatch
name = "Открутить клапан процессора реагентов"
implements = list(TOOL_SCREWDRIVER = 95, TOOL_HEMOSTAT = 35, TOOL_WIRECUTTER = 30, /obj/item/pen = 15)
time = 25
preop_sound = 'sound/items/screwdriver.ogg'
success_sound = 'sound/items/screwdriver2.ogg'

/datum/surgery_step/unscrew_liver_hatch/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>Вы начинаете откручивать клапан системы обработки реагентов [target]...</span>",
"[user] откручивает клапан на одной из трубок в груди [target].",
"[user] begins to perform surgery on [target].")

/datum/surgery_step/unscrew_liver_hatch/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/liver/liver = target.getorganslot(ORGAN_SLOT_LIVER)
if(!liver || !isrobotic(target))
user.visible_message("<span class='warning'>[user] не находит систему обработки реагентов в груди [target]...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] отсутствует.</span>")
return FALSE
if(!IS_ROBOTIC_ORGAN(liver))
user.visible_message("<span class='warning'>[user] обнаруживает несовместимость обработчика реагентов [target] с известными методиками очистки...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] не подходит для очистки.</span>")
return FALSE
display_results(user, target, "<span class='notice'>Вы успешно откручиваете клапан резервуара с реагентами [target]...</span>",
"[user] успешно откручивает клапан в груди [target].",
"[user] completes the surgery on [target].")
return TRUE

/datum/surgery_step/unscrew_liver_hatch/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/liver/liver = target.getorganslot(ORGAN_SLOT_LIVER)
if(!liver || !isrobotic(target))
user.visible_message("<span class='warning'>[user] не находит систему обработки реагентов в груди [target]...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] отсутствует.</span>")
return FALSE
if(!IS_ROBOTIC_ORGAN(liver))
user.visible_message("<span class='warning'>[user] обнаруживает несовместимость обработчика реагентов [target] с известными методиками очистки...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] не подходит для очистки.</span>")
return FALSE
display_results(user, target, "<span class='warning'>Ваша отвёртка срывается и [target] вздрагивает всем корпусом, когда в [target.ru_na()] обработчике реагентов появляется новая пробоина...</span>",
"[user] неудачно отсверливает клапан у обработчика реагентов [target], повреждая [target.ru_na()] систему.",
"[user] completes the surgery on [target].")
target.adjustOrganLoss(ORGAN_SLOT_LIVER, 20)
playsound(target, 'modular_bluemoon/krashly/sound/items/watersplash.ogg', 40, 1)
return FALSE


/datum/surgery_step/eject_reagents
name = "Открыть люк сброса реагентов (Мультитул)"
implements = list(TOOL_MULTITOOL = 95, TOOL_HEMOSTAT = 25, TOOL_CROWBAR = 25)
time = 40
preop_sound = 'sound/machines/doorclick.ogg'

/datum/surgery_step/eject_reagents/preop(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
display_results(user, target, "<span class='notice'>Вы начинаете открывать люк на резервуаре с реагентами в груди [target]...</span>",
"[user] начинает открывать люк сброса реагентов у [target].",
"[user] begins to perform surgery on [target].")

/datum/surgery_step/eject_reagents/success(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/liver/liver = target.getorganslot(ORGAN_SLOT_LIVER)
if(!liver || !isrobotic(target))
user.visible_message("<span class='warning'>[user] не находит систему обработки реагентов в груди [target]...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] отсутствует.</span>")
return FALSE
if(!IS_ROBOTIC_ORGAN(liver))
user.visible_message("<span class='warning'>[user] обнаруживает несовместимость обработчика реагентов [target] с известными методиками очистки...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] не подходит для очистки.</span>")
return FALSE
display_results(user, target, "<span class='notice'>Вы успешно открываете люк сброса реагентов у [target], высвобождая хранящиеся там реагенты...</span>",
"[user] успешно открывает люк в груди [target], выплёскивая оттуда реагенты.",
"[user] completes the surgery on [target].")
playsound(target, 'sound/effects/splash.ogg', 70, TRUE, 1)
if(target.reagents)
target.reagents.clear_reagents()
new /obj/effect/decal/cleanable/oil/streak(get_turf(target))
return TRUE

/datum/surgery_step/eject_reagents/failure(mob/user, mob/living/carbon/target, target_zone, obj/item/tool, datum/surgery/surgery)
var/obj/item/organ/liver/liver = target.getorganslot(ORGAN_SLOT_LIVER)
if(!liver || !isrobotic(target))
user.visible_message("<span class='warning'>[user] не находит систему обработки реагентов в груди [target]...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] отсутствует.</span>")
return FALSE
if(!IS_ROBOTIC_ORGAN(liver))
user.visible_message("<span class='warning'>[user] обнаруживает несовместимость обработчика реагентов [target] с известными методиками очистки...", "<span class='warning'>Вы понимаете, что система обработки реагентов [target] не подходит для очистки.</span>")
return FALSE
display_results(user, target, "<span class='warning'>Вы слишком сильно нажимаете ломом и крышка процессора реагентов [target] отламывается, а часть жидкости, вылившаяся на [target.ru_na()] микросхемы вызывает короткое замыкание!</span>",
"<span class='warning'>[user] случайно ломает люк резервуара с реагентами в груди [target], вызывая короткое замыкание от вылившихся реагентов.",
"[user] completes the surgery on [target].")
target.adjustOrganLoss(ORGAN_SLOT_LIVER, 35)
playsound(target, 'sound/effects/bang.ogg', 50, 1)
playsound(target, 'sound/effects/splat.ogg', 10, TRUE)
do_sparks(10, 5, target)
target.adjustFireLoss(20)
target.jitteriness += 10
return FALSE
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
Expand Up @@ -4383,6 +4383,7 @@
#include "modular_bluemoon\vlad0s_staff\code\synthdrinks\synth_drinks.dm"
#include "modular_bluemoon\vlad0s_staff\code\synthdrinks\synth_drinks_containers.dm"
#include "modular_bluemoon\vlad0s_staff\code\synthdrinks\synth_drinks_recipes.dm"
#include "modular_bluemoon\vlad0s_staff\code\robot_purge_reagents.dm"
#include "modular_citadel\code\datums\components\souldeath.dm"
#include "modular_citadel\code\datums\status_effects\chems.dm"
#include "modular_citadel\code\game\objects\effects\temporary_visuals\souldeath.dm"
Expand Down

0 comments on commit 28bf951

Please sign in to comment.