From e47a4834e1aa264871f65945b0a8b2fe569e5806 Mon Sep 17 00:00:00 2001 From: Honker9999999 Date: Tue, 1 Oct 2024 20:46:40 +0300 Subject: [PATCH 01/22] add: mecha cage --- code/__DEFINES/traits/sources.dm | 4 + code/_onclick/hud/alert.dm | 32 ++ code/datums/spells/ethereal_jaunt.dm | 3 + .../shadowling/shadowling_abilities.dm | 3 + code/game/mecha/combat/sidewinder.dm | 2 + code/game/mecha/equipment/mecha_equipment.dm | 21 ++ .../game/mecha/equipment/tools/other_tools.dm | 279 +++++++++++++++++- code/game/mecha/mecha.dm | 21 ++ .../items/weapons/implants/implant_freedom.dm | 10 +- .../changeling/powers/biodegrade.dm | 15 + .../goon_vampire/goon_vampire_powers.dm | 3 + .../vampire/vampire_powers/vampire_powers.dm | 3 + .../economy/robotic_quests/mech_types.dm | 1 + .../designs/mechfabricator_designs.dm | 11 + icons/misc/supress_effect.dmi | Bin 0 -> 774 bytes icons/obj/mecha/mecha_cage.dmi | Bin 0 -> 965 bytes icons/obj/mecha/mecha_equipment.dmi | Bin 38239 -> 39599 bytes 17 files changed, 406 insertions(+), 2 deletions(-) create mode 100644 icons/misc/supress_effect.dmi create mode 100644 icons/obj/mecha/mecha_cage.dmi diff --git a/code/__DEFINES/traits/sources.dm b/code/__DEFINES/traits/sources.dm index 2ea56756bda..d46b9a94b03 100644 --- a/code/__DEFINES/traits/sources.dm +++ b/code/__DEFINES/traits/sources.dm @@ -109,6 +109,10 @@ #define STAMINA_TRAIT "stamina" +/// source trait for /obj/item/mecha_parts/mecha_equipment/cage +#define MECH_SUPRESSED_TRAIT "mech_supress" + + /// trait associated to resting #define RESTING_TRAIT "resting" /// trait associated to a stat value or range of diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 4a0132a6645..6093e2993db 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -563,6 +563,38 @@ so as to remain in compliance with the most up-to-date laws." desc = "Maintenance protocols are currently in effect, most actions disabled." icon_state = "locked" +/atom/movable/screen/alert/empty_alert + name = "" + desc = "" + +//MECH MODULES + +//cage module +/atom/movable/screen/alert/mech_cage + name = "You shouldn't see this" + desc = "This as well" + icon = 'icons/obj/mecha/mecha_cage.dmi' + +/atom/movable/screen/alert/mech_cage/zero + name = "Stage Zero" + desc = "You are currently not doing anything." + icon_state = "stage_0" + +/atom/movable/screen/alert/mech_cage/one + name = "Stage One" + desc = "You are currently supressing someone." + icon_state = "stage_1" + +/atom/movable/screen/alert/mech_cage/two + name = "Stage Two" + desc = "You are currently supressing someone handcuffed." + icon_state = "stage_2" + +/atom/movable/screen/alert/mech_cage/three + name = "Stage Three" + desc = "You are currently having someone inside the containment chamber." + icon_state = "stage_3" + //GUARDIANS /atom/movable/screen/alert/cancharge name = "Charge Ready" diff --git a/code/datums/spells/ethereal_jaunt.dm b/code/datums/spells/ethereal_jaunt.dm index 16af8085544..7f133a666ba 100644 --- a/code/datums/spells/ethereal_jaunt.dm +++ b/code/datums/spells/ethereal_jaunt.dm @@ -32,6 +32,9 @@ /obj/effect/proc_holder/spell/ethereal_jaunt/proc/do_jaunt(mob/living/target) playsound(get_turf(target), sound_in, 50, TRUE, -1) + // mech supress escape + if(HAS_TRAIT_FROM(target, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + target.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) ADD_TRAIT(target, TRAIT_NO_TRANSFORM, UNIQUE_TRAIT_SOURCE(src)) var/turf/mobloc = get_turf(target) var/obj/effect/dummy/spell_jaunt/holder = new jaunt_type_path(mobloc) diff --git a/code/game/gamemodes/shadowling/shadowling_abilities.dm b/code/game/gamemodes/shadowling/shadowling_abilities.dm index 89d8e224c56..93a02ed1dd8 100644 --- a/code/game/gamemodes/shadowling/shadowling_abilities.dm +++ b/code/game/gamemodes/shadowling/shadowling_abilities.dm @@ -134,6 +134,9 @@ return playsound(user.loc, 'sound/effects/bamf.ogg', 50, 1) + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.visible_message("[user] vanishes in a puff of black mist!", "You enter the space between worlds as a passageway.") user.SetStunned(0) user.SetWeakened(0) diff --git a/code/game/mecha/combat/sidewinder.dm b/code/game/mecha/combat/sidewinder.dm index c04fea4c8a8..058a1a9edc0 100644 --- a/code/game/mecha/combat/sidewinder.dm +++ b/code/game/mecha/combat/sidewinder.dm @@ -85,3 +85,5 @@ ME.attach(src) ME = new /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang/clusterbang ME.attach(src) + ME = new /obj/item/mecha_parts/mecha_equipment/cage + ME.attach(src) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index cde0a1a6108..8b87b9b0def 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -23,6 +23,7 @@ var/selectable = MODULE_SELECTABLE_FULL var/harmful = FALSE //Controls if equipment can be used to attack by a pacifist. var/integrated = FALSE // Preventing modules from getting detached. + var/alert_category = "mecha_module" //change if you want custom alerts /obj/item/mecha_parts/mecha_equipment/proc/update_chassis_page() @@ -181,6 +182,9 @@ return if(chassis.occupant) remove_targeted_action() + if(chassis.selected == src) + if(selectable == MODULE_SELECTABLE_FULL) + chassis.occupant.clear_alert(alert_category) detach_act() moveto = moveto || get_turf(chassis) if(Move(moveto)) @@ -224,10 +228,27 @@ return /obj/item/mecha_parts/mecha_equipment/proc/select_module() + select_set_alert() chassis.selected = src chassis.occupant_message(span_notice("You switch to [src].")) chassis.visible_message("[chassis] raises [src]") send_byjax(chassis.occupant, "exosuit.browser", "eq_list", chassis.get_equipment_list()) +/obj/item/mecha_parts/mecha_equipment/proc/select_set_alert() + if(selectable == MODULE_SELECTABLE_FULL) + var/mob/living/carbon/occupant = chassis.occupant + if(chassis.selected) + occupant.clear_alert(chassis.selected.alert_category) + return throw_default_alert(occupant) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/proc/throw_default_alert(var/mob/living/carbon/occupant) + if(alert_category == "mecha_module") + var/atom/movable/screen/alert/empty_alert/default_alert = occupant.throw_alert(alert_category, /atom/movable/screen/alert/empty_alert, new_master = src) + default_alert.name = name + default_alert.desc = "You currently have [src.name] module selected" + return TRUE + return FALSE + /obj/item/mecha_parts/mecha_equipment/proc/toggle_module() return diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index e4490d9fe6a..1069e70b922 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -1,5 +1,5 @@ // Teleporter, Wormhole generator, Gravitational catapult, Armor booster modules, -// Repair droid, Tesla Energy relay, Generators +// Repair droid, Tesla Energy relay, Generators, SCS-3 Cage ////////////////////////////////////////////// TELEPORTER /////////////////////////////////////////////// @@ -590,3 +590,280 @@ var/obj/mecha/working/W = loc W.slow_pressure_step_in = initial(W.slow_pressure_step_in) W.fast_pressure_step_in = initial(W.fast_pressure_step_in) + + +//SCS-3 CAGE + +/obj/item/mecha_parts/mecha_equipment/cage + name = "SCS 3 Cage" + desc = "An exosuit module for containing lawbreakers, or hostages." + icon_state = "mecha_cage" + origin_tech = "combat=6;materials=5" + equip_cooldown = 3 SECONDS + energy_drain = 500 + range = MECHA_MELEE + salvageable = FALSE + harmful = FALSE + alert_category = "mecha_cage" + + var/mob/living/carbon/prisoner + var/mob/living/carbon/holding + var/turf/holding_turf + var/datum/action/innate/mecha/select_module/button // for custom icons + var/current_alert //wacky case + var/obj/effect/supress/supress_effect + +/obj/item/mecha_parts/mecha_equipment/cage/can_attach(obj/mecha/M) + if(..()) + if(locate(src) in M.equipment) + return FALSE + if(istype(M, /obj/mecha/combat/durand) || istype(M, /obj/mecha/combat/lockersyndie) || istype(M, /obj/mecha/combat/marauder)) + return TRUE + else if(M.emagged == TRUE) + return TRUE + return FALSE + +/obj/item/mecha_parts/mecha_equipment/cage/attach_act(obj/mecha/M) + START_PROCESSING(SSobj, src) + +/obj/item/mecha_parts/mecha_equipment/cage/Destroy() + for(var/atom/movable/AM in src) + AM.forceMove(get_turf(src)) + if(holding) + stop_supressing(holding) + return ..() + +/obj/item/mecha_parts/mecha_equipment/cage/select_set_alert() + . = ..() + if(!.) + if(prisoner) + change_alert("three") + else if(holding) + if(!holding.handcuffed) + change_alert("one") + else + change_alert("two") + else + change_alert("zero") + +/obj/item/mecha_parts/mecha_equipment/cage/action(mob/living/carbon/target) + if(!action_checks(target)) + return FALSE + if(!istype(target)) + return FALSE + + var/same_target = target == holding + var/supress_check = target.IsStamcrited() || (target.health <= HEALTH_THRESHOLD_CRIT) || target.stat != CONSCIOUS + + //SUPRESSING + if(holding && !same_target) + if(supress_check) + occupant_message(span_notice("You stop supressing [holding], and start supressing [target]...")) + chassis.visible_message(span_warning("[chassis] stops supressing [holding] and switches to [target].")) + stop_supressing(holding, FALSE) + set_supress_effect(target) + if(!do_after_cooldown(target)) + qdel(supress_effect) + supress_effect = null + return FALSE + if(!prisoner) + change_alert("one") + supress(target) + return TRUE + if(!holding && supress_check) + occupant_message(span_notice("You start supressing [target]...")) + chassis.visible_message(span_warning("[chassis] starts supressing [target].")) + supress_effect = new(target.loc) + set_supress_effect(target) + if(!do_after_cooldown(target)) + qdel(supress_effect) + supress_effect = null + return FALSE + if(!prisoner) + change_alert("one") + supress(target) + return TRUE + + //HANDCUFFING + if(same_target && !target.handcuffed) + occupant_message(span_notice("You start cuffing [target]...")) + chassis.visible_message(span_warning("[chassis] starts cuffing [target].")) + if(!do_after_cooldown(target)) + return FALSE + if(!prisoner) + change_alert("two") + target.apply_restraints(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, TRUE) + occupant_message(span_notice("You successfully cuff [target]...")) + chassis.visible_message(span_warning("[chassis] successfully cuffed [target].")) + add_attack_logs(chassis.occupant, target, "shackled") + return TRUE + + //PUTTING INTO MECH + if(same_target && target.handcuffed) + if(!prisoner_insertion_check(target)) + return FALSE + //since we are only using change_state here and in processing, might as well do it here + if(!button) + for(var/datum/action/innate/mecha/select_module/H in chassis.occupant.actions) + if(H.button_icon_state == "mecha_cage") + button = H + break + + change_state("mecha_cage_activate") + occupant_message(span_notice("Yoeu start putting [target] into the containment chamber...")) + chassis.visible_message(span_warning("[chassis] is putting [target] into the containment chamber.")) + if(!do_after_cooldown(target)) + change_state("mecha_cage") + return FALSE + change_state("mecha_cage_activated") + change_alert("three") + target.forceMove(src) + prisoner = target + stop_supressing(target) + update_equip_info() + occupant_message(span_notice("[target] successfully loaded into [src].")) + chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + log_message("[target] loaded.") + return TRUE + + occupant_message(span_notice("[target] can't be suppressed, since [target] is not in critical condition")) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/cage/proc/supress(mob/living/carbon/target) + holding = target + holding_turf = get_turf(holding) + target.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + target.move_resist = MOVE_FORCE_STRONG + supress_effect.icon_state = "applied" + +/obj/item/mecha_parts/mecha_equipment/cage/proc/stop_supressing(mob/living/carbon/target, var/alert = TRUE) + holding = null + holding_turf = null + target.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + target.move_resist = MOVE_FORCE_DEFAULT + qdel(supress_effect) + supress_effect = null + + if(!prisoner) + change_alert("zero") + +/obj/item/mecha_parts/mecha_equipment/cage/proc/change_state(icon) + button.button_icon_state = icon + button.UpdateButtonIcon() + +/obj/item/mecha_parts/mecha_equipment/cage/proc/change_alert(var/stage_number) //zero, one, two, three in string + var/mob/living/carbon/H = chassis.occupant + switch(stage_number) + if("zero") + H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/zero) + if("one") + H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/one) + if("two") + H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/two) + if("three") + H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/three) + + current_alert = stage_number + + +/obj/item/mecha_parts/mecha_equipment/cage/proc/set_supress_effect(mob/living/carbon/target) + supress_effect = new(target.loc) + flick("applying", supress_effect) +/obj/item/mecha_parts/mecha_equipment/cage/proc/prisoner_insertion_check(mob/living/carbon/target) + if(target.buckled) + occupant_message(span_warning("[target] will not fit into the cage because [target.p_they()] [target.p_are()] buckled to [target.buckled]!")) + return FALSE + if(target.has_buckled_mobs()) + occupant_message(span_warning("[target] will not fit into the cage because of the creatures attached to it!")) + return FALSE + if(prisoner) + occupant_message(span_warning("The cage is already occupied!")) + return FALSE + return TRUE + +/obj/item/mecha_parts/mecha_equipment/cage/proc/eject(force) + if(!action_checks(src)) + return FALSE + if(!prisoner) + return FALSE + prisoner.forceMove(get_turf(src)) + if(!force) + occupant_message("[prisoner] ejected.") + log_message("[prisoner] ejected.") + else + occupant_message("[prisoner] escaped.") + log_message("[prisoner] escaped.") + prisoner = null + update_equip_info() + +/obj/item/mecha_parts/mecha_equipment/cage/can_detach() + if(prisoner || holding) + occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) + return FALSE + return TRUE + +/obj/item/mecha_parts/mecha_equipment/cage/detach_act() + STOP_PROCESSING(SSobj, src) + button = null + +/obj/item/mecha_parts/mecha_equipment/cage/get_module_equip_info() + if(prisoner) + return "
\[Occupant: [prisoner] \]
Eject" + +/obj/item/mecha_parts/mecha_equipment/cage/Topic(href,href_list) + ..() + var/datum/topic_input/afilter = new /datum/topic_input(href,href_list) + if(afilter.get("eject")) + eject(FALSE) + return + +/obj/item/mecha_parts/mecha_equipment/cage/container_resist() + if(prisoner.get_item_by_slot(ITEM_SLOT_CLOTH_OUTER)) + var/obj/item/clothing/suit/straight_jacket/H = prisoner.get_item_by_slot(ITEM_SLOT_CLOTH_OUTER) + prisoner.cuff_resist(H, FALSE) + return + if(prisoner.handcuffed) + prisoner.cuff_resist(prisoner.handcuffed, FALSE) + return + if(do_after(prisoner, 30 SECONDS, prisoner)) + eject(TRUE) + +/obj/item/mecha_parts/mecha_equipment/cage/process() + if(holding || prisoner) + if(holding) + var/turf/actual_turf = get_turf(holding) + if(actual_turf != holding_turf) + stop_supressing(holding) + actual_turf = null + if(chassis.occupant == null) + stop_supressing(holding) + + if(prisoner) + if(!istype(prisoner.loc, src)) + prisoner = null + else if(current_alert == "three") + if(holding.handcuffed) + change_alert("two") + else + change_alert("one") + else if(button) + if(button.button_icon_state == "mecha_cage_activated") + change_state("mecha_cage") + + else + if(chassis.occupant) + if(current_alert != "zero" && chassis.selected == src) + change_alert("zero") + if(button) + if(button.button_icon_state == "mecha_cage_activated") + change_state("mecha_cage") + + +/obj/effect/supress + name = "Mech claws" + desc = "Looks like someone is getting taken hostage..." + icon = 'icons/misc/supress_effect.dmi' + icon_state = "applied" + anchored = TRUE + mouse_opacity = MOUSE_OPACITY_TRANSPARENT + plane = ABOVE_GAME_PLANE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 8f85f40c04d..7793a4483f4 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -21,6 +21,7 @@ var/can_move = 0 // time of next allowed movement var/mech_enter_time = 4 SECONDS // Entering mecha time var/mob/living/carbon/occupant = null + var/mob/living/carbon/last_occupant = null var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/normal_step_energy_drain = 10 @@ -406,6 +407,11 @@ occupant_message(span_danger("Unable to move while in zoom mode.")) last_message = world.time return FALSE + if(locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment) + var/obj/item/mecha_parts/mecha_equipment/cage/H = locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment + if(H.holding) + occupant_message(span_notice("You stop supressing [H.holding].")) + H.stop_supressing(H.holding) //Turns strafe OFF if not enough energy to step (with actuator module only) if(strafe && actuator && !has_charge(actuator.energy_per_step)) @@ -1146,6 +1152,7 @@ AI.aiRestorePowerRoutine = 0 AI.forceMove(src) occupant = AI + last_occupant = occupant update_icon(UPDATE_ICON_STATE) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) @@ -1162,6 +1169,10 @@ GrantActions(AI, FALSE) else GrantActions(AI, !AI.can_dominate_mechs) + if(selected) + var/atom/movable/screen/alert/empty_alert/default_alert = AI.throw_alert(selected.alert_category, /atom/movable/screen/alert/empty_alert, new_master = selected) + default_alert.name = selected.name + default_alert.desc = "You currently have [selected.name] module selected" ///////////////////////////////////// //////// Atmospheric stuff //////// @@ -1303,6 +1314,7 @@ /obj/mecha/proc/moved_inside(mob/living/carbon/human/H) if(H && H.client && (H in range(1))) occupant = H + last_occupant = occupant H.forceMove(src) add_fingerprint(H) GrantActions(H, human_occupant = 1) @@ -1318,6 +1330,10 @@ occupant << sound(nominalsound, volume = 50) if(state) H.throw_alert("locked", /atom/movable/screen/alert/mech_maintenance) + if(selected) + var/atom/movable/screen/alert/empty_alert/default_alert = H.throw_alert(selected.alert_category, /atom/movable/screen/alert/empty_alert, new_master = selected) + default_alert.name = selected.name + default_alert.desc = "You currently have [selected.name] module selected" return TRUE else return FALSE @@ -1362,6 +1378,7 @@ var/mob/living/carbon/brain/brainmob = mmi_as_oc.brainmob brainmob.reset_perspective(src) occupant = brainmob + last_occupant = occupant brainmob.forceMove(src) //should allow relaymove if(istype(mmi_as_oc, /obj/item/mmi/robotic_brain)) var/obj/item/mmi/robotic_brain/R = mmi_as_oc @@ -1573,6 +1590,7 @@ regulate_temp() give_air() update_huds() + check_alert() /obj/mecha/proc/process_internal_damage() if(!internal_damage) @@ -1652,6 +1670,9 @@ diag_hud_set_mechstat() diag_hud_set_mechtracking() +/obj/mecha/proc/check_alert() + if(!occupant && last_occupant && selected) + last_occupant.clear_alert(selected.alert_category) /obj/mecha/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list()) var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, FLY_LAYER) diff --git a/code/game/objects/items/weapons/implants/implant_freedom.dm b/code/game/objects/items/weapons/implants/implant_freedom.dm index 50a020207b0..e5c18813223 100644 --- a/code/game/objects/items/weapons/implants/implant_freedom.dm +++ b/code/game/objects/items/weapons/implants/implant_freedom.dm @@ -15,6 +15,9 @@ to_chat(imp_in, "You feel a faint click.") if(iscarbon(imp_in)) var/mob/living/carbon/C_imp_in = imp_in + // mech supress escape + if(HAS_TRAIT_FROM(C_imp_in, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + C_imp_in.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) C_imp_in.uncuff() if(C_imp_in.pulledby) var/mob/living/grabber = C_imp_in.pulledby @@ -24,7 +27,12 @@ playsound(C_imp_in.loc, 'sound/weapons/egloves.ogg', 75, TRUE) grabber.stop_pulling() C_imp_in.client?.move_delay = world.time // to skip move delay we probably got from resisting the grab - + // mech cage container escape + if(istype(C_imp_in.loc, /obj/item/mecha_parts/mecha_equipment/cage)) + var/obj/item/mecha_parts/mecha_equipment/cage/container = C_imp_in.loc + C_imp_in.forceMove(get_turf(container)) + container.prisoner = null + container.update_equip_info() if(!uses) qdel(src) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index 90e65b8ce30..eee838f4861 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -49,6 +49,21 @@ addtimer(CALLBACK(src, PROC_REF(dissolve_restraint), user, res_suit), 3 SECONDS) used = TRUE + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + used = TRUE + + // mech cage container escape + if(istype(user.loc, /obj/item/mecha_parts/mecha_equipment/cage)) + var/obj/item/mecha_parts/mecha_equipment/cage/container = user.loc + var/obj/mecha/mech = container.chassis + mech.visible_message(span_warning("[mech]'s containment chamber suddenly begins to melt!"), \ + span_warning("We vomit acidic goop onto the interior of the containment chamber!")) + user.forceMove(get_turf(container)) + container.prisoner = null + container.update_equip_info() + if(istype(user.loc, /obj/structure/closet) && !used) var/obj/structure/closet/closet = user.loc if(!istype(closet)) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index aa80d124da2..ab358ac5346 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -150,6 +150,9 @@ /obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) diff --git a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm index 77bd4796ec8..dfe5b1f9dc8 100644 --- a/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/vampire_powers.dm @@ -95,6 +95,9 @@ /obj/effect/proc_holder/spell/vampire/self/rejuvenate/cast(list/targets, mob/living/user = usr) + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) diff --git a/code/modules/economy/robotic_quests/mech_types.dm b/code/modules/economy/robotic_quests/mech_types.dm index edd66d9c5c7..0f0f0db5150 100644 --- a/code/modules/economy/robotic_quests/mech_types.dm +++ b/code/modules/economy/robotic_quests/mech_types.dm @@ -147,4 +147,5 @@ /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/amlg, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack, /obj/item/mecha_parts/mecha_equipment/weapon/ballistic/missile_rack/flashbang, + /obj/item/mecha_parts/mecha_equipment/cage, ) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index e7f03f2bcf4..fe413d5812b 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1047,6 +1047,17 @@ construction_time = 10 SECONDS category = list("Exosuit Equipment") +/datum/design/mech_cage + name = "SCS 3 Cage" + desc = "Exosuit-mounted security containing system." + id = "mech_cage" + build_type = MECHFAB + req_tech = (list("materials" = 7, "combat" = 7)) + build_path = /obj/item/mecha_parts/mecha_equipment/cage + materials = list(MAT_METAL=10000, MAT_TITANIUM=4000, MAT_SILVER=2000, MAT_DIAMOND=1000) + construction_time = 10 SECONDS + category = list("Exosuit Equipment") + // Exosuit Weapons /datum/design/mech_grenade_launcher diff --git a/icons/misc/supress_effect.dmi b/icons/misc/supress_effect.dmi new file mode 100644 index 0000000000000000000000000000000000000000..3e0b12b7a997ac909fa967728608bb1ba52eab34 GIT binary patch literal 774 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 delta 18433 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 Date: Thu, 21 Nov 2024 09:50:50 +1000 Subject: [PATCH 02/22] Update goon_vampire_powers.dm From f60d26c706ce5c7bece86a8ea77d068df61ecf5f Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 09:51:31 +1000 Subject: [PATCH 03/22] Update goon_vampire_powers.dm --- code/modules/antagonists/goon_vampire/goon_vampire_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index ab358ac5346..8b9ed220cd1 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -151,8 +151,8 @@ /obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) // mech supress escape - if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) - user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + //if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + //user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) From 8a48e7674fc66f3b827eab6e24284cbc38d8190f Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 09:54:15 +1000 Subject: [PATCH 04/22] Update goon_vampire_powers.dm --- code/modules/antagonists/goon_vampire/goon_vampire_powers.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index 8b9ed220cd1..ab358ac5346 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -151,8 +151,8 @@ /obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) // mech supress escape - //if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) - //user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) From bbf24a4b06178a296136c9dbf8175c8e32dd1b77 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:16:34 +1000 Subject: [PATCH 05/22] check --- code/modules/antagonists/goon_vampire/goon_vampire_powers.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm index ab358ac5346..aa80d124da2 100644 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -150,9 +150,6 @@ /obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) - // mech supress escape - if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) - user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) From 84dc95a0fe9ee35deffddd1a3afd4e7d0b36faed Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:44:17 +1000 Subject: [PATCH 06/22] Create goon_vampire_powers.dm --- .../goon_vampire/goon_vampire_powers.dm | 666 ++++++++++++++++++ 1 file changed, 666 insertions(+) create mode 100644 code/modules/antagonists/goon_vampire/goon_vampire_powers.dm diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm new file mode 100644 index 00000000000..ab358ac5346 --- /dev/null +++ b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm @@ -0,0 +1,666 @@ +/** + * Goon Vampire spell handler. + */ +/datum/spell_handler/goon_vampire + var/required_blood + + +/datum/spell_handler/goon_vampire/can_cast(mob/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) + + var/datum/antagonist/goon_vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + + if(!vampire) + return FALSE + + var/fullpower = vampire.get_ability(/datum/goon_vampire_passive/full) + + if(user.stat >= DEAD) + if(show_message) + to_chat(user, span_warning("Но вы же мертвы!")) + return FALSE + + if(vampire.nullified && !fullpower) + if(show_message) + to_chat(user, span_warning("Что-то блокирует ваши силы!")) + return FALSE + + if(vampire.bloodusable < required_blood) + if(show_message) + to_chat(user, span_warning("Для этого вам потребуется не менее [required_blood] единиц крови!")) + return FALSE + + //chapel check + if(is_type_in_typecache(get_area(user), GLOB.holy_areas) && !fullpower) + if(show_message) + to_chat(user, span_warning("Ваши силы не действуют на этой святой земле.")) + return FALSE + + return TRUE + + +/datum/spell_handler/goon_vampire/spend_spell_cost(mob/user, obj/effect/proc_holder/spell/spell) + for(var/datum/action/spell_action/action in user.actions) + action.UpdateButtonIcon() + + if(!required_blood) //don't take the blood yet if this is false! + return + + var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + vamp?.bloodusable -= required_blood + + +/datum/spell_handler/goon_vampire/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) + var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + vamp?.bloodusable += required_blood + + +/datum/spell_handler/goon_vampire/after_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) + + SSblackbox.record_feedback("tally", "goon_vampire_powers_used", 1, "[spell]") + + if(!required_blood) + return + + var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + to_chat(user, span_boldnotice("У Вас осталось [vamp.bloodusable] единиц крови.")) + + +/******************* + * Spell handler end. + ******************/ + + +/** + * Basis of all vampire spells. + */ +/obj/effect/proc_holder/spell/goon_vampire + name = "Report Me" + desc = "You shouldn't see this!" + school = "vampire" + action_background_icon_state = "bg_vampire_old" + human_req = TRUE + clothes_req = FALSE + base_cooldown = 3 MINUTES + gain_desc = "" + /// How much blood this ability costs to use + var/required_blood + + +/obj/effect/proc_holder/spell/goon_vampire/after_spell_init() + update_name() + + +/obj/effect/proc_holder/spell/goon_vampire/update_name(updates = ALL, mob/user) + . = ..() + if(required_blood) + var/new_name = "[name] ([required_blood])" + name = new_name + action?.name = new_name + action?.UpdateButtonIcon() + + +/obj/effect/proc_holder/spell/goon_vampire/create_new_handler() + var/datum/spell_handler/goon_vampire/H = new() + H.required_blood = required_blood + return H + + +/obj/effect/proc_holder/spell/goon_vampire/self/create_new_targeting() + return new /datum/spell_targeting/self + + +/obj/effect/proc_holder/spell/goon_vampire/targetted + var/range = 1 + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/create_new_targeting() + var/datum/spell_targeting/targeted/T = new() + T.range = range + return T + + +/obj/effect/proc_holder/spell/goon_vampire/proc/affects(mob/target, mob/user = usr) + + //Other vampires aren't affected + if(isvampire(target)) + return FALSE + + //Vampires who have reached their full potential can affect nearly everything + var/datum/antagonist/goon_vampire/vampire = user.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + if(vampire?.get_ability(/datum/goon_vampire_passive/full)) + return TRUE + + //Holy characters are resistant to vampire powers + if(target.mind?.isholy) + return FALSE + + return TRUE + + +//////////////////////////////////////////////////////////////////////////////////////////////////////// + +/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate + name = "Восстановление" + desc= "Используйте накопленную кровь, чтобы влить в тело новые силы, устраняя любое ошеломление" + action_icon_state = "vampire_rejuvinate_old" + base_cooldown = 20 SECONDS + stat_allowed = UNCONSCIOUS + var/effect_timer + var/counter = 0 + + +/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) + user.SetWeakened(0) + user.SetStunned(0) + user.SetKnockdown(0) + user.SetParalysis(0) + user.SetSleeping(0) + user.adjustStaminaLoss(-60) + user.set_resting(FALSE, instant = TRUE) + user.get_up(instant = TRUE) + to_chat(user, span_notice("Ваше тело наполняется чистой кровью, снимая все ошеломляющие эффекты.")) + var/datum/antagonist/goon_vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/goon_vampire) + if(vampire?.get_ability(/datum/goon_vampire_passive/regen)) + effect_timer = addtimer(CALLBACK(src, PROC_REF(rejuvenate_effect), user), 3.5 SECONDS, TIMER_STOPPABLE|TIMER_LOOP) + + +/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/proc/rejuvenate_effect(mob/living/carbon/human/user) + if(QDELETED(user) || counter > 5) + deltimer(effect_timer) + effect_timer = null + counter = 0 + return + + counter++ + var/update = NONE + update |= user.heal_overall_damage(2, 2, updating_health = FALSE, affect_robotic = TRUE) + update |= user.heal_damages(tox = 2, oxy = 5, stamina = 10, updating_health = FALSE) + if(update) + user.updatehealth() + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise + name = "Гипноз" + desc= "Пронзающий взгляд, ошеломляющий жертву на довольно долгое время" + action_icon_state = "vampire_hypnotise" + required_blood = 25 + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise/cast(list/targets, mob/living/carbon/human/user = usr) + var/mob/living/carbon/human/target = targets[1] + + user.visible_message(span_warning("Глаза [user] ярко вспыхивают, когда он[genderize_ru(user.gender,"","а","о","и")] пристально смотр[genderize_ru(user.gender,"ит","ит","ит","ят")] в глаза [target].")) + if(do_after(user, 6 SECONDS, target, NONE)) + if(!affects(target)) + to_chat(user, span_warning("Ваш пронзительный взгляд не смог заворожить [target].")) + to_chat(target, span_notice("Невыразительный взгляд [user] ничего вам не делает.")) + else + to_chat(user, span_warning("Ваш пронзающий взгляд завораживает [target].")) + to_chat(target, span_warning("Вы чувствуете сильную слабость.")) + target.SetSleeping(40 SECONDS) + else + revert_cast(user) + to_chat(user, span_warning("Вы смотрите в никуда.")) + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/disease + name = "Заражающее касание" + desc = "Ваше касание инфицирует кровь жертвы, заражая её могильной лихорадкой. Пока лихорадку не вылечат, жертва будет с трудом держаться на ногах, а её кровь будет наполняться токсинами." + gain_desc = "Вы получили способность «Заражающее касание». Она позволит вам ослаблять тех, кого вы коснётесь до тех пор, пока их не вылечат." + action_icon_state = "vampire_disease" + required_blood = 50 + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/disease/cast(list/targets, mob/living/carbon/human/user = usr) + var/mob/living/carbon/human/target = targets[1] + + to_chat(user, span_warning("Вы незаметно инфицируете [target] заражающим касанием.")) + target.help_shake_act(user) + if(!affects(target)) + to_chat(user, span_warning("Вам кажется, что заражающее касание не подействовало на [target].")) + return + + var/datum/disease/vampire/virus = new + virus.Contract(target) + + +/obj/effect/proc_holder/spell/goon_vampire/glare + name = "Вспышка" + desc = "Вы сверкаете глазами, ненадолго ошеломляя всех людей вокруг" + action_icon_state = "vampire_glare_old" + base_cooldown = 30 SECONDS + stat_allowed = UNCONSCIOUS + + +/obj/effect/proc_holder/spell/goon_vampire/glare/create_new_targeting() + var/datum/spell_targeting/aoe/T = new() + T.range = 1 + T.allowed_type = /mob/living/carbon + return T + + +/obj/effect/proc_holder/spell/goon_vampire/glare/cast(list/targets, mob/living/carbon/human/user = usr) + if(!length(targets)) + revert_cast(user) + return + + if(istype(user.glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) + to_chat(user, span_warning("У вас на глазах повязка!")) + return + + user.visible_message(span_warning("Глаза [user] ослепительно вспыхивают!")) + + for(var/mob/living/carbon/human/target in targets) + if(!affects(target)) + continue + + if(isninja(target)) + var/mob/living/carbon/human/target_human = target + var/obj/item/clothing/glasses/ninja/ninja_visor = target_human.glasses + + if(istype(ninja_visor) && ninja_visor.vamp_protection_active && ninja_visor.current_mode == "flashprotection") + to_chat(target, span_warning("Глаза [user] засветились, но ваш визор защитил вас.")) + continue + + target.Weaken(4 SECONDS) + target.AdjustStuttering(40 SECONDS) + target.adjustStaminaLoss(20) + to_chat(target, span_userdanger("Вы ослеплены вспышкой из глаз [user].")) + add_attack_logs(user, target, "(Vampire) слепит") + target.apply_status_effect(STATUS_EFFECT_STAMINADOT) + + +/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift + name = "Превращение" + desc = "Изменяет ваше имя и внешность, тратя 50 крови, с откатом в 3 минуты." + gain_desc = "Вы получили способность «Превращение», позволяющую навсегда обернуться другим обликом, затратив часть накопленной крови." + action_icon_state = "genetic_poly" + required_blood = 50 + + +/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift/cast(list/targets, mob/living/carbon/human/user = usr) + user.visible_message(span_warning("[user] transforms!")) + + scramble(TRUE, user, 100) + user.real_name = random_name(user.gender, user.dna.species.name) //Give them a name that makes sense for their species. + user.sync_organ_dna(assimilate = TRUE) + user.update_body() + user.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover. + user.reset_markings() //...Or markings. + user.dna.ResetUIFrom(user) + user.flavor_text = "" + user.update_icons() + + +/obj/effect/proc_holder/spell/goon_vampire/self/screech + name = "Визг рукокрылых" + desc = "Невероятно громкий визг, разбивающий стёкла и ошеломляющий окружающих." + gain_desc = "Вы получили способность «Визг рукокрылых», в большом радиусе оглушающую всех, кто может слышать, и раскалывающую стёкла." + action_icon_state = "vampire_screech" + required_blood = 30 + + +/obj/effect/proc_holder/spell/goon_vampire/self/screech/cast(list/targets, mob/user = usr) + + playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, TRUE) + user.visible_message(span_warning("[user] издаёт душераздирающий визг!"), \ + span_warning("Вы громко визжите."), \ + span_italics("Вы слышите болезненно громкий визг!")) + + for(var/mob/living/carbon/target in hearers(4)) + if(target == user) + continue + + if(ishuman(target)) + var/mob/living/carbon/human/h_target = target + if(h_target.check_ear_prot() >= HEARING_PROTECTION_TOTAL) + continue + + if(!affects(target)) + continue + + if(isninja(target)) + var/obj/item/clothing/suit/space/space_ninja/ninja_suit = target.wear_suit + if(istype(ninja_suit) && ninja_suit.vamp_protection_active && ninja_suit.s_initialized) + to_chat(target, span_warning("Вы начали слышать жуткий визг! Но ваш костюм отреагировал на него и временно прикрыл вам уши, минимизируя урон")) + target.Deaf(20 SECONDS) + target.Jitter(100 SECONDS) + target.adjustStaminaLoss(20) + continue + + to_chat(target, span_warning("Вы слышите ушераздирающий визг и ваши чувства притупляются!")) + target.Weaken(4 SECONDS) + target.Deaf(40 SECONDS) + target.Stuttering(40 SECONDS) + target.Jitter(300 SECONDS) + target.apply_damage(60, STAMINA) + + for(var/obj/structure/window/window in view(4)) + window.deconstruct(FALSE) + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall + name = "Порабощение" + desc = "Вы используете большую часть своей силы, вынуждая тех, кто ещё никому не служит, служить только вам." + gain_desc = "Вы получили способность «Порабощение», которая тратит много крови, но позволяет вам поработить человека, который ещё никому не служит, на случайный период времени." + action_icon_state = "vampire_enthrall_old" + required_blood = 300 + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/cast(list/targets, mob/living/carbon/human/user = usr) + + var/mob/living/carbon/human/target = targets[1] + + if(!ishuman(target)) + to_chat(user, span_warning("Вы можете порабощать только гуманоидов.")) + return + + user.visible_message(span_warning("[user] кусает [target] в шею!"), \ + span_warning("Вы кусаете [target] в шею и начинаете передачу части своей силы.")) + to_chat(target, span_warning("Вы ощущаете, как щупальца зла впиваются в ваш разум.")) + + if(do_after(user, 5 SECONDS, target, NONE)) + if(can_enthrall(user, target)) + handle_enthrall(user, target) + else + revert_cast(user) + else + revert_cast(user) + + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/can_enthrall(mob/living/carbon/human/user, mob/living/carbon/target) + + var/enthrall_safe = FALSE + for(var/obj/item/implant/mindshield/implant in target) + if(implant?.implanted) + enthrall_safe = TRUE + break + + for(var/obj/item/implant/traitor/implant in target) + if(implant?.implanted) + enthrall_safe = TRUE + break + + if(!target) + log_runtime(EXCEPTION("При порабощении моба случилось что-то плохое. Атакующий: [user] [user.key] \ref[user]"), user) + return FALSE + + if(!target.mind) + to_chat(user, span_warning("Разум [target.name] сейчас не здесь, поэтому порабощение не удастся.")) + return FALSE + + if(enthrall_safe || isvampire(target) || isvampirethrall(target)) + target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ + span_notice("Вы ощущаете в голове знакомое ощущение, но оно быстро проходит.")) + return FALSE + + if(!affects(target)) + target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ + span_notice("Вера в [SSticker.Bible_deity_name] защищает ваш разум от всякого зла.")) + return FALSE + + if(isninja(target)) + var/obj/item/clothing/suit/space/space_ninja/ninja_suit = target.wear_suit + if(istype(ninja_suit) && ninja_suit.vamp_protection_active && ninja_suit.s_initialized) + target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ + span_notice("Вы ощутили сильную боль, а затем слабый укол в шею. Кажется костюм только, что защитил ваш разум...")) + target.setBrainLoss(20) + return FALSE + + if(!ishuman(target)) + to_chat(user, span_warning("Вы можете порабощать только гуманоидов!")) + return FALSE + + return TRUE + + +/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/target) + if(!istype(target)) + return FALSE + + var/greet_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." + target.mind.add_antag_datum(new /datum/antagonist/mindslave/goon_thrall(user.mind, greet_text)) + if(jobban_isbanned(target, ROLE_VAMPIRE)) + SSticker.mode.replace_jobbanned_player(target, SPECIAL_ROLE_VAMPIRE_THRALL) + target.Stun(4 SECONDS) + to_chat(user, span_warning("Вы успешно поработили [target]. Если игрок откажется Вас слушаться, используйте adminhelp.")) + user.create_log(CONVERSION_LOG, "vampire enthralled", target) + target.create_log(CONVERSION_LOG, "was vampire enthralled", user) + + +/obj/effect/proc_holder/spell/goon_vampire/self/cloak + name = "Покров тьмы" + desc = "Переключается, маскируя вас в темноте" + gain_desc = "Вы получили способность «Покров тьмы», которая, будучи включённой, делает вас практически невидимым в темноте." + action_icon_state = "vampire_cloak_old" + base_cooldown = 1 SECONDS + + +/obj/effect/proc_holder/spell/goon_vampire/self/cloak/update_name(updates = ALL, mob/user) + . = ..() + var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + if(!vamp) + return + + var/new_name = "[initial(name)] ([vamp.iscloaking ? "Выключить" : "Включить"])" + name = new_name + action?.name = new_name + action?.UpdateButtonIcon() + + +/obj/effect/proc_holder/spell/goon_vampire/self/cloak/cast(list/targets, mob/living/carbon/human/user = usr) + var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) + if(!vamp) + return + + vamp.iscloaking = !vamp.iscloaking + update_name(user = user) + to_chat(user, span_notice("Теперь вас будет [vamp.iscloaking ? "не видно" : "видно"] в темноте.")) + + +/obj/effect/proc_holder/spell/goon_vampire/bats + name = "Дети ночи" + desc = "Вы вызываете пару космолетучих мышей, которые будут биться насмерть со всеми вокруг" + gain_desc = "Вы получили способность «Дети ночи», призывающую летучих мышей." + action_icon_state = "vampire_bats" + base_cooldown= 2 MINUTES + required_blood = 50 + var/num_bats = 2 + + +/obj/effect/proc_holder/spell/goon_vampire/bats/create_new_targeting() + var/datum/spell_targeting/aoe/turf/T = new() + T.selection_type = SPELL_SELECTION_RANGE + T.use_turf_of_user = TRUE + T.range = 1 + return T + + +/obj/effect/proc_holder/spell/goon_vampire/bats/valid_target(turf/target, user) + if(target.density) + return FALSE + + for(var/atom/check in target.contents) + if(check.density) + return FALSE + + return TRUE + + +/obj/effect/proc_holder/spell/goon_vampire/bats/cast(list/targets, mob/living/carbon/human/user = usr) + if(length(targets) < num_bats) + revert_cast(user) + return + + for(var/i in 1 to num_bats) + var/turf/target_turf = pick(targets) + targets.Remove(target_turf) + new /mob/living/simple_animal/hostile/scarybat(target_turf, user) + + +/obj/effect/proc_holder/spell/goon_vampire/self/jaunt + name = "Облик тумана" + desc = "Вы на короткое время превращаетесь в облако тумана" + gain_desc = "Вы получили способность «Облик тумана», которая позволит вам превращаться в облако тумана и проходить сквозь любые препятствия." + action_icon_state = "jaunt" + base_cooldown = 60 SECONDS + required_blood = 50 + centcom_cancast = FALSE + var/jaunt_duration = 5 SECONDS //in deciseconds + + +/obj/effect/proc_holder/spell/goon_vampire/self/jaunt/cast(list/targets, mob/living/carbon/human/user = usr) + spawn(0) + var/turf/originalloc = get_turf(user.loc) + var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) + var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc) + animation.name = "water" + animation.set_density(FALSE) + animation.set_anchored(TRUE) + animation.icon = 'icons/mob/mob.dmi' + animation.icon_state = "liquify" + animation.layer = 5 + animation.master = holder + user.ExtinguishMob() + flick("liquify", animation) + user.forceMove(holder) + user.client.eye = holder + var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() + steam.set_up(10, 0, originalloc) + steam.start() + + sleep(jaunt_duration) + if(QDELETED(user)) + return + + var/turf/mobloc = get_turf(user.loc) + animation.loc = mobloc + steam.location = mobloc + steam.start() + ADD_TRAIT(user, TRAIT_IMMOBILIZED, UNIQUE_TRAIT_SOURCE(src)) + + sleep(2 SECONDS) + if(QDELETED(user)) + return + + flick("reappear",animation) + + sleep(0.5 SECONDS) + if(QDELETED(user)) + return + + REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, UNIQUE_TRAIT_SOURCE(src)) + + if(!user.Move(mobloc)) + for(var/direction in list(1,2,4,8,5,6,9,10)) + var/turf/check = get_step(mobloc, direction) + if(check && user.Move(check)) + break + + user.client.eye = user + qdel(animation) + qdel(holder) + + for(var/datum/action/spell_action/action in user.actions) + action.UpdateButtonIcon() + + +// Blink for vamps +// Less smoke spam. +/obj/effect/proc_holder/spell/goon_vampire/shadowstep + name = "Шаг в тень" + desc = "Растворитесь в тенях" + gain_desc = "Вы получили способность «Шаг в тень», позволяющую вам, затратив часть крови, оказаться в ближайшей доступной тени." + action_icon_state = "blink" + base_cooldown = 2 SECONDS + required_blood = 20 + centcom_cancast = FALSE + create_attack_logs = FALSE + + // Teleport radii + var/inner_tele_radius = 0 + var/outer_tele_radius = 6 + // Maximum lighting_lumcount. + var/max_lum = 1 + + +/obj/effect/proc_holder/spell/goon_vampire/shadowstep/create_new_targeting() + var/datum/spell_targeting/aoe/turf/T = new() + T.selection_type = SPELL_SELECTION_RANGE + T.use_turf_of_user = TRUE + T.range = outer_tele_radius + return T + + +/obj/effect/proc_holder/spell/goon_vampire/shadowstep/valid_target(turf/target, user) + if(target in range(user, inner_tele_radius)) + return FALSE + + if(isspaceturf(target)) + return FALSE + + if(target.density) + return FALSE + + if(target.x > world.maxx - outer_tele_radius || target.x < outer_tele_radius) + return FALSE //putting them at the edge is dumb + + if(target.y > world.maxy - outer_tele_radius || target.y < outer_tele_radius) + return FALSE + + // LIGHTING CHECK + var/lightingcount = target.get_lumcount(0.5) * 10 + if(lightingcount > max_lum) + return FALSE + + return TRUE + + +/obj/effect/proc_holder/spell/goon_vampire/shadowstep/cast(list/targets, mob/living/carbon/human/user = usr) + if(!length(targets)) + revert_cast(user) + to_chat(user, span_warning("Поблизости нет теней, куда можно было бы шагнуть.")) + return + + var/target_turf = pick(targets) + spawn(0) + user.ExtinguishMob() + var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(user)) + animation.name = user.name + animation.set_density(FALSE) + animation.set_anchored(TRUE) + animation.icon = user.icon + animation.alpha = 127 + animation.layer = 5 + //animation.master = src + user.forceMove(target_turf) + + spawn(1 SECONDS) + qdel(animation) + + +/datum/goon_vampire_passive + var/gain_desc + + +/datum/goon_vampire_passive/New() + ..() + if(!gain_desc) + gain_desc = "Вы получили способность «[src]»." + + +/datum/goon_vampire_passive/regen + gain_desc = "Ваша способность «Восстановление» улучшена. Теперь она будет постепенно исцелять вас после использования." + + +/datum/goon_vampire_passive/vision + gain_desc = "Ваше вампирское зрение улучшено." + + +/datum/goon_vampire_passive/full + gain_desc = "Вы достигли полной силы и ничто святое больше не может ослабить вас. Ваше зрение значительно улучшилось." + From 1be611cd7e1c853433b4a7ca637397061d97df48 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:47:37 +1000 Subject: [PATCH 07/22] Delete goon_vampire_powers.dm --- .../goon_vampire/goon_vampire_powers.dm | 666 ------------------ 1 file changed, 666 deletions(-) delete mode 100644 code/modules/antagonists/goon_vampire/goon_vampire_powers.dm diff --git a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm b/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm deleted file mode 100644 index ab358ac5346..00000000000 --- a/code/modules/antagonists/goon_vampire/goon_vampire_powers.dm +++ /dev/null @@ -1,666 +0,0 @@ -/** - * Goon Vampire spell handler. - */ -/datum/spell_handler/goon_vampire - var/required_blood - - -/datum/spell_handler/goon_vampire/can_cast(mob/user, charge_check, show_message, obj/effect/proc_holder/spell/spell) - - var/datum/antagonist/goon_vampire/vampire = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - - if(!vampire) - return FALSE - - var/fullpower = vampire.get_ability(/datum/goon_vampire_passive/full) - - if(user.stat >= DEAD) - if(show_message) - to_chat(user, span_warning("Но вы же мертвы!")) - return FALSE - - if(vampire.nullified && !fullpower) - if(show_message) - to_chat(user, span_warning("Что-то блокирует ваши силы!")) - return FALSE - - if(vampire.bloodusable < required_blood) - if(show_message) - to_chat(user, span_warning("Для этого вам потребуется не менее [required_blood] единиц крови!")) - return FALSE - - //chapel check - if(is_type_in_typecache(get_area(user), GLOB.holy_areas) && !fullpower) - if(show_message) - to_chat(user, span_warning("Ваши силы не действуют на этой святой земле.")) - return FALSE - - return TRUE - - -/datum/spell_handler/goon_vampire/spend_spell_cost(mob/user, obj/effect/proc_holder/spell/spell) - for(var/datum/action/spell_action/action in user.actions) - action.UpdateButtonIcon() - - if(!required_blood) //don't take the blood yet if this is false! - return - - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - vamp?.bloodusable -= required_blood - - -/datum/spell_handler/goon_vampire/revert_cast(mob/living/carbon/user, obj/effect/proc_holder/spell/spell) - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - vamp?.bloodusable += required_blood - - -/datum/spell_handler/goon_vampire/after_cast(list/targets, mob/user, obj/effect/proc_holder/spell/spell) - - SSblackbox.record_feedback("tally", "goon_vampire_powers_used", 1, "[spell]") - - if(!required_blood) - return - - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - to_chat(user, span_boldnotice("У Вас осталось [vamp.bloodusable] единиц крови.")) - - -/******************* - * Spell handler end. - ******************/ - - -/** - * Basis of all vampire spells. - */ -/obj/effect/proc_holder/spell/goon_vampire - name = "Report Me" - desc = "You shouldn't see this!" - school = "vampire" - action_background_icon_state = "bg_vampire_old" - human_req = TRUE - clothes_req = FALSE - base_cooldown = 3 MINUTES - gain_desc = "" - /// How much blood this ability costs to use - var/required_blood - - -/obj/effect/proc_holder/spell/goon_vampire/after_spell_init() - update_name() - - -/obj/effect/proc_holder/spell/goon_vampire/update_name(updates = ALL, mob/user) - . = ..() - if(required_blood) - var/new_name = "[name] ([required_blood])" - name = new_name - action?.name = new_name - action?.UpdateButtonIcon() - - -/obj/effect/proc_holder/spell/goon_vampire/create_new_handler() - var/datum/spell_handler/goon_vampire/H = new() - H.required_blood = required_blood - return H - - -/obj/effect/proc_holder/spell/goon_vampire/self/create_new_targeting() - return new /datum/spell_targeting/self - - -/obj/effect/proc_holder/spell/goon_vampire/targetted - var/range = 1 - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/create_new_targeting() - var/datum/spell_targeting/targeted/T = new() - T.range = range - return T - - -/obj/effect/proc_holder/spell/goon_vampire/proc/affects(mob/target, mob/user = usr) - - //Other vampires aren't affected - if(isvampire(target)) - return FALSE - - //Vampires who have reached their full potential can affect nearly everything - var/datum/antagonist/goon_vampire/vampire = user.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(vampire?.get_ability(/datum/goon_vampire_passive/full)) - return TRUE - - //Holy characters are resistant to vampire powers - if(target.mind?.isholy) - return FALSE - - return TRUE - - -//////////////////////////////////////////////////////////////////////////////////////////////////////// - -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate - name = "Восстановление" - desc= "Используйте накопленную кровь, чтобы влить в тело новые силы, устраняя любое ошеломление" - action_icon_state = "vampire_rejuvinate_old" - base_cooldown = 20 SECONDS - stat_allowed = UNCONSCIOUS - var/effect_timer - var/counter = 0 - - -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) - // mech supress escape - if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) - user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) - user.SetWeakened(0) - user.SetStunned(0) - user.SetKnockdown(0) - user.SetParalysis(0) - user.SetSleeping(0) - user.adjustStaminaLoss(-60) - user.set_resting(FALSE, instant = TRUE) - user.get_up(instant = TRUE) - to_chat(user, span_notice("Ваше тело наполняется чистой кровью, снимая все ошеломляющие эффекты.")) - var/datum/antagonist/goon_vampire/vampire = user.mind.has_antag_datum(/datum/antagonist/goon_vampire) - if(vampire?.get_ability(/datum/goon_vampire_passive/regen)) - effect_timer = addtimer(CALLBACK(src, PROC_REF(rejuvenate_effect), user), 3.5 SECONDS, TIMER_STOPPABLE|TIMER_LOOP) - - -/obj/effect/proc_holder/spell/goon_vampire/self/rejuvenate/proc/rejuvenate_effect(mob/living/carbon/human/user) - if(QDELETED(user) || counter > 5) - deltimer(effect_timer) - effect_timer = null - counter = 0 - return - - counter++ - var/update = NONE - update |= user.heal_overall_damage(2, 2, updating_health = FALSE, affect_robotic = TRUE) - update |= user.heal_damages(tox = 2, oxy = 5, stamina = 10, updating_health = FALSE) - if(update) - user.updatehealth() - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise - name = "Гипноз" - desc= "Пронзающий взгляд, ошеломляющий жертву на довольно долгое время" - action_icon_state = "vampire_hypnotise" - required_blood = 25 - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/hypnotise/cast(list/targets, mob/living/carbon/human/user = usr) - var/mob/living/carbon/human/target = targets[1] - - user.visible_message(span_warning("Глаза [user] ярко вспыхивают, когда он[genderize_ru(user.gender,"","а","о","и")] пристально смотр[genderize_ru(user.gender,"ит","ит","ит","ят")] в глаза [target].")) - if(do_after(user, 6 SECONDS, target, NONE)) - if(!affects(target)) - to_chat(user, span_warning("Ваш пронзительный взгляд не смог заворожить [target].")) - to_chat(target, span_notice("Невыразительный взгляд [user] ничего вам не делает.")) - else - to_chat(user, span_warning("Ваш пронзающий взгляд завораживает [target].")) - to_chat(target, span_warning("Вы чувствуете сильную слабость.")) - target.SetSleeping(40 SECONDS) - else - revert_cast(user) - to_chat(user, span_warning("Вы смотрите в никуда.")) - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/disease - name = "Заражающее касание" - desc = "Ваше касание инфицирует кровь жертвы, заражая её могильной лихорадкой. Пока лихорадку не вылечат, жертва будет с трудом держаться на ногах, а её кровь будет наполняться токсинами." - gain_desc = "Вы получили способность «Заражающее касание». Она позволит вам ослаблять тех, кого вы коснётесь до тех пор, пока их не вылечат." - action_icon_state = "vampire_disease" - required_blood = 50 - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/disease/cast(list/targets, mob/living/carbon/human/user = usr) - var/mob/living/carbon/human/target = targets[1] - - to_chat(user, span_warning("Вы незаметно инфицируете [target] заражающим касанием.")) - target.help_shake_act(user) - if(!affects(target)) - to_chat(user, span_warning("Вам кажется, что заражающее касание не подействовало на [target].")) - return - - var/datum/disease/vampire/virus = new - virus.Contract(target) - - -/obj/effect/proc_holder/spell/goon_vampire/glare - name = "Вспышка" - desc = "Вы сверкаете глазами, ненадолго ошеломляя всех людей вокруг" - action_icon_state = "vampire_glare_old" - base_cooldown = 30 SECONDS - stat_allowed = UNCONSCIOUS - - -/obj/effect/proc_holder/spell/goon_vampire/glare/create_new_targeting() - var/datum/spell_targeting/aoe/T = new() - T.range = 1 - T.allowed_type = /mob/living/carbon - return T - - -/obj/effect/proc_holder/spell/goon_vampire/glare/cast(list/targets, mob/living/carbon/human/user = usr) - if(!length(targets)) - revert_cast(user) - return - - if(istype(user.glasses, /obj/item/clothing/glasses/sunglasses/blindfold)) - to_chat(user, span_warning("У вас на глазах повязка!")) - return - - user.visible_message(span_warning("Глаза [user] ослепительно вспыхивают!")) - - for(var/mob/living/carbon/human/target in targets) - if(!affects(target)) - continue - - if(isninja(target)) - var/mob/living/carbon/human/target_human = target - var/obj/item/clothing/glasses/ninja/ninja_visor = target_human.glasses - - if(istype(ninja_visor) && ninja_visor.vamp_protection_active && ninja_visor.current_mode == "flashprotection") - to_chat(target, span_warning("Глаза [user] засветились, но ваш визор защитил вас.")) - continue - - target.Weaken(4 SECONDS) - target.AdjustStuttering(40 SECONDS) - target.adjustStaminaLoss(20) - to_chat(target, span_userdanger("Вы ослеплены вспышкой из глаз [user].")) - add_attack_logs(user, target, "(Vampire) слепит") - target.apply_status_effect(STATUS_EFFECT_STAMINADOT) - - -/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift - name = "Превращение" - desc = "Изменяет ваше имя и внешность, тратя 50 крови, с откатом в 3 минуты." - gain_desc = "Вы получили способность «Превращение», позволяющую навсегда обернуться другим обликом, затратив часть накопленной крови." - action_icon_state = "genetic_poly" - required_blood = 50 - - -/obj/effect/proc_holder/spell/goon_vampire/self/shapeshift/cast(list/targets, mob/living/carbon/human/user = usr) - user.visible_message(span_warning("[user] transforms!")) - - scramble(TRUE, user, 100) - user.real_name = random_name(user.gender, user.dna.species.name) //Give them a name that makes sense for their species. - user.sync_organ_dna(assimilate = TRUE) - user.update_body() - user.reset_hair() //No more winding up with hairstyles you're not supposed to have, and blowing your cover. - user.reset_markings() //...Or markings. - user.dna.ResetUIFrom(user) - user.flavor_text = "" - user.update_icons() - - -/obj/effect/proc_holder/spell/goon_vampire/self/screech - name = "Визг рукокрылых" - desc = "Невероятно громкий визг, разбивающий стёкла и ошеломляющий окружающих." - gain_desc = "Вы получили способность «Визг рукокрылых», в большом радиусе оглушающую всех, кто может слышать, и раскалывающую стёкла." - action_icon_state = "vampire_screech" - required_blood = 30 - - -/obj/effect/proc_holder/spell/goon_vampire/self/screech/cast(list/targets, mob/user = usr) - - playsound(user.loc, 'sound/effects/creepyshriek.ogg', 100, TRUE) - user.visible_message(span_warning("[user] издаёт душераздирающий визг!"), \ - span_warning("Вы громко визжите."), \ - span_italics("Вы слышите болезненно громкий визг!")) - - for(var/mob/living/carbon/target in hearers(4)) - if(target == user) - continue - - if(ishuman(target)) - var/mob/living/carbon/human/h_target = target - if(h_target.check_ear_prot() >= HEARING_PROTECTION_TOTAL) - continue - - if(!affects(target)) - continue - - if(isninja(target)) - var/obj/item/clothing/suit/space/space_ninja/ninja_suit = target.wear_suit - if(istype(ninja_suit) && ninja_suit.vamp_protection_active && ninja_suit.s_initialized) - to_chat(target, span_warning("Вы начали слышать жуткий визг! Но ваш костюм отреагировал на него и временно прикрыл вам уши, минимизируя урон")) - target.Deaf(20 SECONDS) - target.Jitter(100 SECONDS) - target.adjustStaminaLoss(20) - continue - - to_chat(target, span_warning("Вы слышите ушераздирающий визг и ваши чувства притупляются!")) - target.Weaken(4 SECONDS) - target.Deaf(40 SECONDS) - target.Stuttering(40 SECONDS) - target.Jitter(300 SECONDS) - target.apply_damage(60, STAMINA) - - for(var/obj/structure/window/window in view(4)) - window.deconstruct(FALSE) - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall - name = "Порабощение" - desc = "Вы используете большую часть своей силы, вынуждая тех, кто ещё никому не служит, служить только вам." - gain_desc = "Вы получили способность «Порабощение», которая тратит много крови, но позволяет вам поработить человека, который ещё никому не служит, на случайный период времени." - action_icon_state = "vampire_enthrall_old" - required_blood = 300 - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/cast(list/targets, mob/living/carbon/human/user = usr) - - var/mob/living/carbon/human/target = targets[1] - - if(!ishuman(target)) - to_chat(user, span_warning("Вы можете порабощать только гуманоидов.")) - return - - user.visible_message(span_warning("[user] кусает [target] в шею!"), \ - span_warning("Вы кусаете [target] в шею и начинаете передачу части своей силы.")) - to_chat(target, span_warning("Вы ощущаете, как щупальца зла впиваются в ваш разум.")) - - if(do_after(user, 5 SECONDS, target, NONE)) - if(can_enthrall(user, target)) - handle_enthrall(user, target) - else - revert_cast(user) - else - revert_cast(user) - - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/can_enthrall(mob/living/carbon/human/user, mob/living/carbon/target) - - var/enthrall_safe = FALSE - for(var/obj/item/implant/mindshield/implant in target) - if(implant?.implanted) - enthrall_safe = TRUE - break - - for(var/obj/item/implant/traitor/implant in target) - if(implant?.implanted) - enthrall_safe = TRUE - break - - if(!target) - log_runtime(EXCEPTION("При порабощении моба случилось что-то плохое. Атакующий: [user] [user.key] \ref[user]"), user) - return FALSE - - if(!target.mind) - to_chat(user, span_warning("Разум [target.name] сейчас не здесь, поэтому порабощение не удастся.")) - return FALSE - - if(enthrall_safe || isvampire(target) || isvampirethrall(target)) - target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ - span_notice("Вы ощущаете в голове знакомое ощущение, но оно быстро проходит.")) - return FALSE - - if(!affects(target)) - target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ - span_notice("Вера в [SSticker.Bible_deity_name] защищает ваш разум от всякого зла.")) - return FALSE - - if(isninja(target)) - var/obj/item/clothing/suit/space/space_ninja/ninja_suit = target.wear_suit - if(istype(ninja_suit) && ninja_suit.vamp_protection_active && ninja_suit.s_initialized) - target.visible_message(span_warning("Похоже что [target] сопротивляется захвату!"), \ - span_notice("Вы ощутили сильную боль, а затем слабый укол в шею. Кажется костюм только, что защитил ваш разум...")) - target.setBrainLoss(20) - return FALSE - - if(!ishuman(target)) - to_chat(user, span_warning("Вы можете порабощать только гуманоидов!")) - return FALSE - - return TRUE - - -/obj/effect/proc_holder/spell/goon_vampire/targetted/enthrall/proc/handle_enthrall(mob/living/user, mob/living/carbon/human/target) - if(!istype(target)) - return FALSE - - var/greet_text = "You have been Enthralled by [user.real_name]. Follow [user.p_their()] every command." - target.mind.add_antag_datum(new /datum/antagonist/mindslave/goon_thrall(user.mind, greet_text)) - if(jobban_isbanned(target, ROLE_VAMPIRE)) - SSticker.mode.replace_jobbanned_player(target, SPECIAL_ROLE_VAMPIRE_THRALL) - target.Stun(4 SECONDS) - to_chat(user, span_warning("Вы успешно поработили [target]. Если игрок откажется Вас слушаться, используйте adminhelp.")) - user.create_log(CONVERSION_LOG, "vampire enthralled", target) - target.create_log(CONVERSION_LOG, "was vampire enthralled", user) - - -/obj/effect/proc_holder/spell/goon_vampire/self/cloak - name = "Покров тьмы" - desc = "Переключается, маскируя вас в темноте" - gain_desc = "Вы получили способность «Покров тьмы», которая, будучи включённой, делает вас практически невидимым в темноте." - action_icon_state = "vampire_cloak_old" - base_cooldown = 1 SECONDS - - -/obj/effect/proc_holder/spell/goon_vampire/self/cloak/update_name(updates = ALL, mob/user) - . = ..() - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(!vamp) - return - - var/new_name = "[initial(name)] ([vamp.iscloaking ? "Выключить" : "Включить"])" - name = new_name - action?.name = new_name - action?.UpdateButtonIcon() - - -/obj/effect/proc_holder/spell/goon_vampire/self/cloak/cast(list/targets, mob/living/carbon/human/user = usr) - var/datum/antagonist/goon_vampire/vamp = user?.mind?.has_antag_datum(/datum/antagonist/goon_vampire) - if(!vamp) - return - - vamp.iscloaking = !vamp.iscloaking - update_name(user = user) - to_chat(user, span_notice("Теперь вас будет [vamp.iscloaking ? "не видно" : "видно"] в темноте.")) - - -/obj/effect/proc_holder/spell/goon_vampire/bats - name = "Дети ночи" - desc = "Вы вызываете пару космолетучих мышей, которые будут биться насмерть со всеми вокруг" - gain_desc = "Вы получили способность «Дети ночи», призывающую летучих мышей." - action_icon_state = "vampire_bats" - base_cooldown= 2 MINUTES - required_blood = 50 - var/num_bats = 2 - - -/obj/effect/proc_holder/spell/goon_vampire/bats/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - T.selection_type = SPELL_SELECTION_RANGE - T.use_turf_of_user = TRUE - T.range = 1 - return T - - -/obj/effect/proc_holder/spell/goon_vampire/bats/valid_target(turf/target, user) - if(target.density) - return FALSE - - for(var/atom/check in target.contents) - if(check.density) - return FALSE - - return TRUE - - -/obj/effect/proc_holder/spell/goon_vampire/bats/cast(list/targets, mob/living/carbon/human/user = usr) - if(length(targets) < num_bats) - revert_cast(user) - return - - for(var/i in 1 to num_bats) - var/turf/target_turf = pick(targets) - targets.Remove(target_turf) - new /mob/living/simple_animal/hostile/scarybat(target_turf, user) - - -/obj/effect/proc_holder/spell/goon_vampire/self/jaunt - name = "Облик тумана" - desc = "Вы на короткое время превращаетесь в облако тумана" - gain_desc = "Вы получили способность «Облик тумана», которая позволит вам превращаться в облако тумана и проходить сквозь любые препятствия." - action_icon_state = "jaunt" - base_cooldown = 60 SECONDS - required_blood = 50 - centcom_cancast = FALSE - var/jaunt_duration = 5 SECONDS //in deciseconds - - -/obj/effect/proc_holder/spell/goon_vampire/self/jaunt/cast(list/targets, mob/living/carbon/human/user = usr) - spawn(0) - var/turf/originalloc = get_turf(user.loc) - var/obj/effect/dummy/spell_jaunt/holder = new /obj/effect/dummy/spell_jaunt(originalloc) - var/atom/movable/overlay/animation = new /atom/movable/overlay(originalloc) - animation.name = "water" - animation.set_density(FALSE) - animation.set_anchored(TRUE) - animation.icon = 'icons/mob/mob.dmi' - animation.icon_state = "liquify" - animation.layer = 5 - animation.master = holder - user.ExtinguishMob() - flick("liquify", animation) - user.forceMove(holder) - user.client.eye = holder - var/datum/effect_system/steam_spread/steam = new /datum/effect_system/steam_spread() - steam.set_up(10, 0, originalloc) - steam.start() - - sleep(jaunt_duration) - if(QDELETED(user)) - return - - var/turf/mobloc = get_turf(user.loc) - animation.loc = mobloc - steam.location = mobloc - steam.start() - ADD_TRAIT(user, TRAIT_IMMOBILIZED, UNIQUE_TRAIT_SOURCE(src)) - - sleep(2 SECONDS) - if(QDELETED(user)) - return - - flick("reappear",animation) - - sleep(0.5 SECONDS) - if(QDELETED(user)) - return - - REMOVE_TRAIT(user, TRAIT_IMMOBILIZED, UNIQUE_TRAIT_SOURCE(src)) - - if(!user.Move(mobloc)) - for(var/direction in list(1,2,4,8,5,6,9,10)) - var/turf/check = get_step(mobloc, direction) - if(check && user.Move(check)) - break - - user.client.eye = user - qdel(animation) - qdel(holder) - - for(var/datum/action/spell_action/action in user.actions) - action.UpdateButtonIcon() - - -// Blink for vamps -// Less smoke spam. -/obj/effect/proc_holder/spell/goon_vampire/shadowstep - name = "Шаг в тень" - desc = "Растворитесь в тенях" - gain_desc = "Вы получили способность «Шаг в тень», позволяющую вам, затратив часть крови, оказаться в ближайшей доступной тени." - action_icon_state = "blink" - base_cooldown = 2 SECONDS - required_blood = 20 - centcom_cancast = FALSE - create_attack_logs = FALSE - - // Teleport radii - var/inner_tele_radius = 0 - var/outer_tele_radius = 6 - // Maximum lighting_lumcount. - var/max_lum = 1 - - -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/create_new_targeting() - var/datum/spell_targeting/aoe/turf/T = new() - T.selection_type = SPELL_SELECTION_RANGE - T.use_turf_of_user = TRUE - T.range = outer_tele_radius - return T - - -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/valid_target(turf/target, user) - if(target in range(user, inner_tele_radius)) - return FALSE - - if(isspaceturf(target)) - return FALSE - - if(target.density) - return FALSE - - if(target.x > world.maxx - outer_tele_radius || target.x < outer_tele_radius) - return FALSE //putting them at the edge is dumb - - if(target.y > world.maxy - outer_tele_radius || target.y < outer_tele_radius) - return FALSE - - // LIGHTING CHECK - var/lightingcount = target.get_lumcount(0.5) * 10 - if(lightingcount > max_lum) - return FALSE - - return TRUE - - -/obj/effect/proc_holder/spell/goon_vampire/shadowstep/cast(list/targets, mob/living/carbon/human/user = usr) - if(!length(targets)) - revert_cast(user) - to_chat(user, span_warning("Поблизости нет теней, куда можно было бы шагнуть.")) - return - - var/target_turf = pick(targets) - spawn(0) - user.ExtinguishMob() - var/atom/movable/overlay/animation = new /atom/movable/overlay(get_turf(user)) - animation.name = user.name - animation.set_density(FALSE) - animation.set_anchored(TRUE) - animation.icon = user.icon - animation.alpha = 127 - animation.layer = 5 - //animation.master = src - user.forceMove(target_turf) - - spawn(1 SECONDS) - qdel(animation) - - -/datum/goon_vampire_passive - var/gain_desc - - -/datum/goon_vampire_passive/New() - ..() - if(!gain_desc) - gain_desc = "Вы получили способность «[src]»." - - -/datum/goon_vampire_passive/regen - gain_desc = "Ваша способность «Восстановление» улучшена. Теперь она будет постепенно исцелять вас после использования." - - -/datum/goon_vampire_passive/vision - gain_desc = "Ваше вампирское зрение улучшено." - - -/datum/goon_vampire_passive/full - gain_desc = "Вы достигли полной силы и ничто святое больше не может ослабить вас. Ваше зрение значительно улучшилось." - From ddf763ae69a307f8b3aae8180197297728051933 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Thu, 21 Nov 2024 10:49:58 +1000 Subject: [PATCH 08/22] Update goon_vampire_powers.dm --- .../antagonists/vampire/vampire_powers/goon_vampire_powers.dm | 3 +++ 1 file changed, 3 insertions(+) diff --git a/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm b/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm index f4fd1721bff..575debedfec 100644 --- a/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm +++ b/code/modules/antagonists/vampire/vampire_powers/goon_vampire_powers.dm @@ -58,6 +58,9 @@ /obj/effect/proc_holder/spell/vampire/goon/self/rejuvenate/cast(list/targets, mob/living/carbon/human/user = usr) + // mech supress escape + if(HAS_TRAIT_FROM(user, TRAIT_IMMOBILIZED, MECH_SUPRESSED_TRAIT)) + user.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) user.SetWeakened(0) user.SetStunned(0) user.SetKnockdown(0) From d0650c41c5172fd27b360f4b64af74d4d23519da Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:14:06 +1000 Subject: [PATCH 09/22] codestyle 1 Co-authored-by: Antoonij <42318445+Antoonij@users.noreply.github.com> --- code/_onclick/hud/alert.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index 6093e2993db..c16f1cb133a 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -567,9 +567,9 @@ so as to remain in compliance with the most up-to-date laws." name = "" desc = "" -//MECH MODULES +// MECH MODULES -//cage module +// cage module /atom/movable/screen/alert/mech_cage name = "You shouldn't see this" desc = "This as well" From 9959cc9eeb717c2e7dbd3e509fd9c4a3cb653d97 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:14:23 +1000 Subject: [PATCH 10/22] codestyle 2 Co-authored-by: Antoonij <42318445+Antoonij@users.noreply.github.com> --- code/game/mecha/equipment/tools/other_tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 1069e70b922..4b2f1824b52 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -592,7 +592,7 @@ W.fast_pressure_step_in = initial(W.fast_pressure_step_in) -//SCS-3 CAGE +// SCS-3 CAGE /obj/item/mecha_parts/mecha_equipment/cage name = "SCS 3 Cage" From 4afa73ace046028cc86f503484a49a319f3e567f Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:34:39 +1000 Subject: [PATCH 11/22] cleaning up code --- .../game/mecha/equipment/tools/other_tools.dm | 134 ++++++++++-------- 1 file changed, 74 insertions(+), 60 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 1069e70b922..f866889bc4f 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -609,8 +609,10 @@ var/mob/living/carbon/prisoner var/mob/living/carbon/holding var/turf/holding_turf - var/datum/action/innate/mecha/select_module/button // for custom icons - var/current_alert //wacky case + /// for custom icons + var/datum/action/innate/mecha/select_module/button + /// wacky case + var/current_alert var/obj/effect/supress/supress_effect /obj/item/mecha_parts/mecha_equipment/cage/can_attach(obj/mecha/M) @@ -631,6 +633,10 @@ AM.forceMove(get_turf(src)) if(holding) stop_supressing(holding) + + prisoner = null + holding = null + holding_turf = null return ..() /obj/item/mecha_parts/mecha_equipment/cage/select_set_alert() @@ -656,24 +662,28 @@ var/supress_check = target.IsStamcrited() || (target.health <= HEALTH_THRESHOLD_CRIT) || target.stat != CONSCIOUS //SUPRESSING - if(holding && !same_target) - if(supress_check) - occupant_message(span_notice("You stop supressing [holding], and start supressing [target]...")) - chassis.visible_message(span_warning("[chassis] stops supressing [holding] and switches to [target].")) - stop_supressing(holding, FALSE) - set_supress_effect(target) - if(!do_after_cooldown(target)) - qdel(supress_effect) - supress_effect = null - return FALSE - if(!prisoner) - change_alert("one") - supress(target) - return TRUE - if(!holding && supress_check) - occupant_message(span_notice("You start supressing [target]...")) - chassis.visible_message(span_warning("[chassis] starts supressing [target].")) - supress_effect = new(target.loc) + if(((holding && !same_target) || !holding) && supress_check) + supress_action(target) + return TRUE + + //HANDCUFFING + if(same_target && !target.handcuffed) + handcuff_action(target) + return TRUE + + //PUTTING INTO MECH + if(same_target && target.handcuffed) + insert_action(target) + return TRUE + + occupant_message(span_notice("[target] can't be suppressed, since [target] is not in critical condition")) + return FALSE + +/obj/item/mecha_parts/mecha_equipment/cage/proc/supress_action(mob/living/carbon/target) + if(!holding) + occupant_message(span_notice("You stop supressing [holding], and start supressing [target]...")) + chassis.visible_message(span_warning("[chassis] stops supressing [holding] and switches to [target].")) + stop_supressing(holding, FALSE) set_supress_effect(target) if(!do_after_cooldown(target)) qdel(supress_effect) @@ -682,52 +692,56 @@ if(!prisoner) change_alert("one") supress(target) - return TRUE - - //HANDCUFFING - if(same_target && !target.handcuffed) - occupant_message(span_notice("You start cuffing [target]...")) - chassis.visible_message(span_warning("[chassis] starts cuffing [target].")) + else + occupant_message(span_notice("You start supressing [target]...")) + chassis.visible_message(span_warning("[chassis] starts supressing [target].")) + supress_effect = new(target.loc) + set_supress_effect(target) if(!do_after_cooldown(target)) + qdel(supress_effect) + supress_effect = null return FALSE if(!prisoner) - change_alert("two") - target.apply_restraints(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, TRUE) - occupant_message(span_notice("You successfully cuff [target]...")) - chassis.visible_message(span_warning("[chassis] successfully cuffed [target].")) - add_attack_logs(chassis.occupant, target, "shackled") - return TRUE - - //PUTTING INTO MECH - if(same_target && target.handcuffed) - if(!prisoner_insertion_check(target)) - return FALSE - //since we are only using change_state here and in processing, might as well do it here - if(!button) - for(var/datum/action/innate/mecha/select_module/H in chassis.occupant.actions) - if(H.button_icon_state == "mecha_cage") - button = H - break + change_alert("one") + supress(target) - change_state("mecha_cage_activate") - occupant_message(span_notice("Yoeu start putting [target] into the containment chamber...")) - chassis.visible_message(span_warning("[chassis] is putting [target] into the containment chamber.")) - if(!do_after_cooldown(target)) - change_state("mecha_cage") +/obj/item/mecha_parts/mecha_equipment/cage/proc/handcuff_action(mob/living/carbon/target) + occupant_message(span_notice("You start cuffing [target]...")) + chassis.visible_message(span_warning("[chassis] starts cuffing [target].")) + if(!do_after_cooldown(target)) + return FALSE + if(!prisoner) + change_alert("two") + target.apply_restraints(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, TRUE) + occupant_message(span_notice("You successfully cuff [target]...")) + chassis.visible_message(span_warning("[chassis] successfully cuffed [target].")) + add_attack_logs(chassis.occupant, target, "shackled") + +/obj/item/mecha_parts/mecha_equipment/cage/proc/insert_action(mob/living/carbon/target) + if(!prisoner_insertion_check(target)) return FALSE - change_state("mecha_cage_activated") - change_alert("three") - target.forceMove(src) - prisoner = target - stop_supressing(target) - update_equip_info() - occupant_message(span_notice("[target] successfully loaded into [src].")) - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) - log_message("[target] loaded.") - return TRUE + //since we are only using change_state here and in processing, might as well do it here + if(!button) + for(var/datum/action/innate/mecha/select_module/H in chassis.occupant.actions) + if(H.button_icon_state == "mecha_cage") + button = H + break - occupant_message(span_notice("[target] can't be suppressed, since [target] is not in critical condition")) - return FALSE + change_state("mecha_cage_activate") + occupant_message(span_notice("Yoeu start putting [target] into the containment chamber...")) + chassis.visible_message(span_warning("[chassis] is putting [target] into the containment chamber.")) + if(!do_after_cooldown(target)) + change_state("mecha_cage") + return FALSE + change_state("mecha_cage_activated") + change_alert("three") + target.forceMove(src) + prisoner = target + stop_supressing(target) + update_equip_info() + occupant_message(span_notice("[target] successfully loaded into [src].")) + chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + log_message("[target] loaded.") /obj/item/mecha_parts/mecha_equipment/cage/proc/supress(mob/living/carbon/target) holding = target From 25b5ced689b9e85a8171aa69fe3a21da72c84df8 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 26 Nov 2024 20:39:02 +1000 Subject: [PATCH 12/22] oops --- code/game/mecha/equipment/tools/other_tools.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index d093cb1c0b5..db407ee1630 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -719,7 +719,7 @@ /obj/item/mecha_parts/mecha_equipment/cage/proc/insert_action(mob/living/carbon/target) if(!prisoner_insertion_check(target)) - return FALSE + return FALSE //since we are only using change_state here and in processing, might as well do it here if(!button) for(var/datum/action/innate/mecha/select_module/H in chassis.occupant.actions) From 68cf4bc9b8f45519ac2779fe1fa2a601c57be2e0 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Fri, 13 Dec 2024 12:55:18 +1000 Subject: [PATCH 13/22] alert defines, change_alert proc remake --- code/__DEFINES/alerts.dm | 7 +++ code/_onclick/hud/alert.dm | 7 ++- .../game/mecha/equipment/tools/other_tools.dm | 57 +++++++++---------- paradise.dme | 8 +-- 4 files changed, 44 insertions(+), 35 deletions(-) diff --git a/code/__DEFINES/alerts.dm b/code/__DEFINES/alerts.dm index ff1b29e883e..af8eb6f8353 100644 --- a/code/__DEFINES/alerts.dm +++ b/code/__DEFINES/alerts.dm @@ -30,3 +30,10 @@ /** Silicon related */ #define ALERT_LOCKED "locked" +/** Mech related */ +// SCS-3 Cage +#define CAGE_STAGE_ZERO "stage_zero" +#define CAGE_STAGE_ONE "stage_one" +#define CAGE_STAGE_TWO "stage_two" +#define CAGE_STAGE_THREE "stage_three" + diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index c16f1cb133a..e83118b2832 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -574,26 +574,31 @@ so as to remain in compliance with the most up-to-date laws." name = "You shouldn't see this" desc = "This as well" icon = 'icons/obj/mecha/mecha_cage.dmi' + var/stage_define /atom/movable/screen/alert/mech_cage/zero name = "Stage Zero" desc = "You are currently not doing anything." icon_state = "stage_0" + stage_define = CAGE_STAGE_ZERO /atom/movable/screen/alert/mech_cage/one name = "Stage One" desc = "You are currently supressing someone." icon_state = "stage_1" + stage_define = CAGE_STAGE_ONE /atom/movable/screen/alert/mech_cage/two name = "Stage Two" desc = "You are currently supressing someone handcuffed." icon_state = "stage_2" + stage_define = CAGE_STAGE_TWO /atom/movable/screen/alert/mech_cage/three name = "Stage Three" - desc = "You are currently having someone inside the containment chamber." + desc = "You currently have someone inside the containment chamber." icon_state = "stage_3" + stage_define = CAGE_STAGE_THREE //GUARDIANS /atom/movable/screen/alert/cancharge diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index db407ee1630..f5a42ea9ad4 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -609,10 +609,10 @@ var/mob/living/carbon/prisoner var/mob/living/carbon/holding var/turf/holding_turf - /// for custom icons + ///for custom icons var/datum/action/innate/mecha/select_module/button - /// wacky case - var/current_alert + ///wacky case + var/current_stage var/obj/effect/supress/supress_effect /obj/item/mecha_parts/mecha_equipment/cage/can_attach(obj/mecha/M) @@ -643,14 +643,14 @@ . = ..() if(!.) if(prisoner) - change_alert("three") + change_alert(CAGE_STAGE_THREE) else if(holding) if(!holding.handcuffed) - change_alert("one") + change_alert(CAGE_STAGE_ONE) else - change_alert("two") + change_alert(CAGE_STAGE_TWO) else - change_alert("zero") + change_alert(CAGE_STAGE_ZERO) /obj/item/mecha_parts/mecha_equipment/cage/action(mob/living/carbon/target) if(!action_checks(target)) @@ -690,7 +690,7 @@ supress_effect = null return FALSE if(!prisoner) - change_alert("one") + change_alert(CAGE_STAGE_ONE) supress(target) else occupant_message(span_notice("You start supressing [target]...")) @@ -702,7 +702,7 @@ supress_effect = null return FALSE if(!prisoner) - change_alert("one") + change_alert(CAGE_STAGE_ONE) supress(target) /obj/item/mecha_parts/mecha_equipment/cage/proc/handcuff_action(mob/living/carbon/target) @@ -711,7 +711,7 @@ if(!do_after_cooldown(target)) return FALSE if(!prisoner) - change_alert("two") + change_alert(CAGE_STAGE_TWO) target.apply_restraints(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, TRUE) occupant_message(span_notice("You successfully cuff [target]...")) chassis.visible_message(span_warning("[chassis] successfully cuffed [target].")) @@ -734,10 +734,10 @@ change_state("mecha_cage") return FALSE change_state("mecha_cage_activated") - change_alert("three") + change_alert(CAGE_STAGE_THREE) + stop_supressing(target) target.forceMove(src) prisoner = target - stop_supressing(target) update_equip_info() occupant_message(span_notice("[target] successfully loaded into [src].")) chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) @@ -759,30 +759,27 @@ supress_effect = null if(!prisoner) - change_alert("zero") + change_alert(CAGE_STAGE_ZERO) /obj/item/mecha_parts/mecha_equipment/cage/proc/change_state(icon) button.button_icon_state = icon button.UpdateButtonIcon() -/obj/item/mecha_parts/mecha_equipment/cage/proc/change_alert(var/stage_number) //zero, one, two, three in string +/obj/item/mecha_parts/mecha_equipment/cage/proc/change_alert(var/stage_define) var/mob/living/carbon/H = chassis.occupant - switch(stage_number) - if("zero") - H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/zero) - if("one") - H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/one) - if("two") - H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/two) - if("three") - H.throw_alert(alert_category, /atom/movable/screen/alert/mech_cage/three) - - current_alert = stage_number + for(var/I in subtypesof(/atom/movable/screen/alert/mech_cage)) + var/atom/movable/screen/alert/mech_cage/alert = I + if(alert.stage_define == stage_define) + H.throw_alert(alert_category, alert) + break + + current_stage = stage_define /obj/item/mecha_parts/mecha_equipment/cage/proc/set_supress_effect(mob/living/carbon/target) supress_effect = new(target.loc) flick("applying", supress_effect) + /obj/item/mecha_parts/mecha_equipment/cage/proc/prisoner_insertion_check(mob/living/carbon/target) if(target.buckled) occupant_message(span_warning("[target] will not fit into the cage because [target.p_they()] [target.p_are()] buckled to [target.buckled]!")) @@ -855,19 +852,19 @@ if(prisoner) if(!istype(prisoner.loc, src)) prisoner = null - else if(current_alert == "three") + else if(current_stage == CAGE_STAGE_THREE) if(holding.handcuffed) - change_alert("two") + change_alert(CAGE_STAGE_TWO) else - change_alert("one") + change_alert(CAGE_STAGE_ONE) else if(button) if(button.button_icon_state == "mecha_cage_activated") change_state("mecha_cage") else if(chassis.occupant) - if(current_alert != "zero" && chassis.selected == src) - change_alert("zero") + if(current_stage != CAGE_STAGE_ZERO && chassis.selected == src) + change_alert(CAGE_STAGE_ZERO) if(button) if(button.button_icon_state == "mecha_cage_activated") change_state("mecha_cage") diff --git a/paradise.dme b/paradise.dme index 30b22704ec1..d07486cf3fa 100644 --- a/paradise.dme +++ b/paradise.dme @@ -39,7 +39,6 @@ #include "code\__DEFINES\blob.dm" #include "code\__DEFINES\borer.dm" #include "code\__DEFINES\bots.dm" -#include "code\__DEFINES\rituals.dm" #include "code\__DEFINES\byond_tracy.dm" #include "code\__DEFINES\callbacks.dm" #include "code\__DEFINES\cargo_quests.dm" @@ -115,6 +114,7 @@ #include "code\__DEFINES\RCD.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\request.dm" +#include "code\__DEFINES\rituals.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rolebans.dm" #include "code\__DEFINES\rust_g.dm" @@ -368,7 +368,6 @@ #include "code\controllers\subsystem\tickets\mentor_tickets.dm" #include "code\controllers\subsystem\tickets\tickets.dm" #include "code\datums\action.dm" -#include "code\datums\rituals.dm" #include "code\datums\ai_law_sets.dm" #include "code\datums\ai_laws.dm" #include "code\datums\armor.dm" @@ -404,6 +403,7 @@ #include "code\datums\radio.dm" #include "code\datums\recipe.dm" #include "code\datums\revision.dm" +#include "code\datums\rituals.dm" #include "code\datums\ruins.dm" #include "code\datums\shuttles.dm" #include "code\datums\snake_fashion.dm" @@ -446,7 +446,6 @@ #include "code\datums\components\conveyor_movement.dm" #include "code\datums\components\cross_shock.dm" #include "code\datums\components\decal.dm" -#include "code\datums\components\ritual_object.dm" #include "code\datums\components\defibrillator.dm" #include "code\datums\components\drift.dm" #include "code\datums\components\ducttape.dm" @@ -465,6 +464,7 @@ #include "code\datums\components\persistent_overlay.dm" #include "code\datums\components\proximity_monitor.dm" #include "code\datums\components\radioactivity.dm" +#include "code\datums\components\ritual_object.dm" #include "code\datums\components\shielded.dm" #include "code\datums\components\slippery.dm" #include "code\datums\components\spawner.dm" @@ -3140,7 +3140,6 @@ #include "code\modules\tgui\plugins\modal.dm" #include "code\modules\tgui\states\admin.dm" #include "code\modules\tgui\states\always.dm" -#include "code\modules\tgui\states\range.dm" #include "code\modules\tgui\states\conscious.dm" #include "code\modules\tgui\states\contained.dm" #include "code\modules\tgui\states\deep_inventory.dm" @@ -3152,6 +3151,7 @@ #include "code\modules\tgui\states\notcontained.dm" #include "code\modules\tgui\states\observer.dm" #include "code\modules\tgui\states\physical.dm" +#include "code\modules\tgui\states\range.dm" #include "code\modules\tgui\states\self.dm" #include "code\modules\tgui\states\strippable_state.dm" #include "code\modules\tgui\states\zlevel.dm" From 1b666c081b01665781d3cc9f4a86a275a3b9a989 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Sat, 28 Dec 2024 22:51:22 +1000 Subject: [PATCH 14/22] tweaks removes processing, fixes some bugs, adds some sprites that got deleted when this pr got copied by another person --- .../game/mecha/equipment/tools/other_tools.dm | 94 ++++++++---------- code/game/mecha/mecha.dm | 19 ++-- icons/misc/supress_effect.dmi | Bin 774 -> 737 bytes icons/obj/mecha/mecha_equipment.dmi | Bin 39599 -> 39894 bytes 4 files changed, 54 insertions(+), 59 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index f5a42ea9ad4..9407e8eb748 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -608,7 +608,6 @@ var/mob/living/carbon/prisoner var/mob/living/carbon/holding - var/turf/holding_turf ///for custom icons var/datum/action/innate/mecha/select_module/button ///wacky case @@ -625,18 +624,14 @@ return TRUE return FALSE -/obj/item/mecha_parts/mecha_equipment/cage/attach_act(obj/mecha/M) - START_PROCESSING(SSobj, src) - /obj/item/mecha_parts/mecha_equipment/cage/Destroy() for(var/atom/movable/AM in src) AM.forceMove(get_turf(src)) if(holding) stop_supressing(holding) - + prisoner = null holding = null - holding_turf = null return ..() /obj/item/mecha_parts/mecha_equipment/cage/select_set_alert() @@ -680,10 +675,10 @@ return FALSE /obj/item/mecha_parts/mecha_equipment/cage/proc/supress_action(mob/living/carbon/target) - if(!holding) + if(holding) occupant_message(span_notice("You stop supressing [holding], and start supressing [target]...")) chassis.visible_message(span_warning("[chassis] stops supressing [holding] and switches to [target].")) - stop_supressing(holding, FALSE) + stop_supressing(holding) set_supress_effect(target) if(!do_after_cooldown(target)) qdel(supress_effect) @@ -720,7 +715,6 @@ /obj/item/mecha_parts/mecha_equipment/cage/proc/insert_action(mob/living/carbon/target) if(!prisoner_insertion_check(target)) return FALSE - //since we are only using change_state here and in processing, might as well do it here if(!button) for(var/datum/action/innate/mecha/select_module/H in chassis.occupant.actions) if(H.button_icon_state == "mecha_cage") @@ -728,31 +722,33 @@ break change_state("mecha_cage_activate") - occupant_message(span_notice("Yoeu start putting [target] into the containment chamber...")) + occupant_message(span_notice("You start putting [target] into the containment chamber...")) chassis.visible_message(span_warning("[chassis] is putting [target] into the containment chamber.")) if(!do_after_cooldown(target)) change_state("mecha_cage") return FALSE change_state("mecha_cage_activated") change_alert(CAGE_STAGE_THREE) - stop_supressing(target) - target.forceMove(src) prisoner = target + target.forceMove(src) + stop_supressing(target) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_escape)) update_equip_info() occupant_message(span_notice("[target] successfully loaded into [src].")) chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) log_message("[target] loaded.") /obj/item/mecha_parts/mecha_equipment/cage/proc/supress(mob/living/carbon/target) + RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_moved)) holding = target - holding_turf = get_turf(holding) target.add_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) target.move_resist = MOVE_FORCE_STRONG supress_effect.icon_state = "applied" -/obj/item/mecha_parts/mecha_equipment/cage/proc/stop_supressing(mob/living/carbon/target, var/alert = TRUE) +/obj/item/mecha_parts/mecha_equipment/cage/proc/stop_supressing(mob/living/carbon/target) + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) holding = null - holding_turf = null target.remove_traits(list(TRAIT_IMMOBILIZED, TRAIT_FLOORED), MECH_SUPRESSED_TRAIT) target.move_resist = MOVE_FORCE_DEFAULT qdel(supress_effect) @@ -761,8 +757,29 @@ if(!prisoner) change_alert(CAGE_STAGE_ZERO) +/obj/item/mecha_parts/mecha_equipment/cage/proc/on_moved(mob/living/carbon/target) + SIGNAL_HANDLER + stop_supressing(target) + +/obj/item/mecha_parts/mecha_equipment/cage/proc/on_escape(mob/living/carbon/target) + SIGNAL_HANDLER + occupant_message("[prisoner] escaped.") + log_message("[prisoner] escaped.") + prisoner = null + if(holding) + if(holding.handcuffed) + change_alert(CAGE_STAGE_TWO) + else + change_alert(CAGE_STAGE_ONE) + else + change_alert(CAGE_STAGE_ZERO) + change_state("mecha_cage") + update_equip_info() + UnregisterSignal(target, COMSIG_MOVABLE_MOVED) + /obj/item/mecha_parts/mecha_equipment/cage/proc/change_state(icon) button.button_icon_state = icon + flick(icon, button) button.UpdateButtonIcon() /obj/item/mecha_parts/mecha_equipment/cage/proc/change_alert(var/stage_define) @@ -772,13 +789,13 @@ if(alert.stage_define == stage_define) H.throw_alert(alert_category, alert) break - + current_stage = stage_define /obj/item/mecha_parts/mecha_equipment/cage/proc/set_supress_effect(mob/living/carbon/target) supress_effect = new(target.loc) - flick("applying", supress_effect) + flick("effect_on_doll", supress_effect) /obj/item/mecha_parts/mecha_equipment/cage/proc/prisoner_insertion_check(mob/living/carbon/target) if(target.buckled) @@ -797,6 +814,14 @@ return FALSE if(!prisoner) return FALSE + if(holding) + if(holding.handcuffed) + change_alert(CAGE_STAGE_TWO) + else + change_alert(CAGE_STAGE_ONE) + else + change_alert(CAGE_STAGE_ZERO) + UnregisterSignal(prisoner, COMSIG_MOVABLE_MOVED) prisoner.forceMove(get_turf(src)) if(!force) occupant_message("[prisoner] ejected.") @@ -805,6 +830,7 @@ occupant_message("[prisoner] escaped.") log_message("[prisoner] escaped.") prisoner = null + change_state("mecha_cage") update_equip_info() /obj/item/mecha_parts/mecha_equipment/cage/can_detach() @@ -814,7 +840,6 @@ return TRUE /obj/item/mecha_parts/mecha_equipment/cage/detach_act() - STOP_PROCESSING(SSobj, src) button = null /obj/item/mecha_parts/mecha_equipment/cage/get_module_equip_info() @@ -839,42 +864,11 @@ if(do_after(prisoner, 30 SECONDS, prisoner)) eject(TRUE) -/obj/item/mecha_parts/mecha_equipment/cage/process() - if(holding || prisoner) - if(holding) - var/turf/actual_turf = get_turf(holding) - if(actual_turf != holding_turf) - stop_supressing(holding) - actual_turf = null - if(chassis.occupant == null) - stop_supressing(holding) - - if(prisoner) - if(!istype(prisoner.loc, src)) - prisoner = null - else if(current_stage == CAGE_STAGE_THREE) - if(holding.handcuffed) - change_alert(CAGE_STAGE_TWO) - else - change_alert(CAGE_STAGE_ONE) - else if(button) - if(button.button_icon_state == "mecha_cage_activated") - change_state("mecha_cage") - - else - if(chassis.occupant) - if(current_stage != CAGE_STAGE_ZERO && chassis.selected == src) - change_alert(CAGE_STAGE_ZERO) - if(button) - if(button.button_icon_state == "mecha_cage_activated") - change_state("mecha_cage") - - /obj/effect/supress name = "Mech claws" desc = "Looks like someone is getting taken hostage..." icon = 'icons/misc/supress_effect.dmi' - icon_state = "applied" + icon_state = "effect_on_doll" anchored = TRUE mouse_opacity = MOUSE_OPACITY_TRANSPARENT plane = ABOVE_GAME_PLANE diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 247d8b74e56..50517696223 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -21,7 +21,7 @@ var/can_move = 0 // time of next allowed movement var/mech_enter_time = 4 SECONDS // Entering mecha time var/mob/living/carbon/occupant = null - var/mob/living/carbon/last_occupant = null + var/step_in = 10 //make a step in step_in/10 sec. var/dir_in = 2//What direction will the mech face when entered/powered on? Defaults to South. var/normal_step_energy_drain = 10 @@ -1152,7 +1152,6 @@ AI.aiRestorePowerRoutine = 0 AI.forceMove(src) occupant = AI - last_occupant = occupant update_icon(UPDATE_ICON_STATE) playsound(src, 'sound/machines/windowdoor.ogg', 50, 1) if(!hasInternalDamage()) @@ -1314,7 +1313,6 @@ /obj/mecha/proc/moved_inside(mob/living/carbon/human/H) if(H && H.client && (H in range(1))) occupant = H - last_occupant = occupant H.forceMove(src) add_fingerprint(H) GrantActions(H, human_occupant = 1) @@ -1378,7 +1376,6 @@ var/mob/living/carbon/brain/brainmob = mmi_as_oc.brainmob brainmob.reset_perspective(src) occupant = brainmob - last_occupant = occupant brainmob.forceMove(src) //should allow relaymove if(istype(mmi_as_oc, /obj/item/mmi/robotic_brain)) var/obj/item/mmi/robotic_brain/R = mmi_as_oc @@ -1420,11 +1417,20 @@ if(!occupant) return var/atom/movable/mob_container + if(selected) + occupant.clear_alert(selected.alert_category) occupant.clear_alert("charge") occupant.clear_alert("locked") occupant.clear_alert("mech damage") occupant.clear_alert("mechaport") occupant.clear_alert("mechaport_d") + + if(locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment) + var/obj/item/mecha_parts/mecha_equipment/cage/H = locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment + if(H.holding) + occupant_message(span_notice("You stop supressing [H.holding].")) + H.stop_supressing(H.holding) + if(occupant && occupant.client) occupant.client.mouse_pointer_icon = initial(occupant.client.mouse_pointer_icon) if(ishuman(occupant)) @@ -1590,7 +1596,6 @@ regulate_temp() give_air() update_huds() - check_alert() /obj/mecha/proc/process_internal_damage() if(!internal_damage) @@ -1670,10 +1675,6 @@ diag_hud_set_mechstat() diag_hud_set_mechtracking() -/obj/mecha/proc/check_alert() - if(!occupant && last_occupant && selected) - last_occupant.clear_alert(selected.alert_category) - /obj/mecha/speech_bubble(bubble_state = "", bubble_loc = src, list/bubble_recipients = list()) var/image/I = image('icons/mob/talk.dmi', bubble_loc, bubble_state, FLY_LAYER) SET_PLANE_EXPLICIT(I, ABOVE_GAME_PLANE, src) diff --git a/icons/misc/supress_effect.dmi b/icons/misc/supress_effect.dmi index 3e0b12b7a997ac909fa967728608bb1ba52eab34..e86a1be90b825437f00caea00301fe0241031a93 100644 GIT binary patch delta 713 zcmV;)0yh1I2H^#eB!827R9JLGWpiV4X>fFDZ*Bkpc$`yKaB_9`^iy#0_2eo`Eh^5; z&r`5fFwryM;w;ZhDainGjE%TBGg33tGfE(w;*!LYR3K9+H7zYQxg8v{jCa}q0oObZ<#jUZ75W0SS^~Kucu)n$Z<8aw@$Ll5~G={3{RuF(UbH5iiaj3n1B7PBYY#|qFO~Sn)dT({_*6b}JO?<%ql`O&#IArGJ-`}(^ifvggKcBA8JGT~=>jzn z-7PSbn1820)i#Ab00000000000001>#rg*c)62w=tufnp7sI`Ey}y$yy?)?$ySTE^ zpuS#qZA_@Ivuzt0PW{hh`Ws8tU}v>G_&Z&q>NVBIG~R0hbb;%Vvh5z>%0E{mm?=V{aQ$+wE00000NkvXXu0mjfdDln1 delta 750 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

