From e38b5091a44b6fc8822b7709efc9676c253ac638 Mon Sep 17 00:00:00 2001 From: VoiceInYourHead Date: Thu, 8 Feb 2024 18:15:30 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=A4=D0=B8=D0=BA=D1=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- code/modules/psionics/faculties/psychokinesis.dm | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/psionics/faculties/psychokinesis.dm b/code/modules/psionics/faculties/psychokinesis.dm index fc4dfff5..955db970 100644 --- a/code/modules/psionics/faculties/psychokinesis.dm +++ b/code/modules/psionics/faculties/psychokinesis.dm @@ -148,7 +148,7 @@ target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 1, 2, user) - return TRUE + return TRUE ///MASTER/// @@ -200,7 +200,7 @@ target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 3, 2, user) - return TRUE + return TRUE ///GRANDMASTER/// @@ -252,4 +252,4 @@ target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 6, 2, user) - return TRUE \ No newline at end of file + return TRUE \ No newline at end of file From 1c1fac6c6d1da227f5bca17a668e9105e41b7c81 Mon Sep 17 00:00:00 2001 From: VoiceInYourHead Date: Fri, 9 Feb 2024 18:55:38 +0300 Subject: [PATCH 2/2] alot --- baystation12.dme | 1 + code/_helpers/tools.dm | 6 + code/game/machinery/doors/airlock.dm | 40 +++++++ code/game/machinery/doors/blast_door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/objects/structures/flora.dm | 5 +- code/game/objects/structures/pit.dm | 3 +- code/modules/hydroponics/grown_inedible.dm | 4 +- code/modules/mob/living/carbon/carbon.dm | 1 + .../psionics/equipment/psipower_blade.dm | 15 ++- .../psionics/equipment/psipower_elements.dm | 6 +- .../psionics/equipment/psipower_gun.dm | 103 ++++++++++++++++++ .../psionics/equipment/psipower_tinker.dm | 21 +++- .../psionics/faculties/consciousness.dm | 2 +- .../psionics/faculties/manifestation.dm | 14 ++- .../modules/psionics/faculties/metakinesis.dm | 2 + .../psionics/faculties/psychokinesis.dm | 24 ++-- code/modules/psionics/faculties/redaction.dm | 10 +- code/modules/surgery/encased.dm | 4 +- code/modules/surgery/generic.dm | 4 +- icons/obj/psychic_powers.dmi | Bin 4917 -> 5534 bytes maps/away/for_fd/decor.dm | 2 +- 22 files changed, 237 insertions(+), 34 deletions(-) create mode 100644 code/modules/psionics/equipment/psipower_gun.dm diff --git a/baystation12.dme b/baystation12.dme index d4b81532..7644ba7b 100644 --- a/baystation12.dme +++ b/baystation12.dme @@ -2909,6 +2909,7 @@ #include "code\modules\psionics\equipment\psipower_blade.dm" #include "code\modules\psionics\equipment\psipower_bow.dm" #include "code\modules\psionics\equipment\psipower_elements.dm" +#include "code\modules\psionics\equipment\psipower_gun.dm" #include "code\modules\psionics\equipment\psipower_surgery.dm" #include "code\modules\psionics\equipment\psipower_tinker.dm" #include "code\modules\psionics\equipment\psipower_tk.dm" diff --git a/code/_helpers/tools.dm b/code/_helpers/tools.dm index f3dc66ec..d1efd474 100644 --- a/code/_helpers/tools.dm +++ b/code/_helpers/tools.dm @@ -55,5 +55,11 @@ /obj/item/material/hatchet/ishatchet() return TRUE +/obj/item/psychic_power/psiblade/ishatchet() + return TRUE + +/obj/item/psychic_power/psiaxe/ishatchet() + return TRUE + /obj/item/psychic_power/psifire/iswelder() return TRUE diff --git a/code/game/machinery/doors/airlock.dm b/code/game/machinery/doors/airlock.dm index 1ae1e608..32b80ce2 100644 --- a/code/game/machinery/doors/airlock.dm +++ b/code/game/machinery/doors/airlock.dm @@ -990,6 +990,22 @@ About the new airlock wires panel: src.lock_cut_state = BOLTS_EXPOSED return 0 +///PSIONICS/// + + else if(istype(item,/obj/item/psychic_power/psiaxe)) + //special case - zero delay, different message + if (src.lock_cut_state == BOLTS_EXPOSED) + return 0 //can't actually cut the bolts, go back to regular smashing + user.visible_message( + "\The [user] smashes the bolt cover open!", + "You smash the bolt cover open!" + ) + playsound(src, 'sound/weapons/smash.ogg', 100, 1) + src.lock_cut_state = BOLTS_EXPOSED + return 0 + +///PSIONICS/// + else // I guess you can't cut bolts with that item. Never mind then. return 0 @@ -1150,6 +1166,30 @@ About the new airlock wires panel: else to_chat(user, "You need to be wielding \the [C] to do that.") +///PSIONICS/// + + else if (istype(C, /obj/item/psychic_power/psiaxe) && !(stat & BROKEN) && user.a_intent == I_HURT) + var/obj/item/psychic_power/psiaxe/F = C + playsound(src, 'sound/weapons/smash.ogg', 100, 1) + health -= F.force * 2 + if(health <= 0) + user.visible_message(SPAN_DANGER("[user] smashes \the [C] into the airlock's control panel! It explodes in a shower of sparks!"), SPAN_DANGER("You smash \the [C] into the airlock's control panel! It explodes in a shower of sparks!")) + health = 0 + set_broken(TRUE) + else + user.visible_message(SPAN_DANGER("[user] smashes \the [C] into the airlock's control panel!")) + + else if(istype(C, /obj/item/psychic_power/psiaxe) && !arePowerSystemsOn()) + if(locked) + to_chat(user, "The airlock's bolts prevent it from being forced.") + else if( !welded && !operating ) + if(density) + spawn(0) open(1) + else + spawn(0) close(1) + +///PSIONICS/// + else if(istype(C, /obj/item/device/paint_sprayer)) return else if((stat & (BROKEN|NOPOWER)) && istype(user, /mob/living/simple_animal) && !locked) diff --git a/code/game/machinery/doors/blast_door.dm b/code/game/machinery/doors/blast_door.dm index 8b262555..2167aa4d 100644 --- a/code/game/machinery/doors/blast_door.dm +++ b/code/game/machinery/doors/blast_door.dm @@ -141,7 +141,7 @@ // This only works on broken doors or doors without power. Also allows repair with Plasteel. /obj/machinery/door/blast/attackby(obj/item/C as obj, mob/user as mob) add_fingerprint(user, 0, C) - if(isCrowbar(C) || (istype(C, /obj/item/material/twohanded/fireaxe) && C:wielded == 1)) + if(isCrowbar(C) || (istype(C, /obj/item/material/twohanded/fireaxe) && C:wielded == 1) || istype(C,/obj/item/psychic_power/psiaxe)) if(((stat & NOPOWER) || (stat & BROKEN)) && !( operating )) to_chat(user, "You begin prying at \the [src]...") if(do_after(user, 2 SECONDS, src)) diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index 5bb221c5..8dcfa828 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -263,7 +263,7 @@ to_chat(user, SPAN_DANGER("\The [src] is welded shut!")) return - if(isCrowbar(C) || istype(C,/obj/item/material/twohanded/fireaxe)) + if(isCrowbar(C) || istype(C,/obj/item/material/twohanded/fireaxe) || istype(C,/obj/item/psychic_power/psiaxe)) if(operating) return diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index d6f8ed72..a31dfa40 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -7,20 +7,21 @@ layer = ABOVE_HUMAN_LAYER /obj/structure/flora/tree/attackby(obj/item/W, mob/user) - if( istype(W,/obj/item/material/hatchet) ) + if( istype(W,/obj/item/material/hatchet) || istype(W,/obj/item/psychic_power/psiaxe) || istype(W,/obj/item/psychic_power/psiblade)) visible_message("\The [user] starts chopping \the [src]") if( do_after(user, 50) ) visible_message("\The [user] cutted \the [src]!") new /obj/item/stack/material/wood/ten(get_turf(src)) qdel(src) + /obj/structure/flora/tree/pine name = "pine tree" icon = 'icons/obj/flora/pinetrees.dmi' icon_state = "pine_1" /obj/structure/flora/tree/pine/attackby(obj/item/W, mob/user) - if( istype(W,/obj/item/material/hatchet) ) + if( istype(W,/obj/item/material/hatchet) || istype(W,/obj/item/psychic_power/psiaxe) || istype(W,/obj/item/psychic_power/psiblade)) visible_message("\The [user] starts chopping \the [src] down...") if(do_after(user, 50) && anchored) visible_message("\The [user] cutted \the [src]!") diff --git a/code/game/objects/structures/pit.dm b/code/game/objects/structures/pit.dm index 108eae01..79388b9b 100644 --- a/code/game/objects/structures/pit.dm +++ b/code/game/objects/structures/pit.dm @@ -158,12 +158,13 @@ message = "Here lies [nam], [born] - [died]." /obj/structure/gravemarker/attackby(obj/item/W, mob/user) - if(istype(W,/obj/item/material/hatchet)) + if(istype(W,/obj/item/material/hatchet) || istype(W,/obj/item/psychic_power/psiaxe) || istype(W,/obj/item/psychic_power/psiblade)) visible_message("\The [user] starts hacking away at \the [src] with \the [W].") if(!do_after(user, 30)) visible_message("\The [user] hacks \the [src] apart.") new /obj/item/stack/material/wood(src) qdel(src) + if(istype(W,/obj/item/pen)) var/msg = sanitize(input(user, "What should it say?", "Grave marker", message) as text|null) if(msg) diff --git a/code/modules/hydroponics/grown_inedible.dm b/code/modules/hydroponics/grown_inedible.dm index b0e8c1d3..0ddf8d21 100644 --- a/code/modules/hydroponics/grown_inedible.dm +++ b/code/modules/hydroponics/grown_inedible.dm @@ -19,7 +19,9 @@ var/list/allow_tool_types = list( /obj/item/material/knife, /obj/item/material/hatchet, - /obj/item/circular_saw + /obj/item/circular_saw, + /obj/item/psychic_power/psiaxe, + /obj/item/psychic_power/psiblade ) var/carve_time = 5 SECONDS var/result_type = null diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 9a3fd1d3..211608f4 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -107,6 +107,7 @@ if(prob(80)) src.visible_message("[src] absorbed all pure energy, sent into them!") src.psi.stamina = min(src.psi.max_stamina, src.psi.stamina + rand(15,20)) + carried_orb.charge += 1 var/datum/effect/effect/system/spark_spread/l = new /datum/effect/effect/system/spark_spread l.set_up(5, 1, loc) diff --git a/code/modules/psionics/equipment/psipower_blade.dm b/code/modules/psionics/equipment/psipower_blade.dm index 677106f9..abda255c 100644 --- a/code/modules/psionics/equipment/psipower_blade.dm +++ b/code/modules/psionics/equipment/psipower_blade.dm @@ -37,7 +37,20 @@ icon_state = "psiblade_long" item_state = "psiblade_long" - +/obj/item/psychic_power/psiaxe/afterattack(atom/A as mob|obj|turf|area, mob/user as mob, proximity) + if(!proximity) return + + if(A) + if(istype(A,/obj/structure/window)) + var/obj/structure/window/W = A + W.shatter() + else if(istype(A,/obj/structure/grille)) + qdel(A) + else if(istype(A,/obj/effect/vine)) + var/obj/effect/vine/P = A + P.die_off() + + ..() /obj/item/psychic_power/psiaxe name = "psychokinetic axe" diff --git a/code/modules/psionics/equipment/psipower_elements.dm b/code/modules/psionics/equipment/psipower_elements.dm index 3e6e34cd..af8e441c 100644 --- a/code/modules/psionics/equipment/psipower_elements.dm +++ b/code/modules/psionics/equipment/psipower_elements.dm @@ -6,6 +6,7 @@ icon_state = "electro" item_state = "electro" attack_cooldown = 5 + var/charge = 0 var/cooldown = 0 var/ranged = FALSE @@ -61,8 +62,10 @@ cooldown += 1 new /obj/effect/temporary(get_turf(user),3, 'icons/effects/effects.dmi', "electricity_constant") return TRUE - target.electrocute_act(rand(el_rank * 2,el_rank * 5), user, 1, user.zone_sel.selecting) + target.electrocute_act(rand(el_rank + charge * 2,el_rank + charge * 5), user, 1, user.zone_sel.selecting) cooldown += 1 + if(charge >= 1) + charge -= 1 new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "electricity_constant") return TRUE @@ -86,6 +89,7 @@ to_chat(user, "Вы с скрипом разбиваете источник света, вытягивая всё электричество, которое в нём было.") lighting.broken(TRUE) user.psi.stamina = min(user.psi.max_stamina, user.psi.stamina + rand(5,10)) + charge += 1 else return diff --git a/code/modules/psionics/equipment/psipower_gun.dm b/code/modules/psionics/equipment/psipower_gun.dm new file mode 100644 index 00000000..b1da225c --- /dev/null +++ b/code/modules/psionics/equipment/psipower_gun.dm @@ -0,0 +1,103 @@ +/obj/item/gun/energy/psigun + name = "psychokinetic gun" + desc = "Result of Demiurgy and Hyloforia combinated factors." + icon = 'icons/obj/psychic_powers.dmi' + icon_state = "gun" + fire_sound = 'sound/weapons/Taser.ogg' + fire_sound_text = "energy blast" + + var/maintain_cost = 10 + var/mob/living/owner + + max_shots = 20 //Determines the capacity of the weapon's power cell. Specifying a cell_type overrides this value. + projectile_type = /obj/item/projectile/psi + + self_recharge = 1 //if set, the weapon will recharge itself + +/obj/item/gun/energy/psigun/New(var/mob/living/_owner) + owner = _owner + if(!istype(owner)) + qdel(src) + return + START_PROCESSING(SSprocessing, src) + ..() + +/obj/item/gun/energy/psigun/Destroy() + if(istype(owner) && owner.psi) + LAZYREMOVE(owner.psi.manifested_items, src) + UNSETEMPTY(owner.psi.manifested_items) + STOP_PROCESSING(SSprocessing, src) + . = ..() + +/obj/item/gun/energy/psigun/get_storage_cost() + return ITEM_SIZE_NO_CONTAINER + +/obj/item/gun/energy/psigun/attack(var/mob/living/M, var/mob/living/user, var/target_zone) + if(M.do_psionics_check(max(force, maintain_cost), user)) + to_chat(user, "\The [src] flickers violently out of phase!") + return 1 + . = ..() + +/obj/item/gun/energy/psigun/afterattack(var/atom/target, var/mob/living/user, var/proximity) + if(target.do_psionics_check(max(force, maintain_cost), user)) + to_chat(user, "\The [src] flickers violently out of phase!") + return + . = ..(target, user, proximity) + +/obj/item/gun/energy/psigun/special_check(var/mob/user) + + if(!istype(user, /mob/living)) + return 0 + if(!user.IsAdvancedToolUser()) + return 0 + + var/mob/living/M = user + if(!safety() && world.time > last_safety_check + 5 MINUTES && !user.skill_check(SKILL_WEAPONS, SKILL_BASIC)) + if(prob(30)) + toggle_safety() + return 1 + if(MUTATION_HULK in M.mutations) + to_chat(M, "Your fingers are much too large for the trigger guard!") + return 0 + if(M.psi) + var/hilo_rank = M.psi.get_rank(PSI_ENERGISTICS) + if(hilo_rank <= PSI_RANK_LATENT) + to_chat(M, ", ! ?") + return 0 + if((MUTATION_CLUMSY in M.mutations) && prob(40)) //Clumsy handling + var/obj/P = consume_next_projectile() + if(P) + if(process_projectile(P, user, user, pick(BP_L_FOOT, BP_R_FOOT))) + handle_post_fire(user, user) + user.visible_message( + "\The [user] shoots \himself in the foot with \the [src]!", + "You shoot yourself in the foot with \the [src]!" + ) + M.unequip_item() + else + handle_click_empty(user) + return 0 + return 1 + +/obj/item/gun/energy/psigun/dropped() + ..() + qdel(src) + +/obj/item/gun/energy/psigun/Process() + if(istype(owner)) + owner.psi.spend_power(maintain_cost) + if(!owner || owner.do_psionics_check(maintain_cost, owner) || loc != owner || (owner.l_hand != src && owner.r_hand != src)) + if(istype(loc,/mob/living)) + var/mob/living/carbon/human/host = loc + if(istype(host)) + for(var/obj/item/organ/external/organ in host.organs) + for(var/obj/item/O in organ.implants) + if(O == src) + organ.implants -= src + host.pinned -= src + host.embedded -= src + host.drop_from_inventory(src) + else + STOP_PROCESSING(SSprocessing, src) + + ..() \ No newline at end of file diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index e5a4e20e..dfa69c23 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -50,6 +50,9 @@ icon_state = "tinker" item_state = "psiblade" force = 1 + var/list/emulation = list("Crowbar","Wrench","Screwdriver","Wirecutters") + var/has_multitool = FALSE + var/has_welder = FALSE var/emulating = "Crowbar" /obj/item/psychic_power/tinker/iscrowbar() @@ -64,12 +67,28 @@ /obj/item/psychic_power/tinker/iswirecutter() return emulating == "Wirecutters" +/obj/item/psychic_power/tinker/ismultitool() + return emulating == "Multitool" + +/obj/item/psychic_power/tinker/iswelder() + return emulating == "Welder" + /obj/item/psychic_power/tinker/attack_self() + if(owner.psi) + var/fire_rank = owner.psi.get_rank(PSI_METAKINESIS) + var/demi_rank = owner.psi.get_rank(PSI_MANIFESTATION) + if(fire_rank >= PSI_RANK_LATENT && demi_rank >= PSI_RANK_OPERANT && owner.skill_check(SKILL_CONSTRUCTION, SKILL_TRAINED) && !has_welder) + emulation += "Welder" + has_welder = TRUE + if(demi_rank >= PSI_RANK_MASTER && owner.skill_check(SKILL_ELECTRICAL, SKILL_BASIC) && owner.skill_check(SKILL_DEVICES, SKILL_TRAINED) && !has_multitool) + emulation += "Multitool" + has_multitool = TRUE + if(!owner || loc != owner) return - var/choice = input("Select a tool to emulate.","Power") as null|anything in list("Crowbar","Wrench","Screwdriver","Wirecutters","Gloves","Dismiss") + var/choice = input("Select a tool to emulate.","Power") as null|anything in emulation if(!choice) return diff --git a/code/modules/psionics/faculties/consciousness.dm b/code/modules/psionics/faculties/consciousness.dm index 1f8dd411..337dec1f 100644 --- a/code/modules/psionics/faculties/consciousness.dm +++ b/code/modules/psionics/faculties/consciousness.dm @@ -399,7 +399,7 @@ return TRUE /decl/psionic_power/consciousness/curse - name = "Curse" + name = "Hallucinations" cost = 20 cooldown = 50 use_grab = TRUE diff --git a/code/modules/psionics/faculties/manifestation.dm b/code/modules/psionics/faculties/manifestation.dm index 4a34d03c..f7bece4d 100644 --- a/code/modules/psionics/faculties/manifestation.dm +++ b/code/modules/psionics/faculties/manifestation.dm @@ -26,14 +26,14 @@ if(.) switch(user.psi.get_rank(faculty)) if(PSI_RANK_GRANDMASTER) - var/option = input(target, "Choose something!", "Weapons to create") in list("Blade", "Club", "Battle Axe", "Spear", "Crossbow") + var/option = input(target, "Choose something!", "Weapons to create") in list("Sword", "Club", "Battle Axe", "Spear", "Crossbow", "Pistol") if (!option) return if(user.psi.suppressed) return if(option == "Club") return new /obj/item/psychic_power/psiclub/master/grand/paramount(user, user) - if(option == "Blade") + if(option == "Sword") return new /obj/item/psychic_power/psiblade/master/grand/paramount(user, user) if(option == "Battle Axe") return new /obj/item/psychic_power/psiaxe/master/grand/paramount(user, user) @@ -41,15 +41,21 @@ return new /obj/item/psychic_power/psispear/master/grand/paramount(user, user) if(option == "Crossbow") return new /obj/item/gun/launcher/crossbow/psibow/master/grand/paramount(user, user) + if(option == "Pistol") + if(user.skill_check(SKILL_WEAPONS, SKILL_TRAINED) && user.skill_check(SKILL_CONSTRUCTION, SKILL_EXPERIENCED)) + return new /obj/item/gun/energy/psigun(user, user) + else + to_chat(user, SPAN_OCCULT("Вы пытаетесь какое-то время собраться с мыслями, но совершенно не понимаете, как вам создать столь сложную конструкцию.")) + return FALSE if(PSI_RANK_MASTER) - var/option = input(target, "Choose something!", "Weapons to create") in list("Blade", "Club", "Battle Axe", "Spear", "Crossbow") + var/option = input(target, "Choose something!", "Weapons to create") in list("Sword", "Club", "Battle Axe", "Spear", "Crossbow") if (!option) return if(user.psi.suppressed) return if(option == "Club") return new /obj/item/psychic_power/psiclub/master/grand(user, user) - if(option == "Blade") + if(option == "Sword") return new /obj/item/psychic_power/psiblade/master/grand(user, user) if(option == "Battle Axe") return new /obj/item/psychic_power/psiaxe/master(user, user) diff --git a/code/modules/psionics/faculties/metakinesis.dm b/code/modules/psionics/faculties/metakinesis.dm index a5e0242d..aafd7142 100644 --- a/code/modules/psionics/faculties/metakinesis.dm +++ b/code/modules/psionics/faculties/metakinesis.dm @@ -24,6 +24,8 @@ var/option = input(target, "Choose something!", "Element to use") in list("Electricity", "Fire", "Ice") if (!option) return + if(user.psi.suppressed) + return if(option == "Electricity") return new /obj/item/psychic_power/psielectro(user, user) if(option == "Fire") diff --git a/code/modules/psionics/faculties/psychokinesis.dm b/code/modules/psionics/faculties/psychokinesis.dm index 955db970..d28b4252 100644 --- a/code/modules/psionics/faculties/psychokinesis.dm +++ b/code/modules/psionics/faculties/psychokinesis.dm @@ -115,7 +115,7 @@ target.visible_message(SPAN_DANGER("[target] ловит лицом кулак, улетая назад!")) if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(rand(15,30),BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(rand(15,30),BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и кожа на вашей руке стирается в кровь!")) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) @@ -138,7 +138,7 @@ if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(rand(15,30),BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(rand(15,30),BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и кожа на вашей руке стирается в кровь!")) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") @@ -167,11 +167,11 @@ target.visible_message(SPAN_DANGER("[target] ловит лицом кулак, улетая назад!")) if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(rand(40,50),BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(rand(30,40),BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и вашу руку выворачивает наизнанку!")) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - target.apply_damage(rand(25,50),BRUTE,def_zone=zone) + target.apply_damage(rand(25,40),BRUTE,def_zone=zone) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 3, 2, user) return TRUE @@ -180,7 +180,7 @@ to_chat(target, SPAN_NOTICE("Ваше силовое поле успешно сдержало удар, пускай на это и ушло приличное количество концентрации.")) target.psi.spend_power(10) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - user.apply_damage(rand(25,50),BRUTE,def_zone=zone) + user.apply_damage(rand(25,40),BRUTE,def_zone=zone) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") user.throw_at(get_edge_target_turf(user, get_dir(target, user)), 3, 2, target) user.visible_message(SPAN_DANGER("Мощное силовое поле [target] отбрасывает [user] назад, создавая мощную обратную волну!")) @@ -190,13 +190,13 @@ if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(rand(40,50),BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(rand(30,40),BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и вашу руку выворачивает наизнанку!")) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") target.visible_message(SPAN_DANGER("[target] ловит лицом кулак, улетая назад!")) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - target.apply_damage(rand(25,50),BRUTE,def_zone=zone) + target.apply_damage(rand(25,40),BRUTE,def_zone=zone) target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 3, 2, user) @@ -219,11 +219,11 @@ target.visible_message(SPAN_DANGER("[target] ловит лицом кулак, улетая назад!")) if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(80,BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(60,BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и вашу руку выворачивает наизнанку!")) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - target.apply_damage(rand(40,80),BRUTE,def_zone=zone) + target.apply_damage(rand(40,60),BRUTE,def_zone=zone) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 6, 2, user) return TRUE @@ -232,7 +232,7 @@ to_chat(target, SPAN_NOTICE("Ваше силовое поле успешно сдержало удар, пускай на это и ушло приличное количество концентрации.")) target.psi.spend_power(10) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - user.apply_damage(rand(40,80),BRUTE,def_zone=zone) + user.apply_damage(rand(40,60),BRUTE,def_zone=zone) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") user.throw_at(get_edge_target_turf(user, get_dir(target, user)), 6, 2, target) user.visible_message(SPAN_DANGER("Мощное силовое поле [target] отбрасывает [user] назад, создавая мощную обратную волну!")) @@ -242,13 +242,13 @@ if(!user.skill_check(SKILL_HAULING, SKILL_EXPERIENCED)) - user.apply_damage(80,BRUTE, user.hand ? BP_L_HAND : BP_R_HAND) + user.apply_damage(60,BRUTE, user.hand ? BP_L_ARM : BP_R_ARM) to_chat(user, SPAN_WARNING("Ваше неподготовленное тело не выдерживает отдачи от удара, и вашу руку выворачивает наизнанку!")) new /obj/effect/temporary(get_turf(target),3, 'icons/effects/effects.dmi', "smash") target.visible_message(SPAN_DANGER("[target] ловит лицом кулак, улетая назад!")) for(var/zone in list(BP_CHEST, BP_GROIN, BP_HEAD)) - target.apply_damage(rand(40,80),BRUTE,def_zone=zone) + target.apply_damage(rand(40,60),BRUTE,def_zone=zone) target.throw_at(get_edge_target_turf(target, get_dir(user, target)), 6, 2, user) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 8f8f1cf6..950832b5 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -62,7 +62,7 @@ if (!option) return if(option == "Базовая") - if(do_after(user, 50)) + if(do_after(user, 60)) user.visible_message(SPAN_NOTICE("[user] кладёт руки на плечи [target]...")) to_chat(target, SPAN_NOTICE("Вы ощущаете приятное тепло...ваши раны заживают.")) new /obj/effect/temporary(get_turf(target),8, 'icons/effects/effects.dmi', "redaction_healing") @@ -89,7 +89,7 @@ //It's easier to repair severed tendon, than put bones in place or either repair it structure, so no rank check if(E.status & ORGAN_TENDON_CUT) - if(do_after(user, 50)) + if(do_after(user, 80)) new /obj/effect/temporary(get_turf(target),8, 'icons/effects/effects.dmi', "redaction_healing") to_chat(user, SPAN_NOTICE("Вы аккуратно сплели новое сухожилие на месте повреждённого в [E.name].")) E.status &= ~ORGAN_TENDON_CUT @@ -109,7 +109,7 @@ return 0 if(E.status & ORGAN_BROKEN) user.visible_message(SPAN_NOTICE("[user] кладёт руку на [target]'s [E.name]...")) - if(do_after(user, 80)) + if(do_after(user, 100)) new /obj/effect/temporary(get_turf(target),8, 'icons/effects/effects.dmi', "redaction_healing") to_chat(user, SPAN_NOTICE("Вы установили кости на их прежнее место, заделав образовавшиеся на их поверхности трещины.")) E.status &= ~ORGAN_BROKEN @@ -130,7 +130,7 @@ to_chat(user, SPAN_WARNING("Нет смысла тратить силы на этот обрубок. Здесь вы бессильны.")) return 0 if(E.status & ORGAN_ARTERY_CUT) - if(do_after(user, 80)) + if(do_after(user, 100)) new /obj/effect/temporary(get_turf(target),8, 'icons/effects/effects.dmi', "redaction_healing") to_chat(user, SPAN_NOTICE("Вы вновь связали разованные вены в [E.name], останавливая внутреннее кровотечение.")) to_chat(target, SPAN_NOTICE("Вы ощущаете неприятное чувство в районе [E.name]...словно кто-то вновь сплетает ваши вены воедино.")) @@ -154,7 +154,7 @@ if(red_rank >= PSI_RANK_MASTER) for(var/obj/item/organ/internal/I in E.internal_organs) if(!BP_IS_ROBOTIC(I) && !BP_IS_CRYSTAL(I) && I.damage > 0) - if(do_after(user, 120)) + if(do_after(user, 220)) to_chat(user, SPAN_NOTICE("Вы проникаете внутрь тела [target], восстанавливая повреждённый орган: [I].")) new /obj/effect/temporary(get_turf(target),8, 'icons/effects/effects.dmi', "redaction_healing") var/heal_rate = red_rank diff --git a/code/modules/surgery/encased.dm b/code/modules/surgery/encased.dm index a9fe094d..82c285f1 100644 --- a/code/modules/surgery/encased.dm +++ b/code/modules/surgery/encased.dm @@ -11,7 +11,9 @@ allowed_tools = list( /obj/item/circular_saw = 100, /obj/item/material/knife = 50, - /obj/item/material/hatchet = 75 + /obj/item/material/hatchet = 75, + /obj/item/psychic_power/psiaxe = 75, + /obj/item/psychic_power/psiblade = 50 ) can_infect = 1 blood_level = 1 diff --git a/code/modules/surgery/generic.dm b/code/modules/surgery/generic.dm index a99dfa0f..99a77e35 100644 --- a/code/modules/surgery/generic.dm +++ b/code/modules/surgery/generic.dm @@ -297,7 +297,9 @@ name = "Amputate limb" allowed_tools = list( /obj/item/circular_saw = 100, - /obj/item/material/hatchet = 75 + /obj/item/material/hatchet = 75, + /obj/item/psychic_power/psiaxe = 75, + /obj/item/psychic_power/psiblade = 50 ) min_duration = 110 max_duration = 160 diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index 3ee261910f2204314d1a6255e39bcd2151b8ce3e..0b66055ac15478e66fb0c4602f40d939bbf9d488 100644 GIT binary patch literal 5534 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 literal 4917 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 diff --git a/maps/away/for_fd/decor.dm b/maps/away/for_fd/decor.dm index ec489fe1..69233b7b 100644 --- a/maps/away/for_fd/decor.dm +++ b/maps/away/for_fd/decor.dm @@ -288,7 +288,7 @@ to_chat(L, SPAN_DANGER("You're tangled in \the [src]!")) /obj/structure/fd/bs_vines/attackby(obj/item/I, mob/user, params) - if(istype(I, /obj/item/material/hatchet)) + if(istype(I, /obj/item/material/hatchet) || istype(I,/obj/item/psychic_power/psiaxe) || istype(I,/obj/item/psychic_power/psiblade)) if(do_after(user, 80)) qdel(src)