CcsZiv3>1Dgu9~ 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 Date: Sun, 29 Dec 2024 00:21:34 +1000 Subject: [PATCH 15/22] Update paradise.dme --- paradise.dme | 1 + 1 file changed, 1 insertion(+) diff --git a/paradise.dme b/paradise.dme index d07486cf3fa..5f41ee202ec 100644 --- a/paradise.dme +++ b/paradise.dme @@ -114,6 +114,7 @@ #include "code\__DEFINES\RCD.dm" #include "code\__DEFINES\reagents.dm" #include "code\__DEFINES\request.dm" +#include "code\__DEFINES\request_consoles.dm" #include "code\__DEFINES\rituals.dm" #include "code\__DEFINES\role_preferences.dm" #include "code\__DEFINES\rolebans.dm" From 5eacccccde1eb1d2b22ffba0a6459652d5df9877 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:18:25 +1000 Subject: [PATCH 16/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=201?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/_onclick/hud/alert.dm | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/code/_onclick/hud/alert.dm b/code/_onclick/hud/alert.dm index e83118b2832..3a8e66de69b 100644 --- a/code/_onclick/hud/alert.dm +++ b/code/_onclick/hud/alert.dm @@ -571,32 +571,32 @@ so as to remain in compliance with the most up-to-date laws." // cage module /atom/movable/screen/alert/mech_cage - name = "You shouldn't see this" - desc = "This as well" + name = "Ты не должен это видеть" + desc = "Ну и это тоже" icon = 'icons/obj/mecha/mecha_cage.dmi' var/stage_define /atom/movable/screen/alert/mech_cage/zero - name = "Stage Zero" - desc = "You are currently not doing anything." + name = "Нулевой этап" + desc = "Модуль не работает." icon_state = "stage_0" stage_define = CAGE_STAGE_ZERO /atom/movable/screen/alert/mech_cage/one - name = "Stage One" - desc = "You are currently supressing someone." + name = "Первый этап" + desc = "Модуль работает в режиме удержания." icon_state = "stage_1" stage_define = CAGE_STAGE_ONE /atom/movable/screen/alert/mech_cage/two - name = "Stage Two" - desc = "You are currently supressing someone handcuffed." + name = "Второй этап" + desc = "Модуль работает в режиме удержания цели в наручниках." icon_state = "stage_2" stage_define = CAGE_STAGE_TWO /atom/movable/screen/alert/mech_cage/three - name = "Stage Three" - desc = "You currently have someone inside the containment chamber." + name = "Третий этап" + desc = "Модуль работает в режиме заключения." icon_state = "stage_3" stage_define = CAGE_STAGE_THREE From 0a726e3b80caf50df65db8cc37b7b844f9f8aa86 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:40:12 +1000 Subject: [PATCH 17/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=202?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../game/mecha/equipment/tools/other_tools.dm | 56 +++++++++---------- 1 file changed, 28 insertions(+), 28 deletions(-) diff --git a/code/game/mecha/equipment/tools/other_tools.dm b/code/game/mecha/equipment/tools/other_tools.dm index 9407e8eb748..d201b4adb2e 100644 --- a/code/game/mecha/equipment/tools/other_tools.dm +++ b/code/game/mecha/equipment/tools/other_tools.dm @@ -595,8 +595,8 @@ // SCS-3 CAGE /obj/item/mecha_parts/mecha_equipment/cage - name = "SCS 3 Cage" - desc = "An exosuit module for containing lawbreakers, or hostages." + name = "Клетка SCS-3" + desc = "Модуль для экзокостюмов, используемый в задержании преступников." icon_state = "mecha_cage" origin_tech = "combat=6;materials=5" equip_cooldown = 3 SECONDS @@ -671,13 +671,13 @@ insert_action(target) return TRUE - occupant_message(span_notice("[target] can't be suppressed, since [target] is not in critical condition")) + occupant_message(span_notice("[target] не может быть удержа[genderize_ru(target.gender, "н", "на", "но", "ны")], так как [target] не находится в критическом состоянии")) return FALSE /obj/item/mecha_parts/mecha_equipment/cage/proc/supress_action(mob/living/carbon/target) if(holding) - occupant_message(span_notice("You stop supressing [holding], and start supressing [target]...")) - chassis.visible_message(span_warning("[chassis] stops supressing [holding] and switches to [target].")) + occupant_message(span_notice("Ты перестаёшь удерживать [holding], и начинаешь удерживать [target]...")) + chassis.visible_message(span_warning("[chassis] перестаёт удерживать [holding] и сменяется на [target].")) stop_supressing(holding) set_supress_effect(target) if(!do_after_cooldown(target)) @@ -688,8 +688,8 @@ change_alert(CAGE_STAGE_ONE) supress(target) else - occupant_message(span_notice("You start supressing [target]...")) - chassis.visible_message(span_warning("[chassis] starts supressing [target].")) + occupant_message(span_notice("Ты начинаешь удерживать [target]...")) + chassis.visible_message(span_warning("[chassis] начинает удерживать [target].")) supress_effect = new(target.loc) set_supress_effect(target) if(!do_after_cooldown(target)) @@ -701,15 +701,15 @@ supress(target) /obj/item/mecha_parts/mecha_equipment/cage/proc/handcuff_action(mob/living/carbon/target) - occupant_message(span_notice("You start cuffing [target]...")) - chassis.visible_message(span_warning("[chassis] starts cuffing [target].")) + occupant_message(span_notice("Ты начинаешь сковывать [target]...")) + chassis.visible_message(span_warning("[chassis] начинает сковывать [target].")) if(!do_after_cooldown(target)) return FALSE if(!prisoner) change_alert(CAGE_STAGE_TWO) target.apply_restraints(new /obj/item/restraints/handcuffs, ITEM_SLOT_HANDCUFFED, TRUE) - occupant_message(span_notice("You successfully cuff [target]...")) - chassis.visible_message(span_warning("[chassis] successfully cuffed [target].")) + occupant_message(span_notice("Ты успешно сковал [target]...")) + chassis.visible_message(span_warning("[chassis] успешно сковал [target].")) add_attack_logs(chassis.occupant, target, "shackled") /obj/item/mecha_parts/mecha_equipment/cage/proc/insert_action(mob/living/carbon/target) @@ -722,8 +722,8 @@ break change_state("mecha_cage_activate") - occupant_message(span_notice("You start putting [target] into the containment chamber...")) - chassis.visible_message(span_warning("[chassis] is putting [target] into the containment chamber.")) + occupant_message(span_notice("Ты начинаешь помещать [target] внутрь клетки...")) + chassis.visible_message(span_warning("[chassis] начинает помещать [target] внутрь клетки.")) if(!do_after_cooldown(target)) change_state("mecha_cage") return FALSE @@ -735,8 +735,8 @@ UnregisterSignal(target, COMSIG_MOVABLE_MOVED) RegisterSignal(target, COMSIG_MOVABLE_MOVED, PROC_REF(on_escape)) update_equip_info() - occupant_message(span_notice("[target] successfully loaded into [src].")) - chassis.visible_message(span_warning("[chassis] loads [target] into [src].")) + occupant_message(span_notice("[target] успешно загруже[genderize_ru(target.gender, "н", "на", "но", "ны")].")) + chassis.visible_message(span_warning("[chassis] загружает [target] в клетку.")) log_message("[target] loaded.") /obj/item/mecha_parts/mecha_equipment/cage/proc/supress(mob/living/carbon/target) @@ -763,8 +763,8 @@ /obj/item/mecha_parts/mecha_equipment/cage/proc/on_escape(mob/living/carbon/target) SIGNAL_HANDLER - occupant_message("[prisoner] escaped.") - log_message("[prisoner] escaped.") + occupant_message("[prisoner] сбежа[genderize_ru(target.gender, "л", "ла", "ло", "лы")].") + log_message("[prisoner] сбежа[genderize_ru(target.gender, "л", "ла", "ло", "лы")].") prisoner = null if(holding) if(holding.handcuffed) @@ -799,13 +799,13 @@ /obj/item/mecha_parts/mecha_equipment/cage/proc/prisoner_insertion_check(mob/living/carbon/target) if(target.buckled) - occupant_message(span_warning("[target] will not fit into the cage because [target.p_they()] [target.p_are()] buckled to [target.buckled]!")) + occupant_message(span_warning("[target] не помест[pluralize_ru(target.gender, "ится", "ятся")] в клетку, так как [target] прикова[genderize_ru(target.gender, "н", "нна", "нно", "нны")] к [target.buckled]!")) return FALSE if(target.has_buckled_mobs()) - occupant_message(span_warning("[target] will not fit into the cage because of the creatures attached to it!")) + occupant_message(span_warning("[target] не помест[pluralize_ru(target.gender, "ится", "ятся")] в клетку из-за прикованных к [genderize_ru(target.gender, "нему", "ней", "нему", "ним")] животным!")) return FALSE if(prisoner) - occupant_message(span_warning("The cage is already occupied!")) + occupant_message(span_warning("Клетка уже занята!")) return FALSE return TRUE @@ -824,18 +824,18 @@ UnregisterSignal(prisoner, COMSIG_MOVABLE_MOVED) prisoner.forceMove(get_turf(src)) if(!force) - occupant_message("[prisoner] ejected.") - log_message("[prisoner] ejected.") + occupant_message("[prisoner] извлеч[genderize_ru(prisoner.gender, "ён", "ена", "ено", "ены")].") + log_message("[prisoner] извлеч[genderize_ru(prisoner.gender, "ён", "ена", "ено", "ены")].") else - occupant_message("[prisoner] escaped.") - log_message("[prisoner] escaped.") + occupant_message("[prisoner] сбежа[genderize_ru(prisoner.gender, "л", "ла", "ло", "ли")].") + log_message("[prisoner] сбежа[genderize_ru(prisoner.gender, "л", "ла", "ло", "ли")].") prisoner = null change_state("mecha_cage") update_equip_info() /obj/item/mecha_parts/mecha_equipment/cage/can_detach() if(prisoner || holding) - occupant_message(span_warning("Unable to detach [src] - equipment occupied!")) + occupant_message(span_warning("Невозможно отсоединить [src] - модуль работает!")) return FALSE return TRUE @@ -844,7 +844,7 @@ /obj/item/mecha_parts/mecha_equipment/cage/get_module_equip_info() if(prisoner) - return "
\[Occupant: [prisoner] \]
Eject" + return "
\[Задержанн[genderize_ru(prisoner.gender, "ый", "ая", "ое", "ые")]: [prisoner] \]
Eject" /obj/item/mecha_parts/mecha_equipment/cage/Topic(href,href_list) ..() @@ -865,8 +865,8 @@ eject(TRUE) /obj/effect/supress - name = "Mech claws" - desc = "Looks like someone is getting taken hostage..." + name = "Клешни экзокостюма" + desc = "Сейчас кого-то своруют..." icon = 'icons/misc/supress_effect.dmi' icon_state = "effect_on_doll" anchored = TRUE From 309139a2248f0a58e4580f50835b02982d4f4f44 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:41:37 +1000 Subject: [PATCH 18/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=203?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/mecha/equipment/mecha_equipment.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm index 8b87b9b0def..ae4b6796668 100644 --- a/code/game/mecha/equipment/mecha_equipment.dm +++ b/code/game/mecha/equipment/mecha_equipment.dm @@ -246,7 +246,7 @@ if(alert_category == "mecha_module") var/atom/movable/screen/alert/empty_alert/default_alert = occupant.throw_alert(alert_category, /atom/movable/screen/alert/empty_alert, new_master = src) default_alert.name = name - default_alert.desc = "You currently have [src.name] module selected" + default_alert.desc = "Выбран модуль [src.name]" return TRUE return FALSE From d3f5fdc1c1d1851c09e9426bd05de4b93545d07a Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:46:37 +1000 Subject: [PATCH 19/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=204?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/mecha/mecha.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 9c942a3a3eb..9b77cd2ac2a 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -413,7 +413,7 @@ if(locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment) var/obj/item/mecha_parts/mecha_equipment/cage/H = locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment if(H.holding) - occupant_message(span_notice("You stop supressing [H.holding].")) + occupant_message(span_notice("Ты перестаёшь удерживать [H.holding].")) H.stop_supressing(H.holding) //Turns strafe OFF if not enough energy to step (with actuator module only) @@ -1174,7 +1174,7 @@ if(selected) var/atom/movable/screen/alert/empty_alert/default_alert = AI.throw_alert(selected.alert_category, /atom/movable/screen/alert/empty_alert, new_master = selected) default_alert.name = selected.name - default_alert.desc = "You currently have [selected.name] module selected" + default_alert.desc = "Выбран модуль [selected.name]" ///////////////////////////////////// //////// Atmospheric stuff //////// From 1ea8cc88db556bc28378bdcf138f029badd9b1ac Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 15:48:29 +1000 Subject: [PATCH 20/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=205?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/game/mecha/mecha.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/mecha/mecha.dm b/code/game/mecha/mecha.dm index 9b77cd2ac2a..e155496d2db 100644 --- a/code/game/mecha/mecha.dm +++ b/code/game/mecha/mecha.dm @@ -1334,7 +1334,7 @@ if(selected) var/atom/movable/screen/alert/empty_alert/default_alert = H.throw_alert(selected.alert_category, /atom/movable/screen/alert/empty_alert, new_master = selected) default_alert.name = selected.name - default_alert.desc = "You currently have [selected.name] module selected" + default_alert.desc = "Выбран модуль [selected.name]" return TRUE else return FALSE @@ -1431,7 +1431,7 @@ if(locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment) var/obj/item/mecha_parts/mecha_equipment/cage/H = locate(/obj/item/mecha_parts/mecha_equipment/cage) in equipment if(H.holding) - occupant_message(span_notice("You stop supressing [H.holding].")) + occupant_message(span_notice("Ты перестаёшь удерживать [H.holding].")) H.stop_supressing(H.holding) if(occupant && occupant.client) From 0ac922ec67d073840706b5c8daa1666bb7fa1a3b Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:01:20 +1000 Subject: [PATCH 21/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=206?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/antagonists/changeling/powers/biodegrade.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/antagonists/changeling/powers/biodegrade.dm b/code/modules/antagonists/changeling/powers/biodegrade.dm index eee838f4861..15f0519895a 100644 --- a/code/modules/antagonists/changeling/powers/biodegrade.dm +++ b/code/modules/antagonists/changeling/powers/biodegrade.dm @@ -58,8 +58,8 @@ if(istype(user.loc, /obj/item/mecha_parts/mecha_equipment/cage)) var/obj/item/mecha_parts/mecha_equipment/cage/container = user.loc var/obj/mecha/mech = container.chassis - mech.visible_message(span_warning("[mech]'s containment chamber suddenly begins to melt!"), \ - span_warning("We vomit acidic goop onto the interior of the containment chamber!")) + mech.visible_message(span_warning("Камера содержания [mech] начинает плавиться!"), \ + span_warning("Мы изрыгаем кислотную жидкость на стенки клетки!")) user.forceMove(get_turf(container)) container.prisoner = null container.update_equip_info() From 1d539f116b044bbece3cadd568ab5aaa83e96472 Mon Sep 17 00:00:00 2001 From: NuSanya <143856922+NuSanya@users.noreply.github.com> Date: Tue, 31 Dec 2024 16:11:47 +1000 Subject: [PATCH 22/22] =?UTF-8?q?=D0=BF=D0=B5=D1=80=D0=B5=D0=B2=D0=BE?= =?UTF-8?q?=D0=B4=207?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/research/designs/mechfabricator_designs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/research/designs/mechfabricator_designs.dm b/code/modules/research/designs/mechfabricator_designs.dm index aae4215ad1f..7b34d151ed3 100644 --- a/code/modules/research/designs/mechfabricator_designs.dm +++ b/code/modules/research/designs/mechfabricator_designs.dm @@ -1048,8 +1048,8 @@ category = list("Exosuit Equipment") /datum/design/mech_cage - name = "SCS 3 Cage" - desc = "Exosuit-mounted security containing system." + name = "Клетка SCS-3" + desc = "Модуль для экзокостюмов, используемый для задержания и заключения преступников." id = "mech_cage" build_type = MECHFAB req_tech = (list("materials" = 7, "combat" = 7))