From 180b71ae665c7c54c958dab24e8fdbf1ff4bd311 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 15:36:08 -0400 Subject: [PATCH 001/201] pain --- code/__DEFINES/atom_hud.dm | 2 + code/__DEFINES/psi.dm | 33 ++ code/_onclick/hud/screen_objects.dm | 2 + code/_onclick/other_mobs.dm | 13 + code/controllers/subsystem/processing/psi.dm | 38 ++ code/datums/mind.dm | 7 + code/game/atoms_movable.dm | 3 + code/game/data_huds.dm | 10 +- code/game/machinery/doors/door.dm | 8 + code/game/objects/items.dm | 5 + .../objects/items/implants/implant_psi.dm | 174 ++++++++ .../game/objects/items/stacks/sheets/glass.dm | 31 ++ code/game/objects/items/storage/boxes.dm | 28 ++ code/game/objects/items/storage/firstaid.dm | 8 + code/game/objects/items/two_handed/spears.dm | 9 + code/game/objects/items/weaponry.dm | 19 + code/game/objects/structures/bedsheet_bin.dm | 23 + code/game/objects/structures/extinguisher.dm | 9 + code/game/turfs/closed/walls.dm | 16 + code/modules/admin/admin.dm | 20 + code/modules/admin/topic.dm | 14 + code/modules/client/client_colour.dm | 4 + code/modules/jobs/job_types/_job.dm | 5 + code/modules/mob/living/carbon/carbon.dm | 13 +- .../mob/living/carbon/carbon_defense.dm | 19 + .../mob/living/carbon/human/_species.dm | 12 + .../mob/living/carbon/human/human_defense.dm | 6 + .../mob/living/carbon/human/human_defines.dm | 2 +- .../carbon/human/species_types/ethereal.dm | 1 + .../carbon/human/species_types/polysmorphs.dm | 1 + code/modules/mob/living/living_defense.dm | 4 + code/modules/mob/mob.dm | 2 + .../file_system/programs/psi_monitor.dm | 112 +++++ .../ammunition/ballistic/revolver.dm | 7 + .../ammunition/ballistic/shotgun.dm | 8 + .../projectiles/boxes_magazines/ammo_boxes.dm | 7 + .../boxes_magazines/internal/_cylinder.dm | 3 + .../projectiles/guns/ballistic/revolver.dm | 3 + .../projectiles/projectile/bullets/shotgun.dm | 17 + code/modules/psionics/complexus/complexus.dm | 121 ++++++ .../psionics/complexus/complexus_helpers.dm | 185 ++++++++ .../psionics/complexus/complexus_latency.dm | 18 + .../complexus/complexus_power_cache.dm | 40 ++ .../psionics/complexus/complexus_process.dm | 206 +++++++++ .../psionics/equipment/cerebro_enhancers.dm | 153 +++++++ code/modules/psionics/equipment/psipower.dm | 40 ++ .../psionics/equipment/psipower_blade.dm | 16 + .../psionics/equipment/psipower_tinker.dm | 24 ++ .../modules/psionics/equipment/psipower_tk.dm | 97 +++++ code/modules/psionics/events/_psi.dm | 20 + code/modules/psionics/events/mini_spasms.dm | 69 +++ code/modules/psionics/events/psi_balm.dm | 27 ++ code/modules/psionics/events/psi_wail.dm | 27 ++ code/modules/psionics/faculties/_faculty.dm | 11 + code/modules/psionics/faculties/_power.dm | 57 +++ code/modules/psionics/faculties/coercion.dm | 399 ++++++++++++++++++ .../modules/psionics/faculties/energistics.dm | 128 ++++++ .../psionics/faculties/psychokenisis.dm | 114 +++++ code/modules/psionics/faculties/redaction.dm | 166 ++++++++ code/modules/psionics/interfaces/ui.dm | 20 + code/modules/psionics/interfaces/ui_hub.dm | 98 +++++ code/modules/psionics/interfaces/ui_toggle.dm | 114 +++++ code/modules/psionics/mob/mob.dm | 20 + code/modules/psionics/mob/mob_assay.dm | 79 ++++ code/modules/psionics/null/_null.dm | 28 ++ code/modules/psionics/null/chemistry.dm | 35 ++ code/modules/psionics/null/flooring.dm | 17 + .../chemistry/reagents/drug_reagents.dm | 77 ++++ .../reagents/reagent_containers/pill.dm | 6 + .../research/designs/autolathe_designs.dm | 14 + icons/effects/psi_aura_small.dmi | Bin 0 -> 3594 bytes icons/mob/clothing/head/head.dmi | Bin 279385 -> 280124 bytes icons/mob/hud.dmi | Bin 16236 -> 20056 bytes icons/mob/inhands/misc/sheets_lefthand.dmi | Bin 3562 -> 3474 bytes icons/mob/inhands/misc/sheets_righthand.dmi | Bin 4002 -> 4176 bytes icons/mob/inhands/weapons/swords_lefthand.dmi | Bin 28450 -> 28688 bytes .../mob/inhands/weapons/swords_righthand.dmi | Bin 32705 -> 32945 bytes icons/mob/screen_psi.dmi | Bin 0 -> 16389 bytes icons/obj/ammo.dmi | Bin 53148 -> 56191 bytes icons/obj/clothing/hats/hats.dmi | Bin 106358 -> 106900 bytes icons/obj/implants.dmi | Bin 2796 -> 2971 bytes icons/obj/psychic_powers.dmi | Bin 0 -> 1326 bytes icons/obj/shards.dmi | Bin 3695 -> 5574 bytes icons/obj/weapons/longsword.dmi | Bin 23709 -> 24052 bytes icons/obj/weapons/spears.dmi | Bin 5308 -> 5776 bytes sound/effects/psi_power_evoke.ogg | Bin 0 -> 17986 bytes sound/effects/psi_power_fabrication.ogg | Bin 0 -> 50996 bytes sound/effects/psi_power_fail.ogg | Bin 0 -> 24938 bytes sound/effects/psi_power_feedback.ogg | Bin 0 -> 77856 bytes sound/effects/psi_power_unlock.ogg | Bin 0 -> 30877 bytes sound/effects/psi_power_used.ogg | Bin 0 -> 22450 bytes sound/effects/psisword.ogg | Bin 0 -> 15175 bytes yogstation.dme | 32 ++ .../modules/jobs/job_types/psychiatrist.dm | 7 + 94 files changed, 3157 insertions(+), 6 deletions(-) create mode 100644 code/__DEFINES/psi.dm create mode 100644 code/controllers/subsystem/processing/psi.dm create mode 100644 code/game/objects/items/implants/implant_psi.dm create mode 100644 code/modules/modular_computers/file_system/programs/psi_monitor.dm create mode 100644 code/modules/psionics/complexus/complexus.dm create mode 100644 code/modules/psionics/complexus/complexus_helpers.dm create mode 100644 code/modules/psionics/complexus/complexus_latency.dm create mode 100644 code/modules/psionics/complexus/complexus_power_cache.dm create mode 100644 code/modules/psionics/complexus/complexus_process.dm create mode 100644 code/modules/psionics/equipment/cerebro_enhancers.dm create mode 100644 code/modules/psionics/equipment/psipower.dm create mode 100644 code/modules/psionics/equipment/psipower_blade.dm create mode 100644 code/modules/psionics/equipment/psipower_tinker.dm create mode 100644 code/modules/psionics/equipment/psipower_tk.dm create mode 100644 code/modules/psionics/events/_psi.dm create mode 100644 code/modules/psionics/events/mini_spasms.dm create mode 100644 code/modules/psionics/events/psi_balm.dm create mode 100644 code/modules/psionics/events/psi_wail.dm create mode 100644 code/modules/psionics/faculties/_faculty.dm create mode 100644 code/modules/psionics/faculties/_power.dm create mode 100644 code/modules/psionics/faculties/coercion.dm create mode 100644 code/modules/psionics/faculties/energistics.dm create mode 100644 code/modules/psionics/faculties/psychokenisis.dm create mode 100644 code/modules/psionics/faculties/redaction.dm create mode 100644 code/modules/psionics/interfaces/ui.dm create mode 100644 code/modules/psionics/interfaces/ui_hub.dm create mode 100644 code/modules/psionics/interfaces/ui_toggle.dm create mode 100644 code/modules/psionics/mob/mob.dm create mode 100644 code/modules/psionics/mob/mob_assay.dm create mode 100644 code/modules/psionics/null/_null.dm create mode 100644 code/modules/psionics/null/chemistry.dm create mode 100644 code/modules/psionics/null/flooring.dm create mode 100644 icons/effects/psi_aura_small.dmi create mode 100644 icons/mob/screen_psi.dmi create mode 100644 icons/obj/psychic_powers.dmi create mode 100644 sound/effects/psi_power_evoke.ogg create mode 100644 sound/effects/psi_power_fabrication.ogg create mode 100644 sound/effects/psi_power_fail.ogg create mode 100644 sound/effects/psi_power_feedback.ogg create mode 100644 sound/effects/psi_power_unlock.ogg create mode 100644 sound/effects/psi_power_used.ogg create mode 100644 sound/effects/psisword.ogg diff --git a/code/__DEFINES/atom_hud.dm b/code/__DEFINES/atom_hud.dm index 1b77cee4f3ca..18dbcef4b5dc 100644 --- a/code/__DEFINES/atom_hud.dm +++ b/code/__DEFINES/atom_hud.dm @@ -44,6 +44,8 @@ #define DIAG_LAUNCHPAD_HUD "22" //for antag huds. these are used at the /mob level #define ANTAG_HUD "23" +/// psi control implant +#define IMPPSI_HUD "24" //by default everything in the hud_list of an atom is an image //a value in hud_list with one of these will change that behavior diff --git a/code/__DEFINES/psi.dm b/code/__DEFINES/psi.dm new file mode 100644 index 000000000000..82bdb908b62b --- /dev/null +++ b/code/__DEFINES/psi.dm @@ -0,0 +1,33 @@ +#define PSI_COERCION "coercion" +#define PSI_PSYCHOKINESIS "psychokinesis" +#define PSI_REDACTION "redaction" +#define PSI_ENERGISTICS "energistics" + +#define PSI_RANK_BLUNT 0 +#define PSI_RANK_LATENT 1 +#define PSI_RANK_OPERANT 2 +#define PSI_RANK_MASTER 3 +#define PSI_RANK_GRANDMASTER 4 +#define PSI_RANK_PARAMOUNT 5 + +#define PSI_IMPLANT_AUTOMATIC "Security Level Derived" +#define PSI_IMPLANT_SHOCK "Issue Neural Shock" +#define PSI_IMPLANT_WARN "Issue Reprimand" +#define PSI_IMPLANT_LOG "Log Incident" +#define PSI_IMPLANT_DISABLED "Disabled" + +#define INVOKE_PSI_POWERS(holder, powers, target, return_on_invocation) \ + if(holder?.psi?.can_use()) { \ + for(var/datum/psionic_power/power as anything in powers) { \ + var/obj/item/result = power.invoke(holder, target); \ + if(result) { \ + power.handle_post_power(holder, target); \ + if(istype(result)) { \ + holder.playsound_local(soundin = 'sound/effects/psi/power_evoke.ogg'); \ + LAZYADD(holder.psi.manifested_items, result); \ + holder.put_in_hands(result); \ + } \ + return return_on_invocation; \ + } \ + } \ + } diff --git a/code/_onclick/hud/screen_objects.dm b/code/_onclick/hud/screen_objects.dm index 0f654affe820..4e24f06f025e 100644 --- a/code/_onclick/hud/screen_objects.dm +++ b/code/_onclick/hud/screen_objects.dm @@ -284,6 +284,8 @@ var/obj/item/I = hud.mymob.get_active_held_item() if(I) I.Click(location, control, params) + else + hud.mymob.attack_empty_hand(hud.mymob.active_hand_index) else hud.mymob.swap_hand(held_index) return 1 diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index c46b82ec4719..1707542fbea9 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -5,6 +5,8 @@ Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) + if(psi) + INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[a_intent]), A, FALSE) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -47,6 +49,14 @@ A.attack_hand(src, modifiers) +/mob/living/carbon/human/attack_empty_hand() + if(psi) + INVOKE_PSI_POWERS(src, psi.get_manifestations(), src, FALSE) + +/mob/living/carbon/human/RangedAttack(atom/A, params) + if(psi) + INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[a_intent]), A, TRUE) + //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) . = FALSE @@ -57,6 +67,9 @@ if(interaction_flags_atom & INTERACT_ATOM_ATTACK_HAND) . = _try_interact(user, modifiers) +/mob/proc/attack_empty_hand(hand) + return + /// When the user uses their hand on an item while holding right-click /// Returns a SECONDARY_ATTACK_* value. /atom/proc/attack_hand_secondary(mob/user, modifiers) diff --git a/code/controllers/subsystem/processing/psi.dm b/code/controllers/subsystem/processing/psi.dm new file mode 100644 index 000000000000..eab50c4bca8c --- /dev/null +++ b/code/controllers/subsystem/processing/psi.dm @@ -0,0 +1,38 @@ +GLOBAL_LIST_INIT(psychic_ranks_to_strings, list("Latent", "Operant", "Masterclass", "Grandmasterclass", "Paramount")) + +PROCESSING_SUBSYSTEM_DEF(psi) + name = "Psychics" + // priority = SS_PRIORITY_PSYCHICS + flags = SS_POST_FIRE_TIMING | SS_BACKGROUND + + var/list/faculties_by_id = list() + var/list/faculties_by_name = list() + var/list/all_aura_images = list() + var/list/all_psi_complexes = list() + var/list/psi_dampeners = list() + var/list/psi_monitors = list() + var/list/armour_faculty_by_type = list() + var/list/faculties_by_intent = list() + +/datum/controller/subsystem/processing/psi/New() + NEW_SS_GLOBAL(SSpsi) + +/datum/controller/subsystem/processing/psi/proc/get_faculty(faculty) + return faculties_by_name[faculty] || faculties_by_id[faculty] + +/datum/controller/subsystem/processing/psi/Initialize() + . = ..() + + var/list/faculties = subtypesof(/datum/psionic_faculty) + for(var/ftype in faculties) + var/datum/psionic_faculty/faculty = new ftype + faculties_by_id[faculty.id] = faculty + faculties_by_name[faculty.name] = faculty + faculties_by_intent[faculty.associated_intent] = faculty.id + + var/list/powers = subtypesof(/datum/psionic_power) + for(var/ptype in powers) + var/datum/psionic_power/power = new ptype + if(power.faculty) + var/datum/psionic_faculty/faculty = get_faculty(power.faculty) + faculty?.powers |= power diff --git a/code/datums/mind.dm b/code/datums/mind.dm index b990e01d08c7..0454b303ce1d 100644 --- a/code/datums/mind.dm +++ b/code/datums/mind.dm @@ -465,6 +465,13 @@ if(!check_rights(R_ADMIN)) return + if(current && isliving(current)) + if(href_list["set_psi_faculty"] && href_list["set_psi_faculty_rank"]) + current.set_psi_rank(href_list["set_psi_faculty"], text2num(href_list["set_psi_faculty_rank"])) + message_admins("[key_name_admin(usr)] set [key_name(current)]'s [href_list["set_psi_faculty"]] faculty to [text2num(href_list["set_psi_faculty_rank"])].") + log_admin("[key_name_admin(usr)] set [key_name(current)]'s [href_list["set_psi_faculty"]] faculty to [text2num(href_list["set_psi_faculty_rank"])].") + return TRUE + var/self_antagging = usr == current if(href_list["add_antag"]) diff --git a/code/game/atoms_movable.dm b/code/game/atoms_movable.dm index 753d1803878c..d7f3162ae1cc 100644 --- a/code/game/atoms_movable.dm +++ b/code/game/atoms_movable.dm @@ -1394,3 +1394,6 @@ if(destination) forceMove(destination) return TRUE + +/atom/movable/proc/do_simple_ranged_interaction(mob/user) + return FALSE diff --git a/code/game/data_huds.dm b/code/game/data_huds.dm index 11e780e65b50..21b739967259 100644 --- a/code/game/data_huds.dm +++ b/code/game/data_huds.dm @@ -47,7 +47,7 @@ hud_icons = list(ID_HUD) /datum/atom_hud/data/human/security/advanced - hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD, NANITE_HUD) + hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD, NANITE_HUD, IMPPSI_HUD) /datum/atom_hud/data/human/security/advanced/hos hud_icons = list(ID_HUD, IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, WANTED_HUD, NANITE_HUD, STATUS_HUD, HEALTH_HUD) @@ -212,7 +212,7 @@ Security HUDs! Basic mode shows only the job. /mob/living/proc/sec_hud_set_implants() var/image/holder - for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD)) + for(var/i in list(IMPTRACK_HUD, IMPLOYAL_HUD, IMPCHEM_HUD, IMPPSI_HUD)) holder = hud_list[i] holder.icon_state = null set_hud_image_inactive(i) @@ -231,6 +231,12 @@ Security HUDs! Basic mode shows only the job. holder.pixel_y = IC.Height() - world.icon_size holder.icon_state = "hud_imp_chem" set_hud_image_active(IMPCHEM_HUD) + else if(istype(I, /obj/item/implant/psi_control)) + holder = hud_list[IMPPSI_HUD] + var/icon/IC = icon(icon, icon_state, dir) + holder.pixel_y = IC.Height() - world.icon_size + holder.icon_state = "hud_imp_psi" + set_hud_image_active(IMPPSI_HUD) if(HAS_TRAIT(src, TRAIT_MINDSHIELD)) holder = hud_list[IMPLOYAL_HUD] diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index 2993c9b8d9e2..4577cf7aa2d1 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -199,6 +199,14 @@ return ..() +/obj/machinery/door/do_simple_ranged_interaction(mob/user) + if(!requiresID() || allowed(null)) + if(density) + open() + else + close() + return TRUE + /obj/machinery/door/proc/try_to_activate_door(mob/user) add_fingerprint(user) if(operating || (obj_flags & EMAGGED)) diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index c1c5e5d5268c..6fab03b624b8 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -508,6 +508,11 @@ GLOBAL_VAR_INIT(rpg_loot_items, FALSE) R.activate_module(src) R.hud_used.update_robot_modules_display() +/obj/item/do_simple_ranged_interaction(mob/user) + if(user) + attack_self(user) + return TRUE + /obj/item/proc/GetDeconstructableContents() return get_all_contents() - src diff --git a/code/game/objects/items/implants/implant_psi.dm b/code/game/objects/items/implants/implant_psi.dm new file mode 100644 index 000000000000..38641fea5718 --- /dev/null +++ b/code/game/objects/items/implants/implant_psi.dm @@ -0,0 +1,174 @@ +/obj/item/implant/psi_control + name = "psi dampener implant" + desc = "A safety implant for registered psi-operants." + implant_color = "n" + activated = FALSE + + var/overload = 0 + var/max_overload = 100 + var/cooldown_rate = 10 + var/psi_mode = PSI_IMPLANT_AUTOMATIC + var/list/logs + +/obj/item/implant/psi_control/get_data() + var/dat = {"Implant Specifications:
+ Name: Nanotrasen Psionic Mitigation Implant
+ Life: Ten years.
+ Important Notes: Psionic personel injected with this device can have their psionic potental di.
+
+ Implant Details:
+ Function: Contains a small shard of nullglass that prevents those implanted from being able to use psionic powers.
+ Special Features: Will prevent and log the use of psionics.
+ Integrity: Implant will last so long as the device is inside the bloodstream."} + return dat + +/obj/item/implant/psi_control/Initialize() + . = ..() + SSpsi.psi_dampeners += src + SSpsi.processing += src + +/obj/item/implant/psi_control/Destroy() + SSpsi.psi_dampeners -= src + SSpsi.processing -= src + . = ..() + +/obj/item/implant/psi_control/process() + ..() + overload = max(overload - cooldown_rate, 0) + +/obj/item/implant/psi_control/disrupts_psionics() + if(!imp_in) + return FALSE + var/use_psi_mode = get_psi_mode() + return (use_psi_mode == PSI_IMPLANT_SHOCK || use_psi_mode == PSI_IMPLANT_WARN) ? src : FALSE + +/obj/item/implant/psi_control/removed() + var/mob/living/M = imp_in + if(disrupts_psionics() && istype(M) && M.psi) + to_chat(M, span_notice("You feel the chilly shackles around your psionic faculties fade away.")) + . = ..() + +/obj/item/implant/psi_control/proc/update_functionality(silent) + var/mob/living/M = imp_in + if(silent || !M || !M.psi) + return + if(get_psi_mode() == PSI_IMPLANT_DISABLED) + to_chat(M, span_notice("You feel the chilly shackles around your psionic faculties fade away.")) + else + to_chat(M, span_notice("Bands of hollow ice close themselves around your psionic faculties.")) + +/obj/item/implant/psi_control/proc/meltdown() + overload = 100 + if(imp_in) + report_failure() + psi_mode = PSI_IMPLANT_DISABLED + update_functionality() + +/obj/item/implant/psi_control/proc/get_psi_mode() + if(psi_mode == PSI_IMPLANT_AUTOMATIC) + switch(get_security_level()) + if("green") + return PSI_IMPLANT_SHOCK + if("blue") + return PSI_IMPLANT_WARN + else + return PSI_IMPLANT_LOG + + return psi_mode + +/obj/item/implant/psi_control/withstand_psi_stress(stress, atom/source) + if(source != imp_in) + return + + var/use_psi_mode = get_psi_mode() + + if(use_psi_mode == PSI_IMPLANT_DISABLED) + return stress + + . = 0 + + if(stress) + + // If we're disrupting psionic attempts at the moment, we might overload. + if(disrupts_psionics()) + var/overload_amount = FLOOR(stress, 10) + if(overload_amount) + overload += overload_amount + if(overload >= 100) + if(imp_in) + to_chat(imp_in, span_danger("Your psi dampener overloads violently!")) + meltdown() + update_functionality() + return + if(imp_in) + if(overload >= 75 && overload < 100) + to_chat(imp_in, span_danger("Your psi dampener is searing hot!")) + else if(overload >= 50 && overload < 75) + to_chat(imp_in, span_warning("Your psi dampener is uncomfortably hot...")) + else if(overload >= 25 && overload < 50) + to_chat(imp_in, span_warning("You feel your psi dampener heating up...")) + + // If all we're doing is logging the incident then just pass back stress without changing it. + if(source && source == imp_in) + report_violation(stress) + switch(use_psi_mode) + if(PSI_IMPLANT_LOG) + return stress + if(PSI_IMPLANT_SHOCK) + to_chat(imp_in, span_danger("Your psi dampener punishes you with a violent neural shock!")) + imp_in.electrocute_act(5, src) + if(isliving(imp_in)) + var/mob/living/M = imp_in + if(M.psi) M.psi.stunned(5) + if(PSI_IMPLANT_WARN) + to_chat(imp_in, span_warning("Your psi dampener primly informs you it has reported this violation.")) + +/obj/item/implant/psi_control/proc/report_failure() + LAZYADD(logs, "Critical system failure - [imp_in.name].") + +/obj/item/implant/psi_control/proc/report_violation(stress) + LAZYADD(logs, "Sigma [round(stress/10)] event - [imp_in.name].") + +/obj/item/implant/psi_control/psych + psi_mode = PSI_IMPLANT_LOG + +/obj/item/implanter/psi_control + name = "implanter (psi dampener)" + imp_type = /obj/item/implant/psi_control + +/obj/item/implantcase/psi_control + name = "implant case - 'Psi Dampener'" + desc = "A glass case containing a psi dampener implant." + imp_type = /obj/item/implant/psi_control + +/obj/item/implant/nullglass + name = "nullglass shard" + desc = "A shard of psionic inhibiting glass." + implant_color = "n" + var/stress_left = 100 + var/lifespan = 1 MINUTES + +/obj/item/implant/nullglass/Initialize() + . = ..() + QDEL_IN(src, lifespan) + +/obj/item/implant/nullglass/disrupts_psionics() + if(imp_in) + return src + +/obj/item/implant/nullglass/withstand_psi_stress(stress, atom/source) + if(source != imp_in) + return stress + + . = max(stress - stress_left, 0) + stress_left -= stress + if(imp_in) + if(stress_left > 0 && stress_left < 25) + to_chat(imp_in, span_danger("You feel a searing hot piece of glass in your body!")) + else if(stress_left >= 25 && stress_left < 50) + to_chat(imp_in, span_warning("You feel a piece of glass in your body getting uncomfortably hot...")) + else if(stress_left >= 50) + to_chat(imp_in, span_warning("You feel a piece of glass in your body heating up...")) + if(stress_left <= 0) + to_chat(imp_in, span_danger("You hear a piece of glass shatter in your body!")) + qdel(src) diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index c53825bafe64..1c865231f7d2 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -250,6 +250,28 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( recipes = GLOB.plastitaniumglass_recipes return ..() +GLOBAL_LIST_INIT(nullglass_recipes, list ( \ + new/datum/stack_recipe("nullglass tile", /obj/item/stack/tile/mineral/nullglass, time = 0), \ +)) + +/obj/item/stack/sheet/nullglass + name = "nullglass" + desc = "A glass sheet made out of a strange black glass capable of nullifying magic." + singular_name = "nullglass sheet" + icon_state = "sheet-nullglass" + item_state = "sheet-nullglass" + materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) + merge_type = /obj/item/stack/sheet/nullglass + grind_results = list(/datum/reagent/crystal = 1) + matter_amount = 4 + +/obj/item/stack/sheet/nullglass/fifty + amount = 50 + +/obj/item/stack/sheet/nullglass/Initialize(mapload, new_amount, merge = TRUE) + recipes = GLOB.nullglass_recipes + return ..() + /obj/item/shard name = "shard" desc = "A nasty looking shard of glass." @@ -357,3 +379,12 @@ GLOBAL_LIST_INIT(plastitaniumglass_recipes, list( materials = list(/datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) icon_prefix = "plasma" weld_material = /obj/item/stack/sheet/plasmaglass + +/obj/item/shard/nullglass + name = "null shard" + desc = "A nasty looking shard of nullglass." + icon_state = "nulllarge" + icon_prefix = "null" + +/obj/item/shard/nullglass/disrupts_psionics() + return src diff --git a/code/game/objects/items/storage/boxes.dm b/code/game/objects/items/storage/boxes.dm index 364f4a9640bf..7866247291eb 100644 --- a/code/game/objects/items/storage/boxes.dm +++ b/code/game/objects/items/storage/boxes.dm @@ -434,6 +434,34 @@ /obj/item/implanter = 1) generate_items_inside(items_inside,src) +/obj/item/storage/box/psiimp + name = "boxed psi dampener implant kit" + desc = "Box full of implants to protect the mentaly gifted." + illustration = "implant" + +/obj/item/storage/box/psiimp/PopulateContents() + var/static/items_inside = list( + /obj/item/implantcase/psi_control = 4, + /obj/item/implanter = 1, + /obj/item/implantpad = 1) + generate_items_inside(items_inside,src) + +/obj/item/storage/box/nullglass + name = "box of nullglass shells" + desc = "A box full of beanbag shells designed for shotguns. The box itself is designed for holding any kind of shotgun shell." + icon_state = "rubbershot_box" + illustration = null + +/obj/item/storage/box/nullglass/PopulateContents() + . = ..() + var/datum/component/storage/STR = GetComponent(/datum/component/storage) + STR.max_items = 7 + STR.set_holdable(list(/obj/item/ammo_casing/shotgun)) + +/obj/item/storage/box/nullglass/PopulateContents() + for(var/i in 1 to 7) + new /obj/item/ammo_casing/shotgun/nullglass(src) + /obj/item/storage/box/bodybags name = "body bags" desc = "The label indicates that it contains body bags." diff --git a/code/game/objects/items/storage/firstaid.dm b/code/game/objects/items/storage/firstaid.dm index a63bd8386b80..6196112cec32 100644 --- a/code/game/objects/items/storage/firstaid.dm +++ b/code/game/objects/items/storage/firstaid.dm @@ -681,6 +681,14 @@ for(var/i in 1 to 5) new /obj/item/reagent_containers/pill/aranesp(src) +/obj/item/storage/pill_bottle/three_eye + name = "bottle of Three Eye pills" + desc = "Highly illegal drug. Stimulates rarely used portions of the brain." + +/obj/item/storage/pill_bottle/three_eye/PopulateContents() + for(var/i in 1 to 5) + new /obj/item/reagent_containers/pill/three_eye(src) + /obj/item/storage/pill_bottle/psicodine name = "bottle of psicodine pills" desc = "Contains pills used to treat mental distress and traumas." diff --git a/code/game/objects/items/two_handed/spears.dm b/code/game/objects/items/two_handed/spears.dm index 674df7c98e80..5f4b68c18866 100644 --- a/code/game/objects/items/two_handed/spears.dm +++ b/code/game/objects/items/two_handed/spears.dm @@ -242,6 +242,15 @@ force_wielded = 8 can_be_explosive = FALSE +/obj/item/melee/spear/nullglass + icon = 'icons/obj/weapons/spears.dmi' + icon_state = "spearnull0" + base_icon_state = "nullglass_spear" + var/psi_stress = 0 + +/obj/item/twohanded/spear/nullglass/disrupts_psionics() + return src + /obj/item/melee/spear/plugged_musket name = "plugged maintenance musket" desc = "A maintenance musket with a plug bayonet." diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 20fde79f9df6..98ad9be4a384 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -252,6 +252,25 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 resistance_flags = FIRE_PROOF var/block_force = 20 +/obj/item/claymore/nullglass + name = "nullglass claymore" + icon_state = "claymore_nullglass" + item_state = "claymore_nullglass" + force = 20 + throwforce = 5 + block_force = 15 + var/shatter_chance = 30 + +/obj/item/claymore/nullglass/disrupts_psionics() + return src + +/obj/item/claymore/nullglass/attack(mob/living/target, mob/living/user) + . = ..() + if(prob(shatter_chance)) + var/obj/item/implant/nullglass/imp = new() + imp.implant(target) + playsound(loc, 'sound/effects/glass_step.ogg', 30, TRUE) + /obj/item/katana/Initialize(mapload) . = ..() if(!block_force) diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index b20091ff2455..bfe30e0bfdd6 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -455,6 +455,29 @@ LINEN BINS add_fingerprint(user) +/obj/structure/bedsheetbin/do_simple_ranged_interaction(mob/user) + if(amount >= 1) + amount-- + + var/obj/item/bedsheet/B + if(sheets.len) + B = sheets[sheets.len] + sheets.Remove(B) + + else + B = new /obj/item/bedsheet(loc) + + B.forceMove(drop_location()) + to_chat(user, span_notice("You telekinetically remove [B] from [src].")) + update_icon() + + if(hidden) + hidden.forceMove(drop_location()) + hidden = null + + + add_fingerprint(user) + /obj/item/bedsheet/adjusted slot_flags = ITEM_SLOT_HEAD flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEGLOVES|HIDEJUMPSUIT|HIDENECK|HIDEFACIALHAIR|HIDESUITSTORAGE diff --git a/code/game/objects/structures/extinguisher.dm b/code/game/objects/structures/extinguisher.dm index 9fee168cabc0..45e8e5a99c6e 100644 --- a/code/game/objects/structures/extinguisher.dm +++ b/code/game/objects/structures/extinguisher.dm @@ -106,6 +106,15 @@ else toggle_cabinet(user) +/obj/structure/extinguisher_cabinet/do_simple_ranged_interaction(mob/user) + if(stored_extinguisher) + stored_extinguisher.forceMove(loc) + stored_extinguisher = null + opened = 1 + playsound(loc, 'sound/machines/click.ogg', 15, 1, -3) + update_icon() + else + toggle_cabinet(user) /obj/structure/extinguisher_cabinet/attack_paw(mob/user) return attack_hand(user) diff --git a/code/game/turfs/closed/walls.dm b/code/game/turfs/closed/walls.dm index d4286ae8a513..fd74e3f6e43c 100644 --- a/code/game/turfs/closed/walls.dm +++ b/code/game/turfs/closed/walls.dm @@ -251,6 +251,22 @@ return FALSE /turf/closed/wall/proc/try_decon(obj/item/I, mob/user, turf/T, modifiers) + + if(istype(I, /obj/item/psychic_power/psiblade)) + var/obj/item/psychic_power/psiblade/blade = I + if(!blade.can_break_wall) + return + to_chat(user, span_notice("You sink [blade] into [src] and begin trying to rip out the support frame...")) + playsound(src, 'sound/items/Welder.ogg', 100, 1) + + if(!do_after(user, blade.wall_break_time, src)) + return + + to_chat(user, span_notice("You tear through [src]'s support system and plating!")) + dismantle_wall(TRUE) + user.visible_message(span_warning("[src] was torn open by [user]!")) + playsound(src, 'sound/items/Welder.ogg', 100, 1) + if(!(modifiers && modifiers[RIGHT_CLICK])) return FALSE diff --git a/code/modules/admin/admin.dm b/code/modules/admin/admin.dm index 7df979729dad..664f792b04ba 100644 --- a/code/modules/admin/admin.dm +++ b/code/modules/admin/admin.dm @@ -133,6 +133,26 @@ body += "Redeem Antag Token | " body += "See Antag Tokens" + body += "

" + body += "Psionics:
" + if(isliving(M)) + var/mob/living/psyker = M + if(psyker.psi) + body += "Remove psionics.

" + body += "Trigger latencies.
" + body += "" + for(var/faculty in list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS)) + var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) + var/faculty_rank = psyker.psi ? psyker.psi.get_rank(faculty) : 0 + body += "" + for(var/i = 1 to LAZYLEN(GLOB.psychic_ranks_to_strings)) + var/psi_title = GLOB.psychic_ranks_to_strings[i] + if(i == faculty_rank) + psi_title = "[psi_title]" + body += "" + body += "" + body += "
[faculty_decl.name][psi_title]
" + if (M.client) if(!isnewplayer(M)) body += "

" diff --git a/code/modules/admin/topic.dm b/code/modules/admin/topic.dm index 4eac15b773f2..3018e8cdb623 100644 --- a/code/modules/admin/topic.dm +++ b/code/modules/admin/topic.dm @@ -953,6 +953,20 @@ Game() // updates the main game menu HandleFSecret() + else if(href_list["remove_psionics"]) + var/datum/psi_complexus/psi = locate(href_list["remove_psionics"]) + if(psi?.owner && !QDELETED(psi)) + to_chat(psi.owner, span_notice("Your psionic powers vanish abruptly, leaving you cold and empty.")) + log_admin("[key_name(usr)] removed all psionics from [key_name(psi.owner)].") + message_admins(span_adminnotice("[key_name_admin(usr)] removed all psionics from [key_name(psi.owner)].")) + QDEL_NULL(psi) + + else if(href_list["trigger_psi_latencies"]) + var/datum/psi_complexus/psi = locate(href_list["trigger_psi_latencies"]) + log_admin("[key_name(usr)] triggered psi latencies for [key_name(psi.owner)].") + message_admins(span_adminnotice("[key_name_admin(usr)] triggered psi latencies for [key_name(psi.owner)].")) + psi.check_latency_trigger(100, "outside intervention", redactive = TRUE) + else if(href_list["monkeyone"]) if(!check_rights(R_SPAWN)) return diff --git a/code/modules/client/client_colour.dm b/code/modules/client/client_colour.dm index c59259bc307b..59dba6afa0b2 100644 --- a/code/modules/client/client_colour.dm +++ b/code/modules/client/client_colour.dm @@ -107,6 +107,10 @@ colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) priority = INFINITY //we can't see colors anyway! +/datum/client_colour/thirdeye + colour = list(rgb(16,16,16), rgb(32,32,32), rgb(80,80,80)) + priority = 300 + // Duplicate so it doesn't conflict with monochromacy quirk /datum/client_colour/monochrome_infra colour = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) diff --git a/code/modules/jobs/job_types/_job.dm b/code/modules/jobs/job_types/_job.dm index ee9e3599272e..9bc08e6debd4 100644 --- a/code/modules/jobs/job_types/_job.dm +++ b/code/modules/jobs/job_types/_job.dm @@ -209,6 +209,11 @@ H.dna.species.after_equip_job(src, H, visualsOnly) + if(H.psi && H.psi.has_rank_above(PSI_RANK_OPERANT)) + var/obj/item/implant/psi_control/I = new(H) + if(!I.implant(H, null)) + qdel(I) // For odd casses like the psych + if(!visualsOnly && announce) announce(H) diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 23aa2184d378..6bdc3773376c 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -249,12 +249,14 @@ if(restrained()) changeNext_move(CLICK_CD_BREAKOUT) last_special = world.time + CLICK_CD_BREAKOUT - var/buckle_cd = 600 + var/buckle_cd = 1 MINUTES + if(psi?.can_use()) + buckle_cd = max(0, buckle_cd - ((10 SECONDS) * psi.get_rank(PSI_PSYCHOKINESIS))) if(handcuffed) var/obj/item/restraints/O = src.get_item_by_slot(ITEM_SLOT_HANDCUFFED) buckle_cd = O.breakouttime visible_message(span_warning("[src] attempts to unbuckle [p_them()]self!"), \ - span_notice("You attempt to unbuckle yourself... (This will take around [round(buckle_cd/10,1)] second\s, and you need to stay still.)")) + span_notice("You attempt to unbuckle yourself... (This will take around [DisplayTimeText(buckle_cd)] second\s, and you need to stay still.)")) if(do_after(src, buckle_cd, src, timed_action_flags = IGNORE_HELD_ITEM)) if(!buckled) return @@ -303,6 +305,11 @@ return I.item_flags |= BEING_REMOVED breakouttime = I.breakouttime + + if(psi?.can_use()) + var/psi_mod = (1 - (psi.get_rank(PSI_PSYCHOKINESIS)*0.2)) + breakouttime = max(5, breakouttime * psi_mod) + if(!cuff_break) visible_message(span_warning("[src] attempts to remove [I]!")) to_chat(src, span_notice("You attempt to remove [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")) @@ -314,7 +321,7 @@ else if(cuff_break == FAST_CUFFBREAK) breakouttime = 5 SECONDS visible_message(span_warning("[src] is trying to break [I]!")) - to_chat(src, span_notice("You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)")) + to_chat(src, span_notice("You attempt to break [I]... (This will take around [DisplayTimeText(breakouttime)] and you need to stand still.)")) if(do_after(src, breakouttime, src, timed_action_flags = IGNORE_HELD_ITEM)) clear_cuffs(I, cuff_break) else diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index 45ea43cbc2e7..e4b980451feb 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -691,3 +691,22 @@ user.visible_message(span_danger("[user] grasps at [user.p_their()] [grasped_part.name], trying to stop the bleeding."), span_notice("You grab hold of your [grasped_part.name] tightly."), vision_distance=COMBAT_MESSAGE_RANGE) playsound(get_turf(src), 'sound/weapons/thudswoosh.ogg', 50, TRUE, -1) return TRUE + +/// Exploads the head of the mob +/mob/living/carbon/proc/explode_head(delete_brain) + var/obj/item/bodypart/head = get_bodypart(BODY_ZONE_HEAD) + var/obj/item/organ/brain/brain = getorganslot(ORGAN_SLOT_BRAIN) + if(!istype(head)) + return FALSE + if(delete_brain && (brain in head.get_organs())) + qdel(brain) + head.drop_limb() + head.drop_organs(src, TRUE) + qdel(head) + spawn_gibs() + +/// Causes the mob to have a seizure +/mob/living/carbon/proc/seizure(unconscious = 20 SECONDS, jitter = 1 SECONDS) + visible_message(span_danger("[src] starts having a seizure!")) + Unconscious(unconscious) + SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "seizure", /datum/mood_event/epilepsy) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index ac906eb83dcb..2223745fd3a4 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -210,6 +210,14 @@ GLOBAL_LIST_EMPTY(features_by_species) //The component to add when swimming var/swimming_component = /datum/component/swimming + // Psi Stuff + /// Prob chance that mobs of this species have latent psionics + var/latency_chance = 1 + /// List of faculties that can be chosen for random psionics + var/possable_faculties = list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS) + /// What level starting faculties are at + var/starting_psi_level = PSI_RANK_LATENT + var/smells_like = "something alien" //Should we preload this species's organs? @@ -503,6 +511,10 @@ GLOBAL_LIST_EMPTY(features_by_species) fly.Grant(C) C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING)) + + if(!C.psi && prob(latency_chance)) + C.set_psi_rank(pick(possable_faculties), starting_psi_level) + C.regenerate_icons() SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index a37309c6276b..4064ee8c6cd0 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -48,6 +48,12 @@ if(spec_return) return spec_return + if((!P.disrupts_psionics() && psi && psi.handle_block_chance(P) && psi.spend_power(round(P.damage/4), round(P.damage/20)))) + P.firer = src + P.setAngle(rand(0, 360)) + visible_message(span_danger("[src] deflects [P]!")) + return BULLET_ACT_FORCE_PIERCE + if(mind) if(mind.martial_art && !incapacitated(FALSE, TRUE) && mind.martial_art.can_use(src) && (mind.martial_art.deflection_chance || ((mind.martial_art.id == "sleeping carp") && in_throw_mode))) //Some martial arts users can deflect projectiles! if(prob(mind.martial_art.deflection_chance) || ((mind.martial_art.id == "sleeping carp") && in_throw_mode)) // special check if sleeping carp is our martial art and throwmode is on, deflect diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index d5601d06b6d0..05d2ef3e2b12 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -1,5 +1,5 @@ /mob/living/carbon/human - hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD,IMPTRACK_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD) + hud_possible = list(HEALTH_HUD,STATUS_HUD,ID_HUD,WANTED_HUD,IMPLOYAL_HUD,IMPCHEM_HUD, IMPTRACK_HUD, IMPPSI_HUD, NANITE_HUD, DIAG_NANITE_FULL_HUD,ANTAG_HUD,GLAND_HUD,SENTIENT_DISEASE_HUD) hud_type = /datum/hud/human pressure_resistance = 25 can_buckle = TRUE diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 69710b36a3f4..aac9233eef42 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -37,6 +37,7 @@ hair_color = "fixedmutcolor" hair_alpha = 140 swimming_component = /datum/component/swimming/ethereal + possable_faculties = list(PSI_ENERGISTICS) wings_icon = "Ethereal" wings_detail = "Etherealdetails" diff --git a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm index 9bbe1f2d6b1a..734cc98092a0 100644 --- a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm +++ b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm @@ -43,6 +43,7 @@ mutant_bodyparts = list("tail_polysmorph", "dome", "dorsal_tubes", "teeth", "legs") default_features = list("tail_polysmorph" = "Polys", "dome" = "None", "dorsal_tubes" = "No", "teeth" = "None", "legs" = "Normal Legs") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT + latency_chance = 2 smells_like = "charred, acidic meat" diff --git a/code/modules/mob/living/living_defense.dm b/code/modules/mob/living/living_defense.dm index d859e5f922fc..0818467562f6 100644 --- a/code/modules/mob/living/living_defense.dm +++ b/code/modules/mob/living/living_defense.dm @@ -6,6 +6,10 @@ if(status_flags & GODMODE) visible_message(span_danger("A strange force protects [src], [p_they()] can't be damaged!"), span_userdanger("A strange force protects you!")) return armor + if(psi?.use_psi_armour && psi.last_armor_check == world.time) + show_message(span_warning("You block the blow with your mind!")) + psi.spend_power(10) + return 100 if(armor > 0 && armour_penetration) //WE HAVE ARMOR if(armour_penetration <= -100) // < -100 AP, no penetration on anything armor = 100 diff --git a/code/modules/mob/mob.dm b/code/modules/mob/mob.dm index 49e8396cf469..d43c55eae721 100644 --- a/code/modules/mob/mob.dm +++ b/code/modules/mob/mob.dm @@ -691,6 +691,8 @@ if(I) I.attack_self(src) update_inv_hands() + else + attack_empty_hand(active_hand_index) /** * Get the notes of this mob diff --git a/code/modules/modular_computers/file_system/programs/psi_monitor.dm b/code/modules/modular_computers/file_system/programs/psi_monitor.dm new file mode 100644 index 000000000000..96e5c1daea96 --- /dev/null +++ b/code/modules/modular_computers/file_system/programs/psi_monitor.dm @@ -0,0 +1,112 @@ + +/datum/computer_file/program/psimonitor + filename = "psimonitor" + filedesc = "Psi Monitor" + category = PROGRAM_CATEGORY_CREW + program_icon_state = "comm_monitor" + extended_desc = "This program monitors and configures implanted psi monitors." + size = 6 + requires_ntnet = TRUE + usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_PHONE | PROGRAM_TELESCREEN + transfer_access = ACCESS_MEDICAL + available_on_ntnet = TRUE + tgui_id = "NtosPsiMonitor" + var/obj/item/implant/psi_control/selected_implant + var/show_violations = FALSE + var/authorized +/obj/machinery/psi_monitor/New() + SSpsi.psi_monitors += src + ..() + +/obj/machinery/psi_monitor/emag_act(var/remaining_charges, var/mob/user) + if(!emagged) + emagged = TRUE + remaining_charges-- + req_one_access.Cut() + to_chat(user, "You short out the access protocols.") + return TRUE + return FALSE + +/datum/computer_file/program/psimonitor/ui_act(action, params) + if(..()) + return + computer.play_interact_sound() + switch(action) + if("login") + var/obj/item/card/id/ID = usr.GetID() + if(!ID || (transfer_access in ID.GetAccess())) + to_chat(usr, span_warning("Access denied.")) + else + authorized = "[ID.registered_name] ([ID.assignment])" + return TRUE + if("logout") + authorized = FALSE + return TRUE + if("change_mode") + selected_implant.psi_mode = input("Select a new implant mode.", "Psi Dampener") as null|anything in list(PSI_IMPLANT_AUTOMATIC, PSI_IMPLANT_SHOCK, PSI_IMPLANT_WARN, PSI_IMPLANT_LOG, PSI_IMPLANT_DISABLED) + return TRUE + /* + if("remove_violation") + var/remove_ind = text2num(href_list["remove_violation"]) + if(remove_ind > 0 && remove_ind <= psi_violations.len) + psi_violations.Cut(remove_ind, remove_ind++) + return TRUE + */ + if("change_mode") + selected_implant.psi_mode = input("Select a new implant mode.", "Psi Dampener") as null|anything in list(PSI_IMPLANT_AUTOMATIC, PSI_IMPLANT_SHOCK, PSI_IMPLANT_WARN, PSI_IMPLANT_LOG, PSI_IMPLANT_DISABLED) + return TRUE +/datum/computer_file/program/psimonitor/ui_data(mob/user) + if(!SSnetworks.station_network) + return + var/list/data = get_header_data() + data["authorized"] = authorized + data["ntnetrelays"] = SSnetworks.station_network.relays.len + data["idsstatus"] = SSnetworks.station_network.intrusion_detection_enabled + data["idsalarm"] = SSnetworks.station_network.intrusion_detection_alarm + data["config_softwaredownload"] = SSnetworks.station_network.setting_softwaredownload + data["config_peertopeer"] = SSnetworks.station_network.setting_peertopeer + data["config_communication"] = SSnetworks.station_network.setting_communication + data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol + data["logs"] = list() + if(selected_implant.logs) + data["logs"] = selected_implant.logs + for(var/i in SSnetworks.station_network.logs) + data["ntnetlogs"] += list(list("entry" = i)) + data["ntnetmaxlogs"] = SSnetworks.station_network.setting_maxlogcount + +/obj/machinery/psi_monitor/interact(var/mob/user) + var/list/dat = list() + dat += "

Psi Dampener Monitor

" + if(authorized) + dat += "[authorized] Logout" + else + dat += "Login" + dat += "

Active Psionic Dampeners


" + dat += "
" + dat += "" + for(var/thing in SSpsi.psi_dampeners) + var/obj/item/weapon/implant/psi_control/implant = thing + if(!implant.imp_in) + continue + dat += "" + if(implant.malfunction) + dat += "" + else + dat += "" + dat += "" + dat += "
OperantSystem loadMode
[implant.imp_in.name]ERRORERROR[implant.overload]%[authorized ? "[implant.psi_mode]" : "[implant.psi_mode]"]

" + if(show_violations) + dat += "

Psionic Control Violations -


" + if(psi_violations.len) + for(var/i = 1 to psi_violations.len) + var/entry = psi_violations[i] + dat += "" + else + dat += "" + dat += "

[entry]
[authorized ? "Remove" : ""]
None reported.

" + else + dat += "

Psionic Control Violations +


" + var/datum/browser/popup = new(user, "psi_monitor_\ref[src]", "Psi-Monitor") + popup.set_content(jointext(dat,null)) + popup.open() + diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index aa98196f2cad..8153d5e4aaf1 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -42,6 +42,13 @@ caliber = CALIBER_44MAG projectile_type = /obj/projectile/bullet/m44 +// revolver? + +/obj/item/ammo_casing/a357/nullglass + name = ".357 NULL bullet casing" + desc = "A .357 NULL bullet casing." + projectile_type = /obj/item/projectile/bullet/a357/nullglass + // 7.62x38mmR (Nagant Revolver) /obj/item/ammo_casing/n762 diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index de7538c5a49e..1ebe8a9732e2 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -143,6 +143,14 @@ pellets = 4 variance = 30 +/obj/item/ammo_casing/shotgun/nullglass + name = "nullglass buckshot shell" + desc = "A buckshot shell loaded with shells of nullglass that disrupt psionic." + icon_state = "mshell" // Temp + projectile_type = /obj/item/projectile/bullet/pellet/nullglass + pellets = 6 + variance = 25 + /obj/item/ammo_casing/shotgun/techshell name = "unloaded technological shell" desc = "A high-tech shotgun shell which can be loaded with materials to produce unique effects." diff --git a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm index 948f6e3c2c34..d404af2b6611 100644 --- a/code/modules/projectiles/boxes_magazines/ammo_boxes.dm +++ b/code/modules/projectiles/boxes_magazines/ammo_boxes.dm @@ -55,6 +55,13 @@ max_ammo = 6 multiple_sprites = AMMO_BOX_PER_BULLET +/obj/item/ammo_box/a357/nullglass + name = "speed loader (.357 NULL)" + desc = "A seven-shot speed loader designed for .357 revolvers. \ + These rounds trade damage for the ability to disrupt psionics." + icon_state = "357null" + ammo_type = /obj/item/ammo_casing/a357/nullglass + // .38 special loaders /obj/item/ammo_box/c38 diff --git a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm index aa8e6514d69f..4d687d61a9f1 100644 --- a/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm +++ b/code/modules/projectiles/boxes_magazines/internal/_cylinder.dm @@ -59,3 +59,6 @@ if(!give_round(new load_type(src))) break update_appearance(UPDATE_ICON) + +/obj/item/ammo_box/magazine/internal/cylinder/nullglass + ammo_type = /obj/item/ammo_casing/a357/nullglass diff --git a/code/modules/projectiles/guns/ballistic/revolver.dm b/code/modules/projectiles/guns/ballistic/revolver.dm index 9c7e08f0d957..7b980f06c7e0 100644 --- a/code/modules/projectiles/guns/ballistic/revolver.dm +++ b/code/modules/projectiles/guns/ballistic/revolver.dm @@ -71,6 +71,9 @@ if (current_skin) . += "It can be spun with alt+click" +/obj/item/gun/ballistic/revolver/nullglass + mag_type = /obj/item/ammo_box/magazine/internal/cylinder/nullglass + /obj/item/gun/ballistic/revolver/ultrasecure pin = /obj/item/firing_pin/fucked diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 9dc2917e3018..d6db7b80a38c 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -222,3 +222,20 @@ damage_type = STAMINA // Doesn't do "real" damage sharpness = SHARP_NONE armour_penetration = -40 // Energy armor is usually very low so uhh + + +/obj/item/projectile/bullet/pellet/nullglass + name = "nullglass pellet" + damage = 6 + wound_bonus = 3 + bare_wound_bonus = 3 + +/obj/item/projectile/bullet/pellet/nullglass/disrupts_psionics() + return src + +/obj/item/projectile/bullet/pellet/nullglass/on_hit(atom/target) + . = ..() + if(prob(10)) + var/obj/item/implant/nullglass/imp = new() + imp.implant(target) + playsound(loc, 'sound/effects/glass_step.ogg', 30, TRUE) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm new file mode 100644 index 000000000000..f788ec39140e --- /dev/null +++ b/code/modules/psionics/complexus/complexus.dm @@ -0,0 +1,121 @@ +/datum/psi_complexus + /// Whether or not we have been announced to our holder yet. + var/announced = FALSE + /// Whether or not we are suppressing our psi powers. + var/suppressed = TRUE + /// Whether or not we should automatically deflect/block incoming damage. + var/use_psi_armour = TRUE + /// Whether or not we should automatically heal damage damage. + var/use_autoredaction = TRUE + /// Whether or not zorch uses lethal projectiles. + var/zorch_harm = FALSE + /// What amount of heat the user wants to stop at. + var/limiter = 100 + /// Whether or not we need to rebuild our cache of psi powers. + var/rebuild_power_cache = TRUE + + /// Overall psi rating. + var/rating = 0 + /// Multiplier for power use stamina costs. + var/cost_modifier = 1 + /// Number of process ticks we are stunned for. + var/stun = 0 + /// world.time minimum before next power use. + var/next_power_use = 0 + + // Stamina / Heat + /// Current psi pool. + var/stamina = 50 + /// Max psi pool. + var/max_stamina = 50 + /// Multiplier for the recharge rate of psi heat. + var/stamina_recharge_mult = 1 + /// Current psi heat. + var/heat = 0 + /// Max psi heat. 100 is safe, 300 has minor consequences, 500 is dangerous, max is death. + var/max_heat = 500 + /// Multiplier for the decay rate of psi heat. + var/heat_decay_mult = 1 + + /// List of all currently latent faculties. + var/list/latencies + /// Assoc list of psi faculties to current rank. + var/list/ranks + /// Assoc list of psi faculties to base rank, in case reset is needed + var/list/base_ranks + /// List of atoms manifested/maintained by psychic power. + var/list/manifested_items + /// world.time minimum before a trigger can be attempted again. + var/next_latency_trigger = 0 + /// world.time of last armour check. + var/last_armor_check + var/last_aura_size + var/last_aura_alpha + var/last_aura_color + var/aura_color = "#ff0022" + + // Cached powers. + var/list/melee_powers // Powers used in melee range. + var/list/grab_powers // Powers use by using a grab. + var/list/ranged_powers // Powers used at range. + var/list/manifestation_powers // Powers that create an item. + var/list/powers_by_faculty // All powers within a given faculty. + + var/obj/screen/psi/hub/ui // Reference to the master psi UI object. + var/mob/living/owner // Reference to our owner. + var/image/_aura_image // Client image + +/datum/psi_complexus/proc/get_aura_image() + if(_aura_image && !istype(_aura_image)) + var/atom/A = _aura_image + destroy_aura_image(_aura_image) + _aura_image = null + CRASH("Non-image found in psi complexus: \ref[A] - \the [A] - [istype(A) ? A.type : "non-atom"]") + if(!_aura_image) + _aura_image = create_aura_image(owner) + return _aura_image + +/proc/create_aura_image(newloc) + var/image/aura_image = image(loc = newloc, icon = 'icons/effects/psi_aura_small.dmi', icon_state = "aura") + aura_image.blend_mode = BLEND_MULTIPLY + aura_image.appearance_flags = NO_CLIENT_COLOR | RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + aura_image.layer = TURF_LAYER + 0.5 + aura_image.alpha = 0 + aura_image.pixel_x = -64 + aura_image.pixel_y = -64 + aura_image.mouse_opacity = 0 + aura_image.appearance_flags = 0 + for(var/datum/psi_complexus/psychic in SSpsi.processing) + if(!psychic.suppressed) + psychic?.owner?.client?.images += aura_image + SSpsi.all_aura_images[aura_image] = TRUE + return aura_image + +/proc/destroy_aura_image(image/aura_image) + for(var/datum/psi_complexus/psychic in SSpsi.processing) + psychic?.owner?.client?.images -= aura_image + SSpsi.all_aura_images -= aura_image + +/datum/psi_complexus/New(mob/M) + owner = M + START_PROCESSING(SSpsi, src) + +/datum/psi_complexus/Destroy() + destroy_aura_image(_aura_image) + STOP_PROCESSING(SSpsi, src) + if(owner) + cancel() + if(owner.client) + owner.client.screen -= ui.components + owner.client.screen -= ui + for(var/thing in SSpsi.all_aura_images) + owner.client.images -= thing + QDEL_NULL(ui) + owner.psi = null + owner = null + + if(manifested_items) + for(var/thing in manifested_items) + qdel(thing) + manifested_items.Cut() + . = ..() diff --git a/code/modules/psionics/complexus/complexus_helpers.dm b/code/modules/psionics/complexus/complexus_helpers.dm new file mode 100644 index 000000000000..5f594ea50263 --- /dev/null +++ b/code/modules/psionics/complexus/complexus_helpers.dm @@ -0,0 +1,185 @@ +/datum/psi_complexus/proc/cancel() + SEND_SOUND(owner, sound('sound/effects/psi/power_fail.ogg')) + if(LAZYLEN(manifested_items)) + for(var/thing in manifested_items) + owner.dropItemToGround(thing) + qdel(thing) + manifested_items = null + +/datum/psi_complexus/proc/stunned(amount) + var/old_stun = stun + stun = max(stun, amount) + if(amount && !old_stun) + to_chat(owner, span_danger("Your concentration has been shattered! You cannot focus your psi power!")) + ui.update_icon() + cancel() + +/datum/psi_complexus/proc/get_armour(armourtype) + if(can_use_passive()) + last_armor_check = world.time + return round(clamp(clamp(4 * rating, 0, 20) * get_rank(SSpsi.armour_faculty_by_type[armourtype]), 0, 100) * (stamina/max_stamina)) + last_armor_check = 0 + return 0 + +/datum/psi_complexus/proc/handle_block_chance(obj/item/projectile/projectile) + var/effective_rank + var/chance = 0 + + if(istype(projectile, /obj/item/projectile/beam) || istype(projectile, /obj/item/projectile/energy)) + effective_rank = get_rank(PSI_ENERGISTICS) + else + effective_rank = get_rank(PSI_PSYCHOKINESIS) + + switch(effective_rank) + if(PSI_RANK_OPERANT) + chance = 1 + if(PSI_RANK_MASTER) + chance = 10 + if(PSI_RANK_GRANDMASTER) + chance = 50 + if(PSI_RANK_PARAMOUNT) + chance = 90 + + return prob(chance) + +/datum/psi_complexus/proc/get_rank(faculty) + return LAZYACCESS(ranks, faculty) + +/datum/psi_complexus/proc/set_rank(faculty, rank, defer_update, temporary) + if(get_rank(faculty) != rank) + LAZYSET(ranks, faculty, rank) + if(!temporary) + LAZYSET(base_ranks, faculty, rank) + if(!defer_update) + update() + +/datum/psi_complexus/proc/set_cooldown(value) + next_power_use = world.time + value + ui.update_icon() + +/datum/psi_complexus/proc/can_use_passive() + return (owner.stat == CONSCIOUS && !suppressed && !stun) + +/datum/psi_complexus/proc/can_use(incapacitation_flags) + return (owner.stat == CONSCIOUS && !suppressed && !stun && world.time >= next_power_use) + +/datum/psi_complexus/proc/spend_power(stamina_cost = 0, heat_cost = 0) + . = FALSE + if(!can_use()) + return FALSE + + // Focus + stamina_cost = max(1, CEILING(stamina_cost * cost_modifier, 1)) + if(stamina < stamina_cost) + return FALSE + if((heat + heat_cost) >= limiter) + return FALSE + adjust_stamina(-stamina_cost) + adjust_heat(heat_cost) + handle_heat_effects() + + ui.update_icon() + return TRUE + +/datum/psi_complexus/proc/set_stamina(value = 0) + stamina = clamp(value, 0, max_stamina) + +/datum/psi_complexus/proc/adjust_stamina(value = 0) + set_stamina(stamina + value) + +/datum/psi_complexus/proc/set_heat(value = 0) + heat = clamp(value, 0, max_heat) + +/datum/psi_complexus/proc/adjust_heat(value = 0) + set_heat(heat + value) + +/datum/psi_complexus/proc/hide_auras() + if(owner.client) + for(var/image/I in SSpsi.all_aura_images) + owner.client.images -= I + +/datum/psi_complexus/proc/show_auras() + if(owner.client) + for(var/image/I in SSpsi.all_aura_images) + owner.client.images |= I + +/datum/psi_complexus/proc/handle_heat_effects(effective_heat) + if(!owner) + return FALSE + if(!effective_heat) + effective_heat = heat + if(effective_heat < 100) + return + // The Fun Effects (500 heat) + if(effective_heat >= max_heat) + switch(pick(1, 2)) + //1, Your head asplode / you are gibbed + if(1) + if(iscarbon(owner)) + var/mob/living/carbon/C = owner + C.explode_head() + else + owner.gib() + //2, Your psi powers are too strained, causing them to disapear forever + if(2) + qdel(src) + + //Less fun effects + switch(rand(1, effective_heat - 100)) + // Your nose bleeds a little. + if(1 to 20) + var/mob/living/carbon/human/H + if(istype(H) && (H.dna.species.species_traits & NOBLOOD)) + return + to_chat(owner,span_warning("Your nose begins to bleed...")) + owner.add_splatter_floor(small_drip = TRUE) + // Your get a headache. Yes this is stolen from disease code, sue me + if(21 to effective_heat) + switch(effective_heat) + if(0 to 200) + to_chat(owner, span_warning("[pick("Your head hurts.", "Your head pounds.")]")) + adjust_stamina(rand(-5, -1)) + if(201 to 400) + to_chat(owner, span_warning("[pick("Your head hurts a lot.", "Your head pounds incessantly.")]")) + adjust_stamina(rand(-10, -5)) + owner.adjustStaminaLoss(25) + if(401 to 500) + to_chat(owner, span_userdanger("[pick("You feel a burning knife inside your brain!", "A wave of pain fills your head!")]")) + adjust_stamina(rand(-15, -10)) + owner.Stun(3.5 SECONDS) + +/datum/psi_complexus/proc/backblast(value) + + // Can't backblast if you're controlling your power. + if(!owner || suppressed) + return FALSE + + SEND_SOUND(owner, sound('sound/effects/psi/power_feedback.ogg')) + to_chat(owner, span_danger("Wild energistic feedback blasts across your psyche!")) + stunned(value * 2) + set_cooldown(value * 100) + + if(prob(value*10)) + owner.emote("scream") + adjust_heat(value * 10) + // Your head asplode. + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, value) + if(ishuman(owner)) + var/mob/living/carbon/human/pop = owner + var/obj/item/organ/brain/sponge = pop.getorganslot(ORGAN_SLOT_BRAIN) + if(sponge && pop.getOrganLoss(ORGAN_SLOT_BRAIN) >= sponge.maxHealth) + pop.explode_head() + +/datum/psi_complexus/proc/has_rank_above(required_rank) + for(var/faculty in ranks) + if(required_rank <= get_rank(faculty)) + return TRUE + +/datum/psi_complexus/proc/reset() + aura_color = initial(aura_color) + ranks = base_ranks ? base_ranks.Copy() : null + max_stamina = initial(max_stamina) + set_stamina(stamina) + set_heat(heat) + cancel() + update() diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm new file mode 100644 index 000000000000..93494533b98a --- /dev/null +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -0,0 +1,18 @@ +/datum/psi_complexus/proc/check_latency_trigger(trigger_strength = 0, source, redactive = FALSE) + + if(!LAZYLEN(latencies) || world.time < next_latency_trigger) + return FALSE + + if(!prob(trigger_strength)) + next_latency_trigger = world.time + rand(100, 300) + return FALSE + + var/faculty = pick(latencies) + var/new_rank = rand(2,5) + owner.set_psi_rank(faculty, new_rank) + var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) + to_chat(owner, span_danger("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) + next_latency_trigger = world.time + rand(600, 1800) * new_rank + if(!redactive) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_strength * 2, trigger_strength * 4)) + return TRUE diff --git a/code/modules/psionics/complexus/complexus_power_cache.dm b/code/modules/psionics/complexus/complexus_power_cache.dm new file mode 100644 index 000000000000..6f80dc7e773f --- /dev/null +++ b/code/modules/psionics/complexus/complexus_power_cache.dm @@ -0,0 +1,40 @@ +/datum/psi_complexus/proc/rebuild_power_cache() + if(rebuild_power_cache) + + melee_powers = list() + ranged_powers = list() + manifestation_powers = list() + powers_by_faculty = list() + + for(var/faculty in ranks) + var/relevant_rank = get_rank(faculty) + var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) + for(var/P in faculty_decl.powers) + var/datum/psionic_power/power = P + if(relevant_rank >= power.min_rank) + LAZYADD(powers_by_faculty[power.faculty], power) + if(power.use_ranged) + if(!ranged_powers[faculty]) + ranged_powers[faculty] = list() + LAZYADD(ranged_powers[faculty], power) + if(power.use_melee) + LAZYADD(melee_powers[faculty], power) + if(power.use_manifest) + manifestation_powers += power + rebuild_power_cache = FALSE + +/datum/psi_complexus/proc/get_powers_by_faculty(faculty) + rebuild_power_cache() + return powers_by_faculty[faculty] + +/datum/psi_complexus/proc/get_melee_powers(faculty) + rebuild_power_cache() + return melee_powers[faculty] + +/datum/psi_complexus/proc/get_ranged_powers(faculty) + rebuild_power_cache() + return ranged_powers[faculty] + +/datum/psi_complexus/proc/get_manifestations() + rebuild_power_cache() + return manifestation_powers diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm new file mode 100644 index 000000000000..a2021c61ebaf --- /dev/null +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -0,0 +1,206 @@ +/datum/psi_complexus/proc/update(force) + + set waitfor = FALSE + + var/last_rating = rating + var/highest_faculty + var/highest_rank = 0 + var/combined_rank = 0 + for(var/faculty in ranks) + var/check_rank = get_rank(faculty) + if(check_rank == 1) + LAZYADD(latencies, faculty) + else + if(check_rank <= 0) + ranks -= faculty + LAZYREMOVE(latencies, faculty) + combined_rank += check_rank + if(!highest_faculty || highest_rank < check_rank) + highest_faculty = faculty + highest_rank = check_rank + + UNSETEMPTY(latencies) + var/rank_count = max(1, LAZYLEN(ranks)) + if(force || last_rating != CEILING(combined_rank/rank_count, 1)) + if(highest_rank <= 1) + if(highest_rank == 0) + qdel(src) + return + rebuild_power_cache = TRUE + SEND_SOUND(owner, 'sound/effects/psi/power_unlock.ogg') + rating = CEILING(combined_rank/rank_count, 1) + cost_modifier = 1 + if(rating > 1) + cost_modifier -= min(1, max(0.1, (rating-1) / 10)) + if(!ui) + ui = new(owner) + if(owner.client) + owner.client.screen += ui.components + owner.client.screen += ui + if(!suppressed && owner.client) + for(var/image/I in SSpsi.all_aura_images) + owner.client.images |= I + var/image/aura_image = get_aura_image() + aura_image.blend_mode = BLEND_ADD + switch(highest_faculty) + if(PSI_COERCION) + aura_color = "#cc3333" + if(PSI_PSYCHOKINESIS) + aura_color = "#3333cc" + if(PSI_REDACTION) + aura_color = "#33cc33" + if(PSI_ENERGISTICS) + aura_color = "#cccc33" + + if(!announced && owner?.client && !QDELETED(src)) + announced = TRUE + to_chat(owner, "
") + to_chat(owner, span_notice("You are psionic, touched by powers beyond understanding.")) + to_chat(owner, span_notice("Shift-left-click your Psi icon on the bottom right to view a summary of how to use them, or left click it to suppress or unsuppress your psionics. Beware: overusing your gifts can have deadly consequences.")) + to_chat(owner, "
") + +/datum/psi_complexus/process() + + var/update_hud + if(stun) + stun-- + if(stun) + suppressed = TRUE + else + to_chat(owner, span_notice("You have recovered your mental composure.")) + update_hud = TRUE + return + + if(stamina < max_stamina) + adjust_stamina((owner.stat == CONSCIOUS ? rand(1,3) : rand(3,5)) * stamina_recharge_mult) + + if(heat) + adjust_heat(((owner.stat == CONSCIOUS ? -1 : -3)) * heat_decay_mult) + + if(owner.stat == CONSCIOUS && stamina && use_autoredaction && !suppressed && get_rank(PSI_REDACTION) >= PSI_RANK_OPERANT) + attempt_regeneration() + + var/next_aura_size = max(0.1,((stamina/max_stamina)*min(3,rating))/5) + var/next_aura_alpha = round(((suppressed ? max(0,rating - 2) : rating)/5)*255) + + if(next_aura_alpha != last_aura_alpha || next_aura_size != last_aura_size || aura_color != last_aura_color) + last_aura_size = next_aura_size + last_aura_alpha = next_aura_alpha + last_aura_color = aura_color + var/matrix/M = matrix() + if(next_aura_size != 1) + M.Scale(next_aura_size) + animate(get_aura_image(), alpha = next_aura_alpha, transform = M, color = aura_color, time = 3) + + if(update_hud) + ui.update_icon() + +/datum/psi_complexus/proc/attempt_regeneration() + + var/heal_general = FALSE + var/heal_poison = FALSE + var/heal_internal = FALSE + var/heal_rate = 0 + var/mend_prob = 0 + + switch(get_rank(PSI_REDACTION)) + if(PSI_RANK_PARAMOUNT) + heal_general = TRUE + heal_poison = TRUE + heal_internal = TRUE + mend_prob = 50 + heal_rate = 7 + if(PSI_RANK_GRANDMASTER) + heal_poison = TRUE + heal_internal = TRUE + mend_prob = 20 + heal_rate = 5 + if(PSI_RANK_MASTER) + heal_internal = TRUE + mend_prob = 10 + heal_rate = 3 + if(PSI_RANK_OPERANT) + mend_prob = 5 + heal_rate = 1 + else + return + + if(!heal_rate || stamina < heal_rate) + return // Don't backblast from trying to heal ourselves thanks. + + if(ishuman(owner)) + + var/mob/living/carbon/human/H = owner + + // Mend internal damage. + if(prob(mend_prob)) +/* + // Fix our heart if we're paramount. + if(heal_general && H.is_asystole() && spend_power(heal_rate)) + H.resuscitate() +*/ + // Heal organ damage. + if(heal_internal) + for(var/obj/item/organ/I in H.internal_organs) + + if(I.organ_flags & ORGAN_SYNTHETIC) + continue + + if(I.damage > 0 && spend_power(heal_rate)) + I.applyOrganDamage(-heal_rate) + if(prob(25)) + to_chat(H, span_notice("Your innards itch as your autoredactive faculty mends your [I.name].")) + return + /* To fix + // Heal broken bones. + if(H.bad_external_organs.len) + for(var/obj/item/organ/external/E in H.bad_external_organs) + if(BP_IS_ROBOTIC(E)) + continue + if(heal_internal && (E.status & ORGAN_BROKEN) && E.damage < (E.min_broken_damage * config.organ_health_multiplier)) // So we don't mend and autobreak. + if(spend_power(heal_rate)) + if(E.mend_fracture()) + to_chat(H, span_notice("Your autoredactive faculty coaxes together the shattered bones in your [E.name].")) + return + if(heal_bleeding) + if((E.status & ORGAN_ARTERY_CUT) && spend_power(heal_rate)) + to_chat(H, span_notice("Your autoredactive faculty mends the torn artery in your [E.name], stemming the worst of the bleeding.")) + E.status &= ~ORGAN_ARTERY_CUT + return + if(E.status & ORGAN_TENDON_CUT) + to_chat(H, span_notice("Your autoredactive faculty repairs the severed tendon in your [E.name].")) + E.status &= ~ORGAN_TENDON_CUT + return TRUE + for(var/datum/wound/W in E.wounds) + if(W.bleeding() && spend_power(heal_rate)) + to_chat(H, span_notice("Your autoredactive faculty knits together severed veins, stemming the bleeding from \a [W.desc] on your [E.name].")) + W.bleed_timer = 0 + W.clamped = TRUE + E.status &= ~ORGAN_BLEEDING + return + */ + + + // Heal radiation, cloneloss and poisoning. + if(heal_poison) + + if(owner.radiation && spend_power(heal_rate)) + if(prob(25)) + to_chat(owner, span_notice("Your autoredactive faculty repairs some of the radiation damage to your body.")) + owner.radiation = max(0, owner.radiation - (heal_rate * 5)) + return + + if(owner.getCloneLoss() && spend_power(heal_rate)) + if(prob(25)) + to_chat(owner, span_notice("Your autoredactive faculty stitches together some of your mangled DNA.")) + owner.adjustCloneLoss(-heal_rate) + return + + // Heal everything left. + if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss()) && spend_power(heal_rate)) + owner.adjustBruteLoss(-(heal_rate)) + owner.adjustFireLoss(-(heal_rate)) + owner.adjustOxyLoss(-(heal_rate)) + new /obj/effect/temp_visual/heal(get_turf(owner), "#33cc33") + if(prob(25)) + to_chat(owner, span_notice("Your skin crawls as your autoredactive faculty heals your body.")) diff --git a/code/modules/psionics/equipment/cerebro_enhancers.dm b/code/modules/psionics/equipment/cerebro_enhancers.dm new file mode 100644 index 000000000000..a4281257649f --- /dev/null +++ b/code/modules/psionics/equipment/cerebro_enhancers.dm @@ -0,0 +1,153 @@ +//Psi-boosting item (antag only) +/obj/item/clothing/head/helmet/space/psi_amp + name = "cerebro-energetic enhancer" + desc = "A matte-black, eyeless cerebro-energetic enhancement helmet. It uses highly sophisticated, and illegal, techniques to drill into your brain and install psi-infected AIs into the fluid cavities between your lobes." + //actions_types = list(/datum/action/item_action/toggle_helmet_light) + icon_state = "cerebro" + + var/operating = FALSE + var/list/boosted_faculties + var/boosted_rank = PSI_RANK_PARAMOUNT + var/unboosted_rank = PSI_RANK_MASTER + var/max_boosted_faculties = 3 + var/boosted_psipower = 120 + var/paramount_check = FALSE + +/obj/item/clothing/head/helmet/space/psi_amp/Initialize() + . = ..() + verbs += /obj/item/clothing/head/helmet/space/psi_amp/proc/integrate + +/obj/item/clothing/head/helmet/space/psi_amp/attack_self(mob/user) + + if(operating) + return + + var/mob/living/carbon/human/H = loc + if(istype(H) && H.head == src) + integrate() + return + + if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) + to_chat(user, span_notice("You have no clue how to use this!")) + + var/choice = input("Select a brainboard to install or remove.","Psionic Amplifier") as null|anything in SSpsi.faculties_by_name + if(!choice) + return + + var/removed + var/slots_left = max_boosted_faculties - LAZYLEN(boosted_faculties) + var/datum/psionic_faculty/faculty = SSpsi.get_faculty(choice) + if(faculty.id in boosted_faculties) + LAZYREMOVE(boosted_faculties, faculty.id) + removed = TRUE + else + if(slots_left <= 0) + to_chat(user, span_warning("There are no slots left to install brainboards into.")) + return + LAZYADD(boosted_faculties, faculty.id) + UNSETEMPTY(boosted_faculties) + + slots_left = max_boosted_faculties - LAZYLEN(boosted_faculties) + to_chat(user, span_notice("You [removed ? "remove" : "install"] the [choice] brainboard [removed ? "from" : "in"] \the [src]. There [slots_left!=1 ? "are" : "is"] [slots_left] slot\s left.")) + +/obj/item/clothing/head/helmet/space/psi_amp/AltClick(mob/user) + . = ..() + if(operating) + deintegrate() + else + integrate() + +/obj/item/clothing/head/helmet/space/psi_amp/proc/deintegrate() + if(operating) + return + + var/mob/living/carbon/human/H = loc + if(!istype(H)) + return + if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) + to_chat(H, span_notice("You have no clue how to use this!")) + + + to_chat(H, span_warning("You feel a strange tugging sensation as \the [src] begins removing the slave-minds from your brain...")) + playsound(H, 'sound/weapons/circsawhit.ogg', 50, 1, -1) + operating = TRUE + + sleep(80) + + if(H.psi) + H.psi.reset() + + to_chat(H, span_notice("\The [src] chimes quietly as it finishes removing the slave-minds from your brain.")) + + REMOVE_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) + operating = FALSE + + set_light(0) + +/obj/item/clothing/head/helmet/space/psi_amp/Move() + var/lastloc = loc + . = ..() + if(.) + var/mob/living/carbon/human/H = lastloc + if(istype(H) && H.psi) + H.psi.reset() + H = loc + if(!istype(H) || H.head != src) + REMOVE_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) + +/obj/item/clothing/head/helmet/space/psi_amp/proc/integrate() + if(operating) + return + + var/mob/living/carbon/human/H = loc + + if(!istype(H) || H.head != src) + to_chat(usr, span_warning("\The [src] must be worn on your head in order to be activated.")) + return + + if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) + to_chat(H, span_notice("You have no clue how to use this!")) + return + + if(LAZYLEN(boosted_faculties) < max_boosted_faculties) + to_chat(usr, span_notice("You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) + return + + ADD_TRAIT(src, TRAIT_NODROP, TRAIT_GENERIC) + operating = TRUE + to_chat(H, span_warning("You feel a series of sharp pinpricks as \the [src] anaesthetises your scalp before drilling down into your brain.")) + playsound(H, 'sound/weapons/circsawhit.ogg', 50, 1, -1) + + sleep(80) + + for(var/faculty in list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS)) + if(faculty in boosted_faculties) + H.set_psi_rank(faculty, boosted_rank, take_larger = TRUE, temporary = TRUE) + else + H.set_psi_rank(faculty, unboosted_rank, take_larger = TRUE, temporary = TRUE) + if(H.psi) + H.psi.max_stamina = boosted_psipower + H.psi.set_stamina(H.psi.max_stamina) + H.psi.update(force = TRUE) + + to_chat(H, span_notice("You experience a brief but powerful wave of deja vu as \the [src] finishes modifying your brain.")) + operating = FALSE + H.update_action_buttons() + + set_light(0.5, 0.1, 3, 2, l_color = "#880000") + +/obj/item/clothing/head/helmet/space/psi_amp/lesser + max_boosted_faculties = 1 + boosted_rank = PSI_RANK_MASTER + unboosted_rank = PSI_RANK_OPERANT + boosted_psipower = 50 + +/obj/item/clothing/head/helmet/space/psi_amp/lesser/crown + name = "psionic amplifier" + desc = "A crown-of-thorns cerebro-energetic enhancer that interfaces directly with the brain, isolating and strengthening psionic signals. It kind of looks like a tiara having sex with an industrial robot." + icon_state = "amp" + flags_inv = 0 + body_parts_covered = 0 + +/obj/item/clothing/head/helmet/space/psi_amp/paramount + paramount_check = TRUE diff --git a/code/modules/psionics/equipment/psipower.dm b/code/modules/psionics/equipment/psipower.dm new file mode 100644 index 000000000000..bce3b1eea34d --- /dev/null +++ b/code/modules/psionics/equipment/psipower.dm @@ -0,0 +1,40 @@ +/obj/item/psychic_power + name = "psychic power" + icon = 'icons/obj/psychic_powers.dmi' + anchored = TRUE + var/maintain_cost = 3 + var/mob/living/owner + +/obj/item/psychic_power/New(mob/living/L) + owner = L + if(!istype(owner)) + qdel(src) + return + START_PROCESSING(SSprocessing, src) + ..() + +/obj/item/psychic_power/Destroy() + if(istype(owner) && owner.psi) + LAZYREMOVE(owner.psi.manifested_items, src) + UNSETEMPTY(owner.psi.manifested_items) + STOP_PROCESSING(SSprocessing, src) + . = ..() + +/obj/item/psychic_power/attack_self(mob/user) + user.playsound_local(soundin = 'sound/effects/psi/power_fail.ogg') + user.dropItemToGround(src) + +/obj/item/psychic_power/dropped() + ..() + qdel(src) + +/obj/item/psychic_power/process() + if(istype(owner)) + owner.psi.spend_power(maintain_cost) + if(!owner || loc != owner || !(src in owner.held_items)) + if(ishuman(loc)) + var/mob/living/carbon/human/host = loc + host.remove_embedded_object(src) + host.dropItemToGround(src) + else + qdel(src) diff --git a/code/modules/psionics/equipment/psipower_blade.dm b/code/modules/psionics/equipment/psipower_blade.dm new file mode 100644 index 000000000000..9a3071dc15f4 --- /dev/null +++ b/code/modules/psionics/equipment/psipower_blade.dm @@ -0,0 +1,16 @@ +/obj/item/psychic_power/psiblade + name = "psychokinetic slash" + force = 10 + sharpness = SHARP_EDGED + icon_state = "psiblade_short" + item_state = "psiblade" + lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' + hitsound = 'sound/weapons/psisword.ogg' + var/can_break_wall = FALSE + var/wall_break_time = 6 SECONDS + +/obj/item/psychic_power/psiblade/dropped(var/mob/living/user) + ..() + playsound(loc, 'sound/effects/psi/power_fail.ogg', 30, 1) + QDEL_IN(src, 1) diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm new file mode 100644 index 000000000000..477d6efb382c --- /dev/null +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -0,0 +1,24 @@ +/obj/item/psychic_power/tinker + name = "psychokinetic crowbar" + icon_state = "tinker" + force = 0 + tool_behaviour = TOOL_CROWBAR + usesound = 'sound/weapons/etherealhit.ogg' + var/list/possible_tools + +/obj/item/psychic_power/tinker/attack_self() + + if(!owner || loc != owner) + return + + var/choice = input("Select a tool to emulate.","Power") as null|anything in possible_tools + if(!choice) + return + + if(!owner || loc != owner) + return + + tool_behaviour = choice + name = "psychokinetic [tool_behaviour]" + to_chat(owner, "You begin emulating \a [tool_behaviour].") + owner.playsound_local(soundin = 'sound/effects/psi/power_fabrication.ogg') diff --git a/code/modules/psionics/equipment/psipower_tk.dm b/code/modules/psionics/equipment/psipower_tk.dm new file mode 100644 index 000000000000..deb309afa468 --- /dev/null +++ b/code/modules/psionics/equipment/psipower_tk.dm @@ -0,0 +1,97 @@ +/obj/item/psychic_power/telekinesis + name = "telekinetic grip" + maintain_cost = 3 + icon_state = "telekinesis" + var/atom/movable/focus + +/obj/item/psychic_power/telekinesis/Destroy() + focus = null + . = ..() + +/obj/item/psychic_power/telekinesis/process() + if(!focus || !isturf(focus.loc) || get_dist(get_turf(focus), get_turf(owner)) > owner.psi.get_rank(PSI_PSYCHOKINESIS)) + owner.dropItemToGround(src) + return + . = ..() + +/obj/item/psychic_power/telekinesis/proc/set_focus(atom/movable/_focus) + + if(!isturf(_focus.loc)) + return FALSE + + var/check_paramount + if(isliving(_focus)) + var/mob/living/victim = _focus + check_paramount = (victim.mob_size >= MOB_SIZE_HUMAN) + else if(isitem(_focus)) + var/obj/item/thing = _focus + check_paramount = (thing.w_class >= WEIGHT_CLASS_BULKY) + else + return FALSE + + if(_focus.anchored || (check_paramount && owner.psi.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) + focus = _focus + . = attack_self(owner) + if(!.) + to_chat(owner, span_warning("\The [_focus] is too hefty for you to get a mind-grip on.")) + qdel(src) + return FALSE + + focus = _focus + overlays.Cut() + var/image/I = image(icon = focus.icon, icon_state = focus.icon_state) + I.color = focus.color + I.overlays = focus.overlays + overlays += I + return TRUE + +/obj/item/psychic_power/telekinesis/attack_self(mob/user) + user.visible_message(span_notice("[user] makes a strange gesture.")) + sparkle() + return focus.do_simple_ranged_interaction(user) + +/obj/item/psychic_power/telekinesis/afterattack(atom/target, mob/living/user, proximity) + + if(!target || !user || (isobj(target) && !isturf(target.loc)) || !user.psi || !user.psi.can_use() || !user.psi.spend_power(5)) + return + + //user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) FIX ME + user.psi.set_cooldown(5) + + var/distance = get_dist(get_turf(user), get_turf(focus ? focus : target)) + if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS)) + to_chat(user, span_warning("Your telekinetic power won't reach that far.")) + return FALSE + + if(target == focus) + attack_self(user) + else + user.visible_message(span_danger("[user] gestures sharply!")) + sparkle() + if(!isturf(target) && istype(focus,/obj/item) && target.Adjacent(focus)) + var/obj/item/I = focus + var/resolved = target.attackby(I, user, user.zone_selected) + if(!resolved && target && I) + I.afterattack(target,user,1) // for splashing with beakers + else + if(!focus.anchored) + var/user_rank = owner.psi.get_rank(PSI_PSYCHOKINESIS) + focus.throw_at(target, user_rank*2, user_rank*10, owner) + sleep(1) + sparkle() + owner.dropItemToGround(src) + +/obj/item/psychic_power/telekinesis/proc/sparkle() + set waitfor = 0 + if(focus) + var/obj/effect/overlay/O = new /obj/effect/overlay(get_turf(focus)) + O.name = "sparkles" + O.anchored = 1 + O.density = 0 + O.layer = FLY_LAYER + //O.set_dir(pick(cardinal)) + O.icon = 'icons/effects/effects.dmi' + O.icon_state = "nothing" + flick("empdisable",O) + sleep(5) + qdel(O) diff --git a/code/modules/psionics/events/_psi.dm b/code/modules/psionics/events/_psi.dm new file mode 100644 index 000000000000..9a40e22c61d8 --- /dev/null +++ b/code/modules/psionics/events/_psi.dm @@ -0,0 +1,20 @@ +/datum/round_event/psi + startWhen = 30 + endWhen = 120 + +/datum/round_event/psi/announce() + priority_announce( \ + "A localized disruption within the neighboring psionic continua has been detected. All psi-operant crewmembers \ + are advised to cease any sensitive activities and report to medical personnel in case of damage.", "Central Command Higher Dimensional Affairs") + +/datum/round_event/psi/end() + priority_announce( \ + "The psi-disturbance has ended and baseline normality has been re-asserted. \ + Anything you still can't cope with is therefore your own problem.", "Central Command Higher Dimensional Affairs") + +/datum/round_event/psi/tick() + for(var/thing in SSpsi.processing) + apply_psi_effect(thing) + +/datum/round_event/psi/proc/apply_psi_effect(var/datum/psi_complexus/psi) + return diff --git a/code/modules/psionics/events/mini_spasms.dm b/code/modules/psionics/events/mini_spasms.dm new file mode 100644 index 000000000000..47fdfc4b3b6d --- /dev/null +++ b/code/modules/psionics/events/mini_spasms.dm @@ -0,0 +1,69 @@ +/datum/round_event_control/minispasm + name = "Minispasms" + typepath = /datum/round_event/minispasm + weight = 8 + max_occurrences = 1 + earliest_start = 30 MINUTES + +/datum/round_event/minispasm + startWhen = 60 + endWhen = 90 + var/static/list/psi_operancy_messages = list( + "There's something in your skull!", + "Something is eating your thoughts!", + "You can feel your brain being rewritten!", + "Something is crawling over your frontal lobe!", + "THE SIGNAL THE SIGNAL THE SIGNAL THE SIGNAL THE", + "Something is drilling through your skull!", + "Your head feels like it's going to implode!", + "Thousands of ants are tunneling in your head!" + ) + +/datum/round_event/minispasm/announce() + priority_announce( \ + "PRIORITY ALERT: SIGMA-[rand(50,80)] NON-STANDARD PSIONIC SIGNAL-WAVE TRANSMISSION DETECTED - 97% MATCH, NON-VARIANT \ + SIGNAL SOURCE TRIANGULATED TO DISTANT SITE: All personnel are advised to avoid \ + exposure to active audio transmission equipment including radio headsets and intercoms \ + for the duration of the signal broadcast.", + "Central Command Higher Dimensional Affairs") + +/datum/round_event/minispasm/start() + var/list/victims = list() + for(var/obj/item/radio/radio in world) + if(radio.on) + for(var/mob/living/victim in range(radio.canhear_range, radio.loc)) + if(!isnull(victims[victim]) || victim.stat != CONSCIOUS || HAS_TRAIT(victim, TRAIT_DEAF)) + continue + victims[victim] = radio + for(var/thing in victims) + var/mob/living/victim = thing + var/obj/item/radio/source = victims[victim] + do_spasm(victim, source) + +/datum/round_event/minispasm/proc/do_spasm(mob/living/victim, obj/item/radio/source) + if(victim.psi) + playsound(source, 'sound/creatures/narsie_rises.ogg', 75) //LOUD AS FUCK BOY + to_chat(victim, span_danger("A hauntingly familiar sound hisses from \icon[source] \the [source], and your vision flickers!")) + victim.psi.backblast(rand(5,15)) + victim.Paralyze(0.5 SECONDS) + victim.Jitter(10 SECONDS) + else + victim.visible_message(span_danger("[victim] starts having a seizure!"), span_userdanger("An indescribable, brain-tearing sound hisses from \icon[source] \the [source], and you collapse in a seizure!")) + victim.Unconscious(20 SECONDS) + victim.Jitter(1 SECONDS) + SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "minispasm", /datum/mood_event/epilepsy) + var/new_latencies = rand(2,4) + var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS) + for(var/i = 1 to new_latencies) + to_chat(victim, span_danger("[pick(psi_operancy_messages)]")) + victim.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(10,20)) + victim.set_psi_rank(pick_n_take(faculties), 1) + sleep(30) + victim.psi.update() + sleep(4.5 SECONDS) + victim.psi.check_latency_trigger(100, "a psionic scream", redactive = TRUE) + +/datum/round_event/minispasm/end() + priority_announce( \ + "PRIORITY ALERT: SIGNAL BROADCAST HAS CEASED. Personnel are cleared to resume use of non-hardened radio transmission equipment. Have a nice day.", + "Central Command Higher Dimensional Affairs") diff --git a/code/modules/psionics/events/psi_balm.dm b/code/modules/psionics/events/psi_balm.dm new file mode 100644 index 000000000000..5fe731f36a24 --- /dev/null +++ b/code/modules/psionics/events/psi_balm.dm @@ -0,0 +1,27 @@ +/datum/round_event_control/balm + name = "Psi Balm" + typepath = /datum/round_event/psi/balm + weight = 20 + max_occurrences = 3 + max_alert = SEC_LEVEL_DELTA + +/datum/round_event/psi/balm + var/static/list/balm_messages = list( + "A soothing balm washes over your psyche.", + "For a moment, you can hear a distant, familiar voice singing a quiet lullaby.", + "A sense of peace and comfort falls over you like a warm blanket." + ) + +/datum/round_event/psi/balm/apply_psi_effect(var/datum/psi_complexus/psi) + var/soothed + if(psi.stun > 1) + psi.stun-- + soothed = TRUE + else if(psi.stamina < psi.max_stamina) + psi.adjust_stamina(rand(1,3)) + soothed = TRUE + else if(psi.owner.getOrganLoss(ORGAN_SLOT_BRAIN) > 0) + psi.owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, -1) + soothed = TRUE + if(soothed && prob(10)) + to_chat(psi.owner, span_notice("[pick(balm_messages)]")) diff --git a/code/modules/psionics/events/psi_wail.dm b/code/modules/psionics/events/psi_wail.dm new file mode 100644 index 000000000000..7ea284cbe9f7 --- /dev/null +++ b/code/modules/psionics/events/psi_wail.dm @@ -0,0 +1,27 @@ +/datum/round_event_control/wail + name = "Psi Wail" + typepath = /datum/round_event/psi/wail + weight = 20 + max_occurrences = 3 + max_alert = SEC_LEVEL_DELTA + +/datum/round_event/psi/wail + var/static/list/whine_messages = list( + "A nerve-tearing psychic whine intrudes on your thoughts.", + "A horrible, distracting humming sound breaks your train of thought.", + "Your head aches as a psychic wail intrudes on your psyche." + ) + +/datum/round_event/psi/wail/apply_psi_effect(var/datum/psi_complexus/psi) + var/annoyed + if(prob(1)) + psi.stunned(1) + annoyed = TRUE + else if(prob(10)) + psi.adjust_heat(rand(1,3)) + annoyed = TRUE + else if(psi.stamina) + psi.adjust_stamina(-rand(1,3)) + annoyed = TRUE + if(annoyed && prob(1)) + to_chat(psi.owner, span_notice("[pick(whine_messages)]")) diff --git a/code/modules/psionics/faculties/_faculty.dm b/code/modules/psionics/faculties/_faculty.dm new file mode 100644 index 000000000000..28827b91f6a7 --- /dev/null +++ b/code/modules/psionics/faculties/_faculty.dm @@ -0,0 +1,11 @@ +/datum/psionic_faculty + var/id + var/name + var/associated_intent + var/list/armour_types = list() + var/list/powers = list() + +/datum/psionic_faculty/New() + ..() + for(var/atype in armour_types) + SSpsi.armour_faculty_by_type[atype] = id diff --git a/code/modules/psionics/faculties/_power.dm b/code/modules/psionics/faculties/_power.dm new file mode 100644 index 000000000000..b4b0fe15a262 --- /dev/null +++ b/code/modules/psionics/faculties/_power.dm @@ -0,0 +1,57 @@ +/datum/psionic_power + /// Name. If null, psipower won't be generated on roundstart. + var/name + /// Associated psi faculty. + var/faculty + /// Minimum psi rank to use this power. + var/min_rank + /// Base psi stamina cost for using this power. + var/cost + /// Base heat gained for using this power. + var/heat + /// Deciseconds cooldown after using this power. + var/cooldown + /// Whether or not using this power prints an admin attack log. + var/admin_log = TRUE + /// This power functions from a distance. + var/use_ranged + /// This power functions at melee range. + var/use_melee + /// This power manifests an item in the user's hands. + var/use_manifest + /// A short description of how to use this power, shown via assay. + var/use_description + /// A sound effect to play when the power is used. + var/use_sound = 'sound/effects/psi/power_used.ogg' + +/datum/psionic_power/proc/invoke(mob/living/user, atom/target) + + if(!user.psi) + return FALSE + + if(faculty && min_rank) + var/user_rank = user.psi.get_rank(faculty) + if(user_rank < min_rank) + return FALSE + + if(cost && !user.psi.spend_power(cost, heat)) + return FALSE + + var/user_psi_leech = user.do_psionics_check(cost, user) + if(user_psi_leech) + to_chat(user, span_warning("Your power is leeched away by \the [user_psi_leech] as fast as you can focus it...")) + return FALSE + + if(target.do_psionics_check(cost, user)) + to_chat(user, span_warning("Your power skates across \the [target], but cannot get a grip...")) + return FALSE + + return TRUE + +/datum/psionic_power/proc/handle_post_power(mob/living/user, atom/target) + if(cooldown) + user.psi.set_cooldown(cooldown) + if(admin_log && ismob(user) && ismob(target)) + log_attack("[user] Used psipower ([name]) on [target]") + if(use_sound) + playsound(user.loc, use_sound, 75) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm new file mode 100644 index 000000000000..6912c5c6b47e --- /dev/null +++ b/code/modules/psionics/faculties/coercion.dm @@ -0,0 +1,399 @@ +#define COGMANIP_HYPNOTIZE "Hypnotize" +#define COGMANIP_ERASE_MEMORY "Erase Memory" +#define COGMANIP_THRALL "Thrall" + +/datum/psionic_faculty/coercion + id = PSI_COERCION + name = "Coercion" + associated_intent = INTENT_DISARM + +/datum/psionic_power/coercion + faculty = PSI_COERCION + +/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target) + if (!istype(target)) + to_chat(user, span_warning("You cannot mentally attack \the [target].")) + return FALSE + + . = ..() + +/datum/psionic_power/coercion/blindstrike + name = "Blindstrike" + cost = 8 + cooldown = 120 + use_ranged = TRUE + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." + +/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) + return FALSE + . = ..() + if(.) + user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) + to_chat(user, span_danger("You strike at all around you with a deafening psionic scream!")) + for(var/mob/living/M in orange(user, user.psi.get_rank(PSI_COERCION))) + if(M == user) + continue + M.emote("scream") + to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) + M.blind_eyes(1 SECONDS) + M.confused = rand(3,8) + return TRUE + +/datum/psionic_power/coercion/mindread + name = "Read Mind" + cost = 25 + heat = 15 + cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. + use_melee = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." + +/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) + return FALSE + . = ..() + if(!.) + return + + if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) + to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) + return TRUE + + user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) + var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text + if(!question || user.incapacitated() || !do_after(user, 20)) + return TRUE + + var/started_mindread = world.time + to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) + to_chat(target, span_notice("Your mind is compelled to answer: [question]")) // I wonder how this will go down with the playerbase + + var/answer = input(target, question, "Read Mind") as null|text + if(!answer || world.time > started_mindread + 25 SECONDS || user.stat != CONSCIOUS || target.stat == DEAD) + to_chat(user, span_notice("You receive nothing useful from \the [target].")) + else + to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) + log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") + return TRUE + +/datum/psionic_power/coercion/agony + name = "Agony" + cost = 20 + heat = 15 + cooldown = 7 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." + +/datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target)) + return FALSE + if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + return FALSE + . = ..() + if(.) + user.visible_message("\The [target] has been struck by \the [user]!") + playsound(user.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) + return TRUE + +/datum/psionic_power/coercion/spasm + name = "Spasm" + cost = 15 + cooldown = 100 + use_melee = TRUE + use_ranged = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." + +/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(target)) + return FALSE + + if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) + return FALSE + + . = ..() + + if(.) + to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") + to_chat(target, "The muscles in your arms cramp horrendously!") + if(prob(75)) + target.emote("scream") + if(prob(75) && target.held_items[1] && target.dropItemToGround(target.get_item_for_held_index(1))) + target.visible_message("\The [target] drops what they were holding as their left hand spasms!") + if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) + target.visible_message("\The [target] drops what they were holding as their right hand spasms!") + return TRUE + +/datum/psionic_power/coercion/cognitivemanipulation + name = "Cognitive Manipulation" + cost = 28 + cooldown = 20 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." + +/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user) + return FALSE + . = ..() + if(.) + if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) + to_chat(user, span_warning("\The [target] is dead!")) + return TRUE + user.visible_message(span_danger("\The [user] seizes the head of \the [target] in both hands...")) + + var/coercion_rank = user.psi.get_rank(PSI_COERCION) + var/target_coercion_rank = PSI_RANK_BLUNT + if(target.psi) + target_coercion_rank = target.psi.get_rank(PSI_COERCION) + var/relative_coercion_rank = target_coercion_rank ? coercion_rank - target_coercion_rank : coercion_rank + + var/list/radial_list = list() + var/radial_icon = 'icons/mob/screen_psi.dmi' + + if(coercion_rank >= PSI_RANK_GRANDMASTER) + var/datum/radial_menu_choice/choice = new + choice.image = icon(radial_icon, "hypnotise") + choice.info = "Make the target temporarily subject to a hypnosis-like effect, making them easily influenced by spoken words." + radial_list[COGMANIP_HYPNOTIZE] = choice + + choice = new + choice.image = icon(radial_icon, "erase") + choice.info = "Rewrite the targets mind to remove a specific memory, which can cure them of related ailments." + radial_list[COGMANIP_ERASE_MEMORY] = choice + + if(coercion_rank >= PSI_RANK_PARAMOUNT) + var/datum/radial_menu_choice/choice = new + choice.image = icon(radial_icon, "thrall") + choice.info = "Make the target a subservient thrall to your will." + radial_list[COGMANIP_THRALL] = choice + message_admins(COGMANIP_THRALL) + + if(!radial_list.len) + return TRUE + + var/choice = show_radial_menu(user, target, radial_list, require_near = TRUE, tooltips = TRUE) + + if(!(choice in radial_list)) + return TRUE + + var/mob/living/carbon/C = target + // So much text + if(relative_coercion_rank < PSI_RANK_OPERANT || (relative_coercion_rank == PSI_RANK_OPERANT && (istype(C) && !C.hypnosis_vulnerable()))) + to_chat(user, span_warning("[target] mind is too strong to hypnotize them!")) + if(target_coercion_rank >= PSI_RANK_OPERANT) + to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], but you manage to [relative_coercion_rank == 1 ? "barely " :""]repel the attack!")) + else if(target_coercion_rank == PSI_RANK_LATENT) + to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head holding strong.")) + else + // Non-psionics have no clue what is going on, but they should still have some indication of whats is happening + to_chat(target, span_notice("Your feel a strange sensation in your head.")) + return TRUE + if(target_coercion_rank >= PSI_RANK_OPERANT) + to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], and your mental barriers [relative_coercion_rank > 1 ? "shatter like glass" : "fail"]!")) + to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s mental barriers and start working on the task at hand.")) + else if(target_coercion_rank == PSI_RANK_LATENT) + to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head failing.")) + to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s amiture defenses and start working on the task at hand.")) + else + to_chat(target, span_notice("Your feel a strange sensation in your head.")) + + switch(choice) + if(COGMANIP_HYPNOTIZE) + if(!do_after(user, 30 SECONDS, target, FALSE)) + user.psi.backblast(rand(1, 5)) + return TRUE + to_chat(user, span_danger("You surgicaly rearange \the [target]'s neurons, leaving [target.p_them()] easily influinced by the next thing [target.p_they()] hear. Choice you next words carefuly...")) + target.apply_status_effect(/datum/status_effect/trance, relative_coercion_rank * 10 SECONDS, relative_coercion_rank >= 2) + + if(COGMANIP_ERASE_MEMORY) + if(!do_after(user, 30 SECONDS, target, FALSE)) + user.psi.backblast(rand(1, 5)) + return TRUE + var/lost_memory = pretty_filter(stripped_input(user, "What would you like [target] to forget?", "Cognative Manipulation")) + to_chat(user, span_danger("You surgicaly cut \the [target]'s hippocampus, removing every shread of memory surounding the phrase \"[lost_memory]\".")) + to_chat(target, "[lost_memory]") + to_chat(target, span_warning("You can't remember anything surounding that phrase!")) + + if(COGMANIP_THRALL) + if(!target.mind || !target.key) + to_chat(user, span_warning("\The [target] is mindless!")) + return TRUE + to_chat(user, span_warning("You plunge your mentality into that of \the [target]...")) + if(!do_after(user, target.stat == CONSCIOUS ? 2 MINUTES : 1 MINUTES, target, FALSE)) + user.psi.backblast(rand(10,25)) + return TRUE + to_chat(user, span_danger("You sear through \the [target]'s neurons, reshaping as you see fit and leaving them subservient to your will!")) + to_chat(target, span_danger("Your defenses have eroded away and \the [user] has made you their mindslave.")) + var/datum/antagonist/thrall/T = new() + T.master = user.mind + target.mind.add_antag_datum(T) + return TRUE + +/datum/psionic_power/coercion/assay + name = "Assay" + cost = 15 + cooldown = 10 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." + +/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) + return FALSE + . = ..() + if(.) + user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) + to_chat(user, span_notice("You insinuate your mentality into that of \the [target]...")) + to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) + if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) + user.psi.backblast(rand(5,10)) + return TRUE + to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) + to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) + target.show_psi_assay(user) + return TRUE + +/datum/psionic_power/coercion/focus + name = "Focus" + cost = 10 + cooldown = 8 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." + +/datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || target.pulledby != user) + return FALSE + . = ..() + if(.) + user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) + to_chat(user, span_notice("You probe \the [target]'s mind for various ailments..")) + to_chat(target, span_warning("Your mind is being cleansed of ailments by \the [user].")) + if(!do_after(user, (target.stat == CONSCIOUS ? 5 SECONDS : 2.5 SECONDS), target, FALSE)) + user.psi.backblast(rand(5,10)) + return TRUE + to_chat(user, span_warning("You clear \the [target]'s mind of ailments.")) + to_chat(target, span_warning("Your mind is cleared of ailments.")) + + var/coercion_rank = user.psi.get_rank(PSI_COERCION) + if(coercion_rank >= PSI_RANK_GRANDMASTER) + target.SetParalyzed(0) + if(coercion_rank >= PSI_RANK_PARAMOUNT) + target.SetParalyzed(0) + target.drowsyness = 0 + if(istype(target, /mob/living/carbon)) + var/mob/living/carbon/M = target + M.hallucination = max(M.hallucination, 10) + return TRUE + +/datum/psionic_power/coercion/commune + name = "Commune" + cost = 10 + cooldown = 8 SECONDS + use_melee = TRUE + use_ranged = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." + +/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) + return FALSE + . = ..() + if(.) + user.visible_message("[user] touches their fingers to their temple.") + var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) + + if(!text) + return + + if(target.stat == DEAD) + to_chat(user,"Not even a psion of your level can speak to the dead.") + return + + if (issilicon(target)) + to_chat(user,"This can only be used on living organisms.") + return + + log_say("[key_name(user)] communed to [key_name(target)]: [text]") + + for (var/mob/M in GLOB.player_list) + if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) + to_chat(M,"[user] psionically says to [target]: [text]") + + var/mob/living/carbon/human/H = target + if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) + to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") + else + to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") + if(istype(H)) + if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) + to_chat(H,"Your nose begins to bleed...") + H.add_splatter_floor(small_drip = TRUE) + else if(prob(25)) + to_chat(H,"Your head hurts...") + else if(prob(50)) + to_chat(H,"Your mind buzzes...") + +/datum/psionic_power/coercion/psiping + name = "Psi-ping" + cost = 30 + cooldown = 25 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." + +/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target) + if((target && user != target)) + return FALSE + . = ..() + if(.) + to_chat(user, "You take a moment to tune into the local Nlom...") + if(!do_after(user, 3 SECONDS, user)) + return + var/list/dirs = list() + for(var/mob/living/L in range(20)) + var/turf/T = get_turf(L) + if(!T || L == user || L.stat == DEAD || issilicon(L)) + continue + /* + var/image/ping_image = image(icon = 'icons/effects/effects.dmi', icon_state = "sonar_ping", loc = user) + ping_image.plane = LIGHTING_LAYER+1 + ping_image.layer = LIGHTING_LAYER+1 + ping_image.pixel_x = (T.x - user.x) * 32 + ping_image.pixel_y = (T.y - user.y) * 32 + user << ping_image + addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, ping_image), 8) + */ + var/direction = num2text(get_dir(user, L)) + var/dist + if(text2num(direction)) + switch(get_dist(user, L)) + if(0 to 10) + dist = "very close" + if(10 to 20) + dist = "close" + if(20 to 30) + dist = "a little ways away" + if(30 to 40) + dist = "farther away" + else + dist = "far away" + else + dist = "on top of you" + LAZYINITLIST(dirs[direction]) + dirs[direction][dist] += 1 + for(var/d in dirs) + var/list/feedback = list() + for(var/dst in dirs[d]) + feedback += "[dirs[d][dst]] psionic signature\s [dst]," + if(feedback.len > 1) + feedback[feedback.len - 1] += " and" + to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) + if(!length(dirs)) + to_chat(user, span_notice("You detect no psionic signatures but your own.")) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm new file mode 100644 index 000000000000..282fc52a67de --- /dev/null +++ b/code/modules/psionics/faculties/energistics.dm @@ -0,0 +1,128 @@ +/datum/psionic_faculty/energistics + id = PSI_ENERGISTICS + name = "Energistics" + associated_intent = INTENT_HARM + armour_types = list("bomb", "laser", "energy") + +/datum/psionic_power/energistics + faculty = PSI_ENERGISTICS + +/datum/psionic_power/energistics/disrupt + name = "Disrupt" + cost = 20 + heat = 20 + cooldown = 10 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." + +/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + return FALSE + if(isturf(target)) + return FALSE + . = ..() + if(.) + user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") + empulse(target, 0, 1) + return TRUE + +/datum/psionic_power/energistics/electrocute + name = "Electrocute" + cost = 10 + heat = 30 + cooldown = 7.5 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." + +/datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + return FALSE + if(isturf(target)) + return FALSE + . = ..() + if(.) + if(istype(target)) + user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target]!")) + target.electrocute_act(rand(15,45), user, 1, user.zone_selected) + return TRUE + else if(isatom(target)) + var/obj/item/stock_parts/cell/charging_cell = target.get_cell() + if(istype(charging_cell)) + user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target], charging it!")) + charging_cell.give(rand(15,45)) + return TRUE + else + return FALSE + +/datum/psionic_power/energistics/zorch + name = "Zorch" + cost = 15 + heat = 15 + cooldown = 2 SECONDS + use_ranged = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." + +/datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target) + . = ..() + if(.) + if(HAS_TRAIT(user, TRAIT_PACIFISM) && user.psi.zorch_harm) + to_chat(user, span_notice("You manage to stop yourself before firing a harmful laser from your eyes, you don't want to risk harming anyone...")) + + var/user_rank = user.psi.get_rank(faculty) + var/obj/item/projectile/pew + var/pew_sound + + if(user.psi.zorch_harm) + pew = new /obj/item/projectile/beam/laser(get_turf(user)) + else + pew = new /obj/item/projectile/beam/disabler(get_turf(user)) + + switch(user_rank) + if(PSI_RANK_PARAMOUNT) + pew.damage = 30 + pew.name = "gigawatt mental laser" + pew_sound = 'sound/weapons/lasercannonfire.ogg' + if(PSI_RANK_GRANDMASTER) + pew.damage = 20 + pew.name = "megawatt mental laser" + pew_sound = 'sound/weapons/Laser.ogg' + if(PSI_RANK_MASTER) + pew.damage = 10 + pew.name = "mental laser" + pew_sound = 'sound/weapons/Taser.ogg' + + if(istype(pew)) + playsound(pew.loc, pew_sound, 25, 1) + pew.original = target + pew.starting = get_turf(user) + pew.firer = user + pew.fire(Get_Angle(user, target)) + user.visible_message(span_danger("[user]'s eyes flare with light!")) + return TRUE + +/datum/psionic_power/energistics/spark + name = "Spark" + cost = 1 + cooldown = 1 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." + +/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target) + if(isnull(target) || istype(target)) + return FALSE + . = ..() + if(.) + if(istype(target,/obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/S = target + S.light("[user] snaps \his fingers and \the [S.name] lights up.") + user.emote("snap") + playsound(S.loc, "sparks", 50, 1) + else + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + return TRUE diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm new file mode 100644 index 000000000000..23b977a38e5a --- /dev/null +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -0,0 +1,114 @@ +/datum/psionic_faculty/psychokinesis + id = PSI_PSYCHOKINESIS + name = "Psychokinesis" + associated_intent = INTENT_GRAB + armour_types = list("melee", "bullet") + +/datum/psionic_power/psychokinesis + faculty = PSI_PSYCHOKINESIS + use_sound = null + +/datum/psionic_power/psychokinesis/psiblade + name = "Psiblade" + cost = 10 + cooldown = 3 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Click on or otherwise activate an empty hand while on harm intent to manifest a psychokinetic cutting blade. The power the blade will vary based on your mastery of the faculty." + use_sound = 'sound/effects/psi/power_fabrication.ogg' + use_manifest = TRUE + admin_log = FALSE + +/datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target) + if((target && user != target) || user.a_intent != INTENT_HARM) + return FALSE + . = ..() + if(.) + var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) + switch(user.psi.get_rank(faculty)) + if(PSI_RANK_PARAMOUNT) + blade.can_break_wall = TRUE + blade.wall_break_time = 3 SECONDS + blade.force = 40 + if(PSI_RANK_GRANDMASTER) + blade.can_break_wall = TRUE + blade.force = 30 + if(PSI_RANK_MASTER) + blade.force = 20 + else + blade.force = 10 + return blade + +/datum/psionic_power/psychokinesis/tinker + name = "Tinker" + cost = 5 + cooldown = 10 + min_rank = PSI_RANK_OPERANT + use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." + use_sound = 'sound/effects/psi/power_fabrication.ogg' + use_manifest = TRUE + admin_log = FALSE + +/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target) + if((target && user != target) || user.a_intent != INTENT_HELP) + return FALSE + . = ..() + if(.) + var/obj/item/psychic_power/tinker/tool = new(user) + switch(user.psi.get_rank(faculty)) + if(PSI_RANK_PARAMOUNT) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.toolspeed = 0.25 + if(PSI_RANK_GRANDMASTER) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.toolspeed = 0.5 + if(PSI_RANK_MASTER) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.toolspeed = 1 + if(PSI_RANK_OPERANT) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_MINING) + tool.toolspeed = 1.5 + return tool + +/datum/psionic_power/psychokinesis/telekinesis + name = "Telekinesis" + cost = 5 + cooldown = 1 SECONDS + use_ranged = TRUE + use_manifest = FALSE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." + admin_log = FALSE + use_sound = 'sound/effects/psi/power_used.ogg' + var/global/list/valid_machine_types = list( + /obj/machinery/door + ) + +/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) + if(user.a_intent != INTENT_GRAB) + return FALSE + . = ..() + if(.) + + var/distance = get_dist(user, target) + if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS) * 2) + to_chat(user, span_warning("Your telekinetic power won't reach that far.")) + return FALSE + + if(istype(target, /mob) || istype(target, /obj)) + var/obj/item/psychic_power/telekinesis/tk = new(user) + if(tk.set_focus(target)) + tk.sparkle() + user.visible_message("\The [user] reaches out.") + return tk + else if(istype(target, /obj/structure)) + user.visible_message("\The [user] makes a strange gesture.") + var/obj/O = target + O.attack_hand(user) + return TRUE + else if(istype(target, /obj/machinery)) + for(var/mtype in valid_machine_types) + if(istype(target, mtype)) + var/obj/machinery/machine = target + machine.attack_hand(user) + return TRUE + return FALSE diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm new file mode 100644 index 000000000000..51c49c334253 --- /dev/null +++ b/code/modules/psionics/faculties/redaction.dm @@ -0,0 +1,166 @@ +/datum/psionic_faculty/redaction + id = PSI_REDACTION + name = "Redaction" + associated_intent = INTENT_HELP + armour_types = list(BIO, RAD) + +/datum/psionic_power/redaction + faculty = PSI_REDACTION + admin_log = FALSE + +/datum/psionic_power/redaction/proc/check_dead(var/mob/living/target) + if(!istype(target)) + return FALSE + if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) + return TRUE + return FALSE + +/datum/psionic_power/redaction/invoke(var/mob/living/user, var/mob/living/target) + if(check_dead(target)) + return FALSE + . = ..() + +/datum/psionic_power/redaction/skinsight + name = "Skinsight" + cost = 3 + heat = 1 + cooldown = 3 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." + +/datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_CHEST || target.pulledby == user) + return FALSE + . = ..() + if(.) + user.visible_message(span_notice("\The [user] rests a hand on \the [target].")) + healthscan(user, target, user.psi.get_rank(PSI_REDACTION) >= PSI_RANK_GRANDMASTER) + return TRUE + +/datum/psionic_power/redaction/mend + name = "Mend" + cost = 7 + heat = 10 + cooldown = 5 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." + +/datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(user) || !istype(target) || target.pulledby != user || user.grab_state >= GRAB_AGGRESSIVE) + return FALSE + . = ..() + if(.) + var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) + + if(!E) + to_chat(user, span_warning("They are missing that limb.")) + return TRUE + + if(E.status == BODYPART_ROBOTIC) + to_chat(user, span_warning("That limb is prosthetic.")) + return TRUE + + user.visible_message(span_notice("\The [user] rests a hand on \the [target]'s [E.name]...")) + to_chat(target, span_notice("A healing warmth suffuses you.")) + + var/redaction_rank = user.psi.get_rank(PSI_REDACTION) + var/pk_rank = user.psi.get_rank(PSI_PSYCHOKINESIS) + + if(pk_rank >= PSI_RANK_LATENT && redaction_rank >= PSI_RANK_MASTER) + var/removal_size = clamp(5-pk_rank, 0, 5) + var/valid_objects = list() + for(var/obj/item/thing in E.embedded_objects) + if(thing.w_class >= removal_size) + valid_objects += thing + if(LAZYLEN(valid_objects)) + var/removing = pick(valid_objects) + target.remove_embedded_object(removing) + to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removing] free of \the [E].")) + return TRUE + + if(redaction_rank >= PSI_RANK_GRANDMASTER) + for(var/obj/item/organ/O in target.internal_organs) + if(O.damage > 0) + to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) + O.applyOrganDamage(-rand(redaction_rank, redaction_rank * 2)) + return TRUE + if(E.get_damage(TRUE)) + E.heal_damage((redaction_rank * 10), (redaction_rank * 10)) + to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) + new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") + return TRUE + + to_chat(user, span_notice("You can find nothing within \the [target]'s [E.name] to mend.")) + return FALSE + +/datum/psionic_power/redaction/cleanse + name = "Cleanse" + cost = 9 + heat = 15 + cooldown = 6 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." + +/datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(user) || !istype(target) || target.pulledby != user || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + return FALSE + . = ..() + if(.) + // No messages, as Mend procs them even if it fails to heal anything, and Cleanse is always checked after Mend. + var/removing = rand(20,25) + if(target.radiation) + to_chat(user, span_notice("You repair some of the radiation-damaged tissue within \the [target]...")) + if(target.radiation > removing) + target.radiation -= removing + else + target.radiation = 0 + return TRUE + if(target.getCloneLoss()) + to_chat(user, span_notice("You stitch together some of the mangled DNA within \the [target]...")) + if(target.getCloneLoss() >= removing) + target.adjustCloneLoss(-removing) + else + target.adjustCloneLoss(-(target.getCloneLoss())) + return TRUE + to_chat(user, span_notice("You can find no genetic damage or radiation to heal within \the [target].")) + return TRUE + +/datum/psionic_power/revive + name = "Revive" + cost = 25 + heat = 100 + cooldown = 8 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_PARAMOUNT + faculty = PSI_REDACTION + use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." + admin_log = FALSE + +/datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target) + if(!isliving(target) || !istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user || user.grab_state < GRAB_AGGRESSIVE) + return FALSE + . = ..() + if(.) + if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) + to_chat(user, span_warning("This person is already alive!")) + return TRUE + + if(((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT)) + to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) + return TRUE + + user.visible_message(span_notice("\The [user] splays out their hands over \the [target]'s body...")) + target.notify_ghost_cloning("Your heart is being revived!") + target.grab_ghost() + if(!do_after(user, 10 SECONDS, target, FALSE)) + user.psi.backblast(rand(10,25)) + return TRUE + + to_chat(target, span_notice("Life floods back into your body!")) + target.visible_message(span_notice("\The [target] shudders violently!")) + target.adjustOxyLoss(-rand(15,20)) + target.revive() + return TRUE diff --git a/code/modules/psionics/interfaces/ui.dm b/code/modules/psionics/interfaces/ui.dm new file mode 100644 index 000000000000..4cbf7f09206f --- /dev/null +++ b/code/modules/psionics/interfaces/ui.dm @@ -0,0 +1,20 @@ +obj/screen/psi + icon = 'icons/mob/screen_psi.dmi' + var/mob/living/owner + var/hidden = TRUE + +/obj/screen/psi/New(var/mob/living/_owner) + loc = null + owner = _owner + update_icon() + +/obj/screen/psi/Destroy() + if(owner && owner.client) + owner.client.screen -= src + . = ..() + +/obj/screen/psi/update_icon() + if(hidden) + invisibility = 101 + else + invisibility = 0 diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm new file mode 100644 index 000000000000..d23ee62e72a8 --- /dev/null +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -0,0 +1,98 @@ +/obj/screen/psi/hub + name = "Psi" + icon_state = "psi_suppressed" + screen_loc = "EAST-1:28,CENTER-4:7" + hidden = FALSE + maptext_x = 6 + maptext_y = -8 + var/image/on_cooldown + var/mutable_appearance/heat_bar + var/mutable_appearance/heat_bar_filling + var/list/components + +/obj/screen/psi/hub/New(var/mob/living/_owner) + on_cooldown = image(icon, "cooldown") + heat_bar = mutable_appearance(icon, "heat_bar") + heat_bar.pixel_y += 28 + heat_bar_filling = mutable_appearance(icon, "") + heat_bar_filling.pixel_y += 28 + components = list( + new /obj/screen/psi/armour(_owner), + new /obj/screen/psi/autoredaction(_owner), + new /obj/screen/psi/zorch_harm(_owner), + new /obj/screen/psi/limiter(_owner), + new /obj/screen/psi/toggle_psi_menu(_owner, src) + ) + ..() + START_PROCESSING(SSprocessing, src) + +/obj/screen/psi/hub/update_icon() + if(!owner.psi) + return + cut_overlays() + icon_state = owner.psi.suppressed ? "psi_suppressed" : "psi_active" + if(world.time < owner.psi.next_power_use) + add_overlay(on_cooldown) + heat_bar_filling.icon_state = "heat_[round(owner.psi.heat / 5, 5)]" + switch(owner.psi.heat) + if(400 to 500) + heat_bar_filling.color = "#FF0033" + if(300 to 400) + heat_bar_filling.color = "#FF9933" + if(100 to 300) + heat_bar_filling.color = "#00FF33" + if(0 to 100) + heat_bar_filling.color = "#6699FF" + add_overlay(heat_bar) + add_overlay(heat_bar_filling) + var/offset = 1 + for(var/thing in components) + var/obj/screen/psi/component = thing + component.update_icon() + if(!component.invisibility) + component.screen_loc = "EAST-[++offset]:28,CENTER-4:7" + +/obj/screen/psi/hub/Destroy() + STOP_PROCESSING(SSprocessing, src) + owner = null + for(var/thing in components) + qdel(thing) + components.Cut() + . = ..() + +/obj/screen/psi/hub/process() + if(!istype(owner)) + qdel(src) + return + if(!owner.psi) + return + maptext = "[round((owner.psi.stamina/owner.psi.max_stamina)*100)]%" + update_icon() + +/obj/screen/psi/hub/MouseEntered(location, control, params) + . = ..() + openToolTip(usr, src, params, title = "[owner.mind.name]'s Psi Complexus", content = "Stamina: [(owner.psi.stamina/owner.psi.max_stamina)*100]%\nHeat: [owner.psi.heat]\nStuned: [owner.psi.stun ? "True" : "False"]\n") + +/obj/screen/psi/hub/MouseExited(location, control, params) + . = ..() + closeToolTip(usr) + +/obj/screen/psi/hub/Click(var/location, var/control, var/params) + var/list/click_params = params2list(params) + if(click_params["shift"]) + owner.show_psi_assay(owner) + return + + if(owner.psi.suppressed && owner.psi.stun) + to_chat(owner, "You are dazed and reeling, and cannot muster enough focus to do that!") + return + + owner.psi.suppressed = !owner.psi.suppressed + to_chat(owner, "You are [owner.psi.suppressed ? "now suppressing" : "no longer suppressing"] your psi-power.") + if(owner.psi.suppressed) + owner.psi.cancel() + owner.psi.hide_auras() + else + owner.playsound_local(soundin = 'sound/effects/psi/power_unlock.ogg') + owner.psi.show_auras() + update_icon() diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm new file mode 100644 index 000000000000..da9ae39a873b --- /dev/null +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -0,0 +1,114 @@ +// Begin psi armour toggle. +/obj/screen/psi/armour + name = "Psi-Armour" + icon_state = "psiarmour_off" + +/obj/screen/psi/armour/update_icon() + ..() + if(invisibility == 0) + icon_state = owner.psi.use_psi_armour ? "psiarmour_on" : "psiarmour_off" + +/obj/screen/psi/armour/Click() + if(!owner.psi) + return + owner.psi.use_psi_armour = !owner.psi.use_psi_armour + to_chat(owner, span_notice("You will [owner.psi.use_psi_armour ? "no longer" : "now"] use your psionics to deflect or block incoming attacks.")) + update_icon() + +// End psi armour toggle. + +// Begin autoredaction toggle. +/obj/screen/psi/autoredaction + name = "Autoredaction" + icon_state = "healing_off" + +/obj/screen/psi/autoredaction/update_icon() + ..() + if(invisibility == 0) + icon_state = owner.psi.use_autoredaction ? "healing_on" : "healing_off" + +/obj/screen/psi/autoredaction/Click() + if(!owner.psi) + return + owner.psi.use_autoredaction = !owner.psi.use_autoredaction + to_chat(owner, span_notice("You will [owner.psi.use_autoredaction ? "now" : "no longer"] use your psionics to regenerate.")) + update_icon() + +// End autoredaction toggle. + +// Begin zorch harm toggle. +/obj/screen/psi/zorch_harm + name = "Zorch Mode" + icon_state = "zorch_disable" + +/obj/screen/psi/zorch_harm/update_icon() + ..() + if(invisibility == 0) + icon_state = owner.psi.zorch_harm ? "zorch_harm" : "zorch_disable" + +/obj/screen/psi/zorch_harm/Click() + if(!owner.psi) + return + owner.psi.zorch_harm = !owner.psi.zorch_harm + to_chat(owner, span_notice("You will now fire [owner.psi.zorch_harm ? "lethal" : "non-lethal"] lasers with your psionics.")) + update_icon() + +// End zorch harm toggle. + +// Begin limiter toggle. +/obj/screen/psi/limiter + name = "Psi-Limiter" + icon_state = "limiter_100" + +/obj/screen/psi/limiter/update_icon() + ..() + if(invisibility == 0) + switch(owner.psi.limiter) + if(100) + icon_state = "limiter_100" + if(300) + icon_state = "limiter_300" + if(INFINITY) + icon_state = "limiter_500" + +/obj/screen/psi/limiter/Click() + if(!owner.psi) + return + switch(owner.psi.limiter) + if(100) + owner.psi.limiter = 300 + if(300) + owner.psi.limiter = INFINITY + if(INFINITY) + owner.psi.limiter = 100 + if(owner.psi.limiter == INFINITY) + to_chat(owner, span_warning("You release your self imposed shackles!")) + else + to_chat(owner, span_notice("Your mental limiters will stop you at [owner.psi.limiter] heat.")) + update_icon() + +// End limiter toggle. + +// Menu toggle. +/obj/screen/psi/toggle_psi_menu + name = "Show/Hide Psi UI" + icon_state = "arrow_left" + var/obj/screen/psi/hub/controller + +/obj/screen/psi/toggle_psi_menu/New(var/mob/living/_owner, var/obj/screen/psi/hub/_controller) + controller = _controller + ..(_owner) + +/obj/screen/psi/toggle_psi_menu/Click() + var/set_hidden = !hidden + for(var/thing in controller.components) + var/obj/screen/psi/psi = thing + psi.hidden = set_hidden + controller.update_icon() + +/obj/screen/psi/toggle_psi_menu/update_icon() + if(hidden) + icon_state = "arrow_left" + else + icon_state = "arrow_right" +// End menu toggle. diff --git a/code/modules/psionics/mob/mob.dm b/code/modules/psionics/mob/mob.dm new file mode 100644 index 000000000000..c2f576780f78 --- /dev/null +++ b/code/modules/psionics/mob/mob.dm @@ -0,0 +1,20 @@ +/mob/living + var/datum/psi_complexus/psi + +/mob/living/Login() + . = ..() + if(psi) + psi.update(TRUE) + if(!psi.suppressed) + psi.show_auras() + +/mob/living/Destroy() + QDEL_NULL(psi) + . = ..() + +/mob/living/proc/set_psi_rank(faculty, rank, take_larger, defer_update, temporary) + if(!psi) + psi = new(src) + var/current_rank = psi.get_rank(faculty) + if(current_rank != rank && (!take_larger || current_rank < rank)) + psi.set_rank(faculty, rank, defer_update, temporary) diff --git a/code/modules/psionics/mob/mob_assay.dm b/code/modules/psionics/mob/mob_assay.dm new file mode 100644 index 000000000000..9c898591a53f --- /dev/null +++ b/code/modules/psionics/mob/mob_assay.dm @@ -0,0 +1,79 @@ +/mob/living/proc/show_psi_assay(var/mob/viewer) + + if(!viewer) viewer = usr + + var/use_He_is = "You are" + var/use_He_has = "You have" + if(istype(machine) || viewer != src) + use_He_is = "[p_they(TRUE)] [p_are()]" + use_He_has = "[p_they(TRUE)] [p_have()]" + + var/list/dat = list() + + dat += "

Summary

" + dat += "
" + + if(psi) + + // Hi Warhammer 40k rating system, how are you? + // I hope you get along with the Galactic Milieu metapsychics. + var/use_rating + var/effective_rating = psi.rating + if(effective_rating > 1 && psi.suppressed) + effective_rating = max(0, psi.rating-2) + var/rating_descriptor + /* FIX THIS + if(viewer != usr && thralls?.mind?.has_antag_datum() && ishuman(viewer)) + var/mob/living/H = viewer + if(H.psi && H.psi.get_rank(PSI_REDACTION) >= PSI_RANK_GRANDMASTER) + dat += "Their mind has been cored like an apple, and enslaved by another operant psychic." + */ + if(!use_rating) + switch(effective_rating) + if(1) + use_rating = "[effective_rating]-Epsilon" + rating_descriptor = "This indicates the presence of minor latent psi potential with little or no operant capabilities." + if(2) + use_rating = "[effective_rating]-Delta" + rating_descriptor = "This indicates the presence of minor psi capabilities of the Operant rank or higher." + if(3) + use_rating = "[effective_rating]-Gamma" + rating_descriptor = "This indicates the presence of psi capabilities of the Master rank or higher." + if(4) + use_rating = "[effective_rating]-Beta" + rating_descriptor = "This indicates the presence of significant psi capabilities of the Grandmaster rank or higher." + if(5) + use_rating = "[effective_rating]-Alpha" + rating_descriptor = "This indicates the presence of major psi capabilities of the Paramount Grandmaster rank or higher." + else + use_rating = "[effective_rating]-Lambda" + rating_descriptor = "This indicates the presence of trace latent psi capabilities." + + dat += "[use_He_has] an overall psi rating of [use_rating].
[rating_descriptor]
" + + dat += "[use_He_is] currently [psi.suppressed ? "suppressing" : "not suppressing"] your psychic operancy.
" + dat += "[use_He_has] [psi.stamina]/[psi.max_stamina] psi stamina remaining.
" + dat += "
" + + for(var/faculty_id in psi.ranks) + var/datum/psionic_faculty/faculty = SSpsi.get_faculty(faculty_id) + if(psi.ranks[faculty.id] > 0) + dat += "[use_He_is] assayed at the rank of [GLOB.psychic_ranks_to_strings[psi.ranks[faculty.id]]] for the [faculty.name] faculty.
" + else + dat += "[use_He_has] no notable power within the [faculty.name] faculty.
" + dat += "
" + + if(viewer == usr) + dat += "" + for(var/faculty_id in psi.ranks) + var/list/check_powers = psi.get_powers_by_faculty(faculty_id) + if(LAZYLEN(check_powers)) + var/datum/psionic_faculty/faculty = SSpsi.get_faculty(faculty_id) + dat += "" + for(var/datum/psionic_power/power in check_powers) + dat += "" + dat += "

Psi-power Usage

[use_He_has] access to the following psi-powers within the [faculty.name] faculty:
[power.name][power.use_description]
" + + var/datum/browser/popup = new(viewer, "psi_assay_\ref[src]", "Psi-Assay") + popup.set_content(jointext(dat,null)) + popup.open() diff --git a/code/modules/psionics/null/_null.dm b/code/modules/psionics/null/_null.dm new file mode 100644 index 000000000000..3b4b09e07253 --- /dev/null +++ b/code/modules/psionics/null/_null.dm @@ -0,0 +1,28 @@ +/atom/proc/disrupts_psionics() + for(var/atom/movable/AM in contents) + if(!istype(AM) || AM == src) + continue + var/disrupted_by = AM.disrupts_psionics() + if(disrupted_by) + return disrupted_by + return FALSE + +/atom/proc/do_psionics_check(var/stress, var/atom/source) + var/turf/T = get_turf(src) + if(istype(T) && T != src) + var/V = T.do_psionics_check(stress, source) + if(V) + return V + stress = withstand_psi_stress(stress, source) + var/V = disrupts_psionics() + return V + +/atom/proc/withstand_psi_stress(var/stress, var/atom/source) + . = max(stress, 0) + if(.) + for(var/thing in contents) + var/atom/movable/AM = thing + if(istype(AM) && AM != src && AM.disrupts_psionics()) + . = AM.withstand_psi_stress(., source) + if(. <= 0) + break diff --git a/code/modules/psionics/null/chemistry.dm b/code/modules/psionics/null/chemistry.dm new file mode 100644 index 000000000000..68db9e953f31 --- /dev/null +++ b/code/modules/psionics/null/chemistry.dm @@ -0,0 +1,35 @@ +/datum/reagent/crystal + name = "crystallizing agent" + taste_description = "sharpness" + reagent_state = LIQUID + color = "#13bc5e" + +/datum/reagent/crystal/affect_blood(var/mob/living/carbon/M, var/alien, var/removed) + var/result_mat = (M.psi || (M.mind && GLOB.wizards.is_antagonist(M.mind))) ? MATERIAL_NULLGLASS : MATERIAL_CRYSTAL + if(ishuman(M)) + var/mob/living/carbon/human/H = M + if(prob(5)) + var/obj/item/organ/external/E = pick(H.organs) + if(!E || E.is_stump() || BP_IS_ROBOTIC(E)) + return + if(BP_IS_CRYSTAL(E)) + E.heal_damage(rand(3,5), rand(3,5)) + if(BP_IS_BRITTLE(E) && prob(5)) + E.status &= ~ORGAN_BRITTLE + else if(E.organ_tag != BP_CHEST && E.organ_tag != BP_GROIN) + to_chat(H, SPAN_DANGER("Your [E.name] is being lacerated from within!")) + if(H.can_feel_pain()) + H.emote("scream") + if(prob(25)) + for(var/i = 1 to rand(3,5)) + new /obj/item/weapon/material/shard(get_turf(E), result_mat) + E.droplimb(0, DROPLIMB_BLUNT) + else + E.take_external_damage(rand(20,30), 0) + E.status |= ORGAN_CRYSTAL + E.status |= ORGAN_BRITTLE + return + to_chat(M, SPAN_DANGER("Your flesh is being lacerated from within!")) + M.adjustBruteLoss(rand(3,6)) + if(prob(10)) + new /obj/item/weapon/material/shard(get_turf(M), result_mat) diff --git a/code/modules/psionics/null/flooring.dm b/code/modules/psionics/null/flooring.dm new file mode 100644 index 000000000000..b7751417da57 --- /dev/null +++ b/code/modules/psionics/null/flooring.dm @@ -0,0 +1,17 @@ +/turf/open/floor + var/psi_null + +/turf/open/floor/disrupts_psionics() + return (psi_null ? src : FALSE) + +/turf/open/floor/nullglass + name = "nullglass plating" + desc = "You can hear the tiles whispering..." + icon_state = "light_off" + psi_null = TRUE + floor_tile = /obj/item/stack/tile/mineral/nullglass + +/obj/item/stack/tile/mineral/nullglass + name = "nullglass floor tile" + icon_state = "tile_e" + turf_type = /turf/open/floor/nullglass diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 48077660403e..9c13794ba687 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -794,3 +794,80 @@ M.emote(pick("twitch","drool","moan","giggle")) ..() . = 1 + +/datum/reagent/drug/three_eye + name = "Three Eye" + taste_description = "liquid starlight" + description = "Three Eye is one of the most notorious narcotics to ever come out of the independant habitats, allowing those who take it to see through walls." + reagent_state = LIQUID + color = "#ccccff" + metabolization_rate = REAGENTS_METABOLISM + overdose_threshold = 25 + + // M A X I M U M C H E E S E + var/global/list/dose_messages = list( + "Your name is called. It is your time.", + "You are dissolving. Your hands are wax...", + "It all runs together. It all mixes.", + "It is done. It is over. You are done. You are over.", + "You won't forget. Don't forget. Don't forget.", + "Light seeps across the edges of your vision...", + "Something slides and twitches within your sinus cavity...", + "Your bowels roil. It waits within.", + "Your gut churns. You are heavy with potential.", + "Your heart flutters. It is winged and caged in your chest.", + "There is a precious thing, behind your eyes.", + "Everything is ending. Everything is beginning.", + "Nothing ends. Nothing begins.", + "Wake up. Please wake up.", + "Stop it! You're hurting them!", + "It's too soon for this. Please go back.", + "We miss you. Where are you?", + "Come back from there. Please." + ) + + var/global/list/overdose_messages = list( + "THE SIGNAL THE SIGNAL THE SIGNAL THE SIGNAL", + "IT CRIES IT CRIES IT WAITS IT CRIES", + "NOT YOURS NOT YOURS NOT YOURS NOT YOURS", + "THAT IS NOT FOR YOU", + "IT RUNS IT RUNS IT RUNS IT RUNS", + "THE BLOOD THE BLOOD THE BLOOD THE BLOOD", + "THE LIGHT THE DARK A STAR IN CHAINS" + ) + +/datum/reagent/drug/three_eye/on_mob_metabolize(mob/living/L) + ..() + ADD_TRAIT(L, TRAIT_XRAY_VISION, type) + L.add_client_colour(/datum/client_colour/thirdeye) + L.update_sight() + +/datum/reagent/drug/three_eye/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_XRAY_VISION, type) + L.remove_client_colour(/datum/client_colour/thirdeye) + L.update_sight() + ..() + +/datum/reagent/drug/three_eye/on_mob_life(mob/living/carbon/M) + M.hallucination += 50 + M.Jitter(3) + M.Dizzy(3) + if(prob(0.1)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.Jitter(350) + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(8, 12)) + if(prob(5)) + to_chat(M, span_warning("[pick(dose_messages)]")) + +/datum/reagent/drug/three_eye/overdose_process(mob/living/M) + ..() + M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(1, 5)) + if(prob(10)) + M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) + M.Unconscious(100) + M.Jitter(350) + if(prob(10)) + to_chat(M, span_danger("[pick(overdose_messages)]")) + if(M.psi) + M.psi.check_latency_trigger(30, "a Three Eye overdose") diff --git a/code/modules/reagents/reagent_containers/pill.dm b/code/modules/reagents/reagent_containers/pill.dm index db90e30e6812..fdecb570ad8f 100644 --- a/code/modules/reagents/reagent_containers/pill.dm +++ b/code/modules/reagents/reagent_containers/pill.dm @@ -256,6 +256,12 @@ icon_state = "pill_happy" list_reagents = list(/datum/reagent/drug/happiness = 10) +/obj/item/reagent_containers/pill/three_eye + name = "strange pill" + desc = "The surface of this unlabelled pill crawls against your skin." + icon_state = "pill12" + list_reagents = list(/datum/reagent/drug/three_eye = 10) + /obj/item/reagent_containers/pill/floorpill name = "floorpill" desc = "A strange pill found in the depths of maintenance." diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 2fc7d0a542aa..985fac9132d1 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -965,6 +965,20 @@ build_path = /obj/item/ammo_casing/a357 category = list("hacked", "Security") +/obj/item/projectile/bullet/a357/nullglass + name = ".357 NULL bullet" + damage = 30 + +/obj/item/projectile/bullet/a357/nullglass/disrupts_psionics() + return src + +/obj/item/projectile/bullet/a357/nullglass/on_hit(atom/target) + . = ..() + if(prob(50)) + var/obj/item/implant/nullglass/imp = new() + imp.implant(target) + playsound(loc, 'sound/effects/glass_step.ogg', 30, TRUE) + /datum/design/a357/ironfeather name = ".357 Ironfeather Bullet" id = "a357_ironfeather" diff --git a/icons/effects/psi_aura_small.dmi b/icons/effects/psi_aura_small.dmi new file mode 100644 index 0000000000000000000000000000000000000000..f5e222b61f5ff79daadc01cfc7fa6cd8c32ea515 GIT binary patch literal 3594 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 Dnh48Y literal 0 HcmV?d00001 diff --git a/icons/mob/clothing/head/head.dmi b/icons/mob/clothing/head/head.dmi index 6710eb3d925f8c9bae65bbe65717ac726748347b..8b4eda3147496de377df1a1982df61bb786c2855 100644 GIT binary patch delta 18697 zcmZsi2|QHa|NqAl3Zb$kOQ}?fN>Pa+qEZyuW3un2lzq91P}a(l6bfaZtYe+AWXVn# z`&g3Q*k&Xn*v)psv=lyz~_ZIg?NsO0X>G;k*n1eAx`>oc!)7KC8A!?D~f&@U?*%gx5M0@MJLY3r{K zTv%gK*EzTUdZ*EH;j-L#wQIG3|5$3k-aFEr=Q|4U&iAU!-|HpcN`9AEVV39g-rS08 z?VdI3cs!f`d1goOp6rl4CsOf}GoF{8*mGQ;yE4a>MqauopRCY8o~E7;pHjd*nAxPE z7O|xx$ZpU?fW>=>G%nBHmYJ_Um)pm=S7=lA3o#(hWYHR`1cj12Z`9yDTZv}0&dSHz{io{;Gw?FP$ z{6;&v>!Y$PkerFewBSg;V5ZpL1Z6uL>M zr>wthi=2!3*&X|R(b1`O(K{)RYlQy+zaFerLW5K?BPb9A@b8;_ zoN^BZtN8t%Ki0;^qS9Fkzd+xm-$;(=3gJJn@7eKAX`pCoT>0$$3&LY+D4U&}%m-7k z%)*8PQ%PKygBK&!nr_O#ytxuKH?0?lA=i!w4BMsqb!cWvHT5ecPA!_XZzu77N9Ut6gTLN>*yUj z^_8*QnKq)yPhVqm>pjAws$nUx&&4=M>k8m1r*|XpZ zN4m3nU_lL8e%L_rni+NPwff4_z z0LGt$y)1ybUR{@$UXq3IPBCd1#XLP{kfsIaw} zSojeIh5gL=PA84B)P19ljEn%`JfffTA5`iuc27>$ha|+uA0Xc3TM==`(!GF%C*K~b ze|GyGF_#b*clUvU@7}JVYg1PYLTB4&kzg@1Z-=5e+aXFYelH?`VXLd*5Ee?i2otI? z5G;LJ;AC5hIC@Rm`f*FfYJT2#C++0pTyL(s z(jGO>)?GaOT4E}NYJ?ORUQztsw!slf68yN=Tj#0e}8c1E=@%udvzKHw? z(nw2RU32RFr3Ov}EBU2)=k*I8F64SnU(qQ9KY*$HLsi$hQ^xez9e17IDyNE+91uz79Ta14}7BvJ|n%e|4{Cq{a$+?ocRxG-0pJ$Y7AwHZ3M&~|02X%>`1xc8wO-PV69vLjO zh*S^Z5cL4%<>WYE7oXxJ6ml`B5iv#AZv_u3_l0osB?>jTV7;C`EoH5c44-c~l9G(1 zI{gx>1qL%Q0#Bw;%irsW&Ae*7|MQ5}se+YhOQE9}@T&J^U=5&gouDG;+mb#L*LevWfEMG2YAOF8-jN zq0-(u4?0-{nf{UiT#{k&9`jbPCoHF@#D)k1#~V1jxd;8MqaOvGCeKaX>TW z$1Qwbug$u!hnQdx+o}vpZna#s*N>u^hy{UYUGWUwz)j5*0w&)erU zDj>UT9uQFTCIwN(XnRH1yY(7P9T(n}irsKF2hpyViQSmM5Mk(j`_R?tsra(e_w*N# zW}G(jdPSd#C9lbRWnt&^qlqHgWMyk&Dru5eb+l9z2w>8AiMqhl>>s#?01OZ;ZYV!x zA5)({G8)9#g|^zNGcYN>2OfWS$2&%%Vr33-_EB~X6`FAs7W+4T?^p_6nwTgPFQ@NB z)=VFi#kt-$mY4;+2zBL@X8M*3xTq?tCbxW1&Y5jhs-mJo#I3rOw@!WwyM6NX<*5v? zbIB1*K{qL_YG*Z*v6q2|55OFE^RqPR(eGa+iK4|9PpiJHlq`5n^}iX~6-=l@c<~n& z$X^4)nq>0mhmsEprD=NUez_tvOv4(CC)PYIa=Sk!a$T%}n-SA)Z9jB6)%ENKt@dE^ zwX)Hw_~CMzgh;-lhE`{bh8>pWVb5jGwu72}D^GTM;@Gc`$^EPX;)fOQ$zEs>4-oer z$_gv=t1{DQy7WOVd`qR`?VC44;NjhEq?J(?*eDvQjVrWp3516IBrjo9iQ;yf-COSk!2uTtyKg&cK86imTcj$HH9fa#NV1B(DKv}2)ETrO$@3uX=#tj-vbUkW|z zlR8Oq7q?VTI6Jpk-FG9U(b3l6$6aE}!5fN`mX-2P4h;~oNc`k5?2w^<9bzHn+sFu8 z#8`3G1@$pYb80s%b^g3#qZ$X`UQAX~%5Bby(FkyTv2LPnu?Qb9~v&pl+>O*tWKwcs{xg=`25?h)izJL+>I=bq%Y3#O?FF7 z?)?r^^Wt~8|1r`ER4D>~FOH%Y(wbVdT;UmCS9AtavW-^gLB1?CWL&lz-2tYj`RC{2 z`BUyu`wksCLjMsVeEjH%tSmX5P|1291>o(FfC>Eh*`D*LJg{EWI0b`gYHN>1<)$Sk=gh|@Ti{#Iy|a*n z{qFjRim{shzB_E7%sNn^`JoqmVSzirPbsx-8~@(s7Wr{lH@LO+Vv&sW`kS5e6JvC+ zG^(M}rt+O4Q4h-QcS7XhvBShpk&s~`fxfg4C}SuAVs4Zj^Bjz*4cGlZb2BruX!ydX z!@FM~<+<_(d018^d_Tc=F(mJyL0C(Q_OK;&u6`d3Dp6aR&+?OkLb2 zs~a$lvAAglsx&le4A{JQaV!D=*7j;FMoyZWgRe)e`(y25)s;aP^on7uuuvi_PV)QL zuH;{6kdAnNERd0;mzsX)phPq@5%_E3${qQM`t27K^I2gTfwE?~Hs_r6FA*pNe+^mM#`N-Q#6r z1DUEfjgmtwp)9RK#aaDi#7&lLpon3-OJ+`)jaVG~KKv{L6DGI{jx%Hg#3pJrR1_g) z#9IrlGrAciU|1@sk{VFv4Ei#X01$|cj5JsU7;HS1*jm5Sb_NoPwMv6={1dOpAbe|2 zLmX|?rv6P?#oRMcmp#}?I!uPcS#^4PIzFcz4kdIVc4Qv!%xlLLpX96dN@O`(2vXO^ z7oJWR#vo?M%ORIckf#sr4ey7Ugc8g~q%6H)snDGH-rSr^WS3@pv?2nqfBm^|PRP{e zM0=5JfsNmGExmQ(qdprKVygO~CKud$HK56Ot?=Xi)PIFyBBLYPmZ4) zuhOQ~sz|FCIKviX1B9cvrkZkrsl*peJ>B6Qm)965lM)l{Oh^(6gD*hCgRMt9wR)Zj@CQp7S&mFaD#hjN%FR zF|O+In98)W@9!;YtFMcHql7%sBtAYzRm$2GhgYsDw^GoW8Am#k!J*VPcr@rj(^#69Dn6;fM(bU(vC)0f* zBx>vSr9G!I2MXl^ILBoB06yN>=8Yfwd7xJq-xLrL={jNtJ>>a8l@S*~%;^z^j2l)$ zQer+ba|I_h2mn*cla{Yj#n0D$V??fv@1f&R4N3KT=KjfGsBOqKc7cd-T*LV}U}ewF z`>J0mlQT0j3F&dVura(54bJ4 z?H&3~Rr+e7wwEXujG5aLVRGprUn|>52qz4qk&=Zfl`QIqUvouAG>ONKuv8$PTY7zR z#|P2l&p0`;037rBG)YNG)X`(dZu$$I{%<9=`gmaae=D*7A;s7%5EZ42QMuE6_xrK& zkd3HZ&^K0hMoX;y5o0XmN`hYOcsL49+jH!jG--l&(QS36?-pD373}5?;ssravV#bx zqWm{JCkJ|fg*i}X5m-?H5kF7wQ#R7$gt^i(7t1H~Za?!fKO&m%#~}0o&2;CuT{>g2 z;jEQZ@kdC9{Yusq9<&UbN6n7~VK6D!O-=Rt-yZ%jBT}BFVU_a1kuwgk zhjIRrm37iuu*MZq)`|!g>}%R&RlBX zz0w@$-xA~Dtjs;8o`D4f*H%Z7ar)-fR0~%!D-4_I-oU&HR`dH<&y|VGb&6Iy@5Db3 zMyf4$(h0^b2P7n3t*zbd_^6E7y>*H*`&Q-zov`o>nrDw3eVz`ST3W5!n&K7=`0$cJ z-l~Hp)&bGHIO)*~4f3X6dssW^g~9S|S6-NpUfA>036`3N2fD$*Lov@;VXHl+GYL*|v-`FlBAeY$u%;XwKFoF@FJIYa@xqA{6#XD@)9Z-HS~V+XYe-kK zJn1K}vPgc?;xYBeuw1cT@$+*Ag(e-11?QF-Uk6a&fCG4I$1nOEJvKJhxMxe31U~;?wqKKj&d+ReYGTfY;oFooMCj8d;0xe5a9?{?O zCS(2$lyl1V^8 zyi*`=vOMQ!`c?~}Z_#T>BKnSR3#@|e5nWgiwI z7rw%^P*|vZ>IXW*Vzhh_cxS81rFZLAaTB!6Rc;%~_|Sd6gKrHX9-0<^1WC-0-*Yu> zE#HlfXL3@=B3X(E3O>G~gd0Bk`*+bh1_2Qm!+919`tt!E2i4XR&wOQ^v^iupn=m0? z`GgGjNsRJ?o>-n0o79RaaHiKr_9NJBSOH_3Q)~1pY{-fMLg-4XJ17!1|HcQ<(y6L4F_+L^5H0Ap6#_h&1WU{WVfF7PIM4m`we9D=2H%-*h1JZ~ia zR^V_=KdW(FYtcYL-FQ-f!|U4jGhys!gNr^X-z}p~EaqD7=J$ct6}3z-SRV2(Zdnjr zyd4WHaX{EA6%_VGPA&;sm;@p{rxRfF5){hw zOaR3WV;r4bGN0W++RpF2Uw}bZyrk_EXl!p+~g9WdQ zqBC4@g=HAfygWXP&G7&<@|wyV^cH(Eh_+CGr3(aWoL^j`!5On;{{0Fa+Mrv()LuKe z?1e>bRCkdD<^7ilu=7j2J=+={cwBuN1FejOJ2L6J@p}sy=u&DGsvrQU+(?tahTD=5 zzsu#4+MMaw<(&&^nai*Wixa|a;$vTXIx4@ID?AoIl1 zf#0g+hRqj>K2~4@U)M0OwA@aFo9s!I^8HWnfre&a=T#7Orvitp7@MTr z%fA!1*3rHzMF`_ueefEEqb1h*XM+v_h-Rf2=7Cn+SLW9I;($syyYe&hAK3DYKn?0k z?W^#Q?!a$WNSdXR`Rfc89GugmSaE_Yo#X}OANc}TzZ>-h#?^;Fm6 zr~x$e5@`71fif>O-#vFH5-*17EMYwk z1Zz}tt^rxA;1V53sNqJm&nzRG>Dcd1Erm!$Yn!&OFW)z|HOK4i_YN!(IHsGX7sJ^B zt-EfwoXWcyvRT6>*r3{}Ij}WReQ0C5N^{tgSRR0pJ6CMS|NYVsKthn-qKpVYp3$eU z51{-6ussJTtb(ur)rsiHNQGZytRVrkKL=!h_mw3X^n|H`^T8PnzHF{NSAj*T}ef6$Z#|Pw-1NSFqACiTXt+7vv zX4~59KdGYGcOP}*BAm!pgKS(_?ZQ`iYnp(-6)^#fw@099#>}(NBtT6Ec9*Oy444z<#FPh5A+ry; z$6J6?;z>9sQx945j1r>XNYt5s27S*wa!b;#b%$esXy{UB5aFY<+kKeZ`{JFl`yf_% z06|^!&g;ScaJ)0|^aB5?BssBIamrHXBPf|nzZ2c)oi4O%O;hulVX*$@+Oar9NYp)C zYOpk*w+xJbAw=eHLSuNR2HZbz#_qCL(=vba9-C~Pm)9J!qW6-};Meu*pGc1ppylj3*6{9Z<62vByb*t7K>T zF8ML5e<04;YDReM%H1XSrYZ72SBCEu&mBY*S-+Utggf^GC(436Jc@IO(Gra{6oRw)KSS~Tm(a@UNZbm{> zePUvwQHI`)j|w-}z0JWS`ay--+RH+&^KaVszJsovfXzkcr{Klo9<0yt5_S zB|^Ly-bPxvE!=xznY1Qpc8E@bXWQg&ZOcQ`+JCT6jVw{WShS^*HNW0^_b=(ed(8kE zi!H@1=^uevwCCbFlneXCxo$KMdds4&qYK6RZA58%rwi*_cyr{RBi-mi0OdM;sFfkS zQe~==T11e7ZL8M^QsGV-qGk_-KS{`5`Sm?tT|KN{xE@{3$WuznmJ}NX(LuW*j3n;C z3N=iLcQcEdJ&*Cvr6ICaIe&YF4cpj|vpO@{M14jjsva%putm^5)XNgfP0OtVLwU|A$Fvl8e zW?4N+{|J8UqAsq}X=FC22`<7D^P)xk4&PhP-2&2Ham){AF8bpGtMteXk{fZck;S@9BtLnL8Z<(T@|mbHLLqIr9b{+tZpEnh+6cT4j^d@B1B4WV>nAI z-*iC_$f@Lz(E_MI9ohV8mXH1V_Av4KT0sH4b{GX=FA~u9Bc*@FKgf(*Er=iaf}ywF zZ4|2Qtsg6BZ*M~d@J=@Z1p-`_;P~7{q`EW>oVfSZujZ_R*x$w=-m^Vj95Pi&{P^}o zMNBjFlz{4ThDEDByl_Fp`9K}S_%b1Lwn8RB1}%rB6t!k?_DE>jr3JzNVn0w8Y(l*z zpC5C&r4XVCvt$zFci-Yo4|qX%E^v6KyX5#Oh~BJxX#D_h#%$qCGmzT)oT0)BLS45z5mrVw#smr59fOEHOgXxw=}EcUwDP$!%NPKTF)P% zq=52X)v#8+sWd=UefM5c5U_kKJ~0t$eBhtP*O(CHGavlqqHf1s=EVHQmX_YTFx7uaYJHdQ#JYl#kY=x%P&PAtAdxLuSRWDopE!K za}SU=bf)+4h5x}>G!!3`m_cusxDLEU65Of6xd9+!PK=_uYL!D|T8n^P1bZ?<@_YN9 zse*rzGHjW$#eWUNzlRY^bI!#gAXAwqrV6&5pxM@=+)j;!gfOdM0(h?)tj2&+e{Ml z4-_i?fyDr3>6jf>r;Fm-yCljq16TG0m_jHJm;#t!h%w&g!n*`S!gs8b z87{_??bgu5zA+N1wQ?mlulB`f4c!aQID!3dNCyW&W29WsZLmys&F+W%)dFZni0}O+ z(SX%Qf5Ka!hnr>*IiruH$o%dRRfQvh`;5)-2+H0HqDv?F^D6HY*9 zw{&zK_szaBs;*iSe}uY0FzAIzYsH)celg@5yw6EaA4w@Ug06cW5>jh4)&B6sCb$-F zb%7AAE1su;SYXlH>_OBbi0me7qqD;nosm=X zQ;qXN1N_iT#D8PV!7)P_ptVHQJocaNL4%7g+Imu2g9)!10nCRWI|Chau9{FQt>|eJ z%f{_nh-y}Z5X58YF9^Z@*QxQK>&1Mq8~y5A$M)Z>tv|yWE8qFdijL(rWmy2C@u36v z?y}Gp&eL{wMfyiZ(w`<zloBwRnGEiW&wP#Ok`uxyir?Rp!#;BS^w)faK4%wWtV_$9&f@V7sK{Q}rV$G54Y|gp4CdcE=1UM3U39a)J?_u$ zzrrVZ!=3~my_fD@_Bjb!zkp)#jlVZ|n81iU=eaae?*dTN&X<5+X%gDQ8raXw- z{JJmSiRe^=&ZnOueCNPk-z`YhuE?j3 zsNiEIR2Bs>YY2B&^ zCK%VEI}dDCcTeRdiiEsNO1-oAcSut~{H1kSq0$}RB@QpO)Dn~0e6b-GZZk%hl5Q*a z=MnKkpP31SX2r&K2XtObfd>QFUiPXH14en6S5${+WRd_zzOin%k3*2b<7D_!!cVO& ztU6BGaYQmAbwpB|Ptr)f*MOGc1dvyXOO-EazJyY(^t_uE3JvvOJJ5UlyW4N}0<0sA z*yc1$#|`$8z^AxIF8?ao&tFNXGCJa3Vg#W{Z?3zf8kbo8eej0*;ZaOadV%e(E`wn39!h1zfiGyM1Q^a?EuI;Z<;n%O1bB^%M!lVdFo6rr$w*pG34{ zC9WsQS@ah;+VW3TlZJ*8B3(sxK6ulJT+n)$MH`XF@C5x-ndD(cS&E_#4ZB(`eY{Rl+==fm0n>I z6S_cX050S~TbVNLE_^=FAX+$qE(hw^)G#Hjt7M-R`>+eJvx-kSr93?YrG5k*Q!Ar$ z@+@Ire^Q3!D}LoNXKB(Vv7ir-*6@bu8{;_N@Gm zhS|!T(6|*73b|^tq?#X{yK{-<2@QMnORVw((kIvM%coy1NEeV^J?kFb87O~KtTOk_ zdUCU@7<>X8T2*?`r9Ab0Ofp<2PlcYMUY>V2v>QqQwvZgVYQQ6pNWzNp=H>arS)p6T z`oPA1bb5An>)guq>(}4yd_U8-C?g{?T3Tiogu3_%=*!5?=2AI0@D|N8aul+w2ecK} z#pIOR1fhf1<$QE8mp88GLsrxt$IJTI+|e(%3TmsMY1jCFyFr7ise(2)TN!NZb7eT2 z{{XrQwjEVY-!TJ?3m=FYK-ld&196BZ&q*WLFX92|)J?Ha;X^|q$D~u=8qvnJQ;RKl z4+qpgQ}H3c{_1Q8I$Ry=MDnLrDzhm_B$6#nP~-cZ-U>7zJYaC^-vKEZ=?#RG{4bDO z5AEJbx$r%`hd1Ve9FAln3;u9ThYA6Z*Fu=vQzq8CSQNE`p5c{DPeXDMa@AT#*i8Qi zM|#q|6xoYQ6vdclF$s?VrhOG6J`=a-N&jaOw2WD|Lp~Mlxbhv1YYEU|2;K4C|GHyi zBmmtKTDDeK^yKVz?Tl+6UYkLKzl!rJa~`-=3%lFsZAxV6=C@?WH?A%marn8eBUPRz z5P0&`scVpIUunwZ>u%58){w^QU85>XoUrcReATsjM#x_=2W1IM|NO)y&AfsAjbbQ# z!Q+$ZjR-3wbun@%NbBl?ltKWyZ5y8?car@QfGP#cOG`^-sjT+zAhBb&nvZs46t*h{ z{3>btmh!w8%rXrd$k$!`aI;MYn|RA&+x-}mNsOI$D(u924hzNj8i^9y6u1^eTwZR= zK?C>$37qhptxgC~pa*+El)@FdTlst?A)(@?dg3D3XKJT!j4}T)Uvt#%Cd~&(!7df^ zj#E;Lp}Cwzh5Hfs{$w-hMe24wnpww}v1;{X+RUR59tkGam=s7l??-|rW)wNwpiRua zKtf57%Y$W-T7Oz4)#2$vU(-@Kq;_qfd8}q1Xw{#6?-ke1Xc=ZO?mdQi0aYts!5EDC z^~*MAM&ume5v6ZY7g#ikD)oYFY3OBLhzrzuckLMexa_&Brh}hB)SgLbZC1=gS8&wV z*Pl3Zrpcessh9+~1q?aXj9y=Hcw_Cwg?w?Y-|#Q->Vk+@UjA9Kk%)$c-HS?egUDj;m&2c4 z4f8cbA8JI)P8j8yTLl%3y6ku3LJpF5R$ie6Ga9@-{OP?uv(XoCmfy<&v`*f6{~&U5 z@?i~eQ0z+wJr9K`gk<6L*22sUUET7RMakz9tFj9}f7^**ilVXyll-aeJQBZM7vAz%! zb9_{pRspHI&$SHAynUkyd~+L%Viu#$f6-S;*!=!uT=`Z)oi2S<}JT_FevFg>QIZw|`@3G=>ukZ6NAi4;KQ zf8~W#%*4C{+~{e8ftf+4{dq>VK~#9EQLJRE3cDJkI}Kt6q)xt`(?>N`y!vJvI8o6T z|MD<=@+A`{qQYMF&hp#IY~S@4lwd2)@^+e)Lg7lMPc_s$rt|y-T1silpMqR%L4}~`i=D=ZTf+4dHD?2i$X<90l zNnPL$onT}PfF+>2XBn9CmCgn@dfiefU$QkAQy`xFOWUwb+!+J0(aS(@wNC#`wXWhW zDR=~==HCtivC!T)(ZtGX_q1e9V;t}&&@r}K2A zf;m=tuy+=CyhxNtxT$B^8)G-45pOPI)SUR~@7Xeh90e%Wu@twYA6PO6k0U}J3dG$E zxA?BI5TuNZxbjdaZz*zIKW8we!Mi?!KZw|Smq}3wFZ0j68wbGRL)Cp(z9ivCW0%KI z5?LZpa16UNgX?EEmeQ!BEOUNN4Gu!$pM8=Z{w_ZaF1v-0#Bghcu0e|S-v5O#;3;R# z{|jO0L1c3Q3Kb!&Kzn=oZ2zJ(a1cUv(A@#%?V%i4O$cQqfH6k^tLU^eI%<@TP(3Ef zX71~7S1fkqtTpvS4pB)}<>r6g`QLElpLivAFOaAX88B6=hM8NoK4+hYh~>82(&=uv zXX1Q=%hfCJTv(Tq56Hu+Hu!9x)6CgCXnPM1jB1zNi=CYn5)o>6Z-G$eD5%oMFK_cb zr5|)tf1B_z_8(G7%62lfu(W47Jhdp8XVh}k=v^xJj{+nr`K5~lQ;5%Ng5xF60ANj~7t%5GRG zBm=X)Kw<)dDIQNi+GEJ~zw}oNmx1!C>knORM-?6aP?-@yQ9d<~@}Qip3Lv{1ihx=_ z+Nv^C;`E{qTGjh#;Lobqeoo7Og=jFZJq>%heB$dDXvZjKC)Z4gj75k?l48$_=J$X~ zZ*TyO2hT!&wN-=+3dU)xINkuEcWUT79dP*Uz$G67y?IZ@gP1*l$jx-ah1)^db#V;r zwk==#7T77HqTwS7fu{5=>{rh7eF{@2vV$QMFai!8S1)?)cJLFl7m*41BduKN%qYUE zNn1C|=D=`Ez2?sptG0;b%`7qikXro*CRIE)C5H5phHX;Vo7(ahp!;N`=Nf_je%Us? zVQc42rWoCL(33`n!Y0wQwD()bMikwjTgXh6v0~h89&X3mZpAA7CIgYeTIOFsAFERB zKW)bbwXpncdul1e|LV}_I|kgtJj#v=a$SYAbLo_~6R==P^m+71L-UBp?)?(RwqbS9 zTOz#_c`ky#rlw{e>=9|%mq;S5yuX<@jz#bzXu z1Y`m32FU&9aS*8;b^+GZ_OYz}Au8=rPVyrq#hU}8c0a~GehNzS8@_DXI`;8!LAe*P z+KcB1MD|o(i!vYxIbEMr4l+52@&8g7@tg+mzOs{oAoL~o>NWDZ8Nu(MTk}8_d!zE{_x>{ zq%Pd>K|TaDydlH+^;Klnz~CP}e4dUy`^El@nGX}U90|aY@Ih4_t0%JWB9oe4%>mG7 zH_RzvVNdzvqm~;j{?3)LSZvtFzoMht=xG4m0em(x4wi1V6ltB*a=vlQ>!WL~rM|`~ z=IO}xOrJAc<-G1q-kk5Zk8v63#zQ=z4?HQ;cFth;HK=r|gs8DB4cezRf|@UT`t-9B zwTT({f0_>&TNHhY?YbBSd86~5d{&mj_+cNPZ&Ag$ag$nHd))Z!K7Ld1KI0-hUqm!Gon5<%}YmIVE(a**;swS#xizEWaP1 zL*m(vin#v^N&%px(*wYG4ZE3^-LpHMjTr!=4>AEop}}gCpqT!X zt1-}Hs845zLlb*nJvxyAR0(L_!R749q(2&3qdLJ4X<=1Y`1?u)x>8kQo1>S+jLao5 zgU1-G56{VHaV-sw&yAs>0jvpm5!TP?tPMiJz=)`-eLJbGYJd}rsmv`qA8Q1$ur-IR z!ZHgB`7)~@IStOU{=yVX$9=zb)^t<~LL*vXt9361$YDl6&DCPW?uW??F_9{^xT-4E zI9u$#^bv-)Yx5@d$70)d8l4G`)OY;x7E_-=&u7n%LJ)1P{d4x`x5 zreME~xAHSgdPUhU?)7=@UXdYJaZsu zCG`eVI^%vb(3i@(36j@LhqoOcJExV7FpW!L7`#DlXWdYihFwO=Q+Siw+uOfEM>q0n z7bPV}Z8=7t>04Tc8G@7wBY*@p=EOo}^aO=xpradk^dH(l2_!ssa;B{VHhS@p@Fah! zFCUz_F|dG(J$bB+1{#gJ@#A3(&X~AxFqom9n20_+sryKoWiOr!g1ucZi2H4gZe_ zmcg}8ghDRRbgO)DzRH?rAOZ+|3CGwDat43`$DedJGIj9wCNjz91p6^S^&g$>GP?gT zCA&)!$PO~lr!z@zLq7pS)eqE&EGpPhTE@(N3GKZ3 z8(3;U`{1V57=yXn`qp7JrVd@8(L5XgQ-E+f`96*cZna*T&9Kv9%63x!+mHlk4nlRn z>7cz1Q?5Um>oPvB`{CiHw?+9sQ6H`PbYLZfH>@y#fJ3EGHKRHV@tC6w?5A6e97O*9 z3YNCEZczygtq+BOH)Z>tEfz9FQacXpg1J{O9oKm7xUThW6hi|9VQ1|&_!);DJd@o! z86C8C)9@cLYM5wa+!4fY&y=c0@BC$>J{1->jG0^Ucp5?=;ngs-@7a9U*mMfx@c)-c z_#-pVYD|M-xvDG=y(qdD0_|T}-xqPWEf|rLlKszDHAf;MS`F&(p$Y#9xQO_ldb2*s zY8QJfQ(4*q&pGV*g6Ez0OGp&X#|jDwjYQ?*OC0o2)M{@6B)GCw@(did5Sz(X_$Qv< z-|gA6hi8RNz+#*kH%#LHTSN9c(sIs$ z0|zKq<*G3xe~>M>Ut7|kWAD^;3ZqX4kY|A%*GtWB<(ZN>R+C{%DDf93^j{PzvB#bc zlz^0{}W%0!^IB_96asqdj` zTEzZXRq6>#|CNi4tQ0wms_YgL0UxXAHgdya7Ydl3>V2hP@^k*+va^u&$Sn%96NmVC z*kL>->wH8XG{XC)>2CQ3d`q}$@JCVr)R7DWoXOTJw@5wXfWs=mP?$VN)b2XTD)8nk zuAA^vVW9rxsgG8f}Z{K>#^GvxU3NEq1pcvxS@oG1% za00BqYCLE>E9Ux^opDKAFe(`3KD#};gKaO6H^PIdXv5lNpmc6#{S)7f0s``?(ZgRR znsq74x% zz=A?mKbpEm^vA`#{`*F@o^mebtWn$@9UN&{$+sgVK7_)!F({2uZ~hUIG?Wg-s?qq^jHhj%C&ay=vLer+RtB<|xq+$XH}R zpHE)`7&TFERA2TOyWjx)E|D#TbPIr3;4E~c%pSa$HvFa3wcs}P8?|;6Rn3DSuIgA> zeJX&C53ID26Ze&;nWCK%-1HliZ?z|0rl@q+_C3faag62lG=bbt-PS#suU1p-h6;Yk ztLVr?L|{(|d3azQwko&=t1)VBPcJz9-1}VO(kT99f&0yyFL8?-5qj>x=AP#|w{B$) za0Z_=_(EAmU6RXFg++-e>Cz?MYJ9csYuMFiG>XW5!7Y5M(3S#K_lhe1k1}A+naN> za>bBzEOj2(laK%;d>eMXdtg^WLINz9g^fdG-}5v$Ai>7L1B2Z+GP-u}z>upVba1eE zPmsQs&>n7XXbNO5pH8+5T!dcOG(C=1kHeu!%((UvS#j`bKrzoaol?y!Hv))*Yv6Rm;KQSlaBs8Bq_i9a5+Qmd^x4JX9Fe!N7lC0Okp}8`>X%==>i6axV*++^(p%#S4Xt+ zF)a6=?-m&;+0@i@#btjE4G(jr@B88UI}APhWNL_qO+StPCzO@_K8xDTF0u zH-Ff($A-Z`<&Wv^eG<;A!`2GO$gJ5XnNwM5+11_suxRHJwhxMmiX7bB&Ok2~{`*r2 zOsR{2(Zf9!(Aq@J-;V7O!*#sU3T6lkfB^czxeA;h5E3E-4|+4 zJyGP58_3V+=G*7rn9OiXUE$T$)$PlCX9N4$n@^lMlLB0DTG~`*EyMPH zdOxELWDH&MVHa~nBCsKLbcMm46H&mV8}i!#UQM#-fSJ3Z5JFdss~Mn81vU`9RdBjs kAJeYs53E@{#6SFJygw~ES5v)ahrWYpTcS{6UDiTee zUH`~(Cg?<7M*zzNo2aOlKfs2a>i8fKo4lNSsx~FM^`=!9Ga-Dr^LPl>)HSl3fGG$2 z>@elK4C;(yLK(hT#xB5?YrKHhyjvhQWZKMktA6vn#({m$N&9g4eV7;Cw@|FXQ-Jt# zM8d1|WrYXpM=aAULqNa8Q`ltH7JszF(^AW~RqQbjDgMp8Po9cQ=qmWpO=p^Vt8mv&((z*14JPWL=cTHAfa(cbWKdyI_Mn!`ldozrHeE^;P>hT|pR!k--xa zx6&=%$vi@xQSTu3g`v^Ra|7Ox0)(VBTY5RF8kRYD^oY8yg{7rStB_~*6j>JM7r3(G zFk~ebeN4e;>poCiQX=IttwtOgb;d*v4L$t*`?n?vbuKKuKq50MOQ4#50{dRr8AB=G z62AK}Hvgu+JKLwEYwA7k)Uy+}*jV!Nin5J;RShvUreZxIldrt!mA3g`q$XyDu93%k z_@hT7d=4n(8Kw!ho~hgzP(qXCwK78pZxupB&s{xSFnSAk(kNJAvG5C*wx7wsd+BWQ zb-~QSh9gr6%;-m@Z`5YbpM`lc$L;*mTO(ub=Gh zc6hfrO1}$i3g`V4^{v}@^I-=Nm4R)O5V#rrvC$bH+o{3MD5yxdV zuU53>z=2J;gJ>ukOzC>c$B}vx#r&o$4=pJcaMT@HAPRgl;W@5oiZ7x!6RZvI1|{4J zZXEpV;iPpZIzy`yZ^33E{!ytD6NjhhV@{GRk-(Xip{Hv2*w`ak&%y51kAYWZ2W zR=Lr>+Zc%x6`-goJn?;C;PvZXZu;t-5|pE@g7%%SBAuoRtJp;7`<h^YEW23m=bJjDvMLfIIht*po+~~N>i_PM+@vyIzLlh-b zhu~A~xdwR-@6YNO7NSXZuzDvLhDs7Q1O&cq_^nSjUn{Bjyw3MLnqNvq2z&W+9=3t59lLxi^;tWOaXk zC-$?vHzQR~MYXZVjzpha6#U)&3!}JE8;)xI^PSab=Ix(tAFfQGu1bmeF$Ji1+8s@m zVTi9a7c6~K@XV@EiBHC~@Njg2O~0e}M>;L5BZJT99F*=qJ<=e`^L#mQHGjGCR}_mj z*Xi(~?Wu_NmxgJ&!c$4x9v^7ufw@ecf{|*YN#WgRIX)(15?U1Gqxz5-XgW`^!$ zH_?mIboXu}HSgTf^WU50Gj(Yjq3A#d(3bg$sllO2?tPtRo&Ujlmn`{!gX7?(y}hoW z#6(TMl#c->tLApY)Yj(6yF(R(Mhgt$_hB49bxC(OyTobR?tWb5 zz%@2D>OOiD*7%xJOTz3IfKjgaNpZGU0Y|q#e4ELn?W=(}W9iW|+fR0QrQuS~LPTAO z#2WEmmv-H)F?2b*Bn#n)>_um`SG|@lH^PyH-%|FLj;NLc0j%~2@>smb@`rERMw*U`hS57WeiCF2A^U!Sr6o?n<5kY37PQ&>8xUy{qMm%jjD1rCwHvI92>wNvB8nu(O9pIe5#1d~^SULzeB1{^8m@hhJNhLy~k5l#3$c=6X+41KED<_o>xuBF5 z`?A7YF{?B4Sy)0}7AvV0#|Ycqz~Qt|o+qcKrYe_rDqyg3tDo$X!(hueSWR!90R%q1 zV!Y@p<8zU!;*`Gt?+L{SobsqZm{n|B`+I}wcnqm{d-FDM;e4f8qnRQ_RwtFYIMdh?U+-UBH zP+A@QYHrFy>+|K0xL&Dbuo=G;4+RW9!=5)h*{Li@6?e@o zbxBODIX*Tv^EVWEFvS+2e&6o`{~h(0^QhX8K~Tcv9#{f^F%=dTqV1cTp9*FQKLref z6Em(ii_PwWJ3`cN$CWfcSER1bI=E+Hr945^xu4m#a}>~`g`u*Whq!kPV4IXwH5@W* z?vP3}@Ez5G&zy-6d~vM(+7gcOir0MQ$x(ljfaQBS{(S? z5y?%Gl~gd8pa0QcyLAK#>;pwVCcsa}D*9)&94&cT#Yecz*E~&+UTL&hw+eiVBg|et zYB!{)o#b4zobn{>npMBwO_gmy*g=Eq_j@n4*{9BsLv#$9@X|=&<2BqFyI}R|Kok#0 zO@EJpj*)#3|Lb3~F=!^wJ9k*faKGGQB-sO2zl|U5%`-wB#6f0n6D93%UgzWC@n%%g z$lC_7X0EW$2Le>3mzK%!#VXmC^8wI^Y6dzA(ak=^6G?^se5o0$bj}P8LNHeXDBT4T z{do-2TO3+|Upz=N28%f$2XD%TcfZWp{~rQU`GpQ z6{+e+cr@a|e;r%_W>(<6S~`*U&HYO}{>{8XW*MpQElEp7C z2M0%fVX_iNPL4igcr5ORGvsHGxfFeKKYL^SBM|LCEfh2!jgW%Xo9(da!zSCi4Mz|2 z@WjowCkXn89FZxTxtx2A+)Xtp0=v@LJ(RrJpQFYSu18gqa2Vi+A1rD_VN#N){m`)& zmR{~~KIwv!^ErwwOlM2*X`|9Xz^QmgNjA5oIZD;fA$a|vvgHz7#z|5^MrHB2y5MmI zz=b99yx)#SM{B0BbGunE+%>)7`q>f%1@BxE8H{XxVT3mRFyzs?z%`a%t)_(U7O78F zt``cW3s^ZZn0<#^2i;}R6Kzmn_k;ZdFrxA8!pYJKd1 zggvZ$UUVbmy#5(MLu?qalRt2nXlskkx>`j#-35*uz2XCZw!7cm<)=lVb{0Cf@OKo# zT?dWslx$07--wSkz5+gmPA3!NNR%WqT!d7j8Q6un1n4gVlnR%SZcN-#l2nM&K!vrH zRX_Rts-U95A(luzlu_mJ-K&o1Cp@1~l79PL4^&&$e(-G82?q#VXWC&;%?(mNlZ}m* z$A9U9lO+KT$fZ9JsG55x^V@k+9~OZY5hmra+A_uH&v*c&reQ;)D;!+#dlK&ZNcIWP z8w9W-mLL>JCx8?%a#7jBBHf4rIZe_8P_k4}*s(!^zf9poxSCIhnp1|duRpIcy`!S? z>R2tSN6mN)Oio_j9UkC?Z=cHy1ZCFGyCiJ=qT-n`ip0?4ulAW|@Zh6+DZ!NTRz(iOybm{WBiJ zuAfuE)D$+R$rJ`9e=g@>>U;>tEvOroigGRY7FJ1PG1Tx$lYY!>hh8)=8o3JY6tplr z@1{Ee53Oj}15^6VvRC%yi4VgY!0D1AtbiVZ5jR3YObpzk4E@*y%@Fa~ttLmPd`gtS zT_2`3S}!z#7^~8!JUPO7H)qub!32jN3_Y~yR6RaPO>@rj=0Z#UsjWpqKVWHVy2|v}8!i#2_@_UcPDixLiVN#Sk4w$*{2raf9wiO~mSo!3^dM{< zcBirWuI4v8Fj~YP%W>kk(qO!VH5$CbqC{aOVy?+u$1yy8$IuTCTHle$e-1{2z|Wzz zmV%|CG#$WpffBs~Y^PFWxAqC^zw->p-J2L-pA0~q{$fX;V6i*iyHr%FePC#7j!{*` zOMC)E)hIGI5~5n(SubB+O98bH1{h~(h%wnI(qhX8ak%EefX-CPS?|6|rkL^^SdE7v z>~bMUS{q+bU zef?#5vAE^_TU(U!x06LV0VsFfs07b*JJl>t!?s7-h}0#G{32U z#HpIcYRr;`6xNDlW4kxha4z8hpx@~9!>N4~C+@&0m0fwT`tCY!Z4#1-Wm+d5np!Sn zs@?wXJbV6YD`wn@KN{*%B6;QRi3KBcC=)t>9NmM&p|+}SoWH+Bnqh@O^MTARWj(!j zhld*}o(24YyRyZt_f_X0lb3@OG81@6>2yH;zMt)@II_r~wF-TJ9sqkQGsEFU310^H zgjZSblL^jglwA8KuPzS=srhE;uSSu7r`HK|UO=>FCH}6{%{`8fxA<}Vo)t*h7 zjAF-qx(A%S<}}7!GaeP3TG~2dMtNK@s_^QuK=Qq_D;_ni&5Ldg(9hKK6DLo8Cv0DQ zd7NRAqq479^FXp84^8B6F%4HWT+`au|^dZX@?Qh}j-HS=jp#ryv z8gv)$yM#wL#4bmrQRdftki**qo-hJTy-b?!0i;%apep8{qEmm#e%F0?y5LL3w;vht z*(kG@lJ7IJ4;z0N*2LBFwP#!?N(Xf>M(3)L=IVa5b%bPO>pj9(H+a_9iBh1Dke{qL z41KTH%sO6I{`gW57xy7@ccREVZ_T=Q8*WV|tWCV6Y7SH78%YF7Kc+G9K37#H!9f7v zMw_I8B!gXP$P50SA>1Cf9@+!jYetOc_Mvtl5PWq^eza~qG9nZ}R<_OSIY<0n;l;JI zZ2kS^(W4&%uAKe!bYPGoJMl8r4%nS>dJAZT)>xOe60=iOVKCc!H@J^}fPI~#^FARa zCUzdPzrk84S4O9trppY3->om;9HFa3yfW9-uK)w++TtT30^kg8MgJ-^1=gcB?ad!n z)R%}?U{T_$E;5r;&!63%XPTPSrZ@W;$6oB{wQs{OIaxKJks?Q#s?pC~C=~-2IUn?6 zV#zz4b#oR*%61jPYx_QP;~?Em6@im;JQ$_8cewQlpwaM2uzz%{H7oAmeP93iJd;?&JFV%VA42%3=$3d6_`P+86KWBG?3I!GuVAnfu-j_N4_<5r&J4kxiA(B{>O%TfIK8lw4sPGI{yFkLNC)J4Z702U$Ht0mii& zdi2WBJvH_AMT`g0cc92m&NS|u9+;=H*_)4K`&btJy~7xBzS!`4k~h`aWBMFy*Nl#U zHtVva!!LR6cu21Hj9!=rj|PM4*7LZu;!VQyc|^i_z8V(vgmc5v5QbY<;k8%(K38jG z?AN_U`xaY7!A50o-1)4z($XD3VW|T>&v~jzuBpvx7!r>J0$+Uu4snHs)?Dg*PO4iV z#kWA37KG-`E;Es`7PDb-UgPMpv>njRYzB4_3q-FU{I~%6vVNH!tSM~X|77OA>GEx^ zB7l9B>x+lr%kZ;?@R4-gO_OGp9WY~0z{_PS+iLvDXiF(jYXztw#mB&xBb%Uza4oB+ z!d9!5%YLIa;VgMCR_mxIpb=3^mLe_#dq4SpA_`=_fVXeoW_jgo3EKarlpZmUheg(2%;FF9Cq>ne zX07<`q?^z7qpCj1|3n@v3}H?x!$zi~cn7L@tU`cGJ|mAv17AqqZ@-`NLrG=qye}Wl zn9w^xs6s%aTk{v`ow4w5#$4poaPaK=Y~F#KV51W(N=rx2q3sHi6^-94_0zweRFIVR z3L!X^*igS;b3GcXyo)NWUazw(%9-ScdBO^D4CZ9e>Tp^9AUO7GV)O7*!|Nb)Q{VA( zB;b+Z4RCpW*22^cmiq3U1&<`kZ3UNISb1Pf9C6`v;eM~{oWp&i(d6et3Qo)OZO6~& zIsMha1MV8FtoVh#s*)RLK5#bZ>*+Z_opZeWSbAVRJhGZi=&=F34f{1u0d!CC$Bjge>N{ zN`2k&Ubnl03EG8L9lVm=O8n*cPvU4G7S)xjX{lKb%$jLSSw2J(tc@8e>~K-%R| zJqq7E@BxA(*kn-f1t`%NHV^V}$Xn#*nID8?U2KB&pg|yI=>h;#3U2@4r~cs8jWefI zymAg)dimDU{^H9T$>6TTzCx|+haST$RXsm@5bFj8(1%Z~6-$@AJO|Ptph-t;^%8b< zM7OSxeVhnNE_KyoC3B3C&hFE3umz!A6n+&22I%;Jx-|nK*W9omT!11eU#`Cz*aqW9 zF~X=PW|vK7fqiGI1&;ngbVc=u5xr@$51vls!K{Cb+0={4U!{B3T(~*W&G=$JNa4

~TG4tt(xxe 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

    i7W@8wO%d*3-d75-Ia&YA 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%0A99t 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 literal 3562 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 b=9}(F6qJcvK)0YK_L()hY7VQ`bBp~yNL}SG diff --git a/icons/mob/inhands/misc/sheets_righthand.dmi b/icons/mob/inhands/misc/sheets_righthand.dmi index d0823c6a261107063a7c756b6be4f3abe0929676..d08de7f7744397e3bf0cb8512df95c3b066d515f 100644 GIT binary patch literal 4176 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 literal 4002 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 diff --git a/icons/mob/inhands/weapons/swords_lefthand.dmi b/icons/mob/inhands/weapons/swords_lefthand.dmi index d37c6a3960e6d0f4227a948e258b994b62999902..bad6742d8ab0c853928be445c9a32a789c0f6fdc 100644 GIT binary patch delta 4994 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 delta 4720 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 delta 9233 zcmb_>2T)Vpw=Y;wRNzBYq={0kptR5tX(9rj(xfYbbVBcN5U>Cu0wSF#O?oKOAyImd zNC`yy)+EZol8!>r}lw@`J(rK?JxLZ2ZJm z)4}Jtx3j0OGt`5LDKM+RL?60v`!AJb+h?_Ar9z=at=Q^Z3oj?eJ((XGZqL@&C$41D zh#^eplgqiO~RMLj$E$H8c!?o&Wr-;0n)VMWu*P^MDfIE*m&yo<$i%?{h&?+m{}b_0 zQ_10v>2!5e)WK1Ml9SI>J-7D!%Ec{yvR}_%^$%0OF=LnST%}7}I2)@|EPEwGr*}C} zrR*T9>Ld+$?=?&DX7V)V8ZtSB<)tWnFFEks-{|`R6)APLm}L|K=Hm1Jj&4(E+m=?R?9`_?3w2wC^Aut6D`9lK9fO}X-e zU+j_2Z5z=n?Ci-`4nk8=s#lG~PpK5guD^W-9d4ILT2u2~6tcTx=OR)z`o3K%er`0| zI+8OFM3QGtFme$vn6D`^^4A7^hy!g-imL>K#%}%dw98a=v-FuumBrhPN^ zr^H`JF3K<$TbP^vN!X$-Zg*(h_a5pE+M7j%=a5{>TPx*qT1h0I@X(r|A%)Jd{B6MX zyE7u>f|qrhYuj^TucQn{C9X-r9DOVx4F6`$H4?m;`kKm||Lc?c8!haFwh!5`PSM6h z`J82P8?WcA=cKfTU(6VvbWpnk>fxBE0dxS%mfCt_mo1gN5TDLuH`lM9a9qu@`aUeM zp}2I|YQ*dIr>_{WXHMmYvH4OmH{A_xP>wG2-*(c$*RV!nFg@fD4zzTG6$&|9J(CJzO3ad&?- zDgqY_ZeFr#)v4=5lIxV+#+NQ|f{H>h;|}GW>tYJFiQm1=E?EsAy)?$EIrNp8@$BKDh%H>Q2{@r-$suMP&!>?(Jju<7}cw>QR0N)3F>0K7P3 z;M&c>01G_u$hYs~wGyb@R5oNtSYI}%=1vWoTa+A9AQqI+&29TtDHW47Mbj})ZWHsK zWaZ&p z-S^010|6E~or@!ogI*G`85cqewMDuj&?pj7sUC2~q43)EYb)?Umf42QYO!?MM6=nu>9TdXIcJ1I^k89oN~ zbm>~##ACm)*9!VGqJ1*uCpTi?;&Wos-e5x>TtH2-11f{9+F^SBN%+9iD^q(O9CdC= zH$%qVt{&7q9LonV(X34O>)tzDFJKeOJert(DQv49ch{jX*7qjYHTSpvGZLkp{gUn=6L6%vekWp7jVaJ$)d=w+-GX z5f3Guzz=;P#WrOJu(ygIs!7?}s7WR!feX5t>c-LB^F=NTQHPImApso`vLTf&5Ywv` zo3S6!&Di<1yMKa75?orNOE)r%0TWTy=j2$iFsHxM-(QlwlcW-VN%oN-uQARq{-8wn zECKMJsJwspe;e*PYNnr*rk22^UllnBOLA$(!ki z&RQCV#8;DtDiY!PffX71E%iBjeT&FSum)j?`mr7KwnQwK6+&F#1K0&^i}2+!2_b9F zaIuW7bzbs#5zdlJkTgDG6GSD!#Z))re>}Y%Drn7^^WpM1=tOrva?%eC=aicXrO2Nu zk3s3nComRV7YK{6!{_+BsT_ito;IO*r7;PTZ8DhQv5s!BtZu+pc4ub?b-(Q-W0k?CC++D032Ns^VxizbW-D!7w+Uq%6WNq(o40XB z433Iyf*t}jvN4oJSYrN_4Ciynv(b)_uDG#>M{R%s{$Cr&+Vm(V#fe=@#p%v}1d zWas3jdbF{g%FS_26o^5HxrfxBh(9LQU%2|$C-YC-Cs7WHMm77nM&)#jR) z&I5^^LQ+PWkPHhrg?`z48BBj# z`8p}%xAbd`d&eF!PmpMyT7|T^Px?R6R1N!*t{PN%lhJEx)*o};NVYeeQ;e}Ml@3fq zCj+4c^E(N@acqjVlC8VHdZc-OHW{iG^8%tW^Ry)mf&jQ2@|JOyBHfT@uk{1LKIX5F znL2*GV(SrnbAK{P>!71u-&#_}Rgt|5zq>Xy#aBMo!+OBDE(h?N}61k%4aj7iOR^>aIzs7RPFXg z6|9eq7n!BjbJu;-)o{!lWjKYo*@kLq*0p>ap0cWQIh#s_@vFS1)=ZS>TH%*>fHDy^ z`i4vxF5T^YGlmXYmr4SADVXM25|fEa$`||H{ZB*jh{J|>x9eJ`qhtk6H0MNHPpaBi zQeitrOP?}|tHO4G^PJ8h8|PhJYaS)bFEIiD<@1bZHEs&vF;K-UH}6+Vs^=qts<^W;hHHV^M~lnZy-)i78NHUXj0qv!5>f%q zJcBOobfV2^X=$tHQ)a_&4*m`@D~=&Hm$8zQ)xZ+56lSd`j&E#ETxl$t8E16 zEfvgwd*`i#8qv62Fjz3B=;zyYxe2IJZ}RxeioodySH6K;;f!GTC*y%Mfyo2wv1saP z9eU>##$v%WM$SIoY*-Avs>haF={!ZKX{;zPy7hJ%@A>bV>vXtyPTnS++fWh!nhVYA>Hu`J3*#4@*jCYPGAV4D1N=lZXCU6J*g ziB{YDuCM6xYf?)5q;GdubFEKzNr&u_Y$emx_wfO1S(ksNClASuukQt1O6BQj+#xh7 zu%WY1y>%$cu?YHSX33;@+%$w%98)T$>_(M?s$H!)!Txca2!t%n)N@Q^%w_~&R4McI|GZlRPVq_@B97>#|e@0UL1jL=ZEXJ&fDYOJq}zV#?EU8uU@J9oT} ziG9r5{T(|ELRgEPtGD|`yoHghUZJVYAyY|IH@_TZpi`pME1XUl=F?mZsJ;jdXefqzAp650)awe(hznDm}B(vgVrB-~ahc^s%f?{%T%={lRd*m<4((r9?qU_@RND zdZ6z8z?kl?1l1%sO2P0o`;9wNCfz2h9)dm1CAKgpkPYBx8H`Q90{_;qs=`cdjLGhir!2Lj<)SnQWnbHXc+kyrA`aAX*$VN%#%WHza$b zag3`@ISuxA7tv~B5`0%qPkh4_cRS$oPdD*a{7T|f^mNj4!J!=Hex6EKUOmFexrRJ9 zA@9f7R!RKfm?Z>7(6!BI-0ZhQs9eLDxAR;O8oc}=3bB?1zHn};xB07ZY9_<`VIEJn zo?*4Y`*>;VWN|b28B^t5R5bvOzD0=73!KQFvN_@pPovY&!^UNVcuTkuPRr*-AKnCY zKjoznG;yGpq(V~RTve`+o*RsKbth<0&is4fON|@$*!|;*-qa%k^55=F1*kqJWjyUB zkd~GiYX&^vrG;HR_0bFL7q8T(7>rCm_`2H0EZni{Ajc^)_XvXd0tCv=qY&HN>9?Q1 zZ5gFPtK1R)LA!D;Qej6zQRR&TrWN#z6YH=u_ z^-NybxUC6ArSM^TZb@8i+H?=}?F*cgiedO-de>?bg<;K~N$hx*R?*9id<;j)7z8{f zoYvYsA*_=WAX%&XOL<1e-Mu{aZEPMn88O@NUMpa>_4y`dwob#L0p|B{UJ)Qcq0?0> zL(Kt!L6lE5fopS_2ZH62MJ0V0$ZuyAA8?N}BjhV?#d=M}X!!2;ijJ?@?k-1|nVSA7 z)X#jE6ETsNCw@MKKn%zXUtL-qs;!0m$x)$npot`GYX5cL@b;~&O-F;joU+t}spDLR zqw@s?_y9Qa(zNV>nDQeJz{6uNw{SAm#p&HvX%%-?aqb&xIc$|UU6wH4cnC4>N&!7( z3bF=xe-%K&%htAv1?Jntt~h^AVb`%4DzSkUy*im1IpOrKX1UUj=YiHzsDMiF$9FuC z!8l~_rboXXpTq9TqsNaF)T)VQ#zSVAQ2d!%TCVouuTaB^Y*E0>>MVxRaR?`B{=OHR z!_XnH#kq`i91i!nu~A`rDcCbvzg|-IZO8EIEquQu$pvM-COcZ0fuLOq$~c}&TsWwW z=|j$Od76D4mP31P*J_6qlQGyr#!eL)Mo@Y2TP6&9z-6yJ1AMCKzIDq*P`6mOs*PoL zl6%2C>YxcgtpbwU!c3<*NwiF3GqbOVtjNso5M!ZUD;T~hM~xf37UD&-5ReX!OgqRG z;{H1K8WB4S#WdPg&*ICaMX7iJ*kN}Bn;0LcBQ?{pQ+i1*M?QOoUV_ zPfLO8LR}e9&VLT4;^4T>@0QM4qhNZ#Z?xIXXqbkhfbA^JrEive_t z^s)$FnRQfmSMFbTq{LCUvbH1*nxpP^o0^em8f)XnEB1IuQ%Oj3FZeBT=6TXo;Vs5d zN~-zH4Yr1mDyWBTAk{hO&kw+_^&P#>98*R!M_t)7^klcqiX9_jn>_&Q4}>=Y8`68V zqClRVttB4PXR??IF(jx}0_l6=jCSEvizn6>OdRC-QE;0)HQOB{l|FLtS-IWi8{sA3 zrR17A1D~RbaciNyW&Q05(Oe5_>p*>Ldv!Y2kd76MY7%|sTL<|g!MWiEy;)S4y%Ep* z;?W8)jqw^_-JeSa3=)V?g$i`QP@_X43g|VfU>~|Fu&{ni?#FKN35E%%2&IND{mDWy zD-He_F?!u_eFdAR#BKfo$nQ~`3GHXxC8X@Av66b`6ZJ%w9mG|xUW1-wm$AJTHO;q? z9sMSI-&ve}cv9MN6_hbcP`mkq2Rb=+fIMr0FE$J>P|7dQdM$XDg1y0R z{sD~Ef$M}VH|Xd#cHECG?9wy37VN2IA0v%xTZOV0b03!v;V%#swj=OO=7do+l?*R?5fGoJU;l$GRWi8OszF~h*_K5%dZ6&dzPdpge?OkROQ(&h zFn}cd>)g$wlVqLRt{nc62w*>_XHME65n>An2NH;oBcRQj{I}b%)Z^yzPosM(IW!YO zZwj1Hj02Kxeb0m=Inx@BiSp?O4#$GDCo@lv`9?l9933QljqIavkHLSb(U_$kqWuY( z+|SuzvzRJ!Vo!3UqTfJh2;+O)N zgI|5VK?qe@YTyEmuez~8q<<`3Nv{Q?Fb@S5&9=%xw9%n># zV^1WN@ZtvJ$430)^g5iphME*ePayGKpt?lq^Z0-0*gDzKn zI}t#u*+b@phX9FTWJT!+651dwH~(hsG#VGIBB$+7Ff)~tI3FTm&tD!>g=>DpzrICS zN%jP}M36ik{-t^cTYBAlmwEFSwC6G1}kW9ExFttyeQFv zNTiO$fWWfMuwScU4rnR7)EO2g21cz84vW}$hz$WZWM!jjgHmuTYhlns?3y?w0nj3} zWhdifO1#f6{^`dc0t*QZ4i4I^CyLKIB?3+V6z|~(?v()}?V@xb`^0xqdLe628dgcsc9t_{lol#x&tsQ%M z;X3=865%6fFm_SR5=ie~R+?hL5s9-fBiw9*6=p8k02L}T3O3L`C1O1h5%<;&Gy8z$+Q)Ar z9OqvDgR{3{$busgarV4}@{n{dTfqS@@{9Z6>9B|&Kt~(}f&RAR-AzGeu=3aW|6Ts_ z|D5n_e@`WQ`?a!k{6ixV>Tp%5R2*OTKbg|o*!!-v?_vJfeE<~`2$T#*bbsHxJg1&! zhlP27MS@`Hdeq4WqhnDj?PHR4J<5P=@{`6`wpVVo!$fScA5j63xjx`0i1N-A;uGK& zo81~Yhgo}kpI$ePO%@pyMPKSNH50dkiHUrX@IoO=)gQ8EQo@LdjZK6U^;S8IkkH~+ z0bOgBo{N8x0P%*Zu`%yJ?BktURwZTc;xiu50kTiU-l`rQaa{!9HsAjMa^ytnjQZ#2 zrKJ@57r(V5_$?mtbmAwLpZiZ&YAuunL8oQ(c?L5x*@htFjF&TPQ37Dq53v=iCfGo2_JJN*~ z++bB8pYffSi%_!V`M9rl1+NhQ-diFuZ!o|_59U*F?Wk{FN$%KKlOBi`7dsP%_Oxe2 zb3t-BKK8Aq^-(rRKZyy}LM3Bkuh1WDWrP4A2`Jj34wL)@o`l==8WCfqQrnZwLVkoRFFaW5+j>v^3vA zO69Nz$C9qj)D}H}H*RBd`NC3pl+jJ<^&Y|I2*0(nTQwXrjJwGO0A)vY#phKMhD=Equ2E^E?)A@xira~Fp z871a+e-5@>U7@3(^(|=IK=9cL06e1zotZW??t+CToU*WZXy~PkN4cuv6FBe*f037E zZS4qZE>HVeCXvp_8uIC9gw$8h9J3{bgv1f#k2{TSFFwpfqen*rcN(_hi*e0`g@r3P zOHGmG<#XfX<6zix-cVKC^nJxxDzPgJ{LXcP{51p=-M=xuE8x;o1jre{UP+D*F!Ic| z6-ItDcmSr0-O42-q>A8hw5am?V17N#ZwLfpW$Mhp*k=d?a>7r@VtVTWM#6-xjqAhZ zlg8xx<+-5AL!egEY%`jLH`{0%aDBDOBHvnf?blLO6T(l!@UPww^ZuM(;;2WR)YMcB zNqC}kr7rtNACPk6sCnbBsZiA*k=*5!3KTPH?Tt$Cz0?0UG+znb%SqimG*cKl|16AH z4Da^e01TS>jOX{cV@@gB z|0=kDj{KGHuykWe69&evL1@j1@4!7-fHCI>L>Bn&adLn`I7kOt$E_m|qyNwH|I+^l z;;6MG)7{|X%ot~8ru%{h-w#P7&gp+FfdBfax7-}6*5hx!(}!k$eJ8W-N26?WpLf3> zt9ssDm^;itQk*BGUYv#kIM0;!NIvcYDaLV#gj5c2#V7w3_#MvbPYpBhuYBk5@pl4h z+EY_gSl4=qkNL>`1OX*er2pDIXIEG7c-`IM!fpmAtj|t<>Z1m1xy6m~JNJR@E*saP zcS=7IgE6!OCtEeH&WnI1 zBZmU%wDfi@@FbQ0*jDm=9j~XEB)#r6$6)Fje-c$MjRP6l2(}Pm{AaE6j@x(Seo8QK zgY6NC8!#FyDZhiHE6UD4o9sz9F?f1-B(8rn}dd2tqt^^W3(fRVgouC~?TRu4`>9 z?Gp|s3Ns|p3cgS<4t(N9FU&AA0+6AT1BWj4kzQ3JW`|fC2Dt%C%5AUa!c6c{k)_nz zwg9<01$4ssTnA0d6Pw=~?9yvqy-4Ohf_9BbW`!X&F>2eNzCkfB3M4ALFEesPMH!bb zn=;)!IOE$Ifv~#c98m{lbYz-2@eSIM6e`kW?!siPgv}H_0GkRxQkEJMlkO5V^EL&) zzGoPzRKfFED7~wl80>8>ze&Q=U)GlmdUea&2k_ zH}9?OK6SdSQnJoicpTv8>%$*APv-xPHc;^MMdAgkpz3|$M;8dIQVouTmzBJ2K53;+ z8(dPRyT7zj+2tEOnj!|cCX>K_7F8*pIU3|vcvSq-b5cn@cl`M3x1DU=ef3a^PtD~o zPu|ks4G6J>EAl8i6!cY6Lj!4NA~iqmt%h`zND)n3IEDACT6GkYCyX#Za!q`DVgR1X zF@E67=;UTwlWcLk+oZWPFV?noVPDkXPf;cTN(*D3B~K{#SmWVRh&z?|v^cPkaJj@v zd6R~FpdY`$V4IIO1#L?ylk?6{RhNf$Is2-#;2Wukr?%1ZnS3xLk4+CT!|@~7Ny^p_ zUctSf%WlAL7%a3Sy;%f2S{6U@HG^{dRjCWeh+0`mtM&#uaNGsn*6;hMSB`zQ|0 zVC3Dh@6OA=n86umx}F2SB6Yis_KBp?nY@*QSwB>@E*vBi;57xxC;|Z30I!u4-}_`7 zw)qAaZ>C{-6Of<%8-(*gkrtH8_BeIdNVd}d8bE1Ak$FUrEB3EfOC&71cFFQaKwA=rVm(Ozk68US7 z&<%Ic0>0zqc+?r#f=5hhSQ(-&Ev-tUqwmIg2BLZ%52YsB0|aa9r`+!a z6P-2d6g=P--JdIWpQg2$^f=+c_Q}D;&Bg$k>dc#_-3pfrt6cNjQ*r1BiZP#@dq;Og zj}wD2T7~8ndjrrTo@G@UY=Ngk6|95z@rA(im!M3AZgK??q@xSPx#Y>47FYbwXTQ}1 zpZ*iQh@CZJ<-QLi#MV(>hOD3}&eZ?|9#TT)uV=ji^yA5eN@l2RI%C{pHHJ;Ja#UXBgHiJ=EeuZ+m|o5 zlDw`6rNs+et?4LRs3UrAI6rve-WLIPic!`RXz8a6)HUe4YJzl>2$vcbZxPdN(Q8Rw z6AvOn>@pQ(dj+Ymx&^(Z$4I^DjsrMWv`?biQ6ByspjH(Ugq6ViCkb1U>f5SHvS|s@ zI8rg@PZ+sZU;MjUm5}W@ioNYlO%A>4bYHa`09Of0{XM0+LH{B8y-u1wRjG|6H(TMU zn$kM{ms4nqj}&0{g@08^YTx4Y(IIvqksVVY{pf7Rd*0PfS{oLita}X(C%bP&b;OXZ z0(N>&{xZyxY~gq8+HHz~BULjL*g%%ZZE{OioHTM4Yq+In<1!L!Guvm{qVcS1O&@!v zZmti}@k9FR5QeKmG-cyEFKz%w_YLQ7DID{Ef2E_k#IfVG%Dn%FY5jVmYwBiEv!P{A z1hqM-CvE#uUL~|l1E896s`kYVHw*FmW=!sh8z5`!O8fJVVWgw956!R2)RI2Z?`o43 zDf(-C6cY_4vQ1Z4#A)Q@&G6%xDyXu6jgdJU#WskfW4W^WuUsR7QQy3Gxb~l`xZdvg ze=ZL{IXrQHa2M05O7wj6xR~{@*0OUrk%k}OUDI?z-T09qvk#FvdjEB1`R#j?cbx}T z(33_*`E|Ix>+IuMhL8lxPv7Dy+p*3{haE)W_aS~PNQ50x69;-Q=k8aO)9zD17XIWn z16W)05nYCy&nx^hQ}R}G9VM&*diIQX)Yqw8>gz8ZcqaQGtI`PdQ>f{jI3Ae!>~i*K zggnh*wuu}kl^7MY_o&}$p*!J=z4MO!;CE~;Zn)xB^BqLm(&kv$MA|)H1;3>#HO@R{H4&yi3w$?rq7ibx zoNL_n!*dIcZs|4&7H-P@l6Ifu2P8J+K*H>D#xL?1PM8cCS8WpQClyLkdzgYZ*m;JH z{_i7<#=XCpi>%Sq5#Fy|f-^c`O|$2HU9hG><|%K}{aaggcwH9I5&;&**(Vmw%!GXY z0wB3E(oc~pXLj8dnQV$^I2TH@!jB@RIV6So#3l5{TPRUJ6iRs98NnuC@#JMN751V< z7*C}4=q?m50+)*BJw8E_4p7S@C(yDJ+o$#9r7}IHDTs(9>!)QWr_u+?AXU1K+w@x%>I0pUo39K^NGck)e2S}4ngtB{Y51An?OJ`m+;p9?tB7kng-Hw zebbJ3@$l-uWkq5&h~EBvrq8T-mI{6B+#>817w?H^G#)gD<}4&&n(;KXAP z3{@+ts#?UVI0>0(janno`@Cly*Il+hVC^zz<&Pmdde2H!ib;&--jUJmuMKsUfhZ&1t6Psz`hnwoFs()Dv(mM1lx*&9tO&8TmGZ}A>y2ENBUG`R%wTcOI2 zVVww~J(zDoWNhpU0anJXidwO(Y6Ck%p}4KzxXteFPbPU;SuBGr138<`j;hqp+|r_8 zPm_jIt%!E4pAIgUM@b3D@a;Z|q-~YU9;84a&k1AJ5;kH7Zr)h{hC_tZ=>%9pt``!|R zDfWNpt`DLf6N45sopMAqB?bIECNYFu7EhUcPkigEFX6qheU9z2DX%?}+wbzHZJ`L< zfeb=Li9ql!*A2K}vW&$C+)%G_q5b=i=F2>AW8&l&>W$}FAG5EJ4>X2h-*g(}U!Z3R z>D&L7{sf*{xz*JOdwM05W{y0!!eirqO@7ks=(^+xS-yl@p<_of{4996%~~k#CMfV6 z=B8(V%xr9GPe=@0mN@MZi<+*L|EQ{Nk94-Oq9G-#d7?j}8jsi}y%hN%?w&f*tDJl) z!7Tg6)KdN$53>6xyVr?aT4r>s1hZ?*`dG6UF}7HpI#q#K44!6PeHR_t1WGhX{;{r$ zY1vEn`QQ{Y7Nh*b;rmX=G^~64ZDr42C%MKL^AZe2p!Xdq))ADziulun5XjwUvFR0uzNs>N};!J zSUsQ?+u8SZHKd!yK85YKv*tT*y_F0wd~t}vSK5%kuv)QE z8e`vruHUBjkb4+ESk|;-EzTYOPh0S!e@NNep^H)sbx25tVOehHx8AuY&%R1z&B4b$ zwRY{-Kw+06bM2QR0N`R>UNImsSor~! zT{axTnQMXwiam^!=L|)yzv6M%nV(%ALHRuDEWdo)I&Jayr$$$yHNlZQ&TgvtvegIE zu-@apaIEjiI6RkH_ubJMwsl5nK1~Xc*6a9~6~*1$d>f>Rnwyn4J)@%TYpJmpPs`z861xTB$zBpwtVdrW~r1qI8bJCkMv%>CZYjQB+nOaZY~)`7M_(VXT$MnKzhBOk zPVH!nd{8LgVu*&Qt;Qm_%p`rIY!+Wf)foXwdV3q~K7Nsz-V5|b$Jr)N35g7fcrwzn z@8c1@huj~N55ziM=MjbF9GBmx`R?{*Ex$ZbW9{4u*raiD;e~gS|DoXZB`dLQ`|Cir zYm6C!W%LO>6%e;@n@x{mlR`zaa>n6(<+rpO^#lnG3V>9yE0+nxqI;J6|ud3W#B{b*gB>i zZ|1j1m^q65C1ieksrv4`(F3p`BC_*ZEsu>meeUkEtcUwn6+|tVGGb!%nd+&&nc@No z%rU#!UMZPsj5yY2F^nz!={UwDlxyypAS!iLj*qCo_|c36#{=R?#a-ppa#%rT{UPnXN%(pf(!Tt_v9DWAd-aNq2kFE z9>5CQBh5{~PXYV0;M6u1qhdp|&?jmkR>MRtt;fh<`xwY=BaW-zivbdZc<2-Bo<9mp zh=PVbU%`9Mpf|*NNn|tnwNC!~G4S<{4O#e0!}c zL}&FM2Y7D%4eP0`RVrhCAuwtmRASr7fZ1#T4^roQ`p8eSJnLCoE2jSbh+=fs9F+SV zN%r=Sx2{86Z%n-*pXN6{-T#h0G4keRo81>IYA+=iuPJ3(7<}56pPps9X~s~y(TJA2 zl#x3+L*GEI`W_D99c;(V(MUY)R5GphR>xp2^P~F*1-3_BmbzEi%coZYLKknOJx!OI z*2IsNTp#U!LW{r}k?*j{k^D+OgMh4w65H}Q^ara5;`+f*4uxyKo#HjJP!YlaN5t{y z>>6t+e3}Wkvi`W1j?Df0o;%4|4hMSc|HDiP9*nDOGJ;m!gHvatUC>5-c-H2*9wYFa zyLFO_wsR`I@Jw#ArB3EhT_?np0N0^c3C5jQl1Y8x5c^uvZ%&bb94^oK^xNfdMMZ^_*pl+HpS2paP?Xc#y?72|c#WY%bP8uD*Kt__9kLR}33j zq=yXs*WXDSX~dV)2To978`=EnBN@>@R)sF6iuYd_i>H_V7_mJ-38Sx%D4GJMNjJh1 zRjbgy8!zI(6RL`9J<}!zitFeQlWf-0X6iTA-v!XU-1i8u%O^b1_H`Mvuxoj%CWKxFB7a z6cM7>_Z4K1b|kfWypJ(crYk4t;e*_mr()*hWN+3SKks6rh0Tc zmKn*|dv)Zz@M~Tp5055)(=JHE^kJAHp12xxNOT~P*{4(i63>3#eSNlp{ylQL(mR)D#ueFPOYe)JmWQAlkoI!|6=UgN&j!_Qc39Ee#B4pX zqeaWNd_@3x2v~;rZ~D8HlF{t}XUG#dLAxYICu*)( z@*Rb8asx>C%!|n9Nn+7aF!KIn#?h%8xrQd_-Q$ye;?xVd7`S`-G$BB}&F{(7<#y|S zxC_n=h#MCb!PH@F$SAoKIpeT?UNH7~)gmAuW1?ESUCdk9&y)fn_tNj$d!rR^tQOrV z_FPR~I?~X((2c3m){J{}>*O1P>x!q>a8;}3XMngX*C*%bu2?)FNB|AtXrIK)FA{n= zw+ylLq}t8sUCa&rszMF&1!=`KAdU86XW?la@kU&X&?h0S`Ngg}`IjJ#j7wO3dnC;3 zx#%ZmPFPiZYirZN+WRHMgYabdNEEwfi+R^}>30d>=31dekDN~BR6eUciN(ybe8;1} zn&(wLa<9ZBsiXo&>%G7vJh2*=tddORbb7X*Tk8@c2Sg@yrAxNnThfa)!q^K5GoGUO zYC=K_HLN7kn`ApAfj-x<|8fdA7dwe&CReFYJ6pefXySn*!-rRTj}3>~H6zV*v3N+g-R>y5sqf&?3yUo3hxyq#lZBWn7*+%+++r;4^J$W`2RT^RC zm^y5xv$CR*#U8RPvr_m*STXKRmMk@ItnA?>v z=?#kW9dZ$6T?$q&YHJj{n=Wy!B)wqXhG--VQaL{Jr&$NT{P;-sS(FiN%mt~oq!fcT zN)2xsSnl&}Og%(h`T+algDo+zuci##BIS0gtg7efo$Nf0tZIap#`}e**z9`}!Iy$x ztN!hIxDKCHFda}xk7DdK$hnD0{-o!UODg$nS^(P+RL}bQ*h?T)`!364m}GdnT!Ry_ z&s$YUwFyM=(lZo|sQ8T89lvIxBmGIcQ^VijBY_FoRgt9@N@=*`bv)hbkLSmGB^iVP$SQ~z9PZx=aSb|; zU7Alj9u}r&Q*#yTE(eNGC7J!0?<~o&6c9_t6TfR9BRh>X8Zpb8kZZes=vAcs^Ov(- zzf13`+~r#*Ru-EM2hJfT5EQ#1_T{})+&><`>h|*t%woDXRGIx@`p8legO4s8I^)3D z+be19dQsBzTjel^q{(?f1y@_z35O1>xp^C%5bBeL@l|=u&D#s*%-|#V z5Ho>pyWz%U`X3q+&qJe{sJqPeZ{@bHt_3x$wX1Q<{U-NY3~dNfLB*}J4j0BUY(3N| zH&4>P3GoM|mSF-)X+7N;lQn%Rx34o6E6p|<@fdfm<`_#8+&IbGOtrzCY=;?`WQKna)2WxAp z7h6(>pMJc71jG%;3L;|k{A`BVCe`t(Y5xCz*X*O>OIhe`|H7wun9h&keq+>07J_S~rz8Kz_&#p1DWtviq6X8Yi-Q}|?T>m@W^S`u0-BjBfb!f$ z7ZFgZvKbKNYQ4>JWf8L0(i}ZvA7=GbK1qdHiQ)}8FbME{%bJ>N39TYt@XzKwpvyEvr)`!x7R2b#J2Sb|Bzp&Oy@zk#!9aK-5Qk9Pzx8DND#~GC z>3b4y@sgTmuo=q5WyC^<~*#ecN+A{4P8cz*d%3!;A;vv>ET0Yz|#cVcSrc&Jnu z`JiWbP2TMhg=CjcQ}Bm3U$YF%w~zm*SG1=NueHZ7AimRR*iG}y6#sLAyy>;%^r3-P z6Vhk8fBXt`M>acto}YH?({FAX=!#!-<=_Q>Y{ClNXXCAE{&FBT&rzX3;w?DeJg0QP+YB z*vBafdb-vMp^KUiWnYZRHj7;b`L~99^apZfu4^dznU10jFcl`xqhq+}82hA(2Ufpu zO|_K>zH=)Rhgr#rI>k1ktwiR4yio{TT*m`lmO;DTesd~G$dAPa+o24Ixcj9T_zbQcOyud6?=^GptDf97|);ue3a^P~Gbma+= zu-lxL;GLw`wwWsSQeK%zYZ<7H&Go|93}7rrmz7p*CFTyjIAjzaLQqWHbshyG%*Z<= z*n-4hl3B=&J16uJXf?U=lB>Ul zuWDT408!aGtE2)~J7r8Tw($O~bA1tJ^{q7}`?C?y#(rw@G zh}YShRZtl;Mq&X!qF6?}`yF;Qb%^uz)dEXp`^DbfotN`ub-=CL_v@$B-=OkKw-kjG zXBm)PPqQATGTVj5s>TR(mRb9DRNskl`HzZDMVf_qrv2S~g95}|`;W280;>+ym2XKG z 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 literal 0 HcmV?d00001 diff --git a/icons/obj/ammo.dmi b/icons/obj/ammo.dmi index 54d02ae9082c754aa4abf7cdadfec90481c2e0a1..1c127533513dd9916c97109b3d4d71db2a899845 100644 GIT binary patch literal 56191 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 KE52&~=zjs9xxi}x literal 53148 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 PI_#RpjjIJ$?gsx4r(I

    Psi Dampener Monitor

    " if(authorized) dat += "[authorized] Logout" else dat += "Login" + dat += "

    Active Psionic Dampeners


    " dat += "
    " dat += "" for(var/thing in SSpsi.psi_dampeners) - var/obj/item/weapon/implant/psi_control/implant = thing + var/obj/item/implant/psi_control/implant = thing if(!implant.imp_in) continue dat += "" - if(implant.malfunction) - dat += "" - else - dat += "" + dat += "" dat += "" dat += "
    OperantSystem loadMode
    [implant.imp_in.name]ERRORERROR[implant.overload]%[authorized ? "[implant.psi_mode]" : "[implant.psi_mode]"][implant.overload]%[authorized ? "[implant.psi_mode]" : "[implant.psi_mode]"]

    " + if(show_violations) dat += "

    Psionic Control Violations -


    " - if(psi_violations.len) - for(var/i = 1 to psi_violations.len) + if(length(psi_violations)) + for(var/i = 1 to length(psi_violations)) var/entry = psi_violations[i] dat += "" else @@ -106,7 +101,14 @@ dat += "

    [entry]
    [authorized ? "Remove" : ""]

    " else dat += "

    Psionic Control Violations +


    " + var/datum/browser/popup = new(user, "psi_monitor_\ref[src]", "Psi-Monitor") popup.set_content(jointext(dat,null)) popup.open() + +/obj/machinery/psi_monitor/proc/report_failure(obj/item/implant/psi_control/implant) + psi_violations += span_redtext("Critical system failure - [implant.imp_in.name].") + +/obj/machinery/psi_monitor/proc/report_violation(obj/item/implant/psi_control/implant, stress) + psi_violations += "Sigma [round(stress/10)] event - [implant.imp_in.name]." diff --git a/code/modules/projectiles/ammunition/ballistic/revolver.dm b/code/modules/projectiles/ammunition/ballistic/revolver.dm index 8153d5e4aaf1..d3ce06a1db12 100644 --- a/code/modules/projectiles/ammunition/ballistic/revolver.dm +++ b/code/modules/projectiles/ammunition/ballistic/revolver.dm @@ -47,7 +47,7 @@ /obj/item/ammo_casing/a357/nullglass name = ".357 NULL bullet casing" desc = "A .357 NULL bullet casing." - projectile_type = /obj/item/projectile/bullet/a357/nullglass + projectile_type = /obj/projectile/bullet/a357/nullglass // 7.62x38mmR (Nagant Revolver) diff --git a/code/modules/projectiles/ammunition/ballistic/shotgun.dm b/code/modules/projectiles/ammunition/ballistic/shotgun.dm index 1ebe8a9732e2..d032fbc7a2dd 100644 --- a/code/modules/projectiles/ammunition/ballistic/shotgun.dm +++ b/code/modules/projectiles/ammunition/ballistic/shotgun.dm @@ -147,7 +147,7 @@ name = "nullglass buckshot shell" desc = "A buckshot shell loaded with shells of nullglass that disrupt psionic." icon_state = "mshell" // Temp - projectile_type = /obj/item/projectile/bullet/pellet/nullglass + projectile_type = /obj/projectile/bullet/pellet/nullglass pellets = 6 variance = 25 diff --git a/code/modules/psionics/complexus/complexus_helpers.dm b/code/modules/psionics/complexus/complexus_helpers.dm index b3619f15d8b1..656e8646e700 100644 --- a/code/modules/psionics/complexus/complexus_helpers.dm +++ b/code/modules/psionics/complexus/complexus_helpers.dm @@ -134,7 +134,7 @@ to_chat(owner,span_warning("Your nose begins to bleed...")) owner.add_splatter_floor(small_drip = TRUE) // Your get a headache. Yes this is stolen from disease code, sue me - if(21 to effective_heat) + if(21 to 500) switch(effective_heat) if(0 to 200) to_chat(owner, span_warning("[pick("Your head hurts.", "Your head pounds.")]")) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index d700deab26ba..95cca97ed3e3 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -220,19 +220,6 @@ to_chat(target, "[lost_memory]") to_chat(target, span_warning("You can't remember anything surounding that phrase!")) - if(COGMANIP_THRALL) - if(!target.mind || !target.key) - to_chat(user, span_warning("\The [target] is mindless!")) - return TRUE - to_chat(user, span_warning("You plunge your mentality into that of \the [target]...")) - if(!do_after(user, target.stat == CONSCIOUS ? 2 MINUTES : 1 MINUTES, target, FALSE)) - user.psi.backblast(rand(10,25)) - return TRUE - to_chat(user, span_danger("You sear through \the [target]'s neurons, reshaping as you see fit and leaving them subservient to your will!")) - to_chat(target, span_danger("Your defenses have eroded away and \the [user] has made you their mindslave.")) - var/datum/antagonist/thrall/T = new() - T.master = user.mind - target.mind.add_antag_datum(T) return TRUE /datum/psionic_power/coercion/assay diff --git a/icons/obj/machines/psimeter.dmi b/icons/obj/machines/psimeter.dmi new file mode 100644 index 0000000000000000000000000000000000000000..d39e351f2cfa065a361125848a56c1d27e534836 GIT binary patch literal 1213 zcmbtU>sQiu9R7)vU^=aBYS z1X(f;gs_dAXFMLt)QIYak{lz&M1^xhB@zjZM$5{|N=QgZ!MTr(jqS&OP6(n)rBWDx zCTBMc24nBD2fhkOB$7ZN2nck?;c$NLfeZ!%hGA#lKp#hYe}8`-k4LA|Wyio(2pBVy znq_Uq3X@EBBnP6*zC30$`KP(xWQKg7afF|omYJM-5`wa8IS14DS=u#D+KOh{gX!fl zC>!E*d`%jLRqEYC;qK2Mep&g0eJ~pyg~PD5>Wfb_3CPe=RK&TY1ZXnez=?}w8J+vPTpn4O65aa7EVKD@Af_`dea#ML8j*z zAyjUX@IzcF|0c--`E$BkN&$$_3Xnq#;4vf^4|Q$l-95j}kW1=JjC`GxIf{2`th z!FrPO2#E~9^BfR42wu#2QcuO(R~7xPSe3!qu4_~pe-`{&nf_T2UEmj0;6G|E6tmHH=S$VfNgTfcfbrKj$2jjYRI!ByMf z*|&#d9#aZ{8f*vKYvaMq zeVv9ONvwt(=crNux4||rtb^_w=&aa5M5%BLVLx~x1rStqb3S+Bj4$lmMoWM z_HPPQf(mh~)zNo)k?6}J`}z^Eb0t&nAntRNSZA6!?%c02xP41&*!~C7`cnXhAeWt^djW834ej&F8L3fA+*949S)`9yc(TMi%>wwjtcmpKXPIOnLtN~_u z+fu7_%P=5pkJ_sPNQBFo#6n7)fh?pn8U%jAxJ|)p3+_Cy-En Date: Fri, 5 Jul 2024 19:46:38 -0400 Subject: [PATCH 007/201] compiles but doesnt work --- code/_onclick/other_mobs.dm | 4 ++-- code/modules/mob/living/carbon/human/_species.dm | 2 +- .../mob/living/carbon/human/species_types/polysmorphs.dm | 2 +- code/modules/psionics/faculties/coercion.dm | 1 - code/modules/psionics/faculties/energistics.dm | 1 - code/modules/psionics/faculties/psychokenisis.dm | 7 +++---- code/modules/psionics/faculties/redaction.dm | 1 - 7 files changed, 7 insertions(+), 11 deletions(-) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1707542fbea9..1d660912eb94 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -6,7 +6,7 @@ */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) if(psi) - INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[a_intent]), A, FALSE) + INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[!combat_mode]), A, FALSE) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -55,7 +55,7 @@ /mob/living/carbon/human/RangedAttack(atom/A, params) if(psi) - INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[a_intent]), A, TRUE) + INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[!combat_mode]), A, TRUE) //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 58fe6e10a083..12862cb8e419 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -212,7 +212,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // Psi Stuff /// Prob chance that mobs of this species have latent psionics - var/latency_chance = 15 + var/latency_chance = 100 /// List of faculties that can be chosen for random psionics var/possible_faculties = list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS) /// What level starting faculties are at diff --git a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm index 734cc98092a0..e9dde2d79e8c 100644 --- a/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm +++ b/code/modules/mob/living/carbon/human/species_types/polysmorphs.dm @@ -43,7 +43,7 @@ mutant_bodyparts = list("tail_polysmorph", "dome", "dorsal_tubes", "teeth", "legs") default_features = list("tail_polysmorph" = "Polys", "dome" = "None", "dorsal_tubes" = "No", "teeth" = "None", "legs" = "Normal Legs") changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | ERT_SPAWN | RACE_SWAP | SLIME_EXTRACT - latency_chance = 2 + latency_chance = 20 smells_like = "charred, acidic meat" diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 95cca97ed3e3..6f0266644d06 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -5,7 +5,6 @@ /datum/psionic_faculty/coercion id = PSI_COERCION name = "Coercion" - associated_intent = INTENT_DISARM /datum/psionic_power/coercion faculty = PSI_COERCION diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 7869913be6c0..1d3dd57beccf 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -1,7 +1,6 @@ /datum/psionic_faculty/energistics id = PSI_ENERGISTICS name = "Energistics" - associated_intent = INTENT_HARM armour_types = list("bomb", "laser", "energy") /datum/psionic_power/energistics diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 23b977a38e5a..acc93861fa08 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -1,7 +1,6 @@ /datum/psionic_faculty/psychokinesis id = PSI_PSYCHOKINESIS name = "Psychokinesis" - associated_intent = INTENT_GRAB armour_types = list("melee", "bullet") /datum/psionic_power/psychokinesis @@ -19,7 +18,7 @@ admin_log = FALSE /datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target) - if((target && user != target) || user.a_intent != INTENT_HARM) + if((target && user != target) || !user.combat_mode) return FALSE . = ..() if(.) @@ -49,7 +48,7 @@ admin_log = FALSE /datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target) - if((target && user != target) || user.a_intent != INTENT_HELP) + if((target && user != target) || user.combat_mode) return FALSE . = ..() if(.) @@ -84,7 +83,7 @@ ) /datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) - if(user.a_intent != INTENT_GRAB) + if(!user.combat_mode) return FALSE . = ..() if(.) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 51c49c334253..4e499f8ff958 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -1,7 +1,6 @@ /datum/psionic_faculty/redaction id = PSI_REDACTION name = "Redaction" - associated_intent = INTENT_HELP armour_types = list(BIO, RAD) /datum/psionic_power/redaction From 0691eb3e920c7e7ede677a5cc244ea7c228a40ba Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 19:47:33 -0400 Subject: [PATCH 008/201] remember to change this --- code/modules/mob/living/carbon/human/_species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 12862cb8e419..58fe6e10a083 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -212,7 +212,7 @@ GLOBAL_LIST_EMPTY(features_by_species) // Psi Stuff /// Prob chance that mobs of this species have latent psionics - var/latency_chance = 100 + var/latency_chance = 15 /// List of faculties that can be chosen for random psionics var/possible_faculties = list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS) /// What level starting faculties are at From b1cf655ad101ba3189ce6cfc68b5d251b17f0b34 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Sun, 7 Jul 2024 15:10:46 -0400 Subject: [PATCH 009/201] these can go probably --- code/_onclick/other_mobs.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 1d660912eb94..7e7df0ebeb4a 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -6,7 +6,7 @@ */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) if(psi) - INVOKE_PSI_POWERS(src, psi.get_melee_powers(SSpsi.faculties_by_intent[!combat_mode]), A, FALSE) + INVOKE_PSI_POWERS(src, psi.get_melee_powers(), A, FALSE) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -55,7 +55,7 @@ /mob/living/carbon/human/RangedAttack(atom/A, params) if(psi) - INVOKE_PSI_POWERS(src, psi.get_ranged_powers(SSpsi.faculties_by_intent[!combat_mode]), A, TRUE) + INVOKE_PSI_POWERS(src, psi.get_ranged_powers(), A, TRUE) //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) From caeaf27967a29da6ee26709c75230eeb7bbe1864 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Sun, 7 Jul 2024 23:55:24 -0400 Subject: [PATCH 010/201] huge update (we're getting somewhere) --- code/__DEFINES/magic.dm | 2 + code/__DEFINES/psi.dm | 5 +- code/_onclick/other_mobs.dm | 8 +- code/controllers/subsystem/processing/psi.dm | 2 - .../psionics/complexus/complexus_latency.dm | 1 - .../psionics/complexus/complexus_process.dm | 62 +++ code/modules/psionics/faculties/_faculty.dm | 1 - code/modules/psionics/faculties/coercion.dm | 402 ++---------------- .../modules/psionics/faculties/energistics.dm | 139 ++---- .../coercion/coercion_abilities.dm | 39 ++ .../psionics/faculties/psychokenisis.dm | 69 +-- code/modules/psionics/faculties/redaction.dm | 171 +------- code/modules/psionics/interfaces/ui_hub.dm | 1 + code/modules/psionics/interfaces/ui_toggle.dm | 5 + yogstation.dme | 1 + 15 files changed, 210 insertions(+), 698 deletions(-) create mode 100644 code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm diff --git a/code/__DEFINES/magic.dm b/code/__DEFINES/magic.dm index a83ebbd87cee..593a4adc8092 100644 --- a/code/__DEFINES/magic.dm +++ b/code/__DEFINES/magic.dm @@ -30,6 +30,8 @@ #define SCHOOL_FORBIDDEN "forbidden" /// Blood magic, involves vampirism, draining blood, etc. #define SCHOOL_SANGUINE "sanguine" +/// psionic powers, not *technically* magic +#define SCHOOL_PSIONIC "psionic" // Invocation types - what does the wizard need to do to invoke (cast) the spell? /// Allows being able to cast the spell without saying or doing anything. diff --git a/code/__DEFINES/psi.dm b/code/__DEFINES/psi.dm index 82bdb908b62b..59ddc7526dbb 100644 --- a/code/__DEFINES/psi.dm +++ b/code/__DEFINES/psi.dm @@ -17,8 +17,9 @@ #define PSI_IMPLANT_DISABLED "Disabled" #define INVOKE_PSI_POWERS(holder, powers, target, return_on_invocation) \ - if(holder?.psi?.can_use()) { \ - for(var/datum/psionic_power/power as anything in powers) { \ + if(holder && holder.psi && holder.psi.can_use()) { \ + for(var/thing in powers) { \ + var/datum/psionic_power/power = thing; \ var/obj/item/result = power.invoke(holder, target); \ if(result) { \ power.handle_post_power(holder, target); \ diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 7e7df0ebeb4a..e450a1f09e91 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -5,8 +5,6 @@ Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) - if(psi) - INVOKE_PSI_POWERS(src, psi.get_melee_powers(), A, FALSE) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -52,11 +50,7 @@ /mob/living/carbon/human/attack_empty_hand() if(psi) INVOKE_PSI_POWERS(src, psi.get_manifestations(), src, FALSE) - -/mob/living/carbon/human/RangedAttack(atom/A, params) - if(psi) - INVOKE_PSI_POWERS(src, psi.get_ranged_powers(), A, TRUE) - + //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) . = FALSE diff --git a/code/controllers/subsystem/processing/psi.dm b/code/controllers/subsystem/processing/psi.dm index eab50c4bca8c..0f087fdcf2c4 100644 --- a/code/controllers/subsystem/processing/psi.dm +++ b/code/controllers/subsystem/processing/psi.dm @@ -12,7 +12,6 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/list/psi_dampeners = list() var/list/psi_monitors = list() var/list/armour_faculty_by_type = list() - var/list/faculties_by_intent = list() /datum/controller/subsystem/processing/psi/New() NEW_SS_GLOBAL(SSpsi) @@ -28,7 +27,6 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/datum/psionic_faculty/faculty = new ftype faculties_by_id[faculty.id] = faculty faculties_by_name[faculty.name] = faculty - faculties_by_intent[faculty.associated_intent] = faculty.id var/list/powers = subtypesof(/datum/psionic_power) for(var/ptype in powers) diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index 93494533b98a..77aa9f9d095a 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -1,5 +1,4 @@ /datum/psi_complexus/proc/check_latency_trigger(trigger_strength = 0, source, redactive = FALSE) - if(!LAZYLEN(latencies) || world.time < next_latency_trigger) return FALSE diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index a2021c61ebaf..923bbfe7e56b 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -51,6 +51,64 @@ aura_color = "#33cc33" if(PSI_ENERGISTICS) aura_color = "#cccc33" + + // for(var/datum/psionic_power/power in subtypesof(/datum/psionic_power)) + + //operant level psionics + if(get_rank(PSI_COERCION) == 2) + var/datum/action/cooldown/spell/pointed/disarm/disarm = new(owner) + disarm.Grant(owner) + if(get_rank(PSI_PSYCHOKINESIS) == 2) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_REDACTION) == 2) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_ENERGISTICS) == 2) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + + //master level psionics + if(get_rank(PSI_COERCION) == 3) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_PSYCHOKINESIS) == 3) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_REDACTION) == 3) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_ENERGISTICS) == 3) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + + //grandmaster level psionics + if(get_rank(PSI_COERCION) == 4) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_PSYCHOKINESIS) == 4) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_REDACTION) == 4) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_ENERGISTICS) == 4) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + + //paramount psionics + if(get_rank(PSI_COERCION) == 5) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_PSYCHOKINESIS) == 5) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_REDACTION) == 5) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) + if(get_rank(PSI_ENERGISTICS) == 5) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) if(!announced && owner?.client && !QDELETED(src)) announced = TRUE @@ -59,6 +117,10 @@ to_chat(owner, span_notice("Shift-left-click your Psi icon on the bottom right to view a summary of how to use them, or left click it to suppress or unsuppress your psionics. Beware: overusing your gifts can have deadly consequences.")) to_chat(owner, "
    ") + + + + /datum/psi_complexus/process() var/update_hud diff --git a/code/modules/psionics/faculties/_faculty.dm b/code/modules/psionics/faculties/_faculty.dm index 28827b91f6a7..d31a70c83433 100644 --- a/code/modules/psionics/faculties/_faculty.dm +++ b/code/modules/psionics/faculties/_faculty.dm @@ -1,7 +1,6 @@ /datum/psionic_faculty var/id var/name - var/associated_intent var/list/armour_types = list() var/list/powers = list() diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 6f0266644d06..04ab8e043d4a 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,377 +9,35 @@ /datum/psionic_power/coercion faculty = PSI_COERCION -/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target) - if (!istype(target)) - to_chat(user, span_warning("You cannot mentally attack \the [target].")) - return FALSE - . = ..() +/datum/psionic_power/coercion/mental_freezing + name = "Cognitive Manipulation" + min_rank = PSI_RANK_GRANDMASTER + use_description = "Further increase heat cooldown by another 30%" + +/datum/psionic_power/coercion/psychic_scream + name = "Psychic Scream" + cost = 50 + cooldown = 30 SECONDS + min_rank = PSI_RANK_MASTER + use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." + +/datum/psionic_power/coercion/telepathy + name = "Telepathy" + cost = 30 + cooldown = 5 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grants the ability to telepathically communicate with other sentient beings." + +/datum/psionic_power/coercion/disarm + name = "Disarm" + cost = 50 + cooldown = 30 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grants the ability to telepathically disarm someone's weapons. Upgrades with your Psi Rank" + +/datum/psionic_power/coercion/mental_cooling + name = "Mental Cooling" + min_rank = PSI_RANK_OPERANT + use_description = "Passively upgrades your heat-cooldown by 20%." -/datum/psionic_power/coercion/blindstrike - name = "Blindstrike" - cost = 8 - cooldown = 120 - use_ranged = TRUE - use_melee = TRUE - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." - -/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target) - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) - return FALSE - . = ..() - if(.) - user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) - to_chat(user, span_danger("You strike at all around you with a deafening psionic scream!")) - for(var/mob/living/M in orange(user, user.psi.get_rank(PSI_COERCION))) - if(M == user) - continue - M.emote("scream") - to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) - M.blind_eyes(1 SECONDS) - M.adjust_confusion(10 SECONDS) - return TRUE - -/datum/psionic_power/coercion/mindread - name = "Read Mind" - cost = 25 - heat = 15 - cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. - use_melee = TRUE - min_rank = PSI_RANK_MASTER - use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." - -/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target) - if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) - return FALSE - . = ..() - if(!.) - return - - if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) - to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) - return TRUE - - user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) - var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text - if(!question || user.incapacitated() || !do_after(user, 20)) - return TRUE - - var/started_mindread = world.time - to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) - to_chat(target, span_notice("Your mind is compelled to answer: [question]")) // I wonder how this will go down with the playerbase - - var/answer = input(target, question, "Read Mind") as null|text - if(!answer || world.time > started_mindread + 25 SECONDS || user.stat != CONSCIOUS || target.stat == DEAD) - to_chat(user, span_notice("You receive nothing useful from \the [target].")) - else - to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) - log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") - return TRUE - -/datum/psionic_power/coercion/agony - name = "Agony" - cost = 20 - heat = 15 - cooldown = 7 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_OPERANT - use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." - -/datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target) - if(!istype(target)) - return FALSE - if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) - return FALSE - . = ..() - if(.) - user.visible_message("\The [target] has been struck by \the [user]!") - playsound(user.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) - target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) - return TRUE - -/datum/psionic_power/coercion/spasm - name = "Spasm" - cost = 15 - cooldown = 100 - use_melee = TRUE - use_ranged = TRUE - min_rank = PSI_RANK_MASTER - use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." - -/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) - if(!istype(target)) - return FALSE - - if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) - return FALSE - - . = ..() - - if(.) - to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") - to_chat(target, "The muscles in your arms cramp horrendously!") - if(prob(75)) - target.emote("scream") - if(prob(75) && target.held_items[1] && target.dropItemToGround(target.get_item_for_held_index(1))) - target.visible_message("\The [target] drops what they were holding as their left hand spasms!") - if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) - target.visible_message("\The [target] drops what they were holding as their right hand spasms!") - return TRUE - -/datum/psionic_power/coercion/cognitivemanipulation - name = "Cognitive Manipulation" - cost = 28 - cooldown = 20 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_GRANDMASTER - use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." - -/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target) - if(!istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user) - return FALSE - . = ..() - if(.) - if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) - to_chat(user, span_warning("\The [target] is dead!")) - return TRUE - user.visible_message(span_danger("\The [user] seizes the head of \the [target] in both hands...")) - - var/coercion_rank = user.psi.get_rank(PSI_COERCION) - var/target_coercion_rank = PSI_RANK_BLUNT - if(target.psi) - target_coercion_rank = target.psi.get_rank(PSI_COERCION) - var/relative_coercion_rank = target_coercion_rank ? coercion_rank - target_coercion_rank : coercion_rank - - var/list/radial_list = list() - var/radial_icon = 'icons/mob/screen_psi.dmi' - - if(coercion_rank >= PSI_RANK_GRANDMASTER) - var/datum/radial_menu_choice/choice = new - choice.image = icon(radial_icon, "hypnotise") - choice.info = "Make the target temporarily subject to a hypnosis-like effect, making them easily influenced by spoken words." - radial_list[COGMANIP_HYPNOTIZE] = choice - - choice = new - choice.image = icon(radial_icon, "erase") - choice.info = "Rewrite the targets mind to remove a specific memory, which can cure them of related ailments." - radial_list[COGMANIP_ERASE_MEMORY] = choice - - if(coercion_rank >= PSI_RANK_PARAMOUNT) - var/datum/radial_menu_choice/choice = new - choice.image = icon(radial_icon, "thrall") - choice.info = "Make the target a subservient thrall to your will." - radial_list[COGMANIP_THRALL] = choice - message_admins(COGMANIP_THRALL) - - if(!radial_list.len) - return TRUE - - var/choice = show_radial_menu(user, target, radial_list, require_near = TRUE, tooltips = TRUE) - - if(!(choice in radial_list)) - return TRUE - - var/mob/living/carbon/C = target - // So much text - if(relative_coercion_rank < PSI_RANK_OPERANT || (relative_coercion_rank == PSI_RANK_OPERANT && (istype(C) && !C.hypnosis_vulnerable()))) - to_chat(user, span_warning("[target] mind is too strong to hypnotize them!")) - if(target_coercion_rank >= PSI_RANK_OPERANT) - to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], but you manage to [relative_coercion_rank == 1 ? "barely " :""]repel the attack!")) - else if(target_coercion_rank == PSI_RANK_LATENT) - to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head holding strong.")) - else - // Non-psionics have no clue what is going on, but they should still have some indication of whats is happening - to_chat(target, span_notice("Your feel a strange sensation in your head.")) - return TRUE - if(target_coercion_rank >= PSI_RANK_OPERANT) - to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], and your mental barriers [relative_coercion_rank > 1 ? "shatter like glass" : "fail"]!")) - to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s mental barriers and start working on the task at hand.")) - else if(target_coercion_rank == PSI_RANK_LATENT) - to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head failing.")) - to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s amiture defenses and start working on the task at hand.")) - else - to_chat(target, span_notice("Your feel a strange sensation in your head.")) - - switch(choice) - if(COGMANIP_HYPNOTIZE) - if(!do_after(user, 30 SECONDS, target, FALSE)) - user.psi.backblast(rand(1, 5)) - return TRUE - to_chat(user, span_danger("You surgicaly rearange \the [target]'s neurons, leaving [target.p_them()] easily influinced by the next thing [target.p_they()] hear. Choice you next words carefuly...")) - target.apply_status_effect(/datum/status_effect/trance, relative_coercion_rank * 10 SECONDS, relative_coercion_rank >= 2) - - if(COGMANIP_ERASE_MEMORY) - if(!do_after(user, 30 SECONDS, target, FALSE)) - user.psi.backblast(rand(1, 5)) - return TRUE - var/lost_memory = pretty_filter(stripped_input(user, "What would you like [target] to forget?", "Cognative Manipulation")) - to_chat(user, span_danger("You surgicaly cut \the [target]'s hippocampus, removing every shread of memory surounding the phrase \"[lost_memory]\".")) - to_chat(target, "[lost_memory]") - to_chat(target, span_warning("You can't remember anything surounding that phrase!")) - - return TRUE - -/datum/psionic_power/coercion/assay - name = "Assay" - cost = 15 - cooldown = 10 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_OPERANT - use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." - -/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target) - if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) - return FALSE - . = ..() - if(.) - user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) - to_chat(user, span_notice("You insinuate your mentality into that of \the [target]...")) - to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) - if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) - user.psi.backblast(rand(5,10)) - return TRUE - to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) - to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) - target.show_psi_assay(user) - return TRUE - -/datum/psionic_power/coercion/focus - name = "Focus" - cost = 10 - cooldown = 8 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_MASTER - use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." - -/datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || target.pulledby != user) - return FALSE - . = ..() - if(.) - user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) - to_chat(user, span_notice("You probe \the [target]'s mind for various ailments..")) - to_chat(target, span_warning("Your mind is being cleansed of ailments by \the [user].")) - if(!do_after(user, (target.stat == CONSCIOUS ? 5 SECONDS : 2.5 SECONDS), target, FALSE)) - user.psi.backblast(rand(5,10)) - return TRUE - to_chat(user, span_warning("You clear \the [target]'s mind of ailments.")) - to_chat(target, span_warning("Your mind is cleared of ailments.")) - - var/coercion_rank = user.psi.get_rank(PSI_COERCION) - if(coercion_rank >= PSI_RANK_GRANDMASTER) - target.SetParalyzed(0) - if(coercion_rank >= PSI_RANK_PARAMOUNT) - target.SetParalyzed(0) - target.SetDaze(0) - if(istype(target, /mob/living/carbon)) - var/mob/living/carbon/M = target - M.adjust_hallucinations(60 SECONDS) - return TRUE - -/datum/psionic_power/coercion/commune - name = "Commune" - cost = 10 - cooldown = 8 SECONDS - use_melee = TRUE - use_ranged = TRUE - min_rank = PSI_RANK_OPERANT - use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." - -/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) - return FALSE - . = ..() - if(.) - user.visible_message("[user] touches their fingers to their temple.") - var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) - - if(!text) - return - - if(target.stat == DEAD) - to_chat(user,"Not even a psion of your level can speak to the dead.") - return - - if (issilicon(target)) - to_chat(user,"This can only be used on living organisms.") - return - - log_say("[key_name(user)] communed to [key_name(target)]: [text]") - - for (var/mob/M in GLOB.player_list) - if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) - to_chat(M,"[user] psionically says to [target]: [text]") - - var/mob/living/carbon/human/H = target - if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) - to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") - else - to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") - if(istype(H)) - if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) - to_chat(H,"Your nose begins to bleed...") - H.add_splatter_floor(small_drip = TRUE) - else if(prob(25)) - to_chat(H,"Your head hurts...") - else if(prob(50)) - to_chat(H,"Your mind buzzes...") - -/datum/psionic_power/coercion/psiping - name = "Psi-ping" - cost = 30 - cooldown = 25 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_OPERANT - use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." - -/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target) - if((target && user != target)) - return FALSE - . = ..() - if(.) - to_chat(user, "You take a moment to tune into the local Nlom...") - if(!do_after(user, 3 SECONDS, user)) - return - var/list/dirs = list() - for(var/mob/living/L in range(20)) - var/turf/T = get_turf(L) - if(!T || L == user || L.stat == DEAD || issilicon(L)) - continue - /* - var/image/ping_image = image(icon = 'icons/effects/effects.dmi', icon_state = "sonar_ping", loc = user) - ping_image.plane = LIGHTING_LAYER+1 - ping_image.layer = LIGHTING_LAYER+1 - ping_image.pixel_x = (T.x - user.x) * 32 - ping_image.pixel_y = (T.y - user.y) * 32 - user << ping_image - addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, ping_image), 8) - */ - var/direction = num2text(get_dir(user, L)) - var/dist - if(text2num(direction)) - switch(get_dist(user, L)) - if(0 to 10) - dist = "very close" - if(10 to 20) - dist = "close" - if(20 to 30) - dist = "a little ways away" - if(30 to 40) - dist = "farther away" - else - dist = "far away" - else - dist = "on top of you" - LAZYINITLIST(dirs[direction]) - dirs[direction][dist] += 1 - for(var/d in dirs) - var/list/feedback = list() - for(var/dst in dirs[d]) - feedback += "[dirs[d][dst]] psionic signature\s [dst]," - if(feedback.len > 1) - feedback[feedback.len - 1] += " and" - to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) - if(!length(dirs)) - to_chat(user, span_notice("You detect no psionic signatures but your own.")) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 1d3dd57beccf..874683394c91 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -7,121 +7,36 @@ faculty = PSI_ENERGISTICS /datum/psionic_power/energistics/disrupt - name = "Disrupt" - cost = 20 - heat = 20 - cooldown = 10 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_MASTER - use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." - -/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target) - if(user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) - return FALSE - if(isturf(target)) - return FALSE - . = ..() - if(.) - user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") - empulse(target, 0, 1) - return TRUE - -/datum/psionic_power/energistics/electrocute - name = "Electrocute" - cost = 10 - heat = 30 - cooldown = 7.5 SECONDS - use_melee = TRUE + name = "Disrupt" + cost = 60 + heat = 60 + cooldown = 60 SECONDS min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." - -/datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target) - if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) - return FALSE - if(isturf(target)) - return FALSE - . = ..() - if(.) - if(istype(target)) - user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target]!")) - target.electrocute_act(rand(15,45), user, 1, user.zone_selected) - return TRUE - else if(isatom(target)) - var/obj/item/stock_parts/cell/charging_cell = target.get_cell() - if(istype(charging_cell)) - user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target], charging it!")) - charging_cell.give(rand(15,45)) - return TRUE - else - return FALSE + use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." -/datum/psionic_power/energistics/zorch - name = "Zorch" - cost = 15 - heat = 15 - cooldown = 2 SECONDS - use_ranged = TRUE +/datum/psionic_power/energistics/shock_touch + name = "Shock Touch" + cost = 50 + heat = 100 + cooldown = 30 SECONDS min_rank = PSI_RANK_MASTER - use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." - -/datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target) - . = ..() - if(.) - if(HAS_TRAIT(user, TRAIT_PACIFISM) && user.psi.zorch_harm) - to_chat(user, span_notice("You manage to stop yourself before firing a harmful laser from your eyes, you don't want to risk harming anyone...")) - - var/user_rank = user.psi.get_rank(faculty) - var/obj/projectile/pew - var/pew_sound - - if(user.psi.zorch_harm) - pew = new /obj/projectile/beam/laser(get_turf(user)) - else - pew = new /obj/projectile/beam/disabler(get_turf(user)) - - switch(user_rank) - if(PSI_RANK_PARAMOUNT) - pew.damage = 30 - pew.name = "gigawatt mental laser" - pew_sound = 'sound/weapons/lasercannonfire.ogg' - if(PSI_RANK_GRANDMASTER) - pew.damage = 20 - pew.name = "megawatt mental laser" - pew_sound = 'sound/weapons/Laser.ogg' - if(PSI_RANK_MASTER) - pew.damage = 10 - pew.name = "mental laser" - pew_sound = 'sound/weapons/Taser.ogg' - - if(istype(pew)) - playsound(pew.loc, pew_sound, 25, 1) - pew.original = target - pew.starting = get_turf(user) - pew.firer = user - pew.fire(Get_Angle(user, target)) - user.visible_message(span_danger("[user]'s eyes flare with light!")) - return TRUE + use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." /datum/psionic_power/energistics/spark - name = "Spark" - cost = 1 - cooldown = 1 SECONDS - use_melee = TRUE + name = "Spark" + cost = 1 + cooldown = 1 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." - -/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target) - if(isnull(target) || istype(target)) - return FALSE - . = ..() - if(.) - if(istype(target,/obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/S = target - S.light("[user] snaps \his fingers and \the [S.name] lights up.") - user.emote("snap") - playsound(S.loc, "sparks", 50, 1) - else - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() - return TRUE + use_description = "Grants the ability to cause ignition with your hands. Upgrades with Psi Rank." + +/datum/psionic_power/energistics/recharge + name = "Recharge" + cost = 30 + cooldown = 50 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grants the abilitiy to recharge technology or machinery." + +/datum/psionic_power/energistics/temperature_regulation + name = "Temperature Regulation" + min_rank = PSI_RANK_OPERANT + use_description = "Passively allows the user to regulate their body temperature." diff --git a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm new file mode 100644 index 000000000000..fe9afa52d5c2 --- /dev/null +++ b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm @@ -0,0 +1,39 @@ +/datum/action/cooldown/spell/pointed/disarm + name = "Disarm" + desc = "This spell will allow you to disarm someone within 1 tile." + button_icon_state = "blind" + ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' + + sound = 'sound/effects/psi/power_used.ogg' + school = SCHOOL_PSIONIC + cooldown_time = 30 SECONDS + cast_range = 1 + + spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC + + active_msg = "You prepare to disarm a target..." + + +/datum/action/cooldown/spell/pointed/disarm/is_valid_target(atom/cast_on) + . = ..() + if(!.) + return FALSE + if(!ishuman(cast_on)) + return FALSE + + var/mob/living/carbon/human/human_target = cast_on + return !is_blind(human_target) + +/datum/action/cooldown/spell/pointed/disarm/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("You feel like someone just tried to shake your hand...")) + to_chat(owner, span_warning("The psionic had no effect!")) + return FALSE + + to_chat(cast_on, span_warning("You feel an invisible force disarm you!")) + for(var/V in cast_on.held_items) + var/obj/item/I = V + if(istype(I)) + cast_on.dropItemToGround(I) + return TRUE diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index acc93861fa08..d1dd65448ef5 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -25,23 +25,22 @@ var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) switch(user.psi.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) - blade.can_break_wall = TRUE - blade.wall_break_time = 3 SECONDS blade.force = 40 if(PSI_RANK_GRANDMASTER) - blade.can_break_wall = TRUE - blade.force = 30 + blade.force = 24 + blade.armour_penetration = 25 + blade.AddComponent(/datum/component/cleave_attack, arc_size=180) if(PSI_RANK_MASTER) - blade.force = 20 + blade.force = 18 else - blade.force = 10 + blade.force = 12 return blade /datum/psionic_power/psychokinesis/tinker - name = "Tinker" - cost = 5 - cooldown = 10 - min_rank = PSI_RANK_OPERANT + name = "Tinker" + cost = 5 + cooldown = 10 + min_rank = PSI_RANK_OPERANT use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." use_sound = 'sound/effects/psi/power_fabrication.ogg' use_manifest = TRUE @@ -58,7 +57,7 @@ tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.25 if(PSI_RANK_GRANDMASTER) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.5 if(PSI_RANK_MASTER) tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) @@ -69,45 +68,9 @@ return tool /datum/psionic_power/psychokinesis/telekinesis - name = "Telekinesis" - cost = 5 - cooldown = 1 SECONDS - use_ranged = TRUE - use_manifest = FALSE - min_rank = PSI_RANK_GRANDMASTER - use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." - admin_log = FALSE - use_sound = 'sound/effects/psi/power_used.ogg' - var/global/list/valid_machine_types = list( - /obj/machinery/door - ) - -/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) - if(!user.combat_mode) - return FALSE - . = ..() - if(.) - - var/distance = get_dist(user, target) - if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS) * 2) - to_chat(user, span_warning("Your telekinetic power won't reach that far.")) - return FALSE - - if(istype(target, /mob) || istype(target, /obj)) - var/obj/item/psychic_power/telekinesis/tk = new(user) - if(tk.set_focus(target)) - tk.sparkle() - user.visible_message("\The [user] reaches out.") - return tk - else if(istype(target, /obj/structure)) - user.visible_message("\The [user] makes a strange gesture.") - var/obj/O = target - O.attack_hand(user) - return TRUE - else if(istype(target, /obj/machinery)) - for(var/mtype in valid_machine_types) - if(istype(target, mtype)) - var/obj/machinery/machine = target - machine.attack_hand(user) - return TRUE - return FALSE + name = "Telekinesis" + cost = 5 + cooldown = 1 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grants the ability to telepathically move and access objects. Upgrades with your Psi Rank." + diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 4e499f8ff958..d760b8795d8b 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -7,159 +7,34 @@ faculty = PSI_REDACTION admin_log = FALSE -/datum/psionic_power/redaction/proc/check_dead(var/mob/living/target) - if(!istype(target)) - return FALSE - if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) - return TRUE - return FALSE +/datum/psionic_power/redaction/Mend + name = "Mend" + cost = 15 + heat = 15 + cooldown = 15 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grants the ability to heal physical wounds of others with your touch. Upgrades with Psi Level." -/datum/psionic_power/redaction/invoke(var/mob/living/user, var/mob/living/target) - if(check_dead(target)) - return FALSE - . = ..() - -/datum/psionic_power/redaction/skinsight - name = "Skinsight" - cost = 3 - heat = 1 - cooldown = 3 SECONDS - use_melee = TRUE +/datum/psionic_power/redaction/cleanse + name = "Cleanse" + cost = 15 + heat = 15 + cooldown = 15 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." - -/datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target) - if(!istype(target) || user.zone_selected != BODY_ZONE_CHEST || target.pulledby == user) - return FALSE - . = ..() - if(.) - user.visible_message(span_notice("\The [user] rests a hand on \the [target].")) - healthscan(user, target, user.psi.get_rank(PSI_REDACTION) >= PSI_RANK_GRANDMASTER) - return TRUE + use_description = "Grants the ability to cleanse others of toxins and radiation." -/datum/psionic_power/redaction/mend - name = "Mend" - cost = 7 - heat = 10 - cooldown = 5 SECONDS - use_melee = TRUE +/datum/psionic_power/redaction/healers_visage + name = "Healer's Visage" min_rank = PSI_RANK_OPERANT - use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." - -/datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) - if(!istype(user) || !istype(target) || target.pulledby != user || user.grab_state >= GRAB_AGGRESSIVE) - return FALSE - . = ..() - if(.) - var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) - - if(!E) - to_chat(user, span_warning("They are missing that limb.")) - return TRUE - - if(E.status == BODYPART_ROBOTIC) - to_chat(user, span_warning("That limb is prosthetic.")) - return TRUE - - user.visible_message(span_notice("\The [user] rests a hand on \the [target]'s [E.name]...")) - to_chat(target, span_notice("A healing warmth suffuses you.")) - - var/redaction_rank = user.psi.get_rank(PSI_REDACTION) - var/pk_rank = user.psi.get_rank(PSI_PSYCHOKINESIS) - - if(pk_rank >= PSI_RANK_LATENT && redaction_rank >= PSI_RANK_MASTER) - var/removal_size = clamp(5-pk_rank, 0, 5) - var/valid_objects = list() - for(var/obj/item/thing in E.embedded_objects) - if(thing.w_class >= removal_size) - valid_objects += thing - if(LAZYLEN(valid_objects)) - var/removing = pick(valid_objects) - target.remove_embedded_object(removing) - to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removing] free of \the [E].")) - return TRUE + use_description = "Grants the user passive sight of those harmed, or affected by maladies." - if(redaction_rank >= PSI_RANK_GRANDMASTER) - for(var/obj/item/organ/O in target.internal_organs) - if(O.damage > 0) - to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) - O.applyOrganDamage(-rand(redaction_rank, redaction_rank * 2)) - return TRUE - if(E.get_damage(TRUE)) - E.heal_damage((redaction_rank * 10), (redaction_rank * 10)) - to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) - new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") - return TRUE +/datum/psionic_power/redaction/revivification + name = "Revivification" + min_rank = PSI_RANK_MASTER + use_description = "Grants the user the ability to revive another. Upgrades with Psi Level." - to_chat(user, span_notice("You can find nothing within \the [target]'s [E.name] to mend.")) - return FALSE - -/datum/psionic_power/redaction/cleanse - name = "Cleanse" - cost = 9 - heat = 15 - cooldown = 6 SECONDS - use_melee = TRUE - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." - -/datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) - if(!istype(user) || !istype(target) || target.pulledby != user || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) - return FALSE - . = ..() - if(.) - // No messages, as Mend procs them even if it fails to heal anything, and Cleanse is always checked after Mend. - var/removing = rand(20,25) - if(target.radiation) - to_chat(user, span_notice("You repair some of the radiation-damaged tissue within \the [target]...")) - if(target.radiation > removing) - target.radiation -= removing - else - target.radiation = 0 - return TRUE - if(target.getCloneLoss()) - to_chat(user, span_notice("You stitch together some of the mangled DNA within \the [target]...")) - if(target.getCloneLoss() >= removing) - target.adjustCloneLoss(-removing) - else - target.adjustCloneLoss(-(target.getCloneLoss())) - return TRUE - to_chat(user, span_notice("You can find no genetic damage or radiation to heal within \the [target].")) - return TRUE - -/datum/psionic_power/revive - name = "Revive" - cost = 25 - heat = 100 - cooldown = 8 SECONDS - use_melee = TRUE +/datum/psionic_power/healing_aura + name = "Healing Aura" min_rank = PSI_RANK_PARAMOUNT - faculty = PSI_REDACTION - use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." - admin_log = FALSE - -/datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target) - if(!isliving(target) || !istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user || user.grab_state < GRAB_AGGRESSIVE) - return FALSE - . = ..() - if(.) - if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) - to_chat(user, span_warning("This person is already alive!")) - return TRUE - - if(((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT)) - to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) - return TRUE - - user.visible_message(span_notice("\The [user] splays out their hands over \the [target]'s body...")) - target.notify_ghost_cloning("Your heart is being revived!") - target.grab_ghost() - if(!do_after(user, 10 SECONDS, target, FALSE)) - user.psi.backblast(rand(10,25)) - return TRUE + use_description = "Grants the user an aura of healing of themselves and others over time." - to_chat(target, span_notice("Life floods back into your body!")) - target.visible_message(span_notice("\The [target] shudders violently!")) - target.adjustOxyLoss(-rand(15,20)) - target.revive() - return TRUE diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm index 23d5daffc9b1..51100695cc83 100644 --- a/code/modules/psionics/interfaces/ui_hub.dm +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -9,6 +9,7 @@ var/mutable_appearance/heat_bar var/mutable_appearance/heat_bar_filling var/list/components + plane = HUD_PLANE /obj/screen/psi/hub/New(var/mob/living/_owner) on_cooldown = image(icon, "cooldown") diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index da9ae39a873b..a62f7809110f 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -2,6 +2,7 @@ /obj/screen/psi/armour name = "Psi-Armour" icon_state = "psiarmour_off" + plane = HUD_PLANE /obj/screen/psi/armour/update_icon() ..() @@ -21,6 +22,7 @@ /obj/screen/psi/autoredaction name = "Autoredaction" icon_state = "healing_off" + plane = HUD_PLANE /obj/screen/psi/autoredaction/update_icon() ..() @@ -40,6 +42,7 @@ /obj/screen/psi/zorch_harm name = "Zorch Mode" icon_state = "zorch_disable" + plane = HUD_PLANE /obj/screen/psi/zorch_harm/update_icon() ..() @@ -59,6 +62,7 @@ /obj/screen/psi/limiter name = "Psi-Limiter" icon_state = "limiter_100" + plane = HUD_PLANE /obj/screen/psi/limiter/update_icon() ..() @@ -94,6 +98,7 @@ name = "Show/Hide Psi UI" icon_state = "arrow_left" var/obj/screen/psi/hub/controller + plane = HUD_PLANE /obj/screen/psi/toggle_psi_menu/New(var/mob/living/_owner, var/obj/screen/psi/hub/_controller) controller = _controller diff --git a/yogstation.dme b/yogstation.dme index 1bf4ee5d6fcc..a74ed0ccf7fd 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3564,6 +3564,7 @@ #include "code\modules\psionics\faculties\energistics.dm" #include "code\modules\psionics\faculties\psychokenisis.dm" #include "code\modules\psionics\faculties\redaction.dm" +#include "code\modules\psionics\faculties\faculty_abilities\coercion\coercion_abilities.dm" #include "code\modules\psionics\interfaces\ui.dm" #include "code\modules\psionics\interfaces\ui_hub.dm" #include "code\modules\psionics\interfaces\ui_toggle.dm" From 538d012f01eeab6401d6b4d4025e747dd38a415c Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 11:17:20 -0400 Subject: [PATCH 011/201] coercion spells (molti dont be mad) --- .../psionics/complexus/complexus_process.dm | 28 ++++- code/modules/psionics/faculties/coercion.dm | 29 +++-- .../modules/psionics/faculties/energistics.dm | 36 +++--- .../coercion/coercion_abilities.dm | 114 +++++++++++++++++- code/modules/psionics/interfaces/ui.dm | 1 + 5 files changed, 170 insertions(+), 38 deletions(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 923bbfe7e56b..da3fc2f3783c 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -58,6 +58,10 @@ if(get_rank(PSI_COERCION) == 2) var/datum/action/cooldown/spell/pointed/disarm/disarm = new(owner) disarm.Grant(owner) + var/datum/action/cooldown/spell/list_target/telepathy/psionic/telepathy = new(owner) + telepathy.Grant(owner) + var/datum/action/cooldown/spell/pointed/psychic_scream/scream = new(owner) + scream.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 2) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -70,8 +74,13 @@ //master level psionics if(get_rank(PSI_COERCION) == 3) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) + var/datum/action/cooldown/spell/disarm = locate(/datum/action/cooldown/spell/pointed/disarm) in owner.actions + if(disarm) + disarm.Remove(owner) + var/datum/action/cooldown/spell/pointed/disarm/master/disarm_master = new(owner) + disarm_master.Grant(owner) + var/datum/action/cooldown/spell/pointed/psychic_scream/psy_scream= new(owner) + psy_scream.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 3) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -84,8 +93,11 @@ //grandmaster level psionics if(get_rank(PSI_COERCION) == 4) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) + var/datum/action/cooldown/spell/disarm_master = locate(/datum/action/cooldown/spell/pointed/disarm/master) in owner.actions + if(disarm_master) + disarm_master.Remove(owner) + var/datum/action/cooldown/spell/pointed/disarm/grandmaster/disarm_gmaster = new(owner) + disarm_gmaster.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 4) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -98,8 +110,12 @@ //paramount psionics if(get_rank(PSI_COERCION) == 5) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) + var/datum/action/cooldown/spell/disarm_gmaster = locate(/datum/action/cooldown/spell/pointed/disarm/grandmaster) in owner.actions + if(disarm_gmaster) + disarm_gmaster.Remove(owner) + + var/datum/action/cooldown/spell/pointed/dis_arm/dis_arm = new(owner) + dis_arm.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 5) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 04ab8e043d4a..d53cad514d8d 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,19 +9,6 @@ /datum/psionic_power/coercion faculty = PSI_COERCION - -/datum/psionic_power/coercion/mental_freezing - name = "Cognitive Manipulation" - min_rank = PSI_RANK_GRANDMASTER - use_description = "Further increase heat cooldown by another 30%" - -/datum/psionic_power/coercion/psychic_scream - name = "Psychic Scream" - cost = 50 - cooldown = 30 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." - /datum/psionic_power/coercion/telepathy name = "Telepathy" cost = 30 @@ -41,3 +28,19 @@ min_rank = PSI_RANK_OPERANT use_description = "Passively upgrades your heat-cooldown by 20%." +/datum/psionic_power/coercion/psychic_scream + name = "Psychic Scream" + cost = 50 + cooldown = 30 SECONDS + min_rank = PSI_RANK_MASTER + use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." + +/datum/psionic_power/coercion/mental_freezing + name = "Cognitive Manipulation" + min_rank = PSI_RANK_GRANDMASTER + use_description = "Further increase heat cooldown by another 30%" + + + + + diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 874683394c91..17aaa607eeb6 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -6,22 +6,6 @@ /datum/psionic_power/energistics faculty = PSI_ENERGISTICS -/datum/psionic_power/energistics/disrupt - name = "Disrupt" - cost = 60 - heat = 60 - cooldown = 60 SECONDS - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." - -/datum/psionic_power/energistics/shock_touch - name = "Shock Touch" - cost = 50 - heat = 100 - cooldown = 30 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." - /datum/psionic_power/energistics/spark name = "Spark" cost = 1 @@ -40,3 +24,23 @@ name = "Temperature Regulation" min_rank = PSI_RANK_OPERANT use_description = "Passively allows the user to regulate their body temperature." + +/datum/psionic_power/energistics/shock_touch + name = "Shock Touch" + cost = 50 + heat = 100 + cooldown = 30 SECONDS + min_rank = PSI_RANK_MASTER + use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." + +/datum/psionic_power/energistics/disrupt + name = "Disrupt" + cost = 60 + heat = 60 + cooldown = 60 SECONDS + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." + + + + diff --git a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm index fe9afa52d5c2..5f085d56ca2b 100644 --- a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm +++ b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm @@ -1,3 +1,4 @@ +///operant level spells /datum/action/cooldown/spell/pointed/disarm name = "Disarm" desc = "This spell will allow you to disarm someone within 1 tile." @@ -11,8 +12,21 @@ spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC + antimagic_flags = MAGIC_RESISTANCE_MIND + active_msg = "You prepare to disarm a target..." +/datum/action/cooldown/spell/pointed/disarm/master + + desc = "This spell will allow you to disarm someone within 3 tile." + cooldown_time = 25 SECONDS + cast_range = 3 + +/datum/action/cooldown/spell/pointed/disarm/grandmaster + + desc = "This spell will allow you to disarm someone within 5 tile." + cooldown_time = 15 SECONDS + cast_range = 5 /datum/action/cooldown/spell/pointed/disarm/is_valid_target(atom/cast_on) . = ..() @@ -21,9 +35,6 @@ if(!ishuman(cast_on)) return FALSE - var/mob/living/carbon/human/human_target = cast_on - return !is_blind(human_target) - /datum/action/cooldown/spell/pointed/disarm/cast(mob/living/carbon/human/cast_on) . = ..() if(cast_on.can_block_magic(antimagic_flags)) @@ -37,3 +48,100 @@ if(istype(I)) cast_on.dropItemToGround(I) return TRUE + +/datum/action/cooldown/spell/pointed/dis_arm + + name = "Dis-arm" + desc = "This spell will allow you to dis-arm someone within 10 tile." + button_icon_state = "blind" + ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' + + sound = 'sound/effects/psi/power_used.ogg' + school = SCHOOL_PSIONIC + cooldown_time = 60 SECONDS + cast_range = 10 + + spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC + + antimagic_flags = MAGIC_RESISTANCE_MIND + + active_msg = "You prepare to disarm a target..." + +/datum/action/cooldown/spell/pointed/dis_arm/is_valid_target(atom/cast_on) + . = ..() + if(!.) + return FALSE + if(!ishuman(cast_on)) + return FALSE + +/datum/action/cooldown/spell/pointed/dis_arm/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("You feel like someone just tried to shake your hand...")) + to_chat(owner, span_warning("The psionic had no effect!")) + return FALSE + + to_chat(cast_on, span_warning("You feel an invisible force rip off your arms!")) + if(iscarbon(cast_on)) + var/mob/living/carbon/CM = cast_on + for(var/obj/item/bodypart/bodypart in CM.bodyparts) + if(!(bodypart.body_part & (HEAD|CHEST|LEGS))) + if(bodypart.dismemberable) + bodypart.dismember() + return TRUE + +/datum/action/cooldown/spell/list_target/telepathy/psionic + + name = "Psionic Telepathy" + desc = "Telepathically transmits a message to the target." + button_icon = 'icons/mob/actions/actions_revenant.dmi' + button_icon_state = "r_transmit" + + cooldown_time = 5 SECONDS + + spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC + + antimagic_flags = MAGIC_RESISTANCE_MIND + + choose_target_message = "Choose a target to whisper to." + +///master level spells + +/datum/action/cooldown/spell/pointed/psychic_scream + name = "Psychic Scream" + desc = "This spell sends a blast of psychic energy to another person, heavily damaging their mental stamina." + button_icon_state = "blind" + ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' + + sound = 'sound/effects/psi/power_used.ogg' + school = SCHOOL_PSIONIC + cooldown_time = 30 SECONDS + cast_range = 3 + + spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC + + antimagic_flags = MAGIC_RESISTANCE_MIND + + active_msg = "You prepare to send a blast of psionic energy at a target..." + + +/datum/action/cooldown/spell/pointed/psychic_scream/is_valid_target(atom/cast_on) + . = ..() + if(!.) + return FALSE + if(!ishuman(cast_on)) + return FALSE + + var/mob/living/carbon/human/human_target = cast_on + return !is_blind(human_target) + +/datum/action/cooldown/spell/pointed/psychic_scream/cast(mob/living/carbon/human/cast_on) + . = ..() + if(cast_on.can_block_magic(antimagic_flags)) + to_chat(cast_on, span_notice("You feel like someone turned their speakers on too loud...")) + to_chat(owner, span_warning("The psionic had no effect!")) + return FALSE + + to_chat(cast_on, span_warning("You feel an invisible force punch your brain!")) + cast_on.adjustStaminaLoss(25) + return TRUE diff --git a/code/modules/psionics/interfaces/ui.dm b/code/modules/psionics/interfaces/ui.dm index 4cbf7f09206f..4d78f9b1efd4 100644 --- a/code/modules/psionics/interfaces/ui.dm +++ b/code/modules/psionics/interfaces/ui.dm @@ -18,3 +18,4 @@ obj/screen/psi invisibility = 101 else invisibility = 0 + . = ..() From 583feb3d0ffb1e2f62c339d7f68884d712785ca2 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 12:28:05 -0500 Subject: [PATCH 012/201] Revert "coercion spells (molti dont be mad)" This reverts commit 538d012f01eeab6401d6b4d4025e747dd38a415c. --- .../psionics/complexus/complexus_process.dm | 28 +---- code/modules/psionics/faculties/coercion.dm | 29 ++--- .../modules/psionics/faculties/energistics.dm | 36 +++--- .../coercion/coercion_abilities.dm | 114 +----------------- code/modules/psionics/interfaces/ui.dm | 1 - 5 files changed, 38 insertions(+), 170 deletions(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index da3fc2f3783c..923bbfe7e56b 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -58,10 +58,6 @@ if(get_rank(PSI_COERCION) == 2) var/datum/action/cooldown/spell/pointed/disarm/disarm = new(owner) disarm.Grant(owner) - var/datum/action/cooldown/spell/list_target/telepathy/psionic/telepathy = new(owner) - telepathy.Grant(owner) - var/datum/action/cooldown/spell/pointed/psychic_scream/scream = new(owner) - scream.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 2) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -74,13 +70,8 @@ //master level psionics if(get_rank(PSI_COERCION) == 3) - var/datum/action/cooldown/spell/disarm = locate(/datum/action/cooldown/spell/pointed/disarm) in owner.actions - if(disarm) - disarm.Remove(owner) - var/datum/action/cooldown/spell/pointed/disarm/master/disarm_master = new(owner) - disarm_master.Grant(owner) - var/datum/action/cooldown/spell/pointed/psychic_scream/psy_scream= new(owner) - psy_scream.Grant(owner) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 3) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -93,11 +84,8 @@ //grandmaster level psionics if(get_rank(PSI_COERCION) == 4) - var/datum/action/cooldown/spell/disarm_master = locate(/datum/action/cooldown/spell/pointed/disarm/master) in owner.actions - if(disarm_master) - disarm_master.Remove(owner) - var/datum/action/cooldown/spell/pointed/disarm/grandmaster/disarm_gmaster = new(owner) - disarm_gmaster.Grant(owner) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 4) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) @@ -110,12 +98,8 @@ //paramount psionics if(get_rank(PSI_COERCION) == 5) - var/datum/action/cooldown/spell/disarm_gmaster = locate(/datum/action/cooldown/spell/pointed/disarm/grandmaster) in owner.actions - if(disarm_gmaster) - disarm_gmaster.Remove(owner) - - var/datum/action/cooldown/spell/pointed/dis_arm/dis_arm = new(owner) - dis_arm.Grant(owner) + var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) + ranged_touch.Grant(owner) if(get_rank(PSI_PSYCHOKINESIS) == 5) var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) ranged_touch.Grant(owner) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index d53cad514d8d..04ab8e043d4a 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,6 +9,19 @@ /datum/psionic_power/coercion faculty = PSI_COERCION + +/datum/psionic_power/coercion/mental_freezing + name = "Cognitive Manipulation" + min_rank = PSI_RANK_GRANDMASTER + use_description = "Further increase heat cooldown by another 30%" + +/datum/psionic_power/coercion/psychic_scream + name = "Psychic Scream" + cost = 50 + cooldown = 30 SECONDS + min_rank = PSI_RANK_MASTER + use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." + /datum/psionic_power/coercion/telepathy name = "Telepathy" cost = 30 @@ -28,19 +41,3 @@ min_rank = PSI_RANK_OPERANT use_description = "Passively upgrades your heat-cooldown by 20%." -/datum/psionic_power/coercion/psychic_scream - name = "Psychic Scream" - cost = 50 - cooldown = 30 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." - -/datum/psionic_power/coercion/mental_freezing - name = "Cognitive Manipulation" - min_rank = PSI_RANK_GRANDMASTER - use_description = "Further increase heat cooldown by another 30%" - - - - - diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 17aaa607eeb6..874683394c91 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -6,6 +6,22 @@ /datum/psionic_power/energistics faculty = PSI_ENERGISTICS +/datum/psionic_power/energistics/disrupt + name = "Disrupt" + cost = 60 + heat = 60 + cooldown = 60 SECONDS + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." + +/datum/psionic_power/energistics/shock_touch + name = "Shock Touch" + cost = 50 + heat = 100 + cooldown = 30 SECONDS + min_rank = PSI_RANK_MASTER + use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." + /datum/psionic_power/energistics/spark name = "Spark" cost = 1 @@ -24,23 +40,3 @@ name = "Temperature Regulation" min_rank = PSI_RANK_OPERANT use_description = "Passively allows the user to regulate their body temperature." - -/datum/psionic_power/energistics/shock_touch - name = "Shock Touch" - cost = 50 - heat = 100 - cooldown = 30 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." - -/datum/psionic_power/energistics/disrupt - name = "Disrupt" - cost = 60 - heat = 60 - cooldown = 60 SECONDS - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." - - - - diff --git a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm index 5f085d56ca2b..fe9afa52d5c2 100644 --- a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm +++ b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm @@ -1,4 +1,3 @@ -///operant level spells /datum/action/cooldown/spell/pointed/disarm name = "Disarm" desc = "This spell will allow you to disarm someone within 1 tile." @@ -12,21 +11,8 @@ spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - antimagic_flags = MAGIC_RESISTANCE_MIND - active_msg = "You prepare to disarm a target..." -/datum/action/cooldown/spell/pointed/disarm/master - - desc = "This spell will allow you to disarm someone within 3 tile." - cooldown_time = 25 SECONDS - cast_range = 3 - -/datum/action/cooldown/spell/pointed/disarm/grandmaster - - desc = "This spell will allow you to disarm someone within 5 tile." - cooldown_time = 15 SECONDS - cast_range = 5 /datum/action/cooldown/spell/pointed/disarm/is_valid_target(atom/cast_on) . = ..() @@ -35,6 +21,9 @@ if(!ishuman(cast_on)) return FALSE + var/mob/living/carbon/human/human_target = cast_on + return !is_blind(human_target) + /datum/action/cooldown/spell/pointed/disarm/cast(mob/living/carbon/human/cast_on) . = ..() if(cast_on.can_block_magic(antimagic_flags)) @@ -48,100 +37,3 @@ if(istype(I)) cast_on.dropItemToGround(I) return TRUE - -/datum/action/cooldown/spell/pointed/dis_arm - - name = "Dis-arm" - desc = "This spell will allow you to dis-arm someone within 10 tile." - button_icon_state = "blind" - ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' - - sound = 'sound/effects/psi/power_used.ogg' - school = SCHOOL_PSIONIC - cooldown_time = 60 SECONDS - cast_range = 10 - - spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - - antimagic_flags = MAGIC_RESISTANCE_MIND - - active_msg = "You prepare to disarm a target..." - -/datum/action/cooldown/spell/pointed/dis_arm/is_valid_target(atom/cast_on) - . = ..() - if(!.) - return FALSE - if(!ishuman(cast_on)) - return FALSE - -/datum/action/cooldown/spell/pointed/dis_arm/cast(mob/living/carbon/human/cast_on) - . = ..() - if(cast_on.can_block_magic(antimagic_flags)) - to_chat(cast_on, span_notice("You feel like someone just tried to shake your hand...")) - to_chat(owner, span_warning("The psionic had no effect!")) - return FALSE - - to_chat(cast_on, span_warning("You feel an invisible force rip off your arms!")) - if(iscarbon(cast_on)) - var/mob/living/carbon/CM = cast_on - for(var/obj/item/bodypart/bodypart in CM.bodyparts) - if(!(bodypart.body_part & (HEAD|CHEST|LEGS))) - if(bodypart.dismemberable) - bodypart.dismember() - return TRUE - -/datum/action/cooldown/spell/list_target/telepathy/psionic - - name = "Psionic Telepathy" - desc = "Telepathically transmits a message to the target." - button_icon = 'icons/mob/actions/actions_revenant.dmi' - button_icon_state = "r_transmit" - - cooldown_time = 5 SECONDS - - spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - - antimagic_flags = MAGIC_RESISTANCE_MIND - - choose_target_message = "Choose a target to whisper to." - -///master level spells - -/datum/action/cooldown/spell/pointed/psychic_scream - name = "Psychic Scream" - desc = "This spell sends a blast of psychic energy to another person, heavily damaging their mental stamina." - button_icon_state = "blind" - ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' - - sound = 'sound/effects/psi/power_used.ogg' - school = SCHOOL_PSIONIC - cooldown_time = 30 SECONDS - cast_range = 3 - - spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - - antimagic_flags = MAGIC_RESISTANCE_MIND - - active_msg = "You prepare to send a blast of psionic energy at a target..." - - -/datum/action/cooldown/spell/pointed/psychic_scream/is_valid_target(atom/cast_on) - . = ..() - if(!.) - return FALSE - if(!ishuman(cast_on)) - return FALSE - - var/mob/living/carbon/human/human_target = cast_on - return !is_blind(human_target) - -/datum/action/cooldown/spell/pointed/psychic_scream/cast(mob/living/carbon/human/cast_on) - . = ..() - if(cast_on.can_block_magic(antimagic_flags)) - to_chat(cast_on, span_notice("You feel like someone turned their speakers on too loud...")) - to_chat(owner, span_warning("The psionic had no effect!")) - return FALSE - - to_chat(cast_on, span_warning("You feel an invisible force punch your brain!")) - cast_on.adjustStaminaLoss(25) - return TRUE diff --git a/code/modules/psionics/interfaces/ui.dm b/code/modules/psionics/interfaces/ui.dm index 4d78f9b1efd4..4cbf7f09206f 100644 --- a/code/modules/psionics/interfaces/ui.dm +++ b/code/modules/psionics/interfaces/ui.dm @@ -18,4 +18,3 @@ obj/screen/psi invisibility = 101 else invisibility = 0 - . = ..() From 5bdb0b0972c3d97899a70d8f4566147d5ba4f244 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 12:28:07 -0500 Subject: [PATCH 013/201] Revert "huge update (we're getting somewhere)" This reverts commit caeaf27967a29da6ee26709c75230eeb7bbe1864. --- code/__DEFINES/magic.dm | 2 - code/__DEFINES/psi.dm | 5 +- code/_onclick/other_mobs.dm | 8 +- code/controllers/subsystem/processing/psi.dm | 2 + .../psionics/complexus/complexus_latency.dm | 1 + .../psionics/complexus/complexus_process.dm | 62 --- code/modules/psionics/faculties/_faculty.dm | 1 + code/modules/psionics/faculties/coercion.dm | 402 ++++++++++++++++-- .../modules/psionics/faculties/energistics.dm | 139 ++++-- .../coercion/coercion_abilities.dm | 39 -- .../psionics/faculties/psychokenisis.dm | 69 ++- code/modules/psionics/faculties/redaction.dm | 171 +++++++- code/modules/psionics/interfaces/ui_hub.dm | 1 - code/modules/psionics/interfaces/ui_toggle.dm | 5 - yogstation.dme | 1 - 15 files changed, 698 insertions(+), 210 deletions(-) delete mode 100644 code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm diff --git a/code/__DEFINES/magic.dm b/code/__DEFINES/magic.dm index 593a4adc8092..a83ebbd87cee 100644 --- a/code/__DEFINES/magic.dm +++ b/code/__DEFINES/magic.dm @@ -30,8 +30,6 @@ #define SCHOOL_FORBIDDEN "forbidden" /// Blood magic, involves vampirism, draining blood, etc. #define SCHOOL_SANGUINE "sanguine" -/// psionic powers, not *technically* magic -#define SCHOOL_PSIONIC "psionic" // Invocation types - what does the wizard need to do to invoke (cast) the spell? /// Allows being able to cast the spell without saying or doing anything. diff --git a/code/__DEFINES/psi.dm b/code/__DEFINES/psi.dm index 59ddc7526dbb..82bdb908b62b 100644 --- a/code/__DEFINES/psi.dm +++ b/code/__DEFINES/psi.dm @@ -17,9 +17,8 @@ #define PSI_IMPLANT_DISABLED "Disabled" #define INVOKE_PSI_POWERS(holder, powers, target, return_on_invocation) \ - if(holder && holder.psi && holder.psi.can_use()) { \ - for(var/thing in powers) { \ - var/datum/psionic_power/power = thing; \ + if(holder?.psi?.can_use()) { \ + for(var/datum/psionic_power/power as anything in powers) { \ var/obj/item/result = power.invoke(holder, target); \ if(result) { \ power.handle_post_power(holder, target); \ diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index e450a1f09e91..7e7df0ebeb4a 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -5,6 +5,8 @@ Otherwise pretty standard. */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) + if(psi) + INVOKE_PSI_POWERS(src, psi.get_melee_powers(), A, FALSE) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -50,7 +52,11 @@ /mob/living/carbon/human/attack_empty_hand() if(psi) INVOKE_PSI_POWERS(src, psi.get_manifestations(), src, FALSE) - + +/mob/living/carbon/human/RangedAttack(atom/A, params) + if(psi) + INVOKE_PSI_POWERS(src, psi.get_ranged_powers(), A, TRUE) + //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) . = FALSE diff --git a/code/controllers/subsystem/processing/psi.dm b/code/controllers/subsystem/processing/psi.dm index 0f087fdcf2c4..eab50c4bca8c 100644 --- a/code/controllers/subsystem/processing/psi.dm +++ b/code/controllers/subsystem/processing/psi.dm @@ -12,6 +12,7 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/list/psi_dampeners = list() var/list/psi_monitors = list() var/list/armour_faculty_by_type = list() + var/list/faculties_by_intent = list() /datum/controller/subsystem/processing/psi/New() NEW_SS_GLOBAL(SSpsi) @@ -27,6 +28,7 @@ PROCESSING_SUBSYSTEM_DEF(psi) var/datum/psionic_faculty/faculty = new ftype faculties_by_id[faculty.id] = faculty faculties_by_name[faculty.name] = faculty + faculties_by_intent[faculty.associated_intent] = faculty.id var/list/powers = subtypesof(/datum/psionic_power) for(var/ptype in powers) diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index 77aa9f9d095a..93494533b98a 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -1,4 +1,5 @@ /datum/psi_complexus/proc/check_latency_trigger(trigger_strength = 0, source, redactive = FALSE) + if(!LAZYLEN(latencies) || world.time < next_latency_trigger) return FALSE diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 923bbfe7e56b..a2021c61ebaf 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -51,64 +51,6 @@ aura_color = "#33cc33" if(PSI_ENERGISTICS) aura_color = "#cccc33" - - // for(var/datum/psionic_power/power in subtypesof(/datum/psionic_power)) - - //operant level psionics - if(get_rank(PSI_COERCION) == 2) - var/datum/action/cooldown/spell/pointed/disarm/disarm = new(owner) - disarm.Grant(owner) - if(get_rank(PSI_PSYCHOKINESIS) == 2) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_REDACTION) == 2) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_ENERGISTICS) == 2) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - - //master level psionics - if(get_rank(PSI_COERCION) == 3) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_PSYCHOKINESIS) == 3) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_REDACTION) == 3) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_ENERGISTICS) == 3) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - - //grandmaster level psionics - if(get_rank(PSI_COERCION) == 4) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_PSYCHOKINESIS) == 4) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_REDACTION) == 4) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_ENERGISTICS) == 4) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - - //paramount psionics - if(get_rank(PSI_COERCION) == 5) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_PSYCHOKINESIS) == 5) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_REDACTION) == 5) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) - if(get_rank(PSI_ENERGISTICS) == 5) - var/datum/action/cooldown/spell/pointed/projectile/fireball/ranged_touch = new(owner) - ranged_touch.Grant(owner) if(!announced && owner?.client && !QDELETED(src)) announced = TRUE @@ -117,10 +59,6 @@ to_chat(owner, span_notice("Shift-left-click your Psi icon on the bottom right to view a summary of how to use them, or left click it to suppress or unsuppress your psionics. Beware: overusing your gifts can have deadly consequences.")) to_chat(owner, "
    ") - - - - /datum/psi_complexus/process() var/update_hud diff --git a/code/modules/psionics/faculties/_faculty.dm b/code/modules/psionics/faculties/_faculty.dm index d31a70c83433..28827b91f6a7 100644 --- a/code/modules/psionics/faculties/_faculty.dm +++ b/code/modules/psionics/faculties/_faculty.dm @@ -1,6 +1,7 @@ /datum/psionic_faculty var/id var/name + var/associated_intent var/list/armour_types = list() var/list/powers = list() diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 04ab8e043d4a..6f0266644d06 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,35 +9,377 @@ /datum/psionic_power/coercion faculty = PSI_COERCION +/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target) + if (!istype(target)) + to_chat(user, span_warning("You cannot mentally attack \the [target].")) + return FALSE -/datum/psionic_power/coercion/mental_freezing - name = "Cognitive Manipulation" - min_rank = PSI_RANK_GRANDMASTER - use_description = "Further increase heat cooldown by another 30%" - -/datum/psionic_power/coercion/psychic_scream - name = "Psychic Scream" - cost = 50 - cooldown = 30 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Send a blast of psychic energy to another person's mind, applying stamina damage to them." - -/datum/psionic_power/coercion/telepathy - name = "Telepathy" - cost = 30 - cooldown = 5 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to telepathically communicate with other sentient beings." - -/datum/psionic_power/coercion/disarm - name = "Disarm" - cost = 50 - cooldown = 30 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to telepathically disarm someone's weapons. Upgrades with your Psi Rank" - -/datum/psionic_power/coercion/mental_cooling - name = "Mental Cooling" - min_rank = PSI_RANK_OPERANT - use_description = "Passively upgrades your heat-cooldown by 20%." + . = ..() +/datum/psionic_power/coercion/blindstrike + name = "Blindstrike" + cost = 8 + cooldown = 120 + use_ranged = TRUE + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." + +/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) + return FALSE + . = ..() + if(.) + user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) + to_chat(user, span_danger("You strike at all around you with a deafening psionic scream!")) + for(var/mob/living/M in orange(user, user.psi.get_rank(PSI_COERCION))) + if(M == user) + continue + M.emote("scream") + to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) + M.blind_eyes(1 SECONDS) + M.adjust_confusion(10 SECONDS) + return TRUE + +/datum/psionic_power/coercion/mindread + name = "Read Mind" + cost = 25 + heat = 15 + cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. + use_melee = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." + +/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) + return FALSE + . = ..() + if(!.) + return + + if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) + to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) + return TRUE + + user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) + var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text + if(!question || user.incapacitated() || !do_after(user, 20)) + return TRUE + + var/started_mindread = world.time + to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) + to_chat(target, span_notice("Your mind is compelled to answer: [question]")) // I wonder how this will go down with the playerbase + + var/answer = input(target, question, "Read Mind") as null|text + if(!answer || world.time > started_mindread + 25 SECONDS || user.stat != CONSCIOUS || target.stat == DEAD) + to_chat(user, span_notice("You receive nothing useful from \the [target].")) + else + to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) + log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") + return TRUE + +/datum/psionic_power/coercion/agony + name = "Agony" + cost = 20 + heat = 15 + cooldown = 7 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." + +/datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target)) + return FALSE + if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + return FALSE + . = ..() + if(.) + user.visible_message("\The [target] has been struck by \the [user]!") + playsound(user.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) + target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) + return TRUE + +/datum/psionic_power/coercion/spasm + name = "Spasm" + cost = 15 + cooldown = 100 + use_melee = TRUE + use_ranged = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." + +/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(target)) + return FALSE + + if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) + return FALSE + + . = ..() + + if(.) + to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") + to_chat(target, "The muscles in your arms cramp horrendously!") + if(prob(75)) + target.emote("scream") + if(prob(75) && target.held_items[1] && target.dropItemToGround(target.get_item_for_held_index(1))) + target.visible_message("\The [target] drops what they were holding as their left hand spasms!") + if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) + target.visible_message("\The [target] drops what they were holding as their right hand spasms!") + return TRUE + +/datum/psionic_power/coercion/cognitivemanipulation + name = "Cognitive Manipulation" + cost = 28 + cooldown = 20 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." + +/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user) + return FALSE + . = ..() + if(.) + if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) + to_chat(user, span_warning("\The [target] is dead!")) + return TRUE + user.visible_message(span_danger("\The [user] seizes the head of \the [target] in both hands...")) + + var/coercion_rank = user.psi.get_rank(PSI_COERCION) + var/target_coercion_rank = PSI_RANK_BLUNT + if(target.psi) + target_coercion_rank = target.psi.get_rank(PSI_COERCION) + var/relative_coercion_rank = target_coercion_rank ? coercion_rank - target_coercion_rank : coercion_rank + + var/list/radial_list = list() + var/radial_icon = 'icons/mob/screen_psi.dmi' + + if(coercion_rank >= PSI_RANK_GRANDMASTER) + var/datum/radial_menu_choice/choice = new + choice.image = icon(radial_icon, "hypnotise") + choice.info = "Make the target temporarily subject to a hypnosis-like effect, making them easily influenced by spoken words." + radial_list[COGMANIP_HYPNOTIZE] = choice + + choice = new + choice.image = icon(radial_icon, "erase") + choice.info = "Rewrite the targets mind to remove a specific memory, which can cure them of related ailments." + radial_list[COGMANIP_ERASE_MEMORY] = choice + + if(coercion_rank >= PSI_RANK_PARAMOUNT) + var/datum/radial_menu_choice/choice = new + choice.image = icon(radial_icon, "thrall") + choice.info = "Make the target a subservient thrall to your will." + radial_list[COGMANIP_THRALL] = choice + message_admins(COGMANIP_THRALL) + + if(!radial_list.len) + return TRUE + + var/choice = show_radial_menu(user, target, radial_list, require_near = TRUE, tooltips = TRUE) + + if(!(choice in radial_list)) + return TRUE + + var/mob/living/carbon/C = target + // So much text + if(relative_coercion_rank < PSI_RANK_OPERANT || (relative_coercion_rank == PSI_RANK_OPERANT && (istype(C) && !C.hypnosis_vulnerable()))) + to_chat(user, span_warning("[target] mind is too strong to hypnotize them!")) + if(target_coercion_rank >= PSI_RANK_OPERANT) + to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], but you manage to [relative_coercion_rank == 1 ? "barely " :""]repel the attack!")) + else if(target_coercion_rank == PSI_RANK_LATENT) + to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head holding strong.")) + else + // Non-psionics have no clue what is going on, but they should still have some indication of whats is happening + to_chat(target, span_notice("Your feel a strange sensation in your head.")) + return TRUE + if(target_coercion_rank >= PSI_RANK_OPERANT) + to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], and your mental barriers [relative_coercion_rank > 1 ? "shatter like glass" : "fail"]!")) + to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s mental barriers and start working on the task at hand.")) + else if(target_coercion_rank == PSI_RANK_LATENT) + to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head failing.")) + to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s amiture defenses and start working on the task at hand.")) + else + to_chat(target, span_notice("Your feel a strange sensation in your head.")) + + switch(choice) + if(COGMANIP_HYPNOTIZE) + if(!do_after(user, 30 SECONDS, target, FALSE)) + user.psi.backblast(rand(1, 5)) + return TRUE + to_chat(user, span_danger("You surgicaly rearange \the [target]'s neurons, leaving [target.p_them()] easily influinced by the next thing [target.p_they()] hear. Choice you next words carefuly...")) + target.apply_status_effect(/datum/status_effect/trance, relative_coercion_rank * 10 SECONDS, relative_coercion_rank >= 2) + + if(COGMANIP_ERASE_MEMORY) + if(!do_after(user, 30 SECONDS, target, FALSE)) + user.psi.backblast(rand(1, 5)) + return TRUE + var/lost_memory = pretty_filter(stripped_input(user, "What would you like [target] to forget?", "Cognative Manipulation")) + to_chat(user, span_danger("You surgicaly cut \the [target]'s hippocampus, removing every shread of memory surounding the phrase \"[lost_memory]\".")) + to_chat(target, "[lost_memory]") + to_chat(target, span_warning("You can't remember anything surounding that phrase!")) + + return TRUE + +/datum/psionic_power/coercion/assay + name = "Assay" + cost = 15 + cooldown = 10 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." + +/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) + return FALSE + . = ..() + if(.) + user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) + to_chat(user, span_notice("You insinuate your mentality into that of \the [target]...")) + to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) + if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) + user.psi.backblast(rand(5,10)) + return TRUE + to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) + to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) + target.show_psi_assay(user) + return TRUE + +/datum/psionic_power/coercion/focus + name = "Focus" + cost = 10 + cooldown = 8 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_MASTER + use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." + +/datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || target.pulledby != user) + return FALSE + . = ..() + if(.) + user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) + to_chat(user, span_notice("You probe \the [target]'s mind for various ailments..")) + to_chat(target, span_warning("Your mind is being cleansed of ailments by \the [user].")) + if(!do_after(user, (target.stat == CONSCIOUS ? 5 SECONDS : 2.5 SECONDS), target, FALSE)) + user.psi.backblast(rand(5,10)) + return TRUE + to_chat(user, span_warning("You clear \the [target]'s mind of ailments.")) + to_chat(target, span_warning("Your mind is cleared of ailments.")) + + var/coercion_rank = user.psi.get_rank(PSI_COERCION) + if(coercion_rank >= PSI_RANK_GRANDMASTER) + target.SetParalyzed(0) + if(coercion_rank >= PSI_RANK_PARAMOUNT) + target.SetParalyzed(0) + target.SetDaze(0) + if(istype(target, /mob/living/carbon)) + var/mob/living/carbon/M = target + M.adjust_hallucinations(60 SECONDS) + return TRUE + +/datum/psionic_power/coercion/commune + name = "Commune" + cost = 10 + cooldown = 8 SECONDS + use_melee = TRUE + use_ranged = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." + +/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) + return FALSE + . = ..() + if(.) + user.visible_message("[user] touches their fingers to their temple.") + var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) + + if(!text) + return + + if(target.stat == DEAD) + to_chat(user,"Not even a psion of your level can speak to the dead.") + return + + if (issilicon(target)) + to_chat(user,"This can only be used on living organisms.") + return + + log_say("[key_name(user)] communed to [key_name(target)]: [text]") + + for (var/mob/M in GLOB.player_list) + if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) + to_chat(M,"[user] psionically says to [target]: [text]") + + var/mob/living/carbon/human/H = target + if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) + to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") + else + to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") + if(istype(H)) + if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) + to_chat(H,"Your nose begins to bleed...") + H.add_splatter_floor(small_drip = TRUE) + else if(prob(25)) + to_chat(H,"Your head hurts...") + else if(prob(50)) + to_chat(H,"Your mind buzzes...") + +/datum/psionic_power/coercion/psiping + name = "Psi-ping" + cost = 30 + cooldown = 25 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_OPERANT + use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." + +/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target) + if((target && user != target)) + return FALSE + . = ..() + if(.) + to_chat(user, "You take a moment to tune into the local Nlom...") + if(!do_after(user, 3 SECONDS, user)) + return + var/list/dirs = list() + for(var/mob/living/L in range(20)) + var/turf/T = get_turf(L) + if(!T || L == user || L.stat == DEAD || issilicon(L)) + continue + /* + var/image/ping_image = image(icon = 'icons/effects/effects.dmi', icon_state = "sonar_ping", loc = user) + ping_image.plane = LIGHTING_LAYER+1 + ping_image.layer = LIGHTING_LAYER+1 + ping_image.pixel_x = (T.x - user.x) * 32 + ping_image.pixel_y = (T.y - user.y) * 32 + user << ping_image + addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, ping_image), 8) + */ + var/direction = num2text(get_dir(user, L)) + var/dist + if(text2num(direction)) + switch(get_dist(user, L)) + if(0 to 10) + dist = "very close" + if(10 to 20) + dist = "close" + if(20 to 30) + dist = "a little ways away" + if(30 to 40) + dist = "farther away" + else + dist = "far away" + else + dist = "on top of you" + LAZYINITLIST(dirs[direction]) + dirs[direction][dist] += 1 + for(var/d in dirs) + var/list/feedback = list() + for(var/dst in dirs[d]) + feedback += "[dirs[d][dst]] psionic signature\s [dst]," + if(feedback.len > 1) + feedback[feedback.len - 1] += " and" + to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) + if(!length(dirs)) + to_chat(user, span_notice("You detect no psionic signatures but your own.")) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 874683394c91..1d3dd57beccf 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -7,36 +7,121 @@ faculty = PSI_ENERGISTICS /datum/psionic_power/energistics/disrupt - name = "Disrupt" - cost = 60 - heat = 60 - cooldown = 60 SECONDS - min_rank = PSI_RANK_GRANDMASTER + name = "Disrupt" + cost = 20 + heat = 20 + cooldown = 10 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_MASTER use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." -/datum/psionic_power/energistics/shock_touch - name = "Shock Touch" - cost = 50 - heat = 100 - cooldown = 30 SECONDS +/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + return FALSE + if(isturf(target)) + return FALSE + . = ..() + if(.) + user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") + empulse(target, 0, 1) + return TRUE + +/datum/psionic_power/energistics/electrocute + name = "Electrocute" + cost = 10 + heat = 30 + cooldown = 7.5 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." + +/datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target) + if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + return FALSE + if(isturf(target)) + return FALSE + . = ..() + if(.) + if(istype(target)) + user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target]!")) + target.electrocute_act(rand(15,45), user, 1, user.zone_selected) + return TRUE + else if(isatom(target)) + var/obj/item/stock_parts/cell/charging_cell = target.get_cell() + if(istype(charging_cell)) + user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target], charging it!")) + charging_cell.give(rand(15,45)) + return TRUE + else + return FALSE + +/datum/psionic_power/energistics/zorch + name = "Zorch" + cost = 15 + heat = 15 + cooldown = 2 SECONDS + use_ranged = TRUE min_rank = PSI_RANK_MASTER - use_description = "Grants the ability to charge electricity in the user's hand, shocking anyone touched." + use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." + +/datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target) + . = ..() + if(.) + if(HAS_TRAIT(user, TRAIT_PACIFISM) && user.psi.zorch_harm) + to_chat(user, span_notice("You manage to stop yourself before firing a harmful laser from your eyes, you don't want to risk harming anyone...")) + + var/user_rank = user.psi.get_rank(faculty) + var/obj/projectile/pew + var/pew_sound + + if(user.psi.zorch_harm) + pew = new /obj/projectile/beam/laser(get_turf(user)) + else + pew = new /obj/projectile/beam/disabler(get_turf(user)) + + switch(user_rank) + if(PSI_RANK_PARAMOUNT) + pew.damage = 30 + pew.name = "gigawatt mental laser" + pew_sound = 'sound/weapons/lasercannonfire.ogg' + if(PSI_RANK_GRANDMASTER) + pew.damage = 20 + pew.name = "megawatt mental laser" + pew_sound = 'sound/weapons/Laser.ogg' + if(PSI_RANK_MASTER) + pew.damage = 10 + pew.name = "mental laser" + pew_sound = 'sound/weapons/Taser.ogg' + + if(istype(pew)) + playsound(pew.loc, pew_sound, 25, 1) + pew.original = target + pew.starting = get_turf(user) + pew.firer = user + pew.fire(Get_Angle(user, target)) + user.visible_message(span_danger("[user]'s eyes flare with light!")) + return TRUE /datum/psionic_power/energistics/spark - name = "Spark" - cost = 1 - cooldown = 1 SECONDS + name = "Spark" + cost = 1 + cooldown = 1 SECONDS + use_melee = TRUE min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to cause ignition with your hands. Upgrades with Psi Rank." - -/datum/psionic_power/energistics/recharge - name = "Recharge" - cost = 30 - cooldown = 50 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grants the abilitiy to recharge technology or machinery." - -/datum/psionic_power/energistics/temperature_regulation - name = "Temperature Regulation" - min_rank = PSI_RANK_OPERANT - use_description = "Passively allows the user to regulate their body temperature." + use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." + +/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target) + if(isnull(target) || istype(target)) + return FALSE + . = ..() + if(.) + if(istype(target,/obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/S = target + S.light("[user] snaps \his fingers and \the [S.name] lights up.") + user.emote("snap") + playsound(S.loc, "sparks", 50, 1) + else + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + return TRUE diff --git a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm b/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm deleted file mode 100644 index fe9afa52d5c2..000000000000 --- a/code/modules/psionics/faculties/faculty_abilities/coercion/coercion_abilities.dm +++ /dev/null @@ -1,39 +0,0 @@ -/datum/action/cooldown/spell/pointed/disarm - name = "Disarm" - desc = "This spell will allow you to disarm someone within 1 tile." - button_icon_state = "blind" - ranged_mousepointer = 'icons/effects/mouse_pointers/blind_target.dmi' - - sound = 'sound/effects/psi/power_used.ogg' - school = SCHOOL_PSIONIC - cooldown_time = 30 SECONDS - cast_range = 1 - - spell_requirements = SPELL_CASTABLE_WITHOUT_INVOCATION | SPELL_REQUIRES_NO_ANTIMAGIC - - active_msg = "You prepare to disarm a target..." - - -/datum/action/cooldown/spell/pointed/disarm/is_valid_target(atom/cast_on) - . = ..() - if(!.) - return FALSE - if(!ishuman(cast_on)) - return FALSE - - var/mob/living/carbon/human/human_target = cast_on - return !is_blind(human_target) - -/datum/action/cooldown/spell/pointed/disarm/cast(mob/living/carbon/human/cast_on) - . = ..() - if(cast_on.can_block_magic(antimagic_flags)) - to_chat(cast_on, span_notice("You feel like someone just tried to shake your hand...")) - to_chat(owner, span_warning("The psionic had no effect!")) - return FALSE - - to_chat(cast_on, span_warning("You feel an invisible force disarm you!")) - for(var/V in cast_on.held_items) - var/obj/item/I = V - if(istype(I)) - cast_on.dropItemToGround(I) - return TRUE diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index d1dd65448ef5..acc93861fa08 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -25,22 +25,23 @@ var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) switch(user.psi.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) + blade.can_break_wall = TRUE + blade.wall_break_time = 3 SECONDS blade.force = 40 if(PSI_RANK_GRANDMASTER) - blade.force = 24 - blade.armour_penetration = 25 - blade.AddComponent(/datum/component/cleave_attack, arc_size=180) + blade.can_break_wall = TRUE + blade.force = 30 if(PSI_RANK_MASTER) - blade.force = 18 + blade.force = 20 else - blade.force = 12 + blade.force = 10 return blade /datum/psionic_power/psychokinesis/tinker - name = "Tinker" - cost = 5 - cooldown = 10 - min_rank = PSI_RANK_OPERANT + name = "Tinker" + cost = 5 + cooldown = 10 + min_rank = PSI_RANK_OPERANT use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." use_sound = 'sound/effects/psi/power_fabrication.ogg' use_manifest = TRUE @@ -57,7 +58,7 @@ tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.25 if(PSI_RANK_GRANDMASTER) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.5 if(PSI_RANK_MASTER) tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) @@ -68,9 +69,45 @@ return tool /datum/psionic_power/psychokinesis/telekinesis - name = "Telekinesis" - cost = 5 - cooldown = 1 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to telepathically move and access objects. Upgrades with your Psi Rank." - + name = "Telekinesis" + cost = 5 + cooldown = 1 SECONDS + use_ranged = TRUE + use_manifest = FALSE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." + admin_log = FALSE + use_sound = 'sound/effects/psi/power_used.ogg' + var/global/list/valid_machine_types = list( + /obj/machinery/door + ) + +/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) + if(!user.combat_mode) + return FALSE + . = ..() + if(.) + + var/distance = get_dist(user, target) + if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS) * 2) + to_chat(user, span_warning("Your telekinetic power won't reach that far.")) + return FALSE + + if(istype(target, /mob) || istype(target, /obj)) + var/obj/item/psychic_power/telekinesis/tk = new(user) + if(tk.set_focus(target)) + tk.sparkle() + user.visible_message("\The [user] reaches out.") + return tk + else if(istype(target, /obj/structure)) + user.visible_message("\The [user] makes a strange gesture.") + var/obj/O = target + O.attack_hand(user) + return TRUE + else if(istype(target, /obj/machinery)) + for(var/mtype in valid_machine_types) + if(istype(target, mtype)) + var/obj/machinery/machine = target + machine.attack_hand(user) + return TRUE + return FALSE diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index d760b8795d8b..4e499f8ff958 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -7,34 +7,159 @@ faculty = PSI_REDACTION admin_log = FALSE -/datum/psionic_power/redaction/Mend - name = "Mend" - cost = 15 - heat = 15 - cooldown = 15 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to heal physical wounds of others with your touch. Upgrades with Psi Level." +/datum/psionic_power/redaction/proc/check_dead(var/mob/living/target) + if(!istype(target)) + return FALSE + if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) + return TRUE + return FALSE -/datum/psionic_power/redaction/cleanse - name = "Cleanse" - cost = 15 - heat = 15 - cooldown = 15 SECONDS +/datum/psionic_power/redaction/invoke(var/mob/living/user, var/mob/living/target) + if(check_dead(target)) + return FALSE + . = ..() + +/datum/psionic_power/redaction/skinsight + name = "Skinsight" + cost = 3 + heat = 1 + cooldown = 3 SECONDS + use_melee = TRUE min_rank = PSI_RANK_OPERANT - use_description = "Grants the ability to cleanse others of toxins and radiation." + use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." + +/datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target) + if(!istype(target) || user.zone_selected != BODY_ZONE_CHEST || target.pulledby == user) + return FALSE + . = ..() + if(.) + user.visible_message(span_notice("\The [user] rests a hand on \the [target].")) + healthscan(user, target, user.psi.get_rank(PSI_REDACTION) >= PSI_RANK_GRANDMASTER) + return TRUE -/datum/psionic_power/redaction/healers_visage - name = "Healer's Visage" +/datum/psionic_power/redaction/mend + name = "Mend" + cost = 7 + heat = 10 + cooldown = 5 SECONDS + use_melee = TRUE min_rank = PSI_RANK_OPERANT - use_description = "Grants the user passive sight of those harmed, or affected by maladies." + use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." + +/datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(user) || !istype(target) || target.pulledby != user || user.grab_state >= GRAB_AGGRESSIVE) + return FALSE + . = ..() + if(.) + var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) + + if(!E) + to_chat(user, span_warning("They are missing that limb.")) + return TRUE + + if(E.status == BODYPART_ROBOTIC) + to_chat(user, span_warning("That limb is prosthetic.")) + return TRUE + + user.visible_message(span_notice("\The [user] rests a hand on \the [target]'s [E.name]...")) + to_chat(target, span_notice("A healing warmth suffuses you.")) + + var/redaction_rank = user.psi.get_rank(PSI_REDACTION) + var/pk_rank = user.psi.get_rank(PSI_PSYCHOKINESIS) + + if(pk_rank >= PSI_RANK_LATENT && redaction_rank >= PSI_RANK_MASTER) + var/removal_size = clamp(5-pk_rank, 0, 5) + var/valid_objects = list() + for(var/obj/item/thing in E.embedded_objects) + if(thing.w_class >= removal_size) + valid_objects += thing + if(LAZYLEN(valid_objects)) + var/removing = pick(valid_objects) + target.remove_embedded_object(removing) + to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removing] free of \the [E].")) + return TRUE -/datum/psionic_power/redaction/revivification - name = "Revivification" - min_rank = PSI_RANK_MASTER - use_description = "Grants the user the ability to revive another. Upgrades with Psi Level." + if(redaction_rank >= PSI_RANK_GRANDMASTER) + for(var/obj/item/organ/O in target.internal_organs) + if(O.damage > 0) + to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) + O.applyOrganDamage(-rand(redaction_rank, redaction_rank * 2)) + return TRUE + if(E.get_damage(TRUE)) + E.heal_damage((redaction_rank * 10), (redaction_rank * 10)) + to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) + new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") + return TRUE -/datum/psionic_power/healing_aura - name = "Healing Aura" + to_chat(user, span_notice("You can find nothing within \the [target]'s [E.name] to mend.")) + return FALSE + +/datum/psionic_power/redaction/cleanse + name = "Cleanse" + cost = 9 + heat = 15 + cooldown = 6 SECONDS + use_melee = TRUE + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." + +/datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) + if(!istype(user) || !istype(target) || target.pulledby != user || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + return FALSE + . = ..() + if(.) + // No messages, as Mend procs them even if it fails to heal anything, and Cleanse is always checked after Mend. + var/removing = rand(20,25) + if(target.radiation) + to_chat(user, span_notice("You repair some of the radiation-damaged tissue within \the [target]...")) + if(target.radiation > removing) + target.radiation -= removing + else + target.radiation = 0 + return TRUE + if(target.getCloneLoss()) + to_chat(user, span_notice("You stitch together some of the mangled DNA within \the [target]...")) + if(target.getCloneLoss() >= removing) + target.adjustCloneLoss(-removing) + else + target.adjustCloneLoss(-(target.getCloneLoss())) + return TRUE + to_chat(user, span_notice("You can find no genetic damage or radiation to heal within \the [target].")) + return TRUE + +/datum/psionic_power/revive + name = "Revive" + cost = 25 + heat = 100 + cooldown = 8 SECONDS + use_melee = TRUE min_rank = PSI_RANK_PARAMOUNT - use_description = "Grants the user an aura of healing of themselves and others over time." + faculty = PSI_REDACTION + use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." + admin_log = FALSE + +/datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target) + if(!isliving(target) || !istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user || user.grab_state < GRAB_AGGRESSIVE) + return FALSE + . = ..() + if(.) + if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) + to_chat(user, span_warning("This person is already alive!")) + return TRUE + + if(((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT)) + to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) + return TRUE + + user.visible_message(span_notice("\The [user] splays out their hands over \the [target]'s body...")) + target.notify_ghost_cloning("Your heart is being revived!") + target.grab_ghost() + if(!do_after(user, 10 SECONDS, target, FALSE)) + user.psi.backblast(rand(10,25)) + return TRUE + to_chat(target, span_notice("Life floods back into your body!")) + target.visible_message(span_notice("\The [target] shudders violently!")) + target.adjustOxyLoss(-rand(15,20)) + target.revive() + return TRUE diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm index 51100695cc83..23d5daffc9b1 100644 --- a/code/modules/psionics/interfaces/ui_hub.dm +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -9,7 +9,6 @@ var/mutable_appearance/heat_bar var/mutable_appearance/heat_bar_filling var/list/components - plane = HUD_PLANE /obj/screen/psi/hub/New(var/mob/living/_owner) on_cooldown = image(icon, "cooldown") diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index a62f7809110f..da9ae39a873b 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -2,7 +2,6 @@ /obj/screen/psi/armour name = "Psi-Armour" icon_state = "psiarmour_off" - plane = HUD_PLANE /obj/screen/psi/armour/update_icon() ..() @@ -22,7 +21,6 @@ /obj/screen/psi/autoredaction name = "Autoredaction" icon_state = "healing_off" - plane = HUD_PLANE /obj/screen/psi/autoredaction/update_icon() ..() @@ -42,7 +40,6 @@ /obj/screen/psi/zorch_harm name = "Zorch Mode" icon_state = "zorch_disable" - plane = HUD_PLANE /obj/screen/psi/zorch_harm/update_icon() ..() @@ -62,7 +59,6 @@ /obj/screen/psi/limiter name = "Psi-Limiter" icon_state = "limiter_100" - plane = HUD_PLANE /obj/screen/psi/limiter/update_icon() ..() @@ -98,7 +94,6 @@ name = "Show/Hide Psi UI" icon_state = "arrow_left" var/obj/screen/psi/hub/controller - plane = HUD_PLANE /obj/screen/psi/toggle_psi_menu/New(var/mob/living/_owner, var/obj/screen/psi/hub/_controller) controller = _controller diff --git a/yogstation.dme b/yogstation.dme index a74ed0ccf7fd..1bf4ee5d6fcc 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3564,7 +3564,6 @@ #include "code\modules\psionics\faculties\energistics.dm" #include "code\modules\psionics\faculties\psychokenisis.dm" #include "code\modules\psionics\faculties\redaction.dm" -#include "code\modules\psionics\faculties\faculty_abilities\coercion\coercion_abilities.dm" #include "code\modules\psionics\interfaces\ui.dm" #include "code\modules\psionics\interfaces\ui_hub.dm" #include "code\modules\psionics\interfaces\ui_toggle.dm" From dc53bccd97c0f9635b61cff8ae8a09698ef7a0cc Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:15:38 -0500 Subject: [PATCH 014/201] Revert "coercion spells (molti dont be mad)" This reverts commit 538d012f01eeab6401d6b4d4025e747dd38a415c. --- _maps/_basemap.dm | 2 +- code/__DEFINES/psi.dm | 19 +---- code/_onclick/other_mobs.dm | 7 +- code/modules/psionics/complexus/complexus.dm | 76 ++++++++++++------- .../complexus/complexus_power_cache.dm | 25 +----- .../psionics/complexus/complexus_process.dm | 1 + code/modules/psionics/faculties/_power.dm | 15 ++-- code/modules/psionics/faculties/coercion.dm | 12 --- .../modules/psionics/faculties/energistics.dm | 4 - .../psionics/faculties/psychokenisis.dm | 4 - code/modules/psionics/faculties/redaction.dm | 4 - 11 files changed, 68 insertions(+), 101 deletions(-) diff --git a/_maps/_basemap.dm b/_maps/_basemap.dm index 48b96c8948f7..aadbfa88a035 100644 --- a/_maps/_basemap.dm +++ b/_maps/_basemap.dm @@ -1,4 +1,4 @@ -//#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. +#define LOWMEMORYMODE //uncomment this to load centcom and runtime station and thats it. #include "map_files\generic\CentCom.dmm" diff --git a/code/__DEFINES/psi.dm b/code/__DEFINES/psi.dm index 82bdb908b62b..3bbf2893805a 100644 --- a/code/__DEFINES/psi.dm +++ b/code/__DEFINES/psi.dm @@ -16,18 +16,7 @@ #define PSI_IMPLANT_LOG "Log Incident" #define PSI_IMPLANT_DISABLED "Disabled" -#define INVOKE_PSI_POWERS(holder, powers, target, return_on_invocation) \ - if(holder?.psi?.can_use()) { \ - for(var/datum/psionic_power/power as anything in powers) { \ - var/obj/item/result = power.invoke(holder, target); \ - if(result) { \ - power.handle_post_power(holder, target); \ - if(istype(result)) { \ - holder.playsound_local(soundin = 'sound/effects/psi/power_evoke.ogg'); \ - LAZYADD(holder.psi.manifested_items, result); \ - holder.put_in_hands(result); \ - } \ - return return_on_invocation; \ - } \ - } \ - } +#define COMSIG_PSI_SELECTION "select action" +#define COMSIG_PSI_INVOKE "invoke selected" +///return to block the regular action from happening + #define COMSIG_PSI_BLOCK_ACTION (1<<0) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 7e7df0ebeb4a..9f08343e9fa0 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -6,7 +6,8 @@ */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) if(psi) - INVOKE_PSI_POWERS(src, psi.get_melee_powers(), A, FALSE) + if(SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, proximity, modifiers) & COMSIG_PSI_BLOCK_ACTION) + return if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) check_self_for_injuries() @@ -51,11 +52,11 @@ /mob/living/carbon/human/attack_empty_hand() if(psi) - INVOKE_PSI_POWERS(src, psi.get_manifestations(), src, FALSE) + SEND_SIGNAL(src, COMSIG_PSI_SELECTION) /mob/living/carbon/human/RangedAttack(atom/A, params) if(psi) - INVOKE_PSI_POWERS(src, psi.get_ranged_powers(), A, TRUE) + SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, TRUE, params) //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index f788ec39140e..0280ac3e679b 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -55,16 +55,58 @@ var/aura_color = "#ff0022" // Cached powers. - var/list/melee_powers // Powers used in melee range. - var/list/grab_powers // Powers use by using a grab. - var/list/ranged_powers // Powers used at range. - var/list/manifestation_powers // Powers that create an item. - var/list/powers_by_faculty // All powers within a given faculty. + var/list/learned_powers // All powers known + var/list/powers_by_faculty + var/datum/psionic_power/selected_power // Power currently selected var/obj/screen/psi/hub/ui // Reference to the master psi UI object. var/mob/living/owner // Reference to our owner. var/image/_aura_image // Client image +/datum/psi_complexus/New(mob/M) + owner = M + START_PROCESSING(SSpsi, src) + RegisterSignal(M, COMSIG_PSI_SELECTION, PROC_REF(select_power)) + RegisterSignal(M, COMSIG_PSI_INVOKE, PROC_REF(invoke_power)) + +/datum/psi_complexus/Destroy() + destroy_aura_image(_aura_image) + STOP_PROCESSING(SSpsi, src) + if(owner) + UnregisterSignal(owner, COMSIG_PSI_SELECTION) + UnregisterSignal(owner, COMSIG_PSI_INVOKE) + cancel() + if(owner.client) + owner.client.screen -= ui.components + owner.client.screen -= ui + for(var/thing in SSpsi.all_aura_images) + owner.client.images -= thing + QDEL_NULL(ui) + owner.psi = null + owner = null + + if(manifested_items) + for(var/thing in manifested_items) + qdel(thing) + manifested_items.Cut() + . = ..() + +/datum/psi_complexus/proc/select_power(mob/user) + if(!LAZYLEN(learned_powers)) + return + var/list/choice_list = LAZYCOPY(learned_powers) + for(var/datum/psionic_power/I as anything in choice_list) + choice_list[I] = image(I.icon, null, I.icon_state) + selected_power = show_radial_menu(user, user, choice_list) + if(selected_power) + selected_power.on_select(user) + +/datum/psi_complexus/proc/invoke_power(mob/user, atom/target, proximity, parameters) + if(!selected_power) + return + user.playsound_local(soundin = 'sound/effects/psi/power_evoke.ogg') + return selected_power.invoke(user, target, proximity, parameters) + /datum/psi_complexus/proc/get_aura_image() if(_aura_image && !istype(_aura_image)) var/atom/A = _aura_image @@ -95,27 +137,3 @@ for(var/datum/psi_complexus/psychic in SSpsi.processing) psychic?.owner?.client?.images -= aura_image SSpsi.all_aura_images -= aura_image - -/datum/psi_complexus/New(mob/M) - owner = M - START_PROCESSING(SSpsi, src) - -/datum/psi_complexus/Destroy() - destroy_aura_image(_aura_image) - STOP_PROCESSING(SSpsi, src) - if(owner) - cancel() - if(owner.client) - owner.client.screen -= ui.components - owner.client.screen -= ui - for(var/thing in SSpsi.all_aura_images) - owner.client.images -= thing - QDEL_NULL(ui) - owner.psi = null - owner = null - - if(manifested_items) - for(var/thing in manifested_items) - qdel(thing) - manifested_items.Cut() - . = ..() diff --git a/code/modules/psionics/complexus/complexus_power_cache.dm b/code/modules/psionics/complexus/complexus_power_cache.dm index 6f80dc7e773f..14a10b97d26d 100644 --- a/code/modules/psionics/complexus/complexus_power_cache.dm +++ b/code/modules/psionics/complexus/complexus_power_cache.dm @@ -1,9 +1,7 @@ /datum/psi_complexus/proc/rebuild_power_cache() if(rebuild_power_cache) - melee_powers = list() - ranged_powers = list() - manifestation_powers = list() + learned_powers = list() powers_by_faculty = list() for(var/faculty in ranks) @@ -13,28 +11,9 @@ var/datum/psionic_power/power = P if(relevant_rank >= power.min_rank) LAZYADD(powers_by_faculty[power.faculty], power) - if(power.use_ranged) - if(!ranged_powers[faculty]) - ranged_powers[faculty] = list() - LAZYADD(ranged_powers[faculty], power) - if(power.use_melee) - LAZYADD(melee_powers[faculty], power) - if(power.use_manifest) - manifestation_powers += power + LAZYADD(learned_powers, power) rebuild_power_cache = FALSE /datum/psi_complexus/proc/get_powers_by_faculty(faculty) rebuild_power_cache() return powers_by_faculty[faculty] - -/datum/psi_complexus/proc/get_melee_powers(faculty) - rebuild_power_cache() - return melee_powers[faculty] - -/datum/psi_complexus/proc/get_ranged_powers(faculty) - rebuild_power_cache() - return ranged_powers[faculty] - -/datum/psi_complexus/proc/get_manifestations() - rebuild_power_cache() - return manifestation_powers diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index a2021c61ebaf..2c00d0d40ea3 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -27,6 +27,7 @@ qdel(src) return rebuild_power_cache = TRUE + rebuild_power_cache() SEND_SOUND(owner, 'sound/effects/psi/power_unlock.ogg') rating = CEILING(combined_rank/rank_count, 1) cost_modifier = 1 diff --git a/code/modules/psionics/faculties/_power.dm b/code/modules/psionics/faculties/_power.dm index b4b0fe15a262..4a66df0196f4 100644 --- a/code/modules/psionics/faculties/_power.dm +++ b/code/modules/psionics/faculties/_power.dm @@ -3,6 +3,10 @@ var/name /// Associated psi faculty. var/faculty + /// File to pull the ability icon from. + var/icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi' + /// Sprite of the ability itself. + var/icon_state = "creep" /// Minimum psi rank to use this power. var/min_rank /// Base psi stamina cost for using this power. @@ -13,12 +17,6 @@ var/cooldown /// Whether or not using this power prints an admin attack log. var/admin_log = TRUE - /// This power functions from a distance. - var/use_ranged - /// This power functions at melee range. - var/use_melee - /// This power manifests an item in the user's hands. - var/use_manifest /// A short description of how to use this power, shown via assay. var/use_description /// A sound effect to play when the power is used. @@ -55,3 +53,8 @@ log_attack("[user] Used psipower ([name]) on [target]") if(use_sound) playsound(user.loc, use_sound, 75) + +/datum/psionic_power/proc/on_select(mob/living/user) + to_chat(world, "[name] was selected by [user]") + + return TRUE diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 6f0266644d06..06229e40de42 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -20,8 +20,6 @@ name = "Blindstrike" cost = 8 cooldown = 120 - use_ranged = TRUE - use_melee = TRUE min_rank = PSI_RANK_GRANDMASTER use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." @@ -46,7 +44,6 @@ cost = 25 heat = 15 cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. - use_melee = TRUE min_rank = PSI_RANK_MASTER use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." @@ -83,7 +80,6 @@ cost = 20 heat = 15 cooldown = 7 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." @@ -103,8 +99,6 @@ name = "Spasm" cost = 15 cooldown = 100 - use_melee = TRUE - use_ranged = TRUE min_rank = PSI_RANK_MASTER use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." @@ -132,7 +126,6 @@ name = "Cognitive Manipulation" cost = 28 cooldown = 20 SECONDS - use_melee = TRUE min_rank = PSI_RANK_GRANDMASTER use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." @@ -225,7 +218,6 @@ name = "Assay" cost = 15 cooldown = 10 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." @@ -249,7 +241,6 @@ name = "Focus" cost = 10 cooldown = 8 SECONDS - use_melee = TRUE min_rank = PSI_RANK_MASTER use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." @@ -282,8 +273,6 @@ name = "Commune" cost = 10 cooldown = 8 SECONDS - use_melee = TRUE - use_ranged = TRUE min_rank = PSI_RANK_OPERANT use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." @@ -330,7 +319,6 @@ name = "Psi-ping" cost = 30 cooldown = 25 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 1d3dd57beccf..18a11b4a498f 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -11,7 +11,6 @@ cost = 20 heat = 20 cooldown = 10 SECONDS - use_melee = TRUE min_rank = PSI_RANK_MASTER use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." @@ -31,7 +30,6 @@ cost = 10 heat = 30 cooldown = 7.5 SECONDS - use_melee = TRUE min_rank = PSI_RANK_GRANDMASTER use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." @@ -60,7 +58,6 @@ cost = 15 heat = 15 cooldown = 2 SECONDS - use_ranged = TRUE min_rank = PSI_RANK_MASTER use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." @@ -106,7 +103,6 @@ name = "Spark" cost = 1 cooldown = 1 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index acc93861fa08..9666b2e70f0f 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -14,7 +14,6 @@ min_rank = PSI_RANK_OPERANT use_description = "Click on or otherwise activate an empty hand while on harm intent to manifest a psychokinetic cutting blade. The power the blade will vary based on your mastery of the faculty." use_sound = 'sound/effects/psi/power_fabrication.ogg' - use_manifest = TRUE admin_log = FALSE /datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target) @@ -44,7 +43,6 @@ min_rank = PSI_RANK_OPERANT use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." use_sound = 'sound/effects/psi/power_fabrication.ogg' - use_manifest = TRUE admin_log = FALSE /datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target) @@ -72,8 +70,6 @@ name = "Telekinesis" cost = 5 cooldown = 1 SECONDS - use_ranged = TRUE - use_manifest = FALSE min_rank = PSI_RANK_GRANDMASTER use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." admin_log = FALSE diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 4e499f8ff958..80c5b58541e0 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -24,7 +24,6 @@ cost = 3 heat = 1 cooldown = 3 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." @@ -42,7 +41,6 @@ cost = 7 heat = 10 cooldown = 5 SECONDS - use_melee = TRUE min_rank = PSI_RANK_OPERANT use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." @@ -99,7 +97,6 @@ cost = 9 heat = 15 cooldown = 6 SECONDS - use_melee = TRUE min_rank = PSI_RANK_GRANDMASTER use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." @@ -132,7 +129,6 @@ cost = 25 heat = 100 cooldown = 8 SECONDS - use_melee = TRUE min_rank = PSI_RANK_PARAMOUNT faculty = PSI_REDACTION use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." From d30bb3b150f7275afbcd92315b0bbaad6f52eae4 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:18:31 -0500 Subject: [PATCH 015/201] Update complexus.dm --- code/modules/psionics/complexus/complexus.dm | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index 0280ac3e679b..8ceea3365cf7 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -92,6 +92,8 @@ . = ..() /datum/psi_complexus/proc/select_power(mob/user) + if(suppressed) + return if(!LAZYLEN(learned_powers)) return var/list/choice_list = LAZYCOPY(learned_powers) @@ -102,6 +104,8 @@ selected_power.on_select(user) /datum/psi_complexus/proc/invoke_power(mob/user, atom/target, proximity, parameters) + if(suppressed) + return if(!selected_power) return user.playsound_local(soundin = 'sound/effects/psi/power_evoke.ogg') From 58852132aafa7c6acef7e2fa3d6051fdf73db963 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:28:42 -0500 Subject: [PATCH 016/201] very nice --- code/modules/psionics/faculties/_power.dm | 2 +- code/modules/psionics/faculties/coercion.dm | 20 +++++++++---------- .../modules/psionics/faculties/energistics.dm | 8 ++++---- .../psionics/faculties/psychokenisis.dm | 6 +++--- code/modules/psionics/faculties/redaction.dm | 10 +++++----- 5 files changed, 23 insertions(+), 23 deletions(-) diff --git a/code/modules/psionics/faculties/_power.dm b/code/modules/psionics/faculties/_power.dm index 4a66df0196f4..c733b54c9085 100644 --- a/code/modules/psionics/faculties/_power.dm +++ b/code/modules/psionics/faculties/_power.dm @@ -22,7 +22,7 @@ /// A sound effect to play when the power is used. var/use_sound = 'sound/effects/psi/power_used.ogg' -/datum/psionic_power/proc/invoke(mob/living/user, atom/target) +/datum/psionic_power/proc/invoke(mob/living/user, atom/target, proximity, parameters) if(!user.psi) return FALSE diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 06229e40de42..a3b7131c37b7 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,7 +9,7 @@ /datum/psionic_power/coercion faculty = PSI_COERCION -/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if (!istype(target)) to_chat(user, span_warning("You cannot mentally attack \the [target].")) return FALSE @@ -23,7 +23,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." -/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) return FALSE . = ..() @@ -47,7 +47,7 @@ min_rank = PSI_RANK_MASTER use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." -/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) return FALSE . = ..() @@ -83,7 +83,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." -/datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target)) return FALSE if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) @@ -102,7 +102,7 @@ min_rank = PSI_RANK_MASTER use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." -/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(!istype(target)) return FALSE @@ -129,7 +129,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." -/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user) return FALSE . = ..() @@ -221,7 +221,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." -/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) return FALSE . = ..() @@ -244,7 +244,7 @@ min_rank = PSI_RANK_MASTER use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." -/datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || target.pulledby != user) return FALSE . = ..() @@ -276,7 +276,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." -/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) return FALSE . = ..() @@ -322,7 +322,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." -/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if((target && user != target)) return FALSE . = ..() diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 18a11b4a498f..9f4e262c397c 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -14,7 +14,7 @@ min_rank = PSI_RANK_MASTER use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." -/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) return FALSE if(isturf(target)) @@ -33,7 +33,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." -/datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) return FALSE if(isturf(target)) @@ -61,7 +61,7 @@ min_rank = PSI_RANK_MASTER use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." -/datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() if(.) if(HAS_TRAIT(user, TRAIT_PACIFISM) && user.psi.zorch_harm) @@ -106,7 +106,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." -/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(isnull(target) || istype(target)) return FALSE . = ..() diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 9666b2e70f0f..b975afef2ab6 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -16,7 +16,7 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if((target && user != target) || !user.combat_mode) return FALSE . = ..() @@ -45,7 +45,7 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if((target && user != target) || user.combat_mode) return FALSE . = ..() @@ -78,7 +78,7 @@ /obj/machinery/door ) -/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode) return FALSE . = ..() diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 80c5b58541e0..faf2347edd9d 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -14,7 +14,7 @@ return TRUE return FALSE -/datum/psionic_power/redaction/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/redaction/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(check_dead(target)) return FALSE . = ..() @@ -27,7 +27,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." -/datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || user.zone_selected != BODY_ZONE_CHEST || target.pulledby == user) return FALSE . = ..() @@ -44,7 +44,7 @@ min_rank = PSI_RANK_OPERANT use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." -/datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(!istype(user) || !istype(target) || target.pulledby != user || user.grab_state >= GRAB_AGGRESSIVE) return FALSE . = ..() @@ -100,7 +100,7 @@ min_rank = PSI_RANK_GRANDMASTER use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." -/datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target) +/datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(!istype(user) || !istype(target) || target.pulledby != user || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) return FALSE . = ..() @@ -134,7 +134,7 @@ use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." admin_log = FALSE -/datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target) +/datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!isliving(target) || !istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user || user.grab_state < GRAB_AGGRESSIVE) return FALSE . = ..() From b77dbe3260eeba980b62924cc4f721a10fd63193 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:33:17 -0500 Subject: [PATCH 017/201] Update other_mobs.dm --- code/_onclick/other_mobs.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 9f08343e9fa0..127ca2ea591b 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -56,7 +56,7 @@ /mob/living/carbon/human/RangedAttack(atom/A, params) if(psi) - SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, TRUE, params) + SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, FALSE, params) //Return TRUE to cancel other attack hand effects that respect it. /atom/proc/attack_hand(mob/user, modifiers) From 1ed20a0891186ca9440934f3fbe18ab58f53f571 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:49:41 -0500 Subject: [PATCH 018/201] Update cerebro_enhancers.dm --- code/modules/psionics/equipment/cerebro_enhancers.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/modules/psionics/equipment/cerebro_enhancers.dm b/code/modules/psionics/equipment/cerebro_enhancers.dm index 2f1fc1dab96e..3035af3ad3d5 100644 --- a/code/modules/psionics/equipment/cerebro_enhancers.dm +++ b/code/modules/psionics/equipment/cerebro_enhancers.dm @@ -12,10 +12,12 @@ var/max_boosted_faculties = 3 var/boosted_psipower = 120 var/paramount_check = FALSE - -/obj/item/clothing/head/helmet/space/psi_amp/Initialize() - . = ..() - verbs += /obj/item/clothing/head/helmet/space/psi_amp/proc/integrate + +/obj/item/clothing/head/helmet/space/psi_amp/verb/integrate_action() + set name = "Integrate" + set category = null + set src in usr + integrate() /obj/item/clothing/head/helmet/space/psi_amp/attack_self(mob/user) From 32a8772b5f1296f126a78e1ca0b3160b64f31fb5 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 13:52:18 -0500 Subject: [PATCH 019/201] Update implant_psi.dm --- code/game/objects/items/implants/implant_psi.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/game/objects/items/implants/implant_psi.dm b/code/game/objects/items/implants/implant_psi.dm index 36a5daddac1a..5f23cbee1c77 100644 --- a/code/game/objects/items/implants/implant_psi.dm +++ b/code/game/objects/items/implants/implant_psi.dm @@ -21,7 +21,7 @@ Integrity: Implant will last so long as the device is inside the bloodstream."} return dat -/obj/item/implant/psi_control/Initialize() +/obj/item/implant/psi_control/Initialize(mapload) . = ..() SSpsi.psi_dampeners += src SSpsi.processing += src @@ -147,7 +147,7 @@ var/stress_left = 100 var/lifespan = 1 MINUTES -/obj/item/implant/nullglass/Initialize() +/obj/item/implant/nullglass/Initialize(mapload) . = ..() QDEL_IN(src, lifespan) From 59bf30f024ce2c86c0ecb50e76b55c95fd74103a Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 14:06:41 -0500 Subject: [PATCH 020/201] lint --- code/game/objects/items/implants/implant_psi.dm | 4 ++-- code/modules/psionics/interfaces/ui.dm | 3 ++- code/modules/psionics/interfaces/ui_toggle.dm | 1 + 3 files changed, 5 insertions(+), 3 deletions(-) diff --git a/code/game/objects/items/implants/implant_psi.dm b/code/game/objects/items/implants/implant_psi.dm index 5f23cbee1c77..af93d3c5958c 100644 --- a/code/game/objects/items/implants/implant_psi.dm +++ b/code/game/objects/items/implants/implant_psi.dm @@ -41,9 +41,9 @@ var/use_psi_mode = get_psi_mode() return (use_psi_mode == PSI_IMPLANT_SHOCK || use_psi_mode == PSI_IMPLANT_WARN) ? src : FALSE -/obj/item/implant/psi_control/removed() +/obj/item/implant/psi_control/removed(mob/living/source, silent = FALSE, special = 0) var/mob/living/M = imp_in - if(disrupts_psionics() && istype(M) && M.psi) + if(!silent && disrupts_psionics() && istype(M) && M.psi) to_chat(M, span_notice("You feel the chilly shackles around your psionic faculties fade away.")) . = ..() diff --git a/code/modules/psionics/interfaces/ui.dm b/code/modules/psionics/interfaces/ui.dm index 4cbf7f09206f..49660ab3ca1f 100644 --- a/code/modules/psionics/interfaces/ui.dm +++ b/code/modules/psionics/interfaces/ui.dm @@ -1,4 +1,4 @@ -obj/screen/psi +/obj/screen/psi icon = 'icons/mob/screen_psi.dmi' var/mob/living/owner var/hidden = TRUE @@ -14,6 +14,7 @@ obj/screen/psi . = ..() /obj/screen/psi/update_icon() + . = ..() if(hidden) invisibility = 101 else diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index da9ae39a873b..642362bb770a 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -107,6 +107,7 @@ controller.update_icon() /obj/screen/psi/toggle_psi_menu/update_icon() + . = ..() if(hidden) icon_state = "arrow_left" else From 974f42bfedf716c016023e6b6ecde57707e9d11a Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 16:36:18 -0400 Subject: [PATCH 021/201] updates some stuff --- code/modules/psionics/faculties/_power.dm | 4 ++-- .../psionics/faculties/psychokenisis.dm | 17 ++++++++--------- code/modules/psionics/faculties/redaction.dm | 4 ++-- code/modules/psionics/interfaces/ui_hub.dm | 1 + code/modules/psionics/interfaces/ui_toggle.dm | 5 ++++- icons/obj/psychic_powers.dmi | Bin 1326 -> 3468 bytes 6 files changed, 17 insertions(+), 14 deletions(-) diff --git a/code/modules/psionics/faculties/_power.dm b/code/modules/psionics/faculties/_power.dm index c733b54c9085..eee18007c533 100644 --- a/code/modules/psionics/faculties/_power.dm +++ b/code/modules/psionics/faculties/_power.dm @@ -4,9 +4,9 @@ /// Associated psi faculty. var/faculty /// File to pull the ability icon from. - var/icon = 'yogstation/icons/mob/actions/actions_darkspawn.dmi' + var/icon = 'icons/obj/psychic_powers.dmi' /// Sprite of the ability itself. - var/icon_state = "creep" + var/icon_state = "base_power" /// Minimum psi rank to use this power. var/min_rank /// Base psi stamina cost for using this power. diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index b975afef2ab6..0c0b5b837c5c 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -16,12 +16,11 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/psiblade/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if((target && user != target) || !user.combat_mode) - return FALSE +/datum/psionic_power/psychokinesis/psiblade/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() if(.) var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) + user.put_in_hands(blade) switch(user.psi.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) blade.can_break_wall = TRUE @@ -29,11 +28,12 @@ blade.force = 40 if(PSI_RANK_GRANDMASTER) blade.can_break_wall = TRUE - blade.force = 30 + blade.force = 24 + blade.armour_penetration = 30 if(PSI_RANK_MASTER) - blade.force = 20 + blade.force = 18 else - blade.force = 10 + blade.force = 12 return blade /datum/psionic_power/psychokinesis/tinker @@ -45,12 +45,11 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/tinker/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if((target && user != target) || user.combat_mode) - return FALSE +/datum/psionic_power/psychokinesis/tinker/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() if(.) var/obj/item/psychic_power/tinker/tool = new(user) + user.put_in_hands(tool) switch(user.psi.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index faf2347edd9d..8cc464dd9752 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -97,7 +97,7 @@ cost = 9 heat = 15 cooldown = 6 SECONDS - min_rank = PSI_RANK_GRANDMASTER + min_rank = PSI_RANK_OPERANT use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." /datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) @@ -129,7 +129,7 @@ cost = 25 heat = 100 cooldown = 8 SECONDS - min_rank = PSI_RANK_PARAMOUNT + min_rank = PSI_RANK_OPERANT faculty = PSI_REDACTION use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." admin_log = FALSE diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm index 23d5daffc9b1..b6ec992ba675 100644 --- a/code/modules/psionics/interfaces/ui_hub.dm +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -2,6 +2,7 @@ name = "Psi" icon_state = "psi_suppressed" screen_loc = "EAST-1:28,CENTER-4:7" + plane = HUD_PLANE hidden = FALSE maptext_x = 6 maptext_y = -8 diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index 642362bb770a..0e1d5a227751 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -1,5 +1,6 @@ // Begin psi armour toggle. /obj/screen/psi/armour + plane = HUD_PLANE name = "Psi-Armour" icon_state = "psiarmour_off" @@ -19,6 +20,7 @@ // Begin autoredaction toggle. /obj/screen/psi/autoredaction + plane = HUD_PLANE name = "Autoredaction" icon_state = "healing_off" @@ -57,6 +59,7 @@ // Begin limiter toggle. /obj/screen/psi/limiter + plane = HUD_PLANE name = "Psi-Limiter" icon_state = "limiter_100" @@ -94,6 +97,7 @@ name = "Show/Hide Psi UI" icon_state = "arrow_left" var/obj/screen/psi/hub/controller + plane = HUD_PLANE /obj/screen/psi/toggle_psi_menu/New(var/mob/living/_owner, var/obj/screen/psi/hub/_controller) controller = _controller @@ -107,7 +111,6 @@ controller.update_icon() /obj/screen/psi/toggle_psi_menu/update_icon() - . = ..() if(hidden) icon_state = "arrow_left" else diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index e527fe58058830aba849220eab7957ed4060b4b0..683a705e9722b2f675799956b1ca610f3e1153c5 100644 GIT binary patch literal 3468 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 From 4e624084bf60bd2d4493cbfb15a4a80eccfaa3c7 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 18:01:10 -0400 Subject: [PATCH 022/201] moves shit --- code/modules/psionics/faculties/coercion.dm | 419 ++++++++---------- .../modules/psionics/faculties/energistics.dm | 78 ++-- code/modules/psionics/faculties/redaction.dm | 2 +- 3 files changed, 214 insertions(+), 285 deletions(-) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index a3b7131c37b7..b42815d91210 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,71 +9,92 @@ /datum/psionic_power/coercion faculty = PSI_COERCION -/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if (!istype(target)) - to_chat(user, span_warning("You cannot mentally attack \the [target].")) - return FALSE - - . = ..() - -/datum/psionic_power/coercion/blindstrike - name = "Blindstrike" - cost = 8 - cooldown = 120 - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." +/datum/psionic_power/coercion/assay + name = "Assay" + cost = 15 + cooldown = 10 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." -/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) +/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) return FALSE . = ..() if(.) - user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) - to_chat(user, span_danger("You strike at all around you with a deafening psionic scream!")) - for(var/mob/living/M in orange(user, user.psi.get_rank(PSI_COERCION))) - if(M == user) - continue - M.emote("scream") - to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) - M.blind_eyes(1 SECONDS) - M.adjust_confusion(10 SECONDS) + user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) + to_chat(user, span_notice("You insinuate your mentality into that of \the [target]...")) + to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) + if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) + user.psi.backblast(rand(5,10)) + return TRUE + to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) + to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) + target.show_psi_assay(user) return TRUE -/datum/psionic_power/coercion/mindread - name = "Read Mind" - cost = 25 - heat = 15 - cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. - min_rank = PSI_RANK_MASTER - use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." +/datum/psionic_power/coercion/psiping + name = "Psi-ping" + cost = 30 + cooldown = 25 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." -/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) +/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if((target && user != target)) return FALSE . = ..() - if(!.) - return - - if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) - to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) - return TRUE - - user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) - var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text - if(!question || user.incapacitated() || !do_after(user, 20)) - return TRUE + if(.) + to_chat(user, "You take a moment to tune into the local Nlom...") + if(!do_after(user, 3 SECONDS, user)) + return + var/list/dirs = list() + for(var/mob/living/L in range(20)) + var/turf/T = get_turf(L) + if(!T || L == user || L.stat == DEAD || issilicon(L)) + continue + /* + var/image/ping_image = image(icon = 'icons/effects/effects.dmi', icon_state = "sonar_ping", loc = user) + ping_image.plane = LIGHTING_LAYER+1 + ping_image.layer = LIGHTING_LAYER+1 + ping_image.pixel_x = (T.x - user.x) * 32 + ping_image.pixel_y = (T.y - user.y) * 32 + user << ping_image + addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, ping_image), 8) + */ + var/direction = num2text(get_dir(user, L)) + var/dist + if(text2num(direction)) + switch(get_dist(user, L)) + if(0 to 10) + dist = "very close" + if(10 to 20) + dist = "close" + if(20 to 30) + dist = "a little ways away" + if(30 to 40) + dist = "farther away" + else + dist = "far away" + else + dist = "on top of you" + LAZYINITLIST(dirs[direction]) + dirs[direction][dist] += 1 + for(var/d in dirs) + var/list/feedback = list() + for(var/dst in dirs[d]) + feedback += "[dirs[d][dst]] psionic signature\s [dst]," + if(feedback.len > 1) + feedback[feedback.len - 1] += " and" + to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) + if(!length(dirs)) + to_chat(user, span_notice("You detect no psionic signatures but your own.")) - var/started_mindread = world.time - to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) - to_chat(target, span_notice("Your mind is compelled to answer: [question]")) // I wonder how this will go down with the playerbase +/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if (!istype(target)) + to_chat(user, span_warning("You cannot mentally attack \the [target].")) + return FALSE - var/answer = input(target, question, "Read Mind") as null|text - if(!answer || world.time > started_mindread + 25 SECONDS || user.stat != CONSCIOUS || target.stat == DEAD) - to_chat(user, span_notice("You receive nothing useful from \the [target].")) - else - to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) - log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") - return TRUE + . = ..() /datum/psionic_power/coercion/agony name = "Agony" @@ -122,120 +143,51 @@ target.visible_message("\The [target] drops what they were holding as their right hand spasms!") return TRUE -/datum/psionic_power/coercion/cognitivemanipulation - name = "Cognitive Manipulation" - cost = 28 - cooldown = 20 SECONDS - min_rank = PSI_RANK_GRANDMASTER - use_description = "Grab a victim, target the eyes, then attack them while on disarm intent, in order to manipulate their mind. The process takes some time, and failure is punished harshly." +/datum/psionic_power/coercion/commune + name = "Commune" + cost = 10 + cooldown = 8 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." -/datum/psionic_power/coercion/cognitivemanipulation/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user) +/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) return FALSE . = ..() if(.) - if(target.stat == DEAD || HAS_TRAIT(target, TRAIT_FAKEDEATH)) - to_chat(user, span_warning("\The [target] is dead!")) - return TRUE - user.visible_message(span_danger("\The [user] seizes the head of \the [target] in both hands...")) - - var/coercion_rank = user.psi.get_rank(PSI_COERCION) - var/target_coercion_rank = PSI_RANK_BLUNT - if(target.psi) - target_coercion_rank = target.psi.get_rank(PSI_COERCION) - var/relative_coercion_rank = target_coercion_rank ? coercion_rank - target_coercion_rank : coercion_rank - - var/list/radial_list = list() - var/radial_icon = 'icons/mob/screen_psi.dmi' - - if(coercion_rank >= PSI_RANK_GRANDMASTER) - var/datum/radial_menu_choice/choice = new - choice.image = icon(radial_icon, "hypnotise") - choice.info = "Make the target temporarily subject to a hypnosis-like effect, making them easily influenced by spoken words." - radial_list[COGMANIP_HYPNOTIZE] = choice + user.visible_message("[user] touches their fingers to their temple.") + var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) - choice = new - choice.image = icon(radial_icon, "erase") - choice.info = "Rewrite the targets mind to remove a specific memory, which can cure them of related ailments." - radial_list[COGMANIP_ERASE_MEMORY] = choice + if(!text) + return - if(coercion_rank >= PSI_RANK_PARAMOUNT) - var/datum/radial_menu_choice/choice = new - choice.image = icon(radial_icon, "thrall") - choice.info = "Make the target a subservient thrall to your will." - radial_list[COGMANIP_THRALL] = choice - message_admins(COGMANIP_THRALL) + if(target.stat == DEAD) + to_chat(user,"Not even a psion of your level can speak to the dead.") + return - if(!radial_list.len) - return TRUE + if (issilicon(target)) + to_chat(user,"This can only be used on living organisms.") + return - var/choice = show_radial_menu(user, target, radial_list, require_near = TRUE, tooltips = TRUE) + log_say("[key_name(user)] communed to [key_name(target)]: [text]") - if(!(choice in radial_list)) - return TRUE + for (var/mob/M in GLOB.player_list) + if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) + to_chat(M,"[user] psionically says to [target]: [text]") - var/mob/living/carbon/C = target - // So much text - if(relative_coercion_rank < PSI_RANK_OPERANT || (relative_coercion_rank == PSI_RANK_OPERANT && (istype(C) && !C.hypnosis_vulnerable()))) - to_chat(user, span_warning("[target] mind is too strong to hypnotize them!")) - if(target_coercion_rank >= PSI_RANK_OPERANT) - to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], but you manage to [relative_coercion_rank == 1 ? "barely " :""]repel the attack!")) - else if(target_coercion_rank == PSI_RANK_LATENT) - to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head holding strong.")) - else - // Non-psionics have no clue what is going on, but they should still have some indication of whats is happening - to_chat(target, span_notice("Your feel a strange sensation in your head.")) - return TRUE - if(target_coercion_rank >= PSI_RANK_OPERANT) - to_chat(target, span_warning("Your mind is invaded by the presence of \the [user], and your mental barriers [relative_coercion_rank > 1 ? "shatter like glass" : "fail"]!")) - to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s mental barriers and start working on the task at hand.")) - else if(target_coercion_rank == PSI_RANK_LATENT) - to_chat(target, span_notice("Your somehow feel [user]'s presence in your head and something in your head failing.")) - to_chat(user, span_notice("You manage to [relative_coercion_rank > 1 ? "easily " : ""]push through [target]'s amiture defenses and start working on the task at hand.")) + var/mob/living/carbon/human/H = target + if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) + to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") else - to_chat(target, span_notice("Your feel a strange sensation in your head.")) - - switch(choice) - if(COGMANIP_HYPNOTIZE) - if(!do_after(user, 30 SECONDS, target, FALSE)) - user.psi.backblast(rand(1, 5)) - return TRUE - to_chat(user, span_danger("You surgicaly rearange \the [target]'s neurons, leaving [target.p_them()] easily influinced by the next thing [target.p_they()] hear. Choice you next words carefuly...")) - target.apply_status_effect(/datum/status_effect/trance, relative_coercion_rank * 10 SECONDS, relative_coercion_rank >= 2) - - if(COGMANIP_ERASE_MEMORY) - if(!do_after(user, 30 SECONDS, target, FALSE)) - user.psi.backblast(rand(1, 5)) - return TRUE - var/lost_memory = pretty_filter(stripped_input(user, "What would you like [target] to forget?", "Cognative Manipulation")) - to_chat(user, span_danger("You surgicaly cut \the [target]'s hippocampus, removing every shread of memory surounding the phrase \"[lost_memory]\".")) - to_chat(target, "[lost_memory]") - to_chat(target, span_warning("You can't remember anything surounding that phrase!")) - - return TRUE - -/datum/psionic_power/coercion/assay - name = "Assay" - cost = 15 - cooldown = 10 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." - -/datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) - return FALSE - . = ..() - if(.) - user.visible_message(span_warning("\The [user] holds the head of \the [target] in both hands...")) - to_chat(user, span_notice("You insinuate your mentality into that of \the [target]...")) - to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) - if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) - user.psi.backblast(rand(5,10)) - return TRUE - to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) - to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) - target.show_psi_assay(user) - return TRUE + to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") + if(istype(H)) + if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) + to_chat(H,"Your nose begins to bleed...") + H.add_splatter_floor(small_drip = TRUE) + else if(prob(25)) + to_chat(H,"Your head hurts...") + else if(prob(50)) + to_chat(H,"Your mind buzzes...") /datum/psionic_power/coercion/focus name = "Focus" @@ -269,105 +221,82 @@ M.adjust_hallucinations(60 SECONDS) return TRUE -/datum/psionic_power/coercion/commune - name = "Commune" - cost = 10 - cooldown = 8 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." +/datum/psionic_power/coercion/mindread + name = "Read Mind" + cost = 25 + heat = 15 + cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. + min_rank = PSI_RANK_MASTER + use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." -/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) +/datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) return FALSE . = ..() - if(.) - user.visible_message("[user] touches their fingers to their temple.") - var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) + if(!.) + return - if(!text) - return + if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) + to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) + return TRUE - if(target.stat == DEAD) - to_chat(user,"Not even a psion of your level can speak to the dead.") - return + user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) + var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text + if(!question || user.incapacitated() || !do_after(user, 20)) + return TRUE - if (issilicon(target)) - to_chat(user,"This can only be used on living organisms.") - return + var/started_mindread = world.time + to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) + to_chat(target, span_notice("Your mind is compelled to answer: [question]")) // I wonder how this will go down with the playerbase - log_say("[key_name(user)] communed to [key_name(target)]: [text]") + var/answer = input(target, question, "Read Mind") as null|text + if(!answer || world.time > started_mindread + 25 SECONDS || user.stat != CONSCIOUS || target.stat == DEAD) + to_chat(user, span_notice("You receive nothing useful from \the [target].")) + else + to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) + log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") + return TRUE - for (var/mob/M in GLOB.player_list) - if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) - to_chat(M,"[user] psionically says to [target]: [text]") +/datum/psionic_power/coercion/blindstrike + name = "Blindstrike" + cost = 8 + cooldown = 120 + min_rank = PSI_RANK_GRANDMASTER + use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." - var/mob/living/carbon/human/H = target - if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) - to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") - else - to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") - if(istype(H)) - if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) - to_chat(H,"Your nose begins to bleed...") - H.add_splatter_floor(small_drip = TRUE) - else if(prob(25)) - to_chat(H,"Your head hurts...") - else if(prob(50)) - to_chat(H,"Your mind buzzes...") +/datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) + return FALSE + . = ..() + if(.) + user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) + to_chat(user, span_danger("You strike at all around you with a deafening psionic scream!")) + for(var/mob/living/M in orange(user, user.psi.get_rank(PSI_COERCION))) + if(M == user) + continue + M.emote("scream") + to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) + M.blind_eyes(1 SECONDS) + M.adjust_confusion(10 SECONDS) + return TRUE -/datum/psionic_power/coercion/psiping - name = "Psi-ping" - cost = 30 - cooldown = 25 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." +/datum/psionic_power/coercion/dis_arm + name = "Dis-Arm" + cost = 10 + cooldown = 120 + min_rank = PSI_RANK_PARAMOUNT + use_description = "Activate this power, then attack your target on harm intent to Psionically rip their arms off." -/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if((target && user != target)) +/datum/psionic_power/coercion/dis_arm/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(!user.combat_mode) return FALSE . = ..() if(.) - to_chat(user, "You take a moment to tune into the local Nlom...") - if(!do_after(user, 3 SECONDS, user)) - return - var/list/dirs = list() - for(var/mob/living/L in range(20)) - var/turf/T = get_turf(L) - if(!T || L == user || L.stat == DEAD || issilicon(L)) - continue - /* - var/image/ping_image = image(icon = 'icons/effects/effects.dmi', icon_state = "sonar_ping", loc = user) - ping_image.plane = LIGHTING_LAYER+1 - ping_image.layer = LIGHTING_LAYER+1 - ping_image.pixel_x = (T.x - user.x) * 32 - ping_image.pixel_y = (T.y - user.y) * 32 - user << ping_image - addtimer(CALLBACK(GLOBAL_PROC, /proc/qdel, ping_image), 8) - */ - var/direction = num2text(get_dir(user, L)) - var/dist - if(text2num(direction)) - switch(get_dist(user, L)) - if(0 to 10) - dist = "very close" - if(10 to 20) - dist = "close" - if(20 to 30) - dist = "a little ways away" - if(30 to 40) - dist = "farther away" - else - dist = "far away" - else - dist = "on top of you" - LAZYINITLIST(dirs[direction]) - dirs[direction][dist] += 1 - for(var/d in dirs) - var/list/feedback = list() - for(var/dst in dirs[d]) - feedback += "[dirs[d][dst]] psionic signature\s [dst]," - if(feedback.len > 1) - feedback[feedback.len - 1] += " and" - to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) - if(!length(dirs)) - to_chat(user, span_notice("You detect no psionic signatures but your own.")) + user.visible_message(span_danger("\The [user] grows two psionic arms, ripping [target]'s arms off!")) + to_chat(user, span_danger("You channel your full mental might into ripping and tearing!")) + var/mob/living/carbon/CM = target + for(var/obj/item/bodypart/bodypart in CM.bodyparts) + if(!(bodypart.body_part & (HEAD|CHEST|LEGS))) + if(bodypart.dismemberable) + bodypart.dismember() + return TRUE diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 9f4e262c397c..d2e537bedbde 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -6,35 +6,16 @@ /datum/psionic_power/energistics faculty = PSI_ENERGISTICS -/datum/psionic_power/energistics/disrupt - name = "Disrupt" - cost = 20 - heat = 20 - cooldown = 10 SECONDS - min_rank = PSI_RANK_MASTER - use_description = "Target the head, eyes or mouth while on harm intent to use a melee attack that causes a localized electromagnetic pulse." - -/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_HEAD && user.zone_selected != BODY_ZONE_PRECISE_EYES && user.zone_selected != BODY_ZONE_PRECISE_MOUTH) - return FALSE - if(isturf(target)) - return FALSE - . = ..() - if(.) - user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") - empulse(target, 0, 1) - return TRUE - /datum/psionic_power/energistics/electrocute name = "Electrocute" cost = 10 heat = 30 cooldown = 7.5 SECONDS - min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the chest or groin while on harm intent to use a melee attack that electrocutes a victim." + min_rank = PSI_RANK_OPERANT + use_description = "Enter combat mode to use a melee attack that electrocutes a victim, or charge an energy cell." /datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + if(!user.combat_mode) return FALSE if(isturf(target)) return FALSE @@ -53,6 +34,29 @@ else return FALSE +/datum/psionic_power/energistics/spark + name = "Spark" + cost = 1 + cooldown = 1 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." + +/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(isnull(target) || istype(target)) + return FALSE + . = ..() + if(.) + if(istype(target,/obj/item/clothing/mask/cigarette)) + var/obj/item/clothing/mask/cigarette/S = target + S.light("[user] snaps \his fingers and \the [S.name] lights up.") + user.emote("snap") + playsound(S.loc, "sparks", 50, 1) + else + var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread + s.set_up(5, 1, src) + s.start() + return TRUE + /datum/psionic_power/energistics/zorch name = "Zorch" cost = 15 @@ -99,25 +103,21 @@ user.visible_message(span_danger("[user]'s eyes flare with light!")) return TRUE -/datum/psionic_power/energistics/spark - name = "Spark" - cost = 1 - cooldown = 1 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." +/datum/psionic_power/energistics/disrupt + name = "Disrupt" + cost = 20 + heat = 20 + cooldown = 10 SECONDS + min_rank = PSI_RANK_GRANDMASTER + use_description = "Enter combat mode and attack a target to cause a localized electromagnetic pulse." -/datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(isnull(target) || istype(target)) +/datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(!user.combat_mode) + return FALSE + if(isturf(target)) return FALSE . = ..() if(.) - if(istype(target,/obj/item/clothing/mask/cigarette)) - var/obj/item/clothing/mask/cigarette/S = target - S.light("[user] snaps \his fingers and \the [S.name] lights up.") - user.emote("snap") - playsound(S.loc, "sparks", 50, 1) - else - var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) - s.start() + user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") + empulse(target, 5, 1) return TRUE diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 8cc464dd9752..add4da8ca3f2 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -135,7 +135,7 @@ admin_log = FALSE /datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!isliving(target) || !istype(target) || user.zone_selected != BODY_ZONE_PRECISE_EYES || target.pulledby != user || user.grab_state < GRAB_AGGRESSIVE) + if(!isliving(target) || !istype(target)) return FALSE . = ..() if(.) From f3bacc83706e8872701c0412c98f89840e96bae1 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 20:40:11 -0400 Subject: [PATCH 023/201] a lot --- .../psionics/equipment/psipower_tinker.dm | 2 + code/modules/psionics/faculties/coercion.dm | 114 +++++++++--------- .../psionics/faculties/psychokenisis.dm | 3 + code/modules/psionics/faculties/redaction.dm | 4 + icons/obj/psychic_powers.dmi | Bin 3468 -> 5006 bytes 5 files changed, 67 insertions(+), 56 deletions(-) diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index 477d6efb382c..dac5b1659923 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -20,5 +20,7 @@ tool_behaviour = choice name = "psychokinetic [tool_behaviour]" + icon_state = "[tool_behaviour]" + update_icon() to_chat(owner, "You begin emulating \a [tool_behaviour].") owner.playsound_local(soundin = 'sound/effects/psi/power_fabrication.ogg') diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index b42815d91210..d94505698594 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -9,6 +9,52 @@ /datum/psionic_power/coercion faculty = PSI_COERCION +/datum/psionic_power/coercion/commune + name = "Commune" + cost = 10 + cooldown = 8 SECONDS + min_rank = PSI_RANK_OPERANT + use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." + +/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) + if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) + return FALSE + . = ..() + if(.) + user.visible_message("[user] touches their fingers to their temple.") + var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) + + if(!text) + return + + if(target.stat == DEAD) + to_chat(user,"Not even a psion of your level can speak to the dead.") + return + + if (issilicon(target)) + to_chat(user,"This can only be used on living organisms.") + return + + log_say("[key_name(user)] communed to [key_name(target)]: [text]") + + for (var/mob/M in GLOB.player_list) + if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) + to_chat(M,"[user] psionically says to [target]: [text]") + + var/mob/living/carbon/human/H = target + if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) + to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") + else + to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") + if(istype(H)) + if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) + to_chat(H,"Your nose begins to bleed...") + H.add_splatter_floor(small_drip = TRUE) + else if(prob(25)) + to_chat(H,"Your head hurts...") + else if(prob(50)) + to_chat(H,"Your mind buzzes...") + /datum/psionic_power/coercion/assay name = "Assay" cost = 15 @@ -116,22 +162,6 @@ target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) return TRUE -/datum/psionic_power/coercion/spasm - name = "Spasm" - cost = 15 - cooldown = 100 - min_rank = PSI_RANK_MASTER - use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." - -/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(!istype(target)) - return FALSE - - if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) - return FALSE - - . = ..() - if(.) to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") to_chat(target, "The muscles in your arms cramp horrendously!") @@ -143,51 +173,23 @@ target.visible_message("\The [target] drops what they were holding as their right hand spasms!") return TRUE -/datum/psionic_power/coercion/commune - name = "Commune" - cost = 10 - cooldown = 8 SECONDS - min_rank = PSI_RANK_OPERANT - use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." -/datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) - return FALSE - . = ..() - if(.) - user.visible_message("[user] touches their fingers to their temple.") - var/text = pretty_filter(stripped_input(user, "What would you like to say?", "Speak to creature", null, null)) - - if(!text) - return - - if(target.stat == DEAD) - to_chat(user,"Not even a psion of your level can speak to the dead.") - return - if (issilicon(target)) - to_chat(user,"This can only be used on living organisms.") - return +/datum/psionic_power/coercion/spasm + name = "Spasm" + cost = 15 + cooldown = 100 + min_rank = PSI_RANK_MASTER + use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." - log_say("[key_name(user)] communed to [key_name(target)]: [text]") +/datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) + if(!istype(target)) + return FALSE - for (var/mob/M in GLOB.player_list) - if(M.stat == DEAD && M.client.prefs.toggles & CHAT_GHOSTEARS) - to_chat(M,"[user] psionically says to [target]: [text]") + if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) + return FALSE - var/mob/living/carbon/human/H = target - if(prob(25) && (target.mind && target.mind.assigned_role == "Chaplain")) - to_chat(H,"You sense [user]'s psyche enter your mind, whispering quietly: [text]") - else - to_chat(H,"You feel something crawl behind your eyes, hearing: [text]") - if(istype(H)) - if(prob(10) && !(H.dna.species.species_traits & NOBLOOD)) - to_chat(H,"Your nose begins to bleed...") - H.add_splatter_floor(small_drip = TRUE) - else if(prob(25)) - to_chat(H,"Your head hurts...") - else if(prob(50)) - to_chat(H,"Your mind buzzes...") + . = ..() /datum/psionic_power/coercion/focus name = "Focus" diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 0c0b5b837c5c..8e0176e812dc 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -12,6 +12,7 @@ cost = 10 cooldown = 3 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "psy_blade" use_description = "Click on or otherwise activate an empty hand while on harm intent to manifest a psychokinetic cutting blade. The power the blade will vary based on your mastery of the faculty." use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE @@ -41,6 +42,7 @@ cost = 5 cooldown = 10 min_rank = PSI_RANK_OPERANT + icon_state = "psy_tinker" use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE @@ -70,6 +72,7 @@ cost = 5 cooldown = 1 SECONDS min_rank = PSI_RANK_GRANDMASTER + icon_state = "psy_tele" use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." admin_log = FALSE use_sound = 'sound/effects/psi/power_used.ogg' diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index add4da8ca3f2..9530c92d3f0d 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -25,6 +25,7 @@ heat = 1 cooldown = 3 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "redac_skinsight" use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." /datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -42,6 +43,7 @@ heat = 10 cooldown = 5 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "redac_mend" use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." /datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) @@ -98,6 +100,7 @@ heat = 15 cooldown = 6 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "redac_cleanse" use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." /datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) @@ -131,6 +134,7 @@ cooldown = 8 SECONDS min_rank = PSI_RANK_OPERANT faculty = PSI_REDACTION + icon_state = "redac_revive" use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." admin_log = FALSE diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index 683a705e9722b2f675799956b1ca610f3e1153c5..885bfeabf6f2370a1eb84d4133561f3bbe50eed1 100644 GIT binary patch literal 5006 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 CIjMsH literal 3468 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 Date: Mon, 8 Jul 2024 20:56:27 -0400 Subject: [PATCH 024/201] e --- code/modules/psionics/faculties/psychokenisis.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 8e0176e812dc..14700c4b7922 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -27,6 +27,7 @@ blade.can_break_wall = TRUE blade.wall_break_time = 3 SECONDS blade.force = 40 + blade.armour_penetration = 30 if(PSI_RANK_GRANDMASTER) blade.can_break_wall = TRUE blade.force = 24 From 3b9ba5c904a7e29ab67d2a89649a1204c127b01d Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 20:58:49 -0500 Subject: [PATCH 025/201] Update ui_toggle.dm --- code/modules/psionics/interfaces/ui_toggle.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index 0e1d5a227751..e3e6a466d3db 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -111,6 +111,7 @@ controller.update_icon() /obj/screen/psi/toggle_psi_menu/update_icon() + . = ..() if(hidden) icon_state = "arrow_left" else From 76d6d7d896b037609a866ae2ac1081cc3ef4aef1 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:03:29 -0500 Subject: [PATCH 026/201] fixed --- code/modules/psionics/interfaces/ui.dm | 3 +++ code/modules/psionics/interfaces/ui_toggle.dm | 3 +-- 2 files changed, 4 insertions(+), 2 deletions(-) diff --git a/code/modules/psionics/interfaces/ui.dm b/code/modules/psionics/interfaces/ui.dm index 49660ab3ca1f..1285f4c9aa13 100644 --- a/code/modules/psionics/interfaces/ui.dm +++ b/code/modules/psionics/interfaces/ui.dm @@ -15,6 +15,9 @@ /obj/screen/psi/update_icon() . = ..() + handle_visibility() + +/obj/screen/psi/proc/handle_visibility() if(hidden) invisibility = 101 else diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index e3e6a466d3db..11efe808ed41 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -110,8 +110,7 @@ psi.hidden = set_hidden controller.update_icon() -/obj/screen/psi/toggle_psi_menu/update_icon() - . = ..() +/obj/screen/psi/toggle_psi_menu/handle_visibility() if(hidden) icon_state = "arrow_left" else From 314ae9c57a46d4eec2c98ace5bc6785bf1282349 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 22:09:53 -0400 Subject: [PATCH 027/201] gross redaction shit --- code/modules/psionics/faculties/redaction.dm | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 9530c92d3f0d..f81cf64ff273 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -29,7 +29,7 @@ use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." /datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || user.zone_selected != BODY_ZONE_CHEST || target.pulledby == user) + if(user.combat_mode) return FALSE . = ..() if(.) @@ -47,7 +47,7 @@ use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." /datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(!istype(user) || !istype(target) || target.pulledby != user || user.grab_state >= GRAB_AGGRESSIVE) + if(user.combat_mode) return FALSE . = ..() if(.) @@ -104,7 +104,7 @@ use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." /datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(!istype(user) || !istype(target) || target.pulledby != user || user.zone_selected != BODY_ZONE_PRECISE_MOUTH) + if(user.combat_mode) return FALSE . = ..() if(.) @@ -139,7 +139,7 @@ admin_log = FALSE /datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!isliving(target) || !istype(target)) + if(user.combat_mode) return FALSE . = ..() if(.) From 4e6cfd9d92c4874339a21628fc29d9f98305ebcb Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:10:09 -0500 Subject: [PATCH 028/201] Update energistics.dm --- code/modules/psionics/faculties/energistics.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index d2e537bedbde..dccb2e9d6f70 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -53,7 +53,7 @@ playsound(S.loc, "sparks", 50, 1) else var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread - s.set_up(5, 1, src) + s.set_up(5, 1, target) s.start() return TRUE From fce1c3c66295b25c4f97201e030b2e5130726808 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 22:16:11 -0400 Subject: [PATCH 029/201] mining --- icons/obj/psychic_powers.dmi | Bin 5006 -> 5150 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index 885bfeabf6f2370a1eb84d4133561f3bbe50eed1..e3f347b447c7110c4fc3253ad5a90db33632e9fa 100644 GIT binary patch delta 5102 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 CIjMsH From ee9c3b37266b4c0ffb2dbe533fd965c7dd02f167 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:23:27 -0500 Subject: [PATCH 030/201] radial --- code/modules/psionics/complexus/complexus.dm | 5 +++-- code/modules/psionics/complexus/complexus_power_cache.dm | 3 +++ code/modules/psionics/equipment/psipower_tinker.dm | 6 +++++- code/modules/psionics/faculties/psychokenisis.dm | 8 ++++---- 4 files changed, 15 insertions(+), 7 deletions(-) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index 8ceea3365cf7..f0e0015659a2 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -99,8 +99,9 @@ var/list/choice_list = LAZYCOPY(learned_powers) for(var/datum/psionic_power/I as anything in choice_list) choice_list[I] = image(I.icon, null, I.icon_state) - selected_power = show_radial_menu(user, user, choice_list) - if(selected_power) + var/selection = show_radial_menu(user, user, choice_list) + if(selection) + selected_power = selection selected_power.on_select(user) /datum/psi_complexus/proc/invoke_power(mob/user, atom/target, proximity, parameters) diff --git a/code/modules/psionics/complexus/complexus_power_cache.dm b/code/modules/psionics/complexus/complexus_power_cache.dm index 14a10b97d26d..5ae3f7ac521f 100644 --- a/code/modules/psionics/complexus/complexus_power_cache.dm +++ b/code/modules/psionics/complexus/complexus_power_cache.dm @@ -9,6 +9,9 @@ var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) for(var/P in faculty_decl.powers) var/datum/psionic_power/power = P + if(!power.min_rank) //if a minimum rank wasn't set, it's probably either bad coding or a parent used for typepathing, so don't include it + continue + if(relevant_rank >= power.min_rank) LAZYADD(powers_by_faculty[power.faculty], power) LAZYADD(learned_powers, power) diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index dac5b1659923..4e940f935d16 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -11,7 +11,11 @@ if(!owner || loc != owner) return - var/choice = input("Select a tool to emulate.","Power") as null|anything in possible_tools + var/list/choice_list = LAZYCOPY(possible_tools) + for(var/I as anything in choice_list) + choice_list[I] = image(icon, null, I) + var/choice = show_radial_menu(owner, owner, choice_list) + if(!choice) return diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 14700c4b7922..79b44f30cc4f 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -55,16 +55,16 @@ user.put_in_hands(tool) switch(user.psi.get_rank(faculty)) if(PSI_RANK_PARAMOUNT) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_WIRECUTTER, TOOL_WELDER, TOOL_MULTITOOL, TOOL_SCALPEL, TOOL_HEMOSTAT, TOOL_RETRACTOR, TOOL_CAUTERY, TOOL_SAW, TOOL_DRILL, TOOL_BONESET, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.25 if(PSI_RANK_GRANDMASTER) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_SAW, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_DRILL, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_WIRECUTTER, TOOL_SCALPEL, TOOL_HEMOSTAT, TOOL_RETRACTOR, TOOL_CAUTERY, TOOL_SAW, TOOL_DRILL, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 0.5 if(PSI_RANK_MASTER) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WIRECUTTER, TOOL_WRENCH, TOOL_SCALPEL, TOOL_RETRACTOR, TOOL_HEMOSTAT, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_WIRECUTTER, TOOL_SCALPEL, TOOL_HEMOSTAT, TOOL_CAUTERY, TOOL_MINING, TOOL_SHOVEL, TOOL_HATCHET) tool.toolspeed = 1 if(PSI_RANK_OPERANT) - tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_MINING) + tool.possible_tools = list(TOOL_SCREWDRIVER, TOOL_CROWBAR, TOOL_WRENCH, TOOL_MINING, TOOL_SHOVEL) tool.toolspeed = 1.5 return tool From d81e1b3dd040648222a6a109fcf6f91381e36da5 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:28:03 -0500 Subject: [PATCH 031/201] chat, is this real? --- code/modules/psionics/complexus/complexus.dm | 1 + code/modules/psionics/faculties/_power.dm | 2 -- 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index f0e0015659a2..d654730111ae 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -103,6 +103,7 @@ if(selection) selected_power = selection selected_power.on_select(user) + user.balloon_alert(user, "Selected [selected_power.name]") /datum/psi_complexus/proc/invoke_power(mob/user, atom/target, proximity, parameters) if(suppressed) diff --git a/code/modules/psionics/faculties/_power.dm b/code/modules/psionics/faculties/_power.dm index eee18007c533..2aeec5664b0f 100644 --- a/code/modules/psionics/faculties/_power.dm +++ b/code/modules/psionics/faculties/_power.dm @@ -55,6 +55,4 @@ playsound(user.loc, use_sound, 75) /datum/psionic_power/proc/on_select(mob/living/user) - to_chat(world, "[name] was selected by [user]") - return TRUE From c8e6f7e99c1f271601244119e6a34561a8dec439 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:29:24 -0500 Subject: [PATCH 032/201] Update psipower_tinker.dm --- code/modules/psionics/equipment/psipower_tinker.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index 4e940f935d16..7bfd1993575f 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -26,5 +26,5 @@ name = "psychokinetic [tool_behaviour]" icon_state = "[tool_behaviour]" update_icon() - to_chat(owner, "You begin emulating \a [tool_behaviour].") + to_chat(owner, span_notice("You begin emulating \a [tool_behaviour].")) owner.playsound_local(soundin = 'sound/effects/psi/power_fabrication.ogg') From de0b3d968a06e7c8055bd62d8e6c10f69f1e0c5c Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:32:09 -0500 Subject: [PATCH 033/201] Update complexus_process.dm --- code/modules/psionics/complexus/complexus_process.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 2c00d0d40ea3..d70c578d6f9d 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -22,12 +22,12 @@ UNSETEMPTY(latencies) var/rank_count = max(1, LAZYLEN(ranks)) if(force || last_rating != CEILING(combined_rank/rank_count, 1)) + rebuild_power_cache = TRUE + rebuild_power_cache() if(highest_rank <= 1) if(highest_rank == 0) qdel(src) return - rebuild_power_cache = TRUE - rebuild_power_cache() SEND_SOUND(owner, 'sound/effects/psi/power_unlock.ogg') rating = CEILING(combined_rank/rank_count, 1) cost_modifier = 1 From 85f6b9cd34f2a997747913037e38c29f9132f420 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:37:39 -0500 Subject: [PATCH 034/201] radials --- code/modules/psionics/complexus/complexus.dm | 4 ++-- code/modules/psionics/equipment/psipower_tinker.dm | 2 +- 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index d654730111ae..b6ee4edbf19a 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -100,8 +100,8 @@ for(var/datum/psionic_power/I as anything in choice_list) choice_list[I] = image(I.icon, null, I.icon_state) var/selection = show_radial_menu(user, user, choice_list) - if(selection) - selected_power = selection + selected_power = selection + if(selection) //wipe the selected power unless something was actually chosen selected_power.on_select(user) user.balloon_alert(user, "Selected [selected_power.name]") diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index 7bfd1993575f..3faf3b3c1df6 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -14,7 +14,7 @@ var/list/choice_list = LAZYCOPY(possible_tools) for(var/I as anything in choice_list) choice_list[I] = image(icon, null, I) - var/choice = show_radial_menu(owner, owner, choice_list) + var/choice = show_radial_menu(owner, owner, choice_list, null, 42) if(!choice) return From 6810bf5166dc4a2bd3b252b6cd209209512b2154 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:46:40 -0500 Subject: [PATCH 035/201] Update redaction.dm --- code/modules/psionics/faculties/redaction.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index f81cf64ff273..f8706b1fc702 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -147,7 +147,7 @@ to_chat(user, span_warning("This person is already alive!")) return TRUE - if(((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT)) + if((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT) to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) return TRUE From 674d6981c57d675db703626bfba2d0538df31a7d Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 21:48:10 -0500 Subject: [PATCH 036/201] Update complexus_helpers.dm --- code/modules/psionics/complexus/complexus_helpers.dm | 1 + 1 file changed, 1 insertion(+) diff --git a/code/modules/psionics/complexus/complexus_helpers.dm b/code/modules/psionics/complexus/complexus_helpers.dm index 656e8646e700..749f776a21b1 100644 --- a/code/modules/psionics/complexus/complexus_helpers.dm +++ b/code/modules/psionics/complexus/complexus_helpers.dm @@ -73,6 +73,7 @@ if(stamina < stamina_cost) return FALSE if((heat + heat_cost) >= limiter) + to_chat(owner, "Your limiter prevents you from performing that.") return FALSE adjust_stamina(-stamina_cost) adjust_heat(heat_cost) From 22649152c6d7e1249c54f53f180b3d8072c6423a Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 22:08:27 -0500 Subject: [PATCH 037/201] abilities --- code/modules/psionics/faculties/coercion.dm | 81 +++++++++---------- .../modules/psionics/faculties/energistics.dm | 22 +++-- code/modules/psionics/faculties/redaction.dm | 37 ++++----- 3 files changed, 65 insertions(+), 75 deletions(-) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index d94505698594..eca02a2e5933 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -17,7 +17,7 @@ use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." /datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || user == target) + if(!istype(target) || user == target) return FALSE . = ..() if(.) @@ -28,12 +28,12 @@ return if(target.stat == DEAD) - to_chat(user,"Not even a psion of your level can speak to the dead.") - return + to_chat(user, span_cult("Not even a psion of your level can speak to the dead.")) + return COMSIG_PSI_BLOCK_ACTION if (issilicon(target)) - to_chat(user,"This can only be used on living organisms.") - return + to_chat(user, span_warning("This can only be used on living organisms.")) + return COMSIG_PSI_BLOCK_ACTION log_say("[key_name(user)] communed to [key_name(target)]: [text]") @@ -63,7 +63,7 @@ use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." /datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || user.zone_selected != BODY_ZONE_HEAD || target.pulledby != user || user == target) + if(!istype(target) || user == target) return FALSE . = ..() if(.) @@ -72,11 +72,11 @@ to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) user.psi.backblast(rand(5,10)) - return TRUE + return COMSIG_PSI_BLOCK_ACTION to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) target.show_psi_assay(user) - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/coercion/psiping name = "Psi-ping" @@ -85,8 +85,8 @@ min_rank = PSI_RANK_OPERANT use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." -/datum/psionic_power/coercion/psiping/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if((target && user != target)) +/datum/psionic_power/coercion/psiping/invoke(mob/living/user, mob/living/target, proximity, parameters) + if(user != target) return FALSE . = ..() if(.) @@ -135,11 +135,10 @@ if(!length(dirs)) to_chat(user, span_notice("You detect no psionic signatures but your own.")) -/datum/psionic_power/coercion/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) +/datum/psionic_power/coercion/invoke(mob/living/user, mob/living/target, proximity, parameters) if (!istype(target)) to_chat(user, span_warning("You cannot mentally attack \the [target].")) return FALSE - . = ..() /datum/psionic_power/coercion/agony @@ -151,39 +150,24 @@ use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." /datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target)) - return FALSE - if(user.zone_selected != BODY_ZONE_CHEST && user.zone_selected != BODY_ZONE_PRECISE_GROIN) + if(!istype(target) || !proximity || user == target) return FALSE . = ..() if(.) user.visible_message("\The [target] has been struck by \the [user]!") playsound(user.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) - return TRUE - - if(.) - to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") - to_chat(target, "The muscles in your arms cramp horrendously!") - if(prob(75)) - target.emote("scream") - if(prob(75) && target.held_items[1] && target.dropItemToGround(target.get_item_for_held_index(1))) - target.visible_message("\The [target] drops what they were holding as their left hand spasms!") - if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) - target.visible_message("\The [target] drops what they were holding as their right hand spasms!") - return TRUE - - + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/coercion/spasm name = "Spasm" cost = 15 - cooldown = 100 + cooldown = 10 SECONDS min_rank = PSI_RANK_MASTER use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." /datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(!istype(target)) + if(!istype(target) || user == target) return FALSE if(!(user.zone_selected in list(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND))) @@ -191,6 +175,17 @@ . = ..() + if(.) + to_chat(user, "You lash out, stabbing into \the [target] with a lance of psi-power.") + to_chat(target, "The muscles in your arms cramp horrendously!") + if(prob(75)) + target.emote("scream") + if(prob(75) && target.held_items[1] && target.dropItemToGround(target.get_item_for_held_index(1))) + target.visible_message("\The [target] drops what they were holding as their left hand spasms!") + if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) + target.visible_message("\The [target] drops what they were holding as their right hand spasms!") + return COMSIG_PSI_BLOCK_ACTION + /datum/psionic_power/coercion/focus name = "Focus" cost = 10 @@ -199,7 +194,7 @@ use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." /datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected != BODY_ZONE_PRECISE_MOUTH || target.pulledby != user) + if(!istype(target) || !proximity || user == target) return FALSE . = ..() if(.) @@ -208,7 +203,7 @@ to_chat(target, span_warning("Your mind is being cleansed of ailments by \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 5 SECONDS : 2.5 SECONDS), target, FALSE)) user.psi.backblast(rand(5,10)) - return TRUE + return COMSIG_PSI_BLOCK_ACTION to_chat(user, span_warning("You clear \the [target]'s mind of ailments.")) to_chat(target, span_warning("Your mind is cleared of ailments.")) @@ -221,7 +216,7 @@ if(istype(target, /mob/living/carbon)) var/mob/living/carbon/M = target M.adjust_hallucinations(60 SECONDS) - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/coercion/mindread name = "Read Mind" @@ -232,7 +227,7 @@ use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." /datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!istype(target) || target == user || user.zone_selected != BODY_ZONE_HEAD || target.pulledby == user) + if(!istype(target) || target == user || !proximity) return FALSE . = ..() if(!.) @@ -240,12 +235,12 @@ if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text if(!question || user.incapacitated() || !do_after(user, 20)) - return TRUE + return COMSIG_PSI_BLOCK_ACTION var/started_mindread = world.time to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) @@ -257,18 +252,16 @@ else to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/coercion/blindstrike name = "Blindstrike" cost = 8 - cooldown = 120 + cooldown = 12 SECONDS min_rank = PSI_RANK_GRANDMASTER use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." /datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.zone_selected == BODY_ZONE_PRECISE_MOUTH || user.zone_selected != BODY_ZONE_PRECISE_EYES || (istype(target) && target.pulledby == user)) - return FALSE . = ..() if(.) user.visible_message(span_danger("\The [user] suddenly throws back their head, as though screaming silently!")) @@ -280,12 +273,12 @@ to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) M.blind_eyes(1 SECONDS) M.adjust_confusion(10 SECONDS) - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/coercion/dis_arm name = "Dis-Arm" cost = 10 - cooldown = 120 + cooldown = 12 SECONDS min_rank = PSI_RANK_PARAMOUNT use_description = "Activate this power, then attack your target on harm intent to Psionically rip their arms off." @@ -301,4 +294,4 @@ if(!(bodypart.body_part & (HEAD|CHEST|LEGS))) if(bodypart.dismemberable) bodypart.dismember() - return TRUE + return COMSIG_PSI_BLOCK_ACTION diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index dccb2e9d6f70..82d0df2d5a4c 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -15,22 +15,20 @@ use_description = "Enter combat mode to use a melee attack that electrocutes a victim, or charge an energy cell." /datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!user.combat_mode) - return FALSE - if(isturf(target)) + if(!user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) if(istype(target)) user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target]!")) target.electrocute_act(rand(15,45), user, 1, user.zone_selected) - return TRUE + return COMSIG_PSI_BLOCK_ACTION else if(isatom(target)) var/obj/item/stock_parts/cell/charging_cell = target.get_cell() if(istype(charging_cell)) user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target], charging it!")) charging_cell.give(rand(15,45)) - return TRUE + return COMSIG_PSI_BLOCK_ACTION else return FALSE @@ -39,10 +37,10 @@ cost = 1 cooldown = 1 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Target a non-living target in melee range on harm intent to cause some sparks to appear. This can light fires." + use_description = "Target a non-living thing in melee range on harm intent to cause some sparks to appear. This can light fires." /datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(isnull(target) || istype(target)) + if(!user.combat_mode || isnull(target) || istype(target) || !proximity) return FALSE . = ..() if(.) @@ -55,7 +53,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(5, 1, target) s.start() - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/energistics/zorch name = "Zorch" @@ -101,7 +99,7 @@ pew.firer = user pew.fire(Get_Angle(user, target)) user.visible_message(span_danger("[user]'s eyes flare with light!")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/energistics/disrupt name = "Disrupt" @@ -112,12 +110,10 @@ use_description = "Enter combat mode and attack a target to cause a localized electromagnetic pulse." /datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!user.combat_mode) - return FALSE - if(isturf(target)) + if(!user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") empulse(target, 5, 1) - return TRUE + return COMSIG_PSI_BLOCK_ACTION diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index f8706b1fc702..8557b62869ca 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -29,7 +29,7 @@ use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." /datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.combat_mode) + if(user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) @@ -47,7 +47,7 @@ use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." /datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(user.combat_mode) + if(user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) @@ -55,11 +55,11 @@ if(!E) to_chat(user, span_warning("They are missing that limb.")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION if(E.status == BODYPART_ROBOTIC) to_chat(user, span_warning("That limb is prosthetic.")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION user.visible_message(span_notice("\The [user] rests a hand on \the [target]'s [E.name]...")) to_chat(target, span_notice("A healing warmth suffuses you.")) @@ -77,19 +77,20 @@ var/removing = pick(valid_objects) target.remove_embedded_object(removing) to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removing] free of \the [E].")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION if(redaction_rank >= PSI_RANK_GRANDMASTER) for(var/obj/item/organ/O in target.internal_organs) if(O.damage > 0) + var/heal = redaction_rank * 10 to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) - O.applyOrganDamage(-rand(redaction_rank, redaction_rank * 2)) - return TRUE + O.applyOrganDamage(-rand(heal, heal * 2)) + return COMSIG_PSI_BLOCK_ACTION if(E.get_damage(TRUE)) - E.heal_damage((redaction_rank * 10), (redaction_rank * 10)) + E.heal_ordered_damage(redaction_rank * 15, list(BRUTE, BURN, TOX)) to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") - return TRUE + return COMSIG_PSI_BLOCK_ACTION to_chat(user, span_notice("You can find nothing within \the [target]'s [E.name] to mend.")) return FALSE @@ -104,7 +105,7 @@ use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." /datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) - if(user.combat_mode) + if(user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) @@ -116,16 +117,16 @@ target.radiation -= removing else target.radiation = 0 - return TRUE + return COMSIG_PSI_BLOCK_ACTION if(target.getCloneLoss()) to_chat(user, span_notice("You stitch together some of the mangled DNA within \the [target]...")) if(target.getCloneLoss() >= removing) target.adjustCloneLoss(-removing) else target.adjustCloneLoss(-(target.getCloneLoss())) - return TRUE + return COMSIG_PSI_BLOCK_ACTION to_chat(user, span_notice("You can find no genetic damage or radiation to heal within \the [target].")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION /datum/psionic_power/revive name = "Revive" @@ -139,27 +140,27 @@ admin_log = FALSE /datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(user.combat_mode) + if(user.combat_mode || !istype(target) || !proximity) return FALSE . = ..() if(.) if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) to_chat(user, span_warning("This person is already alive!")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION if((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT) to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) - return TRUE + return COMSIG_PSI_BLOCK_ACTION user.visible_message(span_notice("\The [user] splays out their hands over \the [target]'s body...")) target.notify_ghost_cloning("Your heart is being revived!") target.grab_ghost() if(!do_after(user, 10 SECONDS, target, FALSE)) user.psi.backblast(rand(10,25)) - return TRUE + return COMSIG_PSI_BLOCK_ACTION to_chat(target, span_notice("Life floods back into your body!")) target.visible_message(span_notice("\The [target] shudders violently!")) target.adjustOxyLoss(-rand(15,20)) target.revive() - return TRUE + return COMSIG_PSI_BLOCK_ACTION From 186500a8498a5963dbe8bf64af15d23457c9348b Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 23:10:06 -0400 Subject: [PATCH 038/201] psi batong --- .../psionics/equipment/psipower_baton.dm | 16 ++++++ .../psionics/faculties/psychokenisis.dm | 48 +++++++++++------- icons/mob/inhands/weapons/melee_lefthand.dmi | Bin 9146 -> 9318 bytes icons/mob/inhands/weapons/melee_righthand.dmi | Bin 10463 -> 10731 bytes icons/obj/psychic_powers.dmi | Bin 5150 -> 5271 bytes icons/obj/weapons/baton.dmi | Bin 6486 -> 6633 bytes yogstation.dme | 1 + 7 files changed, 48 insertions(+), 17 deletions(-) create mode 100644 code/modules/psionics/equipment/psipower_baton.dm diff --git a/code/modules/psionics/equipment/psipower_baton.dm b/code/modules/psionics/equipment/psipower_baton.dm new file mode 100644 index 000000000000..21034768d4b0 --- /dev/null +++ b/code/modules/psionics/equipment/psipower_baton.dm @@ -0,0 +1,16 @@ +/obj/item/melee/classic_baton/psychic_power/psibaton + name = "psychokinetic bash" + desc = "A psiokenetic truncheon for beating psycho scum." + force = 0 + stamina_damage = 10 + icon = 'icons/obj/psychic_powers.dmi' + icon_state = "psibaton" + item_state = "psibaton" + lefthand_file = 'icons/mob/inhands/weapons/melee_lefthand.dmi' + righthand_file = 'icons/mob/inhands/weapons/melee_righthand.dmi' + hitsound = 'sound/effects/psi/psisword.ogg' + +/obj/item/melee/classic_baton/psychic_power/psibaton/dropped(var/mob/living/user) + ..() + playsound(loc, 'sound/effects/psi/power_fail.ogg', 30, 1) + QDEL_IN(src, 1) diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 79b44f30cc4f..986a514ba005 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -20,23 +20,37 @@ /datum/psionic_power/psychokinesis/psiblade/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() if(.) - var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) - user.put_in_hands(blade) - switch(user.psi.get_rank(faculty)) - if(PSI_RANK_PARAMOUNT) - blade.can_break_wall = TRUE - blade.wall_break_time = 3 SECONDS - blade.force = 40 - blade.armour_penetration = 30 - if(PSI_RANK_GRANDMASTER) - blade.can_break_wall = TRUE - blade.force = 24 - blade.armour_penetration = 30 - if(PSI_RANK_MASTER) - blade.force = 18 - else - blade.force = 12 - return blade + if(HAS_TRAIT(user, TRAIT_PACIFISM)) + var/obj/item/melee/classic_baton/psychic_power/psibaton/baton = new /obj/item/melee/classic_baton/psychic_power/psibaton(user, user) + user.put_in_hands(baton) + switch(user.psi.get_rank(faculty)) + if(PSI_RANK_PARAMOUNT) + baton.stamina_damage = 50 + if(PSI_RANK_GRANDMASTER) + baton.stamina_damage = 40 + if(PSI_RANK_MASTER) + baton.stamina_damage = 25 + else + baton.stamina_damage = 15 + return baton + else + var/obj/item/psychic_power/psiblade/blade = new /obj/item/psychic_power/psiblade(user, user) + user.put_in_hands(blade) + switch(user.psi.get_rank(faculty)) + if(PSI_RANK_PARAMOUNT) + blade.can_break_wall = TRUE + blade.wall_break_time = 3 SECONDS + blade.force = 40 + blade.armour_penetration = 30 + if(PSI_RANK_GRANDMASTER) + blade.can_break_wall = TRUE + blade.force = 24 + blade.armour_penetration = 30 + if(PSI_RANK_MASTER) + blade.force = 18 + else + blade.force = 12 + return blade /datum/psionic_power/psychokinesis/tinker name = "Tinker" diff --git a/icons/mob/inhands/weapons/melee_lefthand.dmi b/icons/mob/inhands/weapons/melee_lefthand.dmi index dd0e7cfc86b0f1ad5ccef711f6c379b8fccd9906..2a30de46491271d54fd6fa5243819c243211d631 100644 GIT binary patch delta 7870 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 I_n(ISA13%A)c^nh delta 7729 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 p-5}V(*uoc*Zh8IxtLeB?yd$02n3<< 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 literal 10463 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 Ef_~o{bN~PV delta 5083 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 CMQRoR literal 6486 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 diff --git a/yogstation.dme b/yogstation.dme index 1bf4ee5d6fcc..04c79dc25a8e 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -3551,6 +3551,7 @@ #include "code\modules\psionics\complexus\complexus_process.dm" #include "code\modules\psionics\equipment\cerebro_enhancers.dm" #include "code\modules\psionics\equipment\psipower.dm" +#include "code\modules\psionics\equipment\psipower_baton.dm" #include "code\modules\psionics\equipment\psipower_blade.dm" #include "code\modules\psionics\equipment\psipower_tinker.dm" #include "code\modules\psionics\equipment\psipower_tk.dm" From 15129e95c80d85ae777de8943a95e81378989559 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 22:12:37 -0500 Subject: [PATCH 039/201] Update redaction.dm --- code/modules/psionics/faculties/redaction.dm | 14 +++----------- 1 file changed, 3 insertions(+), 11 deletions(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 8557b62869ca..6798303c5958 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -53,15 +53,7 @@ if(.) var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) - if(!E) - to_chat(user, span_warning("They are missing that limb.")) - return COMSIG_PSI_BLOCK_ACTION - - if(E.status == BODYPART_ROBOTIC) - to_chat(user, span_warning("That limb is prosthetic.")) - return COMSIG_PSI_BLOCK_ACTION - - user.visible_message(span_notice("\The [user] rests a hand on \the [target]'s [E.name]...")) + user.visible_message(span_notice("\The [user] rests a hand on \the [target]...")) to_chat(target, span_notice("A healing warmth suffuses you.")) var/redaction_rank = user.psi.get_rank(PSI_REDACTION) @@ -86,8 +78,8 @@ to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) O.applyOrganDamage(-rand(heal, heal * 2)) return COMSIG_PSI_BLOCK_ACTION - if(E.get_damage(TRUE)) - E.heal_ordered_damage(redaction_rank * 15, list(BRUTE, BURN, TOX)) + if(target.health < target.maxHealth) + target.heal_ordered_damage(redaction_rank * 15, list(BRUTE, BURN, TOX)) to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") return COMSIG_PSI_BLOCK_ACTION From 4210dd81c570550c37b576b22bfe036ecfa85068 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 22:20:13 -0500 Subject: [PATCH 040/201] Update redaction.dm --- code/modules/psionics/faculties/redaction.dm | 21 ++++++++++++-------- 1 file changed, 13 insertions(+), 8 deletions(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 6798303c5958..6929927dbe20 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -53,6 +53,7 @@ if(.) var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) + user.visible_message(span_notice("\The [user] rests a hand on \the [target]...")) to_chat(target, span_notice("A healing warmth suffuses you.")) @@ -61,14 +62,18 @@ if(pk_rank >= PSI_RANK_LATENT && redaction_rank >= PSI_RANK_MASTER) var/removal_size = clamp(5-pk_rank, 0, 5) - var/valid_objects = list() - for(var/obj/item/thing in E.embedded_objects) - if(thing.w_class >= removal_size) - valid_objects += thing - if(LAZYLEN(valid_objects)) - var/removing = pick(valid_objects) - target.remove_embedded_object(removing) - to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removing] free of \the [E].")) + var/list/embedded_list = list() + var/obj/item/bodypart/body_part + for(var/obj/item/bodypart/part in target.bodyparts) + for(var/obj/item/embedded in part.embedded_objects) + if(embedded.w_class >= removal_size) + embedded_list += embedded + + if(LAZYLEN(embedded_list)) + var/removed_item = pick(embedded_list) + body_part = target.get_embedded_part(removed_item) + target.remove_embedded_object(removed_item, get_turf(target)) + to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removed_item] free of [target]'s [body_part].")) return COMSIG_PSI_BLOCK_ACTION if(redaction_rank >= PSI_RANK_GRANDMASTER) From 487b11e74010631294f395e094393999dda3a8c2 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 22:20:19 -0500 Subject: [PATCH 041/201] Update redaction.dm --- code/modules/psionics/faculties/redaction.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 6929927dbe20..26829e150737 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -51,9 +51,6 @@ return FALSE . = ..() if(.) - var/obj/item/bodypart/E = target.get_bodypart(user.zone_selected) - - user.visible_message(span_notice("\The [user] rests a hand on \the [target]...")) to_chat(target, span_notice("A healing warmth suffuses you.")) From ca1a9b9fc0c581a56bf54af556239e8e64f45d75 Mon Sep 17 00:00:00 2001 From: Molti Date: Mon, 8 Jul 2024 22:20:48 -0500 Subject: [PATCH 042/201] Update redaction.dm --- code/modules/psionics/faculties/redaction.dm | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 26829e150737..8ad8cd5d21a6 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -82,11 +82,11 @@ return COMSIG_PSI_BLOCK_ACTION if(target.health < target.maxHealth) target.heal_ordered_damage(redaction_rank * 15, list(BRUTE, BURN, TOX)) - to_chat(user, span_notice("You patch up some of the damage to [target]'s [E].")) + to_chat(user, span_notice("You patch up some of the damage to [target].")) new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") return COMSIG_PSI_BLOCK_ACTION - to_chat(user, span_notice("You can find nothing within \the [target]'s [E.name] to mend.")) + to_chat(user, span_notice("You can find nothing within \the [target] to mend.")) return FALSE /datum/psionic_power/redaction/cleanse From e18fc425bacb5aafb107bcd10ad538d32bd2bc68 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Mon, 8 Jul 2024 23:37:14 -0400 Subject: [PATCH 043/201] updates this --- icons/obj/psychic_powers.dmi | Bin 5271 -> 5103 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index d7a08c77bada7ba7dd74127b302343ab2d3ce385..c54d60a81ef759c9e766957f048d43b35ba6fb81 100644 GIT binary patch literal 5103 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 RbS(e?002ovPDHLkV1k6l(^dcg literal 5271 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 From 33c6814b836dcacb823cac50b2129d0062038a04 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Tue, 9 Jul 2024 00:00:17 -0400 Subject: [PATCH 044/201] updates descriptors --- code/modules/psionics/faculties/coercion.dm | 18 +++++++++--------- code/modules/psionics/faculties/energistics.dm | 8 ++++---- .../psionics/faculties/psychokenisis.dm | 7 +++---- code/modules/psionics/faculties/redaction.dm | 8 ++++---- 4 files changed, 20 insertions(+), 21 deletions(-) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index eca02a2e5933..9a019c841480 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -14,7 +14,7 @@ cost = 10 cooldown = 8 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Target the mouth and click on a creature on disarm intent to psionically send them a message." + use_description = "Activate the power with z, then click on a creature on to psionically send them a message." /datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || user == target) @@ -60,7 +60,7 @@ cost = 15 cooldown = 10 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Grab a patient, target the head, then use the grab on them while on disarm intent, in order to perform a deep coercive-redactive probe of their psionic potential." + use_description = "Activate the power with z, then click on a target in order to perform a deep coercive-redactive probe of their psionic potential." /datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || user == target) @@ -83,7 +83,7 @@ cost = 30 cooldown = 25 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Click on yourself with an empty hand on disarm intent to detect nearby psionic signatures." + use_description = "Activate the power with z, then click on yourself with an empty hand to detect nearby psionic signatures." /datum/psionic_power/coercion/psiping/invoke(mob/living/user, mob/living/target, proximity, parameters) if(user != target) @@ -147,7 +147,7 @@ heat = 15 cooldown = 7 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Target the chest or groin on disarm intent to use a melee attack equivalent to a strike from a stun baton." + use_description = "Activate the power with z, attack someone to use a melee attack to deal minor stamina damage. Higher psi levels augment the damage done." /datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || !proximity || user == target) @@ -164,7 +164,7 @@ cost = 15 cooldown = 10 SECONDS min_rank = PSI_RANK_MASTER - use_description = "Target the arms or hands on disarm intent to use a ranged attack that may rip the weapons away from the target." + use_description = "Activate the power with z, then target a creature to use a ranged attack that may rip the weapons away from the target." /datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(!istype(target) || user == target) @@ -191,7 +191,7 @@ cost = 10 cooldown = 8 SECONDS min_rank = PSI_RANK_MASTER - use_description = "Grab a patient, target the mouth, then use the grab on them while on disarm intent, in order to cure ailments of the mind." + use_description = "Activate the power with z, then click on someone in order to cure ailments of the mind." /datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || !proximity || user == target) @@ -224,7 +224,7 @@ heat = 15 cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. min_rank = PSI_RANK_MASTER - use_description = "Target the head on disarm intent at melee range to attempt to read a victim's surface thoughts." + use_description = "Activate the power with z, then click on someone in melee range to attempt to read a victim's surface level thoughts." /datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!istype(target) || target == user || !proximity) @@ -259,7 +259,7 @@ cost = 8 cooldown = 12 SECONDS min_rank = PSI_RANK_GRANDMASTER - use_description = "Target the eyes or mouth on disarm intent and click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." + use_description = "Activate the power with z, then click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." /datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() @@ -280,7 +280,7 @@ cost = 10 cooldown = 12 SECONDS min_rank = PSI_RANK_PARAMOUNT - use_description = "Activate this power, then attack your target on harm intent to Psionically rip their arms off." + use_description = "Activate the power with z, then click your target with combat mode to Psionically rip their arms off." /datum/psionic_power/coercion/dis_arm/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 82d0df2d5a4c..ff7678b9aea3 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -12,7 +12,7 @@ heat = 30 cooldown = 7.5 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Enter combat mode to use a melee attack that electrocutes a victim, or charge an energy cell." + use_description = "Activate the power with z, then Enter combat mode to use a melee attack that electrocutes a victim, or charge an energy cell." /datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode || !istype(target) || !proximity) @@ -37,7 +37,7 @@ cost = 1 cooldown = 1 SECONDS min_rank = PSI_RANK_OPERANT - use_description = "Target a non-living thing in melee range on harm intent to cause some sparks to appear. This can light fires." + use_description = "Activate the power with z, then target a non-living thing in melee range with combat mode on to cause some sparks to appear. This can light fires." /datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode || isnull(target) || istype(target) || !proximity) @@ -61,7 +61,7 @@ heat = 15 cooldown = 2 SECONDS min_rank = PSI_RANK_MASTER - use_description = "Use this ranged laser attack while on harm intent. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." + use_description = "Activate the power with z, then use this ranged laser attack with combat mode on. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." /datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) . = ..() @@ -107,7 +107,7 @@ heat = 20 cooldown = 10 SECONDS min_rank = PSI_RANK_GRANDMASTER - use_description = "Enter combat mode and attack a target to cause a localized electromagnetic pulse." + use_description = "Activate the power with z, then enter combat mode and attack a target to cause a localized electromagnetic pulse." /datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode || !istype(target) || !proximity) diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 986a514ba005..22ea9fb91d48 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -13,7 +13,7 @@ cooldown = 3 SECONDS min_rank = PSI_RANK_OPERANT icon_state = "psy_blade" - use_description = "Click on or otherwise activate an empty hand while on harm intent to manifest a psychokinetic cutting blade. The power the blade will vary based on your mastery of the faculty." + use_description = "Summon a psiblade or psibaton, if the user is a pacifist. The power the blade/baton will vary based on your mastery of the faculty." use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE @@ -58,7 +58,7 @@ cooldown = 10 min_rank = PSI_RANK_OPERANT icon_state = "psy_tinker" - use_description = "Click on or otherwise activate an empty hand while on help intent to manifest a psychokinetic tool. Use it in-hand to switch between tool types." + use_description = "Summon a psychokinetic tool. Use it in-hand to switch between tool types, different tools are available at different psi levels." use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE @@ -95,12 +95,11 @@ /obj/machinery/door ) -/datum/psionic_power/psychokinesis/telekinesis/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) +/datum/psionic_power/psychokinesis/telekinesis/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) if(!user.combat_mode) return FALSE . = ..() if(.) - var/distance = get_dist(user, target) if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS) * 2) to_chat(user, span_warning("Your telekinetic power won't reach that far.")) diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index 6798303c5958..c6ca37dc950a 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -26,7 +26,7 @@ cooldown = 3 SECONDS min_rank = PSI_RANK_OPERANT icon_state = "redac_skinsight" - use_description = "Grab a patient, target the chest, then switch to help intent and use the grab on them to perform a health scan." + use_description = "Activate the power with z, then target the mob you wish to scan with combat mode off. Higher psi levels provide more information." /datum/psionic_power/redaction/skinsight/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) if(user.combat_mode || !istype(target) || !proximity) @@ -44,7 +44,7 @@ cooldown = 5 SECONDS min_rank = PSI_RANK_OPERANT icon_state = "redac_mend" - use_description = "Target a patient while on help intent at melee range to mend a variety of maladies, such as bleeding or broken bones. Higher ranks in this faculty allow you to mend a wider range of problems." + use_description = "Activate the power with z, then target the mob you wish to heal with combat mode off. Higher psi levels provide further healing." /datum/psionic_power/redaction/mend/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(user.combat_mode || !istype(target) || !proximity) @@ -94,7 +94,7 @@ cooldown = 6 SECONDS min_rank = PSI_RANK_OPERANT icon_state = "redac_cleanse" - use_description = "Target a patient while on help intent at melee range to cleanse radiation and genetic damage from a patient." + use_description = "Activate the power with z, then target the mob you wish cleanse of radiation and clone damage with combat mode off." /datum/psionic_power/redaction/cleanse/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) if(user.combat_mode || !istype(target) || !proximity) @@ -128,7 +128,7 @@ min_rank = PSI_RANK_OPERANT faculty = PSI_REDACTION icon_state = "redac_revive" - use_description = "Obtain a grab on a dead target, target the head, then select help intent and use the grab against them to attempt to bring them back to life. The process is lengthy and failure is punished harshly." + use_description = "Activate the power with z, then target the mob you wish to revive with combat mode off. Has several limiting factors. Higher psi levels upgrade the revive." admin_log = FALSE /datum/psionic_power/revive/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) From 0a619828688e6a4b4d986c47c3cc06cfad5b76f5 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Tue, 9 Jul 2024 00:10:27 -0400 Subject: [PATCH 045/201] updates icons --- icons/obj/psychic_powers.dmi | Bin 5103 -> 5419 bytes 1 file changed, 0 insertions(+), 0 deletions(-) diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index c54d60a81ef759c9e766957f048d43b35ba6fb81..4764e074de0377882d5519e8fec8b90bc115d40a 100644 GIT binary patch literal 5419 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 V=VLa)1ycY3002ovPDHLkV1oJwLOlQg literal 5103 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 RbS(e?002ovPDHLkV1k6l(^dcg From edfc573f2444b537d03085b36262070a4434baf6 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 08:40:43 -0500 Subject: [PATCH 046/201] this --- code/game/turfs/closed/wall/mineral_walls.dm | 2 +- code/modules/psionics/complexus/complexus.dm | 2 +- code/modules/psionics/equipment/psipower_tinker.dm | 2 +- code/modules/surgery/amputation.dm | 2 +- code/modules/surgery/lipoplasty.dm | 2 +- code/modules/surgery/organic_steps.dm | 2 +- 6 files changed, 6 insertions(+), 6 deletions(-) diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 6edec65e9c25..52cbfa93db50 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -175,7 +175,7 @@ /turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user) if(W.is_sharp() && W.force) var/duration = (48/W.force) * 2 //In seconds, for now. - if(istype(W, /obj/item/hatchet) || istype(W, /obj/item/fireaxe)) + if((W.tool_behaviour == TOOL_HATCHET) || istype(W, /obj/item/fireaxe)) duration /= 4 //Much better with hatchets and axes. if(do_after(user, duration*10, src)) //Into deciseconds. dismantle_wall(FALSE,FALSE) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index b6ee4edbf19a..a8da6367cdec 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -99,7 +99,7 @@ var/list/choice_list = LAZYCOPY(learned_powers) for(var/datum/psionic_power/I as anything in choice_list) choice_list[I] = image(I.icon, null, I.icon_state) - var/selection = show_radial_menu(user, user, choice_list) + var/selection = show_radial_menu(user, user, choice_list, null, 40) selected_power = selection if(selection) //wipe the selected power unless something was actually chosen selected_power.on_select(user) diff --git a/code/modules/psionics/equipment/psipower_tinker.dm b/code/modules/psionics/equipment/psipower_tinker.dm index 3faf3b3c1df6..0debba8530c6 100644 --- a/code/modules/psionics/equipment/psipower_tinker.dm +++ b/code/modules/psionics/equipment/psipower_tinker.dm @@ -14,7 +14,7 @@ var/list/choice_list = LAZYCOPY(possible_tools) for(var/I as anything in choice_list) choice_list[I] = image(icon, null, I) - var/choice = show_radial_menu(owner, owner, choice_list, null, 42) + var/choice = show_radial_menu(owner, owner, choice_list, null, 40) if(!choice) return diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 618f73d01d3e..69b79c853449 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -26,7 +26,7 @@ /datum/surgery_step/sever_limb name = "sever limb" - implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/melee/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/fireaxe = 50, /obj/item/hatchet = 40, /obj/item/kitchen/knife/butcher = 25) + implements = list(TOOL_SCALPEL = 100, TOOL_SAW = 100, /obj/item/melee/arm_blade = 80, /obj/item/melee/chainsaw = 80, /obj/item/mounted_chainsaw = 80, /obj/item/fireaxe = 50, TOOL_HATCHET = 40, /obj/item/kitchen/knife/butcher = 25) time = 6.4 SECONDS preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/organ2.ogg' diff --git a/code/modules/surgery/lipoplasty.dm b/code/modules/surgery/lipoplasty.dm index bb0b5ebdfbc6..68f6f0eb31f2 100644 --- a/code/modules/surgery/lipoplasty.dm +++ b/code/modules/surgery/lipoplasty.dm @@ -28,7 +28,7 @@ //cut fat /datum/surgery_step/cut_fat name = "cut excess fat" - implements = list(TOOL_SCALPEL = 100, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) + implements = list(TOOL_SCALPEL = 100, TOOL_HATCHET = 35, /obj/item/kitchen/knife/butcher = 25) time = 6.4 SECONDS preop_sound = 'sound/surgery/scalpel1.ogg' success_sound = 'sound/surgery/scalpel2.ogg' diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 084b48e0de16..d542ee9c63ad 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -120,7 +120,7 @@ name = "saw bone" implements = list(TOOL_SAW = 100, /obj/item/melee/transforming/energy/sword/cyborg/saw = 100, /obj/item/melee/arm_blade = 75, /obj/item/mounted_chainsaw = 65, /obj/item/melee/chainsaw = 50, - /obj/item/fireaxe = 50, /obj/item/hatchet = 35, /obj/item/kitchen/knife/butcher = 25) + /obj/item/fireaxe = 50, TOOL_HATCHET = 35, /obj/item/kitchen/knife/butcher = 25) time = 5.4 SECONDS preop_sound = list( /obj/item/circular_saw = 'sound/surgery/saw.ogg', From 7d9e41fe75b0b7cf070ee0d490aa6fa2cb8a61dd Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 08:44:00 -0500 Subject: [PATCH 047/201] Update towercap.dm --- code/modules/hydroponics/grown/towercap.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/hydroponics/grown/towercap.dm b/code/modules/hydroponics/grown/towercap.dm index 415c95e0a721..cab2a3c31ed8 100644 --- a/code/modules/hydroponics/grown/towercap.dm +++ b/code/modules/hydroponics/grown/towercap.dm @@ -52,7 +52,7 @@ /obj/item/reagent_containers/food/snacks/grown/wheat)) /obj/item/grown/log/attackby(obj/item/W, mob/user, params) - if(W.is_sharp()) + if(W.is_sharp() || (W.tool_behaviour == TOOL_HATCHET)) user.show_message(span_notice("You make [plank_name] out of \the [src]!"), MSG_VISUAL) var/seed_modifier = 0 if(seed) From 4699a8278de8a17b35ac35464eae74a0e4cac4cc Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Tue, 9 Jul 2024 09:45:05 -0400 Subject: [PATCH 048/201] icons --- code/modules/psionics/faculties/coercion.dm | 9 +++++++++ .../modules/psionics/faculties/energistics.dm | 4 ++++ .../psionics/faculties/psychokenisis.dm | 2 +- icons/obj/psychic_powers.dmi | Bin 5419 -> 6553 bytes 4 files changed, 14 insertions(+), 1 deletion(-) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 9a019c841480..84881ccc9dba 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -14,6 +14,7 @@ cost = 10 cooldown = 8 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "coe_commune" use_description = "Activate the power with z, then click on a creature on to psionically send them a message." /datum/psionic_power/coercion/commune/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -60,6 +61,7 @@ cost = 15 cooldown = 10 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "coe_assay" use_description = "Activate the power with z, then click on a target in order to perform a deep coercive-redactive probe of their psionic potential." /datum/psionic_power/coercion/assay/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -83,6 +85,7 @@ cost = 30 cooldown = 25 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "coe_psiping" use_description = "Activate the power with z, then click on yourself with an empty hand to detect nearby psionic signatures." /datum/psionic_power/coercion/psiping/invoke(mob/living/user, mob/living/target, proximity, parameters) @@ -147,6 +150,7 @@ heat = 15 cooldown = 7 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "coe_agony" use_description = "Activate the power with z, attack someone to use a melee attack to deal minor stamina damage. Higher psi levels augment the damage done." /datum/psionic_power/coercion/agony/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -164,6 +168,7 @@ cost = 15 cooldown = 10 SECONDS min_rank = PSI_RANK_MASTER + icon_state = "coe_spasm" use_description = "Activate the power with z, then target a creature to use a ranged attack that may rip the weapons away from the target." /datum/psionic_power/coercion/spasm/invoke(var/mob/living/user, var/mob/living/carbon/human/target, proximity, parameters) @@ -191,6 +196,7 @@ cost = 10 cooldown = 8 SECONDS min_rank = PSI_RANK_MASTER + icon_state = "coe_focus" use_description = "Activate the power with z, then click on someone in order to cure ailments of the mind." /datum/psionic_power/coercion/focus/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -224,6 +230,7 @@ heat = 15 cooldown = 25 SECONDS //It should take a WHILE to be able to use this again. min_rank = PSI_RANK_MASTER + icon_state = "coe_mindread" use_description = "Activate the power with z, then click on someone in melee range to attempt to read a victim's surface level thoughts." /datum/psionic_power/coercion/mindread/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -259,6 +266,7 @@ cost = 8 cooldown = 12 SECONDS min_rank = PSI_RANK_GRANDMASTER + icon_state = "coe_blindstrike" use_description = "Activate the power with z, then click anywhere to use a radial attack that blinds, deafens and disorients everyone near you." /datum/psionic_power/coercion/blindstrike/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -280,6 +288,7 @@ cost = 10 cooldown = 12 SECONDS min_rank = PSI_RANK_PARAMOUNT + icon_state = "coe_disarm" use_description = "Activate the power with z, then click your target with combat mode to Psionically rip their arms off." /datum/psionic_power/coercion/dis_arm/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index ff7678b9aea3..acf9fda72093 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -12,6 +12,7 @@ heat = 30 cooldown = 7.5 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "ene_ele" use_description = "Activate the power with z, then Enter combat mode to use a melee attack that electrocutes a victim, or charge an energy cell." /datum/psionic_power/energistics/electrocute/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -37,6 +38,7 @@ cost = 1 cooldown = 1 SECONDS min_rank = PSI_RANK_OPERANT + icon_state = "ene_spark" use_description = "Activate the power with z, then target a non-living thing in melee range with combat mode on to cause some sparks to appear. This can light fires." /datum/psionic_power/energistics/spark/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -61,6 +63,7 @@ heat = 15 cooldown = 2 SECONDS min_rank = PSI_RANK_MASTER + icon_state = "ene_zorch" use_description = "Activate the power with z, then use this ranged laser attack with combat mode on. Your mastery of Energistics will determine how powerful the laser is. Be wary of overuse, and try not to fry your own brain." /datum/psionic_power/energistics/zorch/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) @@ -107,6 +110,7 @@ heat = 20 cooldown = 10 SECONDS min_rank = PSI_RANK_GRANDMASTER + icon_state = "ene_disrupt" use_description = "Activate the power with z, then enter combat mode and attack a target to cause a localized electromagnetic pulse." /datum/psionic_power/energistics/disrupt/invoke(var/mob/living/user, var/mob/living/target, proximity, parameters) diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 22ea9fb91d48..b8a96cae6647 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -8,7 +8,7 @@ use_sound = null /datum/psionic_power/psychokinesis/psiblade - name = "Psiblade" + name = "Psiblade/Psibaton" cost = 10 cooldown = 3 SECONDS min_rank = PSI_RANK_OPERANT diff --git a/icons/obj/psychic_powers.dmi b/icons/obj/psychic_powers.dmi index 4764e074de0377882d5519e8fec8b90bc115d40a..22876436397dbdd9c3bd05c6c0208eb9b0f1bfeb 100644 GIT binary patch literal 6553 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 V=VLa)1ycY3002ovPDHLkV1oJwLOlQg From b4b0b476083edb28b3e64c0a247c8a553555138a Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 08:47:53 -0500 Subject: [PATCH 049/201] Update mineral_walls.dm --- code/game/turfs/closed/wall/mineral_walls.dm | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 52cbfa93db50..6c4855187564 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -173,11 +173,13 @@ canSmoothWith = SMOOTH_GROUP_BAMBOO_WALLS /turf/closed/wall/mineral/wood/attackby(obj/item/W, mob/user) - if(W.is_sharp() && W.force) - var/duration = (48/W.force) * 2 //In seconds, for now. + if((W.is_sharp() && W.force) || (W.tool_behaviour == TOOL_HATCHET)) + var/duration = 20 SECONDS if((W.tool_behaviour == TOOL_HATCHET) || istype(W, /obj/item/fireaxe)) - duration /= 4 //Much better with hatchets and axes. - if(do_after(user, duration*10, src)) //Into deciseconds. + duration /= 40 //Much better with hatchets and axes. + else + duration /= W.force + if(do_after(user, duration, src)) dismantle_wall(FALSE,FALSE) return return ..() From b5cd4a85dbbf5750b991e3b302f54011f7e4474f Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 08:58:03 -0500 Subject: [PATCH 050/201] tool stuff --- code/game/objects/structures/flora.dm | 13 ++++++++----- code/game/turfs/closed/wall/mineral_walls.dm | 4 ++++ code/modules/projectiles/guns/ballistic.dm | 2 +- code/modules/surgery/mechanic_steps.dm | 4 ++-- 4 files changed, 15 insertions(+), 8 deletions(-) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 9b42aad57ba6..5c10452809b2 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -22,21 +22,24 @@ /obj/structure/flora/tree/attackby(obj/item/W, mob/user, params) if(log_amount && (!(flags_1 & NODECONSTRUCT_1))) - if(W.is_sharp() && W.force > 0) + if((W.is_sharp() && W.force) || (W.tool_behaviour == TOOL_HATCHET)) + var/duration = 20 SECONDS + if((W.tool_behaviour == TOOL_HATCHET) || istype(W, /obj/item/fireaxe)) + duration /= 40 //Much better with hatchets and axes. + else + duration /= W.force if(W.hitsound) playsound(get_turf(src), W.hitsound, 100, 0, 0) - user.visible_message(span_notice("[user] begins to cut down [src] with [W]."),span_notice("You begin to cut down [src] with [W]."), "You hear the sound of sawing.") - if(do_after(user, (1000 / W.force), src)) //5 seconds with 20 force, 8 seconds with a hatchet, 20 seconds with a shard. + user.visible_message(span_notice("[user] begins to cut down [src] with [W]."),span_notice("You begin to cut down [src] with [W]."), "You hear the sound of chopping.") + if(do_after(user, duration, src)) user.visible_message(span_notice("[user] fells [src] with the [W]."),span_notice("You fell [src] with the [W]."), "You hear the sound of a tree falling.") playsound(get_turf(src), 'sound/effects/meteorimpact.ogg', 100 , 0, 0) for(var/i=1 to log_amount) new /obj/item/grown/log/tree(get_turf(src)) - var/obj/structure/flora/stump/S = new(loc) S.name = "[name] stump" qdel(src) - else return ..() diff --git a/code/game/turfs/closed/wall/mineral_walls.dm b/code/game/turfs/closed/wall/mineral_walls.dm index 6c4855187564..eff5520ac6fa 100644 --- a/code/game/turfs/closed/wall/mineral_walls.dm +++ b/code/game/turfs/closed/wall/mineral_walls.dm @@ -179,7 +179,11 @@ duration /= 40 //Much better with hatchets and axes. else duration /= W.force + if(W.hitsound) + playsound(get_turf(src), W.hitsound, 100, 0, 0) + user.visible_message(span_notice("[user] begins to cut down [src] with [W]."),span_notice("You begin to cut down [src] with [W]."), "You hear the sound of chopping.") if(do_after(user, duration, src)) + user.visible_message(span_notice("[user] fells [src] with the [W]."),span_notice("You fell [src] with the [W]."), "You hear the sound of a tree falling.") dismantle_wall(FALSE,FALSE) return return ..() diff --git a/code/modules/projectiles/guns/ballistic.dm b/code/modules/projectiles/guns/ballistic.dm index 0074741620bb..e2e331f14ac5 100644 --- a/code/modules/projectiles/guns/ballistic.dm +++ b/code/modules/projectiles/guns/ballistic.dm @@ -588,7 +588,7 @@ GLOBAL_LIST_INIT(gun_saw_types, typecacheof(list( ///Handles all the logic of sawing off guns, /obj/item/gun/ballistic/proc/sawoff(mob/user, obj/item/saw) - if(!saw.is_sharp() || !is_type_in_typecache(saw, GLOB.gun_saw_types)) //needs to be sharp. Otherwise turned off eswords can cut this. + if((!saw.is_sharp() || !is_type_in_typecache(saw, GLOB.gun_saw_types)) && (saw.tool_behaviour != TOOL_SAW)) //needs to be sharp. Otherwise turned off eswords can cut this. return if(sawn_off) to_chat(user, span_warning("\The [src] is already shortened!")) diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 0d76573a3c86..c3bb323b584f 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -18,7 +18,7 @@ /datum/surgery_step/mechanic_open/tool_check(mob/user, obj/item/tool) if(istype(tool)) - if(!tool.is_sharp()) + if(implement_type == /obj/item && !tool.is_sharp()) return FALSE if(tool.usesound) preop_sound = tool.usesound @@ -45,7 +45,7 @@ /datum/surgery_step/mechanic_close/tool_check(mob/user, obj/item/tool) if(istype(tool)) - if(!tool.is_sharp()) + if(implement_type == /obj/item && !tool.is_sharp()) return FALSE if(tool.usesound) preop_sound = tool.usesound From 9bc927b0ddccf3fd5a96eee2c6b287614099aa1f Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:19:55 -0500 Subject: [PATCH 051/201] fixes telekinesis --- .../modules/psionics/equipment/psipower_tk.dm | 16 ++++++---- .../psionics/faculties/psychokenisis.dm | 31 +++++++++++-------- 2 files changed, 28 insertions(+), 19 deletions(-) diff --git a/code/modules/psionics/equipment/psipower_tk.dm b/code/modules/psionics/equipment/psipower_tk.dm index deb309afa468..79ca7aabc693 100644 --- a/code/modules/psionics/equipment/psipower_tk.dm +++ b/code/modules/psionics/equipment/psipower_tk.dm @@ -27,6 +27,7 @@ var/obj/item/thing = _focus check_paramount = (thing.w_class >= WEIGHT_CLASS_BULKY) else + qdel(src) return FALSE if(_focus.anchored || (check_paramount && owner.psi.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) @@ -51,11 +52,12 @@ return focus.do_simple_ranged_interaction(user) /obj/item/psychic_power/telekinesis/afterattack(atom/target, mob/living/user, proximity) - - if(!target || !user || (isobj(target) && !isturf(target.loc)) || !user.psi || !user.psi.can_use() || !user.psi.spend_power(5)) + if(!target || !user || (isobj(target) && !isturf(target.loc))) + return + if(!user.psi || !user.psi.can_use() || !user.psi.spend_power(5) || get_dist(get_turf(focus), get_turf(owner)) > (owner.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) + owner.dropItemToGround(src) return - //user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN) FIX ME user.psi.set_cooldown(5) var/distance = get_dist(get_turf(user), get_turf(focus ? focus : target)) @@ -76,9 +78,11 @@ else if(!focus.anchored) var/user_rank = owner.psi.get_rank(PSI_PSYCHOKINESIS) - focus.throw_at(target, user_rank*2, user_rank*10, owner) - sleep(1) - sparkle() + focus.throw_at(target, user_rank*2, user_rank, owner, callback = CALLBACK(src, PROC_REF(end_throw))) + +/obj/item/psychic_power/telekinesis/proc/end_throw() + sparkle() + if(!focus || !isturf(focus.loc) || get_dist(get_turf(focus), get_turf(owner)) > (owner.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) owner.dropItemToGround(src) /obj/item/psychic_power/telekinesis/proc/sparkle() diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index b8a96cae6647..0eefaf0f4aca 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -17,7 +17,10 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/psiblade/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) +/datum/psionic_power/psychokinesis/psiblade/invoke(mob/living/user, mob/living/target, proximity, parameters) + return FALSE + +/datum/psionic_power/psychokinesis/psiblade/on_select(mob/living/user) . = ..() if(.) if(HAS_TRAIT(user, TRAIT_PACIFISM)) @@ -62,7 +65,10 @@ use_sound = 'sound/effects/psi/power_fabrication.ogg' admin_log = FALSE -/datum/psionic_power/psychokinesis/tinker/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) +/datum/psionic_power/psychokinesis/tinker/invoke(mob/living/user, mob/living/target, proximity, parameters) + return FALSE + +/datum/psionic_power/psychokinesis/tinker/on_select(mob/living/user) . = ..() if(.) var/obj/item/psychic_power/tinker/tool = new(user) @@ -95,23 +101,15 @@ /obj/machinery/door ) -/datum/psionic_power/psychokinesis/telekinesis/on_select(var/mob/living/user, var/mob/living/target, proximity, parameters) - if(!user.combat_mode) - return FALSE +/datum/psionic_power/psychokinesis/telekinesis/invoke(mob/living/user, mob/living/target, proximity, parameters) . = ..() if(.) var/distance = get_dist(user, target) - if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS) * 2) + if(distance > (user.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) to_chat(user, span_warning("Your telekinetic power won't reach that far.")) return FALSE - if(istype(target, /mob) || istype(target, /obj)) - var/obj/item/psychic_power/telekinesis/tk = new(user) - if(tk.set_focus(target)) - tk.sparkle() - user.visible_message("\The [user] reaches out.") - return tk - else if(istype(target, /obj/structure)) + if(istype(target, /obj/structure)) user.visible_message("\The [user] makes a strange gesture.") var/obj/O = target O.attack_hand(user) @@ -122,4 +120,11 @@ var/obj/machinery/machine = target machine.attack_hand(user) return TRUE + else if(istype(target, /mob) || istype(target, /obj)) + var/obj/item/psychic_power/telekinesis/tk = new(user) + user.put_in_hands(tk) + if(tk.set_focus(target)) + tk.sparkle() + user.visible_message("\The [user] reaches out.") + return tk return FALSE From 2d9df13b409af8109086bbea64bf2a5cfc807f25 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:31:39 -0500 Subject: [PATCH 052/201] should be done --- .../modules/psionics/equipment/psipower_tk.dm | 20 +++++++++++------- .../psionics/faculties/psychokenisis.dm | 21 +++++++++---------- 2 files changed, 22 insertions(+), 19 deletions(-) diff --git a/code/modules/psionics/equipment/psipower_tk.dm b/code/modules/psionics/equipment/psipower_tk.dm index 79ca7aabc693..201a616291ac 100644 --- a/code/modules/psionics/equipment/psipower_tk.dm +++ b/code/modules/psionics/equipment/psipower_tk.dm @@ -27,7 +27,6 @@ var/obj/item/thing = _focus check_paramount = (thing.w_class >= WEIGHT_CLASS_BULKY) else - qdel(src) return FALSE if(_focus.anchored || (check_paramount && owner.psi.get_rank(PSI_PSYCHOKINESIS) < PSI_RANK_PARAMOUNT)) @@ -46,6 +45,10 @@ overlays += I return TRUE +/obj/item/psychic_power/telekinesis/proc/valid_distance(mob/living/user, atom/target) + var/distance = get_dist(get_turf(user), get_turf(focus ? focus : target)) + return (distance <= (owner.psi.get_rank(PSI_PSYCHOKINESIS) * 2)) + /obj/item/psychic_power/telekinesis/attack_self(mob/user) user.visible_message(span_notice("[user] makes a strange gesture.")) sparkle() @@ -54,16 +57,17 @@ /obj/item/psychic_power/telekinesis/afterattack(atom/target, mob/living/user, proximity) if(!target || !user || (isobj(target) && !isturf(target.loc))) return - if(!user.psi || !user.psi.can_use() || !user.psi.spend_power(5) || get_dist(get_turf(focus), get_turf(owner)) > (owner.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) + + if(!valid_distance(user, target)) owner.dropItemToGround(src) + to_chat(user, span_warning("Your telekinetic power won't reach that far.")) return - user.psi.set_cooldown(5) + if(!user.psi || !user.psi.can_use() || !user.psi.spend_power(5)) + owner.dropItemToGround(src) + return - var/distance = get_dist(get_turf(user), get_turf(focus ? focus : target)) - if(distance > user.psi.get_rank(PSI_PSYCHOKINESIS)) - to_chat(user, span_warning("Your telekinetic power won't reach that far.")) - return FALSE + user.psi.set_cooldown(5) if(target == focus) attack_self(user) @@ -82,7 +86,7 @@ /obj/item/psychic_power/telekinesis/proc/end_throw() sparkle() - if(!focus || !isturf(focus.loc) || get_dist(get_turf(focus), get_turf(owner)) > (owner.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) + if(!focus || !isturf(focus.loc) || !valid_distance(owner, focus)) owner.dropItemToGround(src) /obj/item/psychic_power/telekinesis/proc/sparkle() diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index 0eefaf0f4aca..d7b3c8d8ef71 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -102,24 +102,23 @@ ) /datum/psionic_power/psychokinesis/telekinesis/invoke(mob/living/user, mob/living/target, proximity, parameters) + var/distance = get_dist(user, target) + if(distance > (user.psi.get_rank(PSI_PSYCHOKINESIS) * 2)) + to_chat(user, span_warning("Your telekinetic power won't reach that far.")) + return FALSE + if(istype(target, /obj/machinery) && !(target.type in valid_machine_types)) + return FALSE . = ..() if(.) - var/distance = get_dist(user, target) - if(distance > (user.psi.get_rank(PSI_PSYCHOKINESIS) * 3)) - to_chat(user, span_warning("Your telekinetic power won't reach that far.")) - return FALSE - if(istype(target, /obj/structure)) user.visible_message("\The [user] makes a strange gesture.") var/obj/O = target O.attack_hand(user) return TRUE - else if(istype(target, /obj/machinery)) - for(var/mtype in valid_machine_types) - if(istype(target, mtype)) - var/obj/machinery/machine = target - machine.attack_hand(user) - return TRUE + else if(istype(target, /obj/machinery) && (target.type in valid_machine_types)) + var/obj/machinery/machine = target + machine.attack_hand(user) + return TRUE else if(istype(target, /mob) || istype(target, /obj)) var/obj/item/psychic_power/telekinesis/tk = new(user) user.put_in_hands(tk) From 16c91ef78aed12821d2afa62f261bba76c8aaf1f Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:41:37 -0500 Subject: [PATCH 053/201] autoredaction --- code/modules/psionics/complexus/complexus.dm | 1 + .../psionics/complexus/complexus_process.dm | 18 ++++++++---------- 2 files changed, 9 insertions(+), 10 deletions(-) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index a8da6367cdec..2182ef3f1575 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -94,6 +94,7 @@ /datum/psi_complexus/proc/select_power(mob/user) if(suppressed) return + rebuild_power_cache() if(!LAZYLEN(learned_powers)) return var/list/choice_list = LAZYCOPY(learned_powers) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index d70c578d6f9d..7941b5d84c73 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -21,9 +21,9 @@ UNSETEMPTY(latencies) var/rank_count = max(1, LAZYLEN(ranks)) + rebuild_power_cache = TRUE + rebuild_power_cache() if(force || last_rating != CEILING(combined_rank/rank_count, 1)) - rebuild_power_cache = TRUE - rebuild_power_cache() if(highest_rank <= 1) if(highest_rank == 0) qdel(src) @@ -110,16 +110,16 @@ heal_poison = TRUE heal_internal = TRUE mend_prob = 50 - heal_rate = 7 + heal_rate = 10 if(PSI_RANK_GRANDMASTER) heal_poison = TRUE heal_internal = TRUE mend_prob = 20 - heal_rate = 5 + heal_rate = 7 if(PSI_RANK_MASTER) heal_internal = TRUE mend_prob = 10 - heal_rate = 3 + heal_rate = 4 if(PSI_RANK_OPERANT) mend_prob = 5 heal_rate = 1 @@ -194,14 +194,12 @@ if(owner.getCloneLoss() && spend_power(heal_rate)) if(prob(25)) to_chat(owner, span_notice("Your autoredactive faculty stitches together some of your mangled DNA.")) - owner.adjustCloneLoss(-heal_rate) + owner.adjustCloneLoss(-(heal_rate/2)) return // Heal everything left. - if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss()) && spend_power(heal_rate)) - owner.adjustBruteLoss(-(heal_rate)) - owner.adjustFireLoss(-(heal_rate)) - owner.adjustOxyLoss(-(heal_rate)) + if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss() || owner.getToxLoss()) && spend_power(heal_rate)) + owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ANY, TRUE) new /obj/effect/temp_visual/heal(get_turf(owner), "#33cc33") if(prob(25)) to_chat(owner, span_notice("Your skin crawls as your autoredactive faculty heals your body.")) From 4f03c4a28a919287c9dcf217ef3713e75552f0ab Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:42:05 -0500 Subject: [PATCH 054/201] Update complexus_process.dm --- code/modules/psionics/complexus/complexus_process.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 7941b5d84c73..0dbc302ec8ca 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -199,7 +199,7 @@ // Heal everything left. if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss() || owner.getToxLoss()) && spend_power(heal_rate)) - owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ANY, TRUE) + owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ORGANIC, TRUE) new /obj/effect/temp_visual/heal(get_turf(owner), "#33cc33") if(prob(25)) to_chat(owner, span_notice("Your skin crawls as your autoredactive faculty heals your body.")) From 8c6c3943382ff04262065cfa13af3112e1c3e4d9 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:42:20 -0500 Subject: [PATCH 055/201] Update complexus_process.dm --- code/modules/psionics/complexus/complexus_process.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 0dbc302ec8ca..7941b5d84c73 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -199,7 +199,7 @@ // Heal everything left. if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss() || owner.getToxLoss()) && spend_power(heal_rate)) - owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ORGANIC, TRUE) + owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ANY, TRUE) new /obj/effect/temp_visual/heal(get_turf(owner), "#33cc33") if(prob(25)) to_chat(owner, span_notice("Your skin crawls as your autoredactive faculty heals your body.")) From b7f8333865c54e3e1388dc54184579192ef4963a Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 09:53:21 -0500 Subject: [PATCH 056/201] shift --- code/modules/psionics/complexus/complexus_process.dm | 2 +- code/modules/psionics/interfaces/ui_hub.dm | 4 ++-- code/modules/psionics/interfaces/ui_toggle.dm | 2 +- 3 files changed, 4 insertions(+), 4 deletions(-) diff --git a/code/modules/psionics/complexus/complexus_process.dm b/code/modules/psionics/complexus/complexus_process.dm index 7941b5d84c73..b7fdfba170d8 100644 --- a/code/modules/psionics/complexus/complexus_process.dm +++ b/code/modules/psionics/complexus/complexus_process.dm @@ -199,7 +199,7 @@ // Heal everything left. if(heal_general && prob(mend_prob) && (owner.getBruteLoss() || owner.getFireLoss() || owner.getOxyLoss() || owner.getToxLoss()) && spend_power(heal_rate)) - owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ANY, TRUE) + owner.heal_ordered_damage(heal_rate, list(BRUTE, BURN, TOX, OXY), BODYPART_ANY, TRUE) //it gets to heal robotic parts because otherwise it'd suck you dry trying to fix unfixable limbs new /obj/effect/temp_visual/heal(get_turf(owner), "#33cc33") if(prob(25)) to_chat(owner, span_notice("Your skin crawls as your autoredactive faculty heals your body.")) diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm index b6ec992ba675..7a5a9f272caa 100644 --- a/code/modules/psionics/interfaces/ui_hub.dm +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -1,7 +1,7 @@ /obj/screen/psi/hub name = "Psi" icon_state = "psi_suppressed" - screen_loc = "EAST-1:28,CENTER-4:7" + screen_loc = "EAST-1:28,CENTER-4" plane = HUD_PLANE hidden = FALSE maptext_x = 6 @@ -52,7 +52,7 @@ var/obj/screen/psi/component = thing component.update_icon() if(!component.invisibility) - component.screen_loc = "EAST-[++offset]:28,CENTER-4:7" + component.screen_loc = "EAST-[++offset]:28,CENTER-4" /obj/screen/psi/hub/Destroy() STOP_PROCESSING(SSprocessing, src) diff --git a/code/modules/psionics/interfaces/ui_toggle.dm b/code/modules/psionics/interfaces/ui_toggle.dm index 11efe808ed41..cb23bd178558 100644 --- a/code/modules/psionics/interfaces/ui_toggle.dm +++ b/code/modules/psionics/interfaces/ui_toggle.dm @@ -13,7 +13,7 @@ if(!owner.psi) return owner.psi.use_psi_armour = !owner.psi.use_psi_armour - to_chat(owner, span_notice("You will [owner.psi.use_psi_armour ? "no longer" : "now"] use your psionics to deflect or block incoming attacks.")) + to_chat(owner, span_notice("You will [owner.psi.use_psi_armour ? "now" : "no longer"] use your psionics to deflect or block incoming attacks.")) update_icon() // End psi armour toggle. From 7b3aa45c149cbd7d98dd5fbe1a4f6025e8fe5790 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Tue, 9 Jul 2024 11:13:41 -0400 Subject: [PATCH 057/201] update access --- .../modular_computers/file_system/programs/psi_monitor.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/modular_computers/file_system/programs/psi_monitor.dm b/code/modules/modular_computers/file_system/programs/psi_monitor.dm index 189bb374e149..62c31cb0ac5d 100644 --- a/code/modules/modular_computers/file_system/programs/psi_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/psi_monitor.dm @@ -5,7 +5,7 @@ anchored = TRUE density = TRUE opacity = FALSE - req_access = list(list(ACCESS_PSYCH, ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_HOS)) + req_access = list(ACCESS_PSYCH) var/list/psi_violations = list() var/show_violations = FALSE From 31c792b3233275ff4e93852819948e9d9630ea46 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 10:13:45 -0500 Subject: [PATCH 058/201] returns --- code/__DEFINES/psi.dm | 2 -- code/_onclick/other_mobs.dm | 2 +- code/modules/psionics/complexus/complexus.dm | 4 ++- code/modules/psionics/faculties/coercion.dm | 29 ++++++++++--------- .../modules/psionics/faculties/energistics.dm | 10 +++---- .../psionics/faculties/psychokenisis.dm | 23 ++++++++++----- code/modules/psionics/faculties/redaction.dm | 20 ++++++------- 7 files changed, 49 insertions(+), 41 deletions(-) diff --git a/code/__DEFINES/psi.dm b/code/__DEFINES/psi.dm index 3bbf2893805a..1b07aa257e69 100644 --- a/code/__DEFINES/psi.dm +++ b/code/__DEFINES/psi.dm @@ -18,5 +18,3 @@ #define COMSIG_PSI_SELECTION "select action" #define COMSIG_PSI_INVOKE "invoke selected" -///return to block the regular action from happening - #define COMSIG_PSI_BLOCK_ACTION (1<<0) diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 127ca2ea591b..8ab5e5b2abec 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -6,7 +6,7 @@ */ /mob/living/carbon/human/UnarmedAttack(atom/A, proximity, modifiers) if(psi) - if(SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, proximity, modifiers) & COMSIG_PSI_BLOCK_ACTION) + if(SEND_SIGNAL(src, COMSIG_PSI_INVOKE, A, proximity, modifiers)) return if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) if(src == A) diff --git a/code/modules/psionics/complexus/complexus.dm b/code/modules/psionics/complexus/complexus.dm index 2182ef3f1575..51a75ca76dfd 100644 --- a/code/modules/psionics/complexus/complexus.dm +++ b/code/modules/psionics/complexus/complexus.dm @@ -112,7 +112,9 @@ if(!selected_power) return user.playsound_local(soundin = 'sound/effects/psi/power_evoke.ogg') - return selected_power.invoke(user, target, proximity, parameters) + . = selected_power.invoke(user, target, proximity, parameters) + if(.) + selected_power.handle_post_power(user, target) /datum/psi_complexus/proc/get_aura_image() if(_aura_image && !istype(_aura_image)) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 84881ccc9dba..7391a26f089a 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -30,11 +30,11 @@ if(target.stat == DEAD) to_chat(user, span_cult("Not even a psion of your level can speak to the dead.")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE if (issilicon(target)) to_chat(user, span_warning("This can only be used on living organisms.")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE log_say("[key_name(user)] communed to [key_name(target)]: [text]") @@ -74,11 +74,11 @@ to_chat(target, span_warning("Your persona is being probed by the psychic lens of \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 50 : 25), target, FALSE)) user.psi.backblast(rand(5,10)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE to_chat(user, span_notice("You retreat from \the [target], holding your new knowledge close.")) to_chat(target, span_danger("Your mental complexus is laid bare to judgement of \the [user].")) target.show_psi_assay(user) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/psiping name = "Psi-ping" @@ -95,7 +95,7 @@ if(.) to_chat(user, "You take a moment to tune into the local Nlom...") if(!do_after(user, 3 SECONDS, user)) - return + return FALSE var/list/dirs = list() for(var/mob/living/L in range(20)) var/turf/T = get_turf(L) @@ -137,6 +137,7 @@ to_chat(user, span_notice("You sense " + jointext(feedback, " ") + " towards the [dir2text(text2num(d))].")) if(!length(dirs)) to_chat(user, span_notice("You detect no psionic signatures but your own.")) + return TRUE /datum/psionic_power/coercion/invoke(mob/living/user, mob/living/target, proximity, parameters) if (!istype(target)) @@ -161,7 +162,7 @@ user.visible_message("\The [target] has been struck by \the [user]!") playsound(user.loc, 'sound/weapons/Egloves.ogg', 50, 1, -1) target.apply_damage(10 * (user.psi.get_rank(PSI_COERCION) - 1), STAMINA, BODY_ZONE_CHEST) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/spasm name = "Spasm" @@ -189,7 +190,7 @@ target.visible_message("\The [target] drops what they were holding as their left hand spasms!") if(prob(75) && target.held_items[2] && target.dropItemToGround(target.get_item_for_held_index(2))) target.visible_message("\The [target] drops what they were holding as their right hand spasms!") - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/focus name = "Focus" @@ -209,7 +210,7 @@ to_chat(target, span_warning("Your mind is being cleansed of ailments by \the [user].")) if(!do_after(user, (target.stat == CONSCIOUS ? 5 SECONDS : 2.5 SECONDS), target, FALSE)) user.psi.backblast(rand(5,10)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE to_chat(user, span_warning("You clear \the [target]'s mind of ailments.")) to_chat(target, span_warning("Your mind is cleared of ailments.")) @@ -222,7 +223,7 @@ if(istype(target, /mob/living/carbon)) var/mob/living/carbon/M = target M.adjust_hallucinations(60 SECONDS) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/mindread name = "Read Mind" @@ -242,12 +243,12 @@ if(target.stat == DEAD || (HAS_TRAIT(target, TRAIT_FAKEDEATH)) || !target.client) to_chat(user, span_warning("\The [target] is in no state for a mind-read.")) - return COMSIG_PSI_BLOCK_ACTION + return FALSE user.visible_message(span_warning("\The [user] touches \the [target]'s temple...")) var/question = input(user, "Say something?", "Read Mind", "Penny for your thoughts?") as null|text if(!question || user.incapacitated() || !do_after(user, 20)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE var/started_mindread = world.time to_chat(user, span_notice("You dip your mentality into the surface layer of \the [target]'s mind, seeking an answer: [question]")) @@ -259,7 +260,7 @@ else to_chat(user, span_notice("You skim thoughts from the surface of \the [target]'s mind: [answer]")) log_game("[key_name(user)] read mind of [key_name(target)] with question \"[question]\" and [answer?"got answer \"[answer]\".":"got no answer."]") - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/blindstrike name = "Blindstrike" @@ -281,7 +282,7 @@ to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) M.blind_eyes(1 SECONDS) M.adjust_confusion(10 SECONDS) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/coercion/dis_arm name = "Dis-Arm" @@ -303,4 +304,4 @@ if(!(bodypart.body_part & (HEAD|CHEST|LEGS))) if(bodypart.dismemberable) bodypart.dismember() - return COMSIG_PSI_BLOCK_ACTION + return TRUE diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index acf9fda72093..3f35977d4d92 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -23,13 +23,13 @@ if(istype(target)) user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target]!")) target.electrocute_act(rand(15,45), user, 1, user.zone_selected) - return COMSIG_PSI_BLOCK_ACTION + return TRUE else if(isatom(target)) var/obj/item/stock_parts/cell/charging_cell = target.get_cell() if(istype(charging_cell)) user.visible_message(span_danger("\The [user] sends a jolt of electricity arcing into \the [target], charging it!")) charging_cell.give(rand(15,45)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE else return FALSE @@ -55,7 +55,7 @@ var/datum/effect_system/spark_spread/s = new /datum/effect_system/spark_spread s.set_up(5, 1, target) s.start() - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/energistics/zorch name = "Zorch" @@ -102,7 +102,7 @@ pew.firer = user pew.fire(Get_Angle(user, target)) user.visible_message(span_danger("[user]'s eyes flare with light!")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/energistics/disrupt name = "Disrupt" @@ -120,4 +120,4 @@ if(.) user.visible_message("\The [user] releases a gout of crackling static and arcing lightning over \the [target]!") empulse(target, 5, 1) - return COMSIG_PSI_BLOCK_ACTION + return TRUE diff --git a/code/modules/psionics/faculties/psychokenisis.dm b/code/modules/psionics/faculties/psychokenisis.dm index d7b3c8d8ef71..55589455013c 100644 --- a/code/modules/psionics/faculties/psychokenisis.dm +++ b/code/modules/psionics/faculties/psychokenisis.dm @@ -97,25 +97,32 @@ use_description = "Click on a distant target while on grab intent to manifest a psychokinetic grip. Use it manipulate objects at a distance." admin_log = FALSE use_sound = 'sound/effects/psi/power_used.ogg' - var/global/list/valid_machine_types = list( - /obj/machinery/door + var/list/valid_types = list( //a list of all + /obj/machinery/door, + /obj/structure/window, + /obj/structure/closet, + /obj/structure/chair ) -/datum/psionic_power/psychokinesis/telekinesis/invoke(mob/living/user, mob/living/target, proximity, parameters) +/datum/psionic_power/psychokinesis/telekinesis/New() + . = ..() + valid_types = typecacheof(valid_types) + +/datum/psionic_power/psychokinesis/telekinesis/invoke(mob/living/user, atom/target, proximity, parameters) var/distance = get_dist(user, target) if(distance > (user.psi.get_rank(PSI_PSYCHOKINESIS) * 2)) to_chat(user, span_warning("Your telekinetic power won't reach that far.")) return FALSE - if(istype(target, /obj/machinery) && !(target.type in valid_machine_types)) + if((istype(target, /obj/machinery) || istype(target, /obj/structure)) && !is_type_in_typecache(target, valid_types)) return FALSE . = ..() if(.) if(istype(target, /obj/structure)) - user.visible_message("\The [user] makes a strange gesture.") + user.visible_message(span_notice("\The [user] makes a strange gesture.")) var/obj/O = target O.attack_hand(user) return TRUE - else if(istype(target, /obj/machinery) && (target.type in valid_machine_types)) + else if(istype(target, /obj/machinery)) var/obj/machinery/machine = target machine.attack_hand(user) return TRUE @@ -124,6 +131,6 @@ user.put_in_hands(tk) if(tk.set_focus(target)) tk.sparkle() - user.visible_message("\The [user] reaches out.") - return tk + user.visible_message(span_notice("\The [user] reaches out.")) + return TRUE return FALSE diff --git a/code/modules/psionics/faculties/redaction.dm b/code/modules/psionics/faculties/redaction.dm index c68e3d43264e..d0e1e30dcb79 100644 --- a/code/modules/psionics/faculties/redaction.dm +++ b/code/modules/psionics/faculties/redaction.dm @@ -71,7 +71,7 @@ body_part = target.get_embedded_part(removed_item) target.remove_embedded_object(removed_item, get_turf(target)) to_chat(user, span_notice("You extend a tendril of psychokinetic-redactive power and carefully tease \the [removed_item] free of [target]'s [body_part].")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE if(redaction_rank >= PSI_RANK_GRANDMASTER) for(var/obj/item/organ/O in target.internal_organs) @@ -79,12 +79,12 @@ var/heal = redaction_rank * 10 to_chat(user, span_notice("You encourage the damaged tissue of \the [O] to repair itself.")) O.applyOrganDamage(-rand(heal, heal * 2)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE if(target.health < target.maxHealth) target.heal_ordered_damage(redaction_rank * 15, list(BRUTE, BURN, TOX)) to_chat(user, span_notice("You patch up some of the damage to [target].")) new /obj/effect/temp_visual/heal(get_turf(target), "#33cc33") - return COMSIG_PSI_BLOCK_ACTION + return TRUE to_chat(user, span_notice("You can find nothing within \the [target] to mend.")) return FALSE @@ -111,16 +111,16 @@ target.radiation -= removing else target.radiation = 0 - return COMSIG_PSI_BLOCK_ACTION + return TRUE if(target.getCloneLoss()) to_chat(user, span_notice("You stitch together some of the mangled DNA within \the [target]...")) if(target.getCloneLoss() >= removing) target.adjustCloneLoss(-removing) else target.adjustCloneLoss(-(target.getCloneLoss())) - return COMSIG_PSI_BLOCK_ACTION + return TRUE to_chat(user, span_notice("You can find no genetic damage or radiation to heal within \the [target].")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE /datum/psionic_power/revive name = "Revive" @@ -140,21 +140,21 @@ if(.) if(target.stat != DEAD && !HAS_TRAIT(target, TRAIT_FAKEDEATH)) to_chat(user, span_warning("This person is already alive!")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE if((world.time - target.timeofdeath) > DEFIB_TIME_LIMIT) to_chat(user, span_warning("\The [target] has been dead for too long to revive.")) - return COMSIG_PSI_BLOCK_ACTION + return TRUE user.visible_message(span_notice("\The [user] splays out their hands over \the [target]'s body...")) target.notify_ghost_cloning("Your heart is being revived!") target.grab_ghost() if(!do_after(user, 10 SECONDS, target, FALSE)) user.psi.backblast(rand(10,25)) - return COMSIG_PSI_BLOCK_ACTION + return TRUE to_chat(target, span_notice("Life floods back into your body!")) target.visible_message(span_notice("\The [target] shudders violently!")) target.adjustOxyLoss(-rand(15,20)) target.revive() - return COMSIG_PSI_BLOCK_ACTION + return TRUE From 92c4966232e6888f81c8fdc3c3155a2079de6930 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 10:18:40 -0500 Subject: [PATCH 059/201] latency trigger --- code/modules/psionics/complexus/complexus_latency.dm | 2 +- .../living/carbon/human/species_types/preternis/preternis.dm | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index 93494533b98a..7d7c977290a2 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -8,7 +8,7 @@ return FALSE var/faculty = pick(latencies) - var/new_rank = rand(2,5) + var/new_rank = pickweight(PSI_RANK_OPERANT = 100, PSI_RANK_MASTER = 10, PSI_RANK_GRANDMASTER = 1) //weighted so you can still roll grandmaster, but at a really rare chance owner.set_psi_rank(faculty, new_rank) var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) to_chat(owner, span_danger("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) diff --git a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm index 1680a71cf835..b4861f352dde 100644 --- a/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm +++ b/yogstation/code/modules/mob/living/carbon/human/species_types/preternis/preternis.dm @@ -27,6 +27,9 @@ punchstunthreshold = 7 //technically better stunning siemens_coeff = 1.75 //Circuits REALLY don't like extra electricity flying around + latency_chance = 100 + possible_faculties = list(PSI_COERCION) + //organs mutanteyes = /obj/item/organ/eyes/robotic/preternis mutantlungs = /obj/item/organ/lungs/preternis From c51c350b9860c6f61ac2cbf6392ae91b4d25632b Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Tue, 9 Jul 2024 12:01:27 -0400 Subject: [PATCH 060/201] fixes stacking + gives sec mind control --- code/modules/vending/security.dm | 1 + icons/obj/stack_objects.dmi | Bin 51419 -> 52541 bytes yogstation/icons/obj/stack_objects.dmi | Bin 53239 -> 54227 bytes 3 files changed, 1 insertion(+) diff --git a/code/modules/vending/security.dm b/code/modules/vending/security.dm index 9b561e265a5f..9ba62370bf1d 100644 --- a/code/modules/vending/security.dm +++ b/code/modules/vending/security.dm @@ -10,6 +10,7 @@ products = list(/obj/item/clothing/head/helmet/plated = 6, /obj/item/clothing/suit/armor/plated = 6, /obj/item/restraints/handcuffs = 8, + /obj/item/implanter/psi_control = 3, /obj/item/clothing/neck/anti_magic_collar = 3, /obj/item/restraints/handcuffs/cable/zipties = 10, /obj/item/grenade/flashbang = 4, diff --git a/icons/obj/stack_objects.dmi b/icons/obj/stack_objects.dmi index d88ae0e3504d3f3a6c30d792b679a9311c43dd4a..bd3d424f29486e8d915195f07376dc928fcc76a4 100644 GIT binary patch delta 10773 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 G^*;dUsD_IG delta 9642 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 diff --git a/yogstation/icons/obj/stack_objects.dmi b/yogstation/icons/obj/stack_objects.dmi index d1ea574ddcf412850f4f2689c4100c70a48fca1a..507711433823b89089e225b0f27c9e1bec9fc1f6 100644 GIT binary patch delta 12772 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 delta 11776 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

    bKy zKxBmuE?=lnZ*&v<1&K!ONN{L*l4R`~%H=kX=N;)%V#VVB?@8VfvnX+9vK_8S3ke%% cU%()igwd?)EG&(q8-)94sOTtHD_Xt#A7j3M Date: Tue, 9 Jul 2024 11:45:03 -0500 Subject: [PATCH 061/201] awakener --- .../psionics/complexus/complexus_latency.dm | 24 +- .../complexus/complexus_power_cache.dm | 2 + .../tgui/interfaces/PsionicAwakener.js | 69 ++++++ yogstation.dme | 1 + .../code/game/machinery/psionic_awakener.dm | 212 ++++++++++++++++++ 5 files changed, 298 insertions(+), 10 deletions(-) create mode 100644 tgui/packages/tgui/interfaces/PsionicAwakener.js create mode 100644 yogstation/code/game/machinery/psionic_awakener.dm diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index 7d7c977290a2..9ff16a75e867 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -3,16 +3,20 @@ if(!LAZYLEN(latencies) || world.time < next_latency_trigger) return FALSE - if(!prob(trigger_strength)) - next_latency_trigger = world.time + rand(100, 300) - return FALSE + next_latency_trigger = world.time + rand(10 SECONDS, 30 SECONDS) - var/faculty = pick(latencies) - var/new_rank = pickweight(PSI_RANK_OPERANT = 100, PSI_RANK_MASTER = 10, PSI_RANK_GRANDMASTER = 1) //weighted so you can still roll grandmaster, but at a really rare chance - owner.set_psi_rank(faculty, new_rank) - var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) - to_chat(owner, span_danger("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) - next_latency_trigger = world.time + rand(600, 1800) * new_rank if(!redactive) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_strength * 2, trigger_strength * 4)) + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_strength, trigger_strength * 2)) + + if(prob(trigger_strength)) + var/faculty = pick(latencies) + var/new_rank = pickweight(list(PSI_RANK_OPERANT = 100, PSI_RANK_MASTER = 10, PSI_RANK_GRANDMASTER = 1)) //weighted so you can still roll grandmaster, but at a really rare chance + owner.set_psi_rank(faculty, new_rank) + var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) + to_chat(owner, span_danger("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) + next_latency_trigger = world.time + (rand(60 SECONDS, 180 SECONDS) * new_rank) + else if(!redactive) + to_chat(owner, span_danger("Your head throbs as [source] messes with your brain!")) + return FALSE + return TRUE diff --git a/code/modules/psionics/complexus/complexus_power_cache.dm b/code/modules/psionics/complexus/complexus_power_cache.dm index 5ae3f7ac521f..b3476b45eb74 100644 --- a/code/modules/psionics/complexus/complexus_power_cache.dm +++ b/code/modules/psionics/complexus/complexus_power_cache.dm @@ -7,6 +7,8 @@ for(var/faculty in ranks) var/relevant_rank = get_rank(faculty) var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) + if(!faculty_decl) //if it's not initialized yet, come back later + continue for(var/P in faculty_decl.powers) var/datum/psionic_power/power = P if(!power.min_rank) //if a minimum rank wasn't set, it's probably either bad coding or a parent used for typepathing, so don't include it diff --git a/tgui/packages/tgui/interfaces/PsionicAwakener.js b/tgui/packages/tgui/interfaces/PsionicAwakener.js new file mode 100644 index 000000000000..10a9406612e2 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PsionicAwakener.js @@ -0,0 +1,69 @@ +import { useBackend } from '../backend'; +import { Box, Button, LabeledList, ProgressBar, Section, AnimatedNumber } from '../components'; +import { Window } from '../layouts'; + +export const PsionicAwakener = (props, context) => { + const { act, data } = useBackend(context); + + const { + open, + occupant = {}, + occupied, + ready, + timeleft, + } = data; + + return ( + + +

    + {occupant.stat} + + )}> + {!!occupied && ( + <> + + + + {occupant.brainLoss ? 'Abnormal' : 'Healthy'} + + + + )} + + +
    +
    act('door')} /> + )}> +
    + + + ); +}; diff --git a/yogstation.dme b/yogstation.dme index 04c79dc25a8e..3a1c7715da91 100644 --- a/yogstation.dme +++ b/yogstation.dme @@ -4142,6 +4142,7 @@ #include "yogstation\code\game\gamemodes\vampire\vampire_objectives.dm" #include "yogstation\code\game\gamemodes\vampire\vampire_other.dm" #include "yogstation\code\game\gamemodes\vampire\vampire_powers.dm" +#include "yogstation\code\game\machinery\psionic_awakener.dm" #include "yogstation\code\game\machinery\suit_storage_unit.dm" #include "yogstation\code\game\machinery\computer\arcade.dm" #include "yogstation\code\game\machinery\computer\atmos_sim.dm" diff --git a/yogstation/code/game/machinery/psionic_awakener.dm b/yogstation/code/game/machinery/psionic_awakener.dm new file mode 100644 index 000000000000..49237ba73018 --- /dev/null +++ b/yogstation/code/game/machinery/psionic_awakener.dm @@ -0,0 +1,212 @@ +/obj/machinery/psionic_awakener + name = "psionic awakener" + desc = "An enclosed machine used trigger psionic latencies." + icon = 'icons/obj/machines/sleeper.dmi' + icon_state = "sleeper" + base_icon_state = "sleeper" + density = FALSE + state_open = TRUE + circuit = /obj/item/circuitboard/machine/sleeper //remember to change this + clicksound = 'sound/machines/pda_button1.ogg' + + var/enter_message = "You feel cool air surround you. You go numb as your senses turn inward." + var/open_sound = 'sound/machines/podopen.ogg' + var/close_sound = 'sound/machines/podclose.ogg' + + var/trigger_power = 50 + + COOLDOWN_DECLARE(next_trigger) + var/cooldown_duration = 10 SECONDS + +/obj/machinery/psionic_awakener/Initialize(mapload) + . = ..() + occupant_typecache = GLOB.typecache_living + update_appearance(UPDATE_ICON) + +/obj/machinery/psionic_awakener/update_icon_state() + icon_state = "[base_icon_state][state_open ? "-open" : null]" + return ..() + +/obj/machinery/psionic_awakener/container_resist(mob/living/user) + visible_message(span_notice("[occupant] emerges from [src]!"), span_notice("You climb out of [src]!")) + open_machine() + +/obj/machinery/psionic_awakener/Exited(atom/movable/user) + if (!state_open && user == occupant) + container_resist(user) + +/obj/machinery/psionic_awakener/relaymove(mob/user) + if (!state_open) + container_resist(user) + +/obj/machinery/psionic_awakener/open_machine() + if(!state_open && !panel_open) + flick("[base_icon_state]-anim", src) + if(open_sound) + playsound(src, open_sound, 40) + ..() + +/obj/machinery/psionic_awakener/close_machine(mob/user) + if((isnull(user) || istype(user)) && state_open && !panel_open) + flick("[base_icon_state]-anim", src) + ..(user) + var/mob/living/mob_occupant = occupant + if(mob_occupant && mob_occupant.stat != DEAD) + to_chat(occupant, "[enter_message]") + if(close_sound) + playsound(src, close_sound, 40) + +/obj/machinery/psionic_awakener/emp_act(severity) + . = ..() + if (. & EMP_PROTECT_SELF) + return + if(is_operational() && occupant) + open_machine() + +/obj/machinery/psionic_awakener/emag_act(mob/user, obj/item/card/emag/emag_card) + if(obj_flags & EMAGGED) + return FALSE + to_chat(user, span_danger("You disable the safeties of [src]...")) + obj_flags |= EMAGGED + return TRUE + +/obj/machinery/psionic_awakener/MouseDrop_T(mob/target, mob/user) + if(user.stat || !Adjacent(user) || !user.Adjacent(target) || !iscarbon(target) || !user.IsAdvancedToolUser()) + return + if(isliving(user)) + var/mob/living/L = user + if(!(L.mobility_flags & MOBILITY_STAND)) + return + close_machine(target) + +/obj/machinery/psionic_awakener/screwdriver_act(mob/living/user, obj/item/I) + . = TRUE + if(..()) + return + if(occupant) + to_chat(user, span_warning("[src] is currently occupied!")) + return + if(state_open) + to_chat(user, span_warning("[src] must be closed to [panel_open ? "close" : "open"] its maintenance hatch!")) + return + if(default_deconstruction_screwdriver(user, "[base_icon_state]-o", base_icon_state, I)) + return + return FALSE + +/obj/machinery/psionic_awakener/wrench_act(mob/living/user, obj/item/I) + . = ..() + if(default_change_direction_wrench(user, I)) + return TRUE + +/obj/machinery/psionic_awakener/crowbar_act(mob/living/user, obj/item/I) + . = ..() + if(default_pry_open(I)) + return TRUE + if(default_deconstruction_crowbar(I)) + return TRUE + +/obj/machinery/psionic_awakener/default_pry_open(obj/item/I) //wew + . = !(state_open || panel_open || (flags_1 & NODECONSTRUCT_1)) && I.tool_behaviour == TOOL_CROWBAR + if(.) + I.play_tool_sound(src, 50) + visible_message(span_notice("[usr] pries open [src]."), span_notice("You pry open [src].")) + open_machine() + +/obj/machinery/psionic_awakener/ui_state(mob/user) + return GLOB.notcontained_state + +/obj/machinery/psionic_awakener/ui_interact(mob/user, datum/tgui/ui) + ui = SStgui.try_update_ui(user, src, ui) + if(!ui) + ui = new(user, src, "PsionicAwakener", name) + ui.open() + +/obj/machinery/psionic_awakener/AltClick(mob/user) + if(!user.canUseTopic(src, !issilicon(user))) + return + if(state_open) + close_machine() + else + open_machine() + +/obj/machinery/psionic_awakener/examine(mob/user) + . = ..() + . += span_notice("Alt-click [src] to [state_open ? "close" : "open"] it.") + +/obj/machinery/psionic_awakener/ui_data(mob/user) + var/list/data = list() + data["occupied"] = occupant ? 1 : 0 + data["open"] = state_open + data["ready"] = COOLDOWN_FINISHED(src, next_trigger) + data["timeleft"] = (COOLDOWN_TIMELEFT(src, next_trigger))/10 + + data["occupant"] = list() + var/mob/living/mob_occupant = occupant + if(mob_occupant) + data["occupant"]["name"] = mob_occupant.name + switch(mob_occupant.stat) + if(CONSCIOUS) + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "good" + if(SOFT_CRIT) + data["occupant"]["stat"] = "Conscious" + data["occupant"]["statstate"] = "average" + if(UNCONSCIOUS) + data["occupant"]["stat"] = "Unconscious" + data["occupant"]["statstate"] = "average" + if(DEAD) + data["occupant"]["stat"] = "Dead" + data["occupant"]["statstate"] = "bad" + data["occupant"]["health"] = mob_occupant.health + data["occupant"]["maxHealth"] = mob_occupant.maxHealth + data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD + data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) + return data + +/obj/machinery/psionic_awakener/ui_act(action, params) + if(..()) + return + var/mob/living/mob_occupant = occupant + switch(action) + if("door") + if(state_open) + close_machine() + else + open_machine() + . = TRUE + if("activate") + if(!is_operational() || !mob_occupant) + return + + trigger_psionics(mob_occupant) + . = TRUE + +/obj/machinery/psionic_awakener/proc/trigger_psionics(mob/living/mob_occupant) + if(!mob_occupant || !COOLDOWN_FINISHED(src, next_trigger)) + return + COOLDOWN_START(src, next_trigger, cooldown_duration) + + if(!mob_occupant.psi) + visible_message(span_notice("[src] whirrs quietly as it fails to detect any psionic potential.")) + playsound(src, 'sound/effects/psi/power_fail.ogg', 50, TRUE, 2) + return + + if(obj_flags & EMAGGED) + trigger_power = 100 + + if(obj_flags & EMAGGED) + playsound(src, 'sound/effects/gravhit.ogg', 30, TRUE, 5) + visible_message(span_notice("[src] makes some unusual noises.")) + mob_occupant.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_power, trigger_power * 2)) + + if(mob_occupant?.psi?.check_latency_trigger(trigger_power, name)) + visible_message(span_notice("[src] whirrs loudly as it successfully triggers latent psionic abilities in [mob_occupant].")) + playsound(src, 'sound/effects/psi/power_evoke.ogg', 50, TRUE, 2) + playsound(src, 'sound/effects/psi/power_fabrication.ogg', 50, TRUE, 2) + log_admin("[name] triggered psi latencies for [key_name(mob_occupant)].") + message_admins(span_adminnotice("[ADMIN_FLW(name)] triggered psi latencies for [key_name(mob_occupant)].")) + trigger_power = initial(trigger_power) + else + visible_message(span_notice("[src] whirrs quietly as it fails to unlock any psionic potential.")) + playsound(src, 'sound/effects/psi/power_fail.ogg', 50, TRUE, 2) + trigger_power += 10 //little bit of pity, so it's not just rng From 469b2f1b827e979a2499b280ac4d6b319f52c1ce Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 11:47:40 -0500 Subject: [PATCH 062/201] Update psionic_awakener.dm --- yogstation/code/game/machinery/psionic_awakener.dm | 3 --- 1 file changed, 3 deletions(-) diff --git a/yogstation/code/game/machinery/psionic_awakener.dm b/yogstation/code/game/machinery/psionic_awakener.dm index 49237ba73018..445c3602bcd7 100644 --- a/yogstation/code/game/machinery/psionic_awakener.dm +++ b/yogstation/code/game/machinery/psionic_awakener.dm @@ -157,9 +157,6 @@ if(DEAD) data["occupant"]["stat"] = "Dead" data["occupant"]["statstate"] = "bad" - data["occupant"]["health"] = mob_occupant.health - data["occupant"]["maxHealth"] = mob_occupant.maxHealth - data["occupant"]["minHealth"] = HEALTH_THRESHOLD_DEAD data["occupant"]["brainLoss"] = mob_occupant.getOrganLoss(ORGAN_SLOT_BRAIN) return data From c532883756a91cbab5ed92c4cc784e04935f1294 Mon Sep 17 00:00:00 2001 From: Molti Date: Tue, 9 Jul 2024 12:09:58 -0500 Subject: [PATCH 063/201] tweaks --- .../psionics/complexus/complexus_latency.dm | 22 ++++++++++++++----- .../chemistry/reagents/drug_reagents.dm | 7 ++++++ .../tgui/interfaces/PsionicAwakener.js | 8 ++++++- .../code/game/machinery/psionic_awakener.dm | 2 +- 4 files changed, 32 insertions(+), 7 deletions(-) diff --git a/code/modules/psionics/complexus/complexus_latency.dm b/code/modules/psionics/complexus/complexus_latency.dm index 9ff16a75e867..e151f38c6ac1 100644 --- a/code/modules/psionics/complexus/complexus_latency.dm +++ b/code/modules/psionics/complexus/complexus_latency.dm @@ -1,16 +1,28 @@ /datum/psi_complexus/proc/check_latency_trigger(trigger_strength = 0, source, redactive = FALSE) - if(!LAZYLEN(latencies) || world.time < next_latency_trigger) + if(!LAZYLEN(latencies)) return FALSE - next_latency_trigger = world.time + rand(10 SECONDS, 30 SECONDS) + if(!redactive) //don't force it when it's not had time to rest + owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_strength/2, trigger_strength)) + + if(world.time < next_latency_trigger) + return - if(!redactive) - owner.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(trigger_strength, trigger_strength * 2)) + next_latency_trigger = world.time + rand(10 SECONDS, 30 SECONDS) if(prob(trigger_strength)) var/faculty = pick(latencies) - var/new_rank = pickweight(list(PSI_RANK_OPERANT = 100, PSI_RANK_MASTER = 10, PSI_RANK_GRANDMASTER = 1)) //weighted so you can still roll grandmaster, but at a really rare chance + + var/new_rank = PSI_RANK_OPERANT + switch(rand(0, 100)) //i intially tried using a weighted list with pickweight, but i kept getting out of bounds errors for some reason + if(0) //weighted so you can still roll grandmaster, but at a really rare chance + new_rank = PSI_RANK_GRANDMASTER + if(1 to 10) + new_rank = PSI_RANK_MASTER + if(11 to 100) + new_rank = PSI_RANK_OPERANT + owner.set_psi_rank(faculty, new_rank) var/datum/psionic_faculty/faculty_decl = SSpsi.get_faculty(faculty) to_chat(owner, span_danger("You scream internally as your [faculty_decl.name] faculty is forced into operancy by [source]!")) diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index cb6206814fbe..a4808cb49a7c 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -836,6 +836,9 @@ "THE LIGHT THE DARK A STAR IN CHAINS" ) + COOLDOWN_DECLARE(next_trigger) + var/cooldown_duration = 15 SECONDS + /datum/reagent/drug/three_eye/on_mob_metabolize(mob/living/L) ..() ADD_TRAIT(L, TRAIT_XRAY_VISION, type) @@ -869,5 +872,9 @@ M.adjust_jitter(350 SECONDS) if(prob(10)) to_chat(M, span_danger("[pick(overdose_messages)]")) + return + if(!COOLDOWN_FINISHED(src, next_trigger)) + return + COOLDOWN_START(src, next_trigger, cooldown_duration) if(M.psi) M.psi.check_latency_trigger(30, "a Three Eye overdose") diff --git a/tgui/packages/tgui/interfaces/PsionicAwakener.js b/tgui/packages/tgui/interfaces/PsionicAwakener.js index 10a9406612e2..3b5ed70f313c 100644 --- a/tgui/packages/tgui/interfaces/PsionicAwakener.js +++ b/tgui/packages/tgui/interfaces/PsionicAwakener.js @@ -37,6 +37,12 @@ export const PsionicAwakener = (props, context) => { {occupant.brainLoss ? 'Abnormal' : 'Healthy'} + + )} @@ -52,7 +58,7 @@ export const PsionicAwakener = (props, context) => { onClick={() => act('door')} /> )}>

    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 delta 10392 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 diff --git a/icons/obj/implants.dmi b/icons/obj/implants.dmi index bcb69a7c44481c55f579c939e96ca5999a1f4d59..fbfacf07e029f28737d003dc723663147521682b 100644 GIT binary patch delta 2451 zcmV;E32gT46`L0&iBL{Q4GJ0x0000DNk~Le0001>0001h2m=5B0K2`CDF6Th;*lji zHXIxr%m6d>v~lIOfvSmTyNGbWL@mZsHpPWc|Nk@p05kfqW5{zw%6oD1zn0{iX4jBh z|NohhkEN400Yfa-mj7}9{)PbEl}GBEMDL_vr%oCEz@`Cnq5xAx#q#GAJl_0RfE<51St!|NsBY|Nj600H~;_=A%Xb z&RYP?0HbLiTU%S1|Nj9005LH!003qH0RL1}RKUQ%SXNjwF*Owv7kw+t-2eap0d!JM zQvg8b*k%9#0OWd9Sad{Xb7OL8aCB*JZU6vyoRyNne~JPz42I9`QCUju)X8Mq2>=4$t_Hgu;vvg!n$z+x@eX!sdX;zNbrRWJFeiSdh)5m|& zR7wZX*(L|uiielQNe+sx|iD1P5jWY#{5F4f_6vf@vqOFJv z5m0g9LfjL#Vv{r}v|^D!d5Zu0ecz4T`tGvYRJ|XRUhh5f{+{<6clSOei2oSJWu)6c zoy>9qfxd~%JCs1ESWZkf5SPm z{|&Qd-&j8Rroq$a+?>c>W8?&lVnZ;#Ab&pI4_v~GvfU2iE|*Ibn>(*$e%}hWJ7?xC zx0X+@xb5~CgUCDXjM>T)Jv1l_QdFf08e-}LumdMMG^9Wr&J>a2g3*=*3(a>`nHLSd zyK=F6Nru-;-ZQT-RzDuNRuu0ee^fP?fXEQ$SGt$D38C@EHh$(2%Sl z*FEsy`iCCQd*so_yyfQQkK4vSQCnvfeMCJ&0fX2udZ@Thg927FhA=-|f6M@}BareL zjV=PjX_wCj&WK9*z`$4Ku8riJIuojaH&SX z{3ZtIDD*SH>Vx`%D*KG+2Z7)wvTOzEa4*YqdYw*(`?*oJjOQ(Na}@kI!v?vbff-)q z$1P@5nf$Dwi4qCIqM`Kzf37eZeIh^Ng_*_0GseG|QRHyGsm2)I5d-cT~aplIy+MutYwD&F+6b<4;puWYrI+Df-=%h~?wme=N&yj~lRV07wX z1yO$9P`pau9OU;OaD`+a-0{Ynp}yF&|ns@BV1f$De%aF8gd!-_NaeUr0VcWt$8dAhvE~vxBpbWxNc8VA8(U4 zrFw$=yq_e$;`5jEWd#coQ zbaeiAVES{t24R0rN;5$CJsk-9Us9U={y-3zH3tKJf0_){{GebnBiNiSL1BMRN=qmd zf?o*qL(jTFg#9@wp>S(!EBr#BA3{B>$M|6j$Y||@fA%qkJzYZ9Pel+B2n5)p9u`D? z*aC7DYz;)mf4FA_QGZTDkgZ^AS}Mr4zu3l?T(c$2uaN*#!ElcXa{W2f_sUo3&xOL_ za0~bf27_VtuzObV{wN|ru0I!TeTn;X!4PA`0uDpLZt-j5kO*@9IkBWbFu-olK#tj| z1KlAg@N3&I4l$!Db`)079|*U$1cLBB5)8Doh68>jf5CR59r1@!_IC6SKCbE~u;d+u zvoPrQANcbCcw7Lmhl+wc_+UpzhjLuokCUvH`GFz!A3Si-&jJq>hd8MU#^y(GTaIL} zX$FRV9^jYq=b703CN2Ej54--cfJPN_i zF*=zzmp>Bej6_uYA`x0Sjw*2UXaS8AVB(%gf^jx~qV?k|NEhHM1mh78E>5e*iDc#< zO2AYAKZHrfwfl1#ajkte*?1BgOiz*M4y~i3qobpvqobpv^RJ;>`*X?C-Tk>_>Gu9y zb+Vw|NG$!ibis6&@a-{Y{XKkxktKbv@3Hsi+PY%+{i@W%c9%5!b8W}Ej-|sd z*8W^q*WX=T>F|rSKbNlh#nhim-~5AU?$fdVeqWkMdw)<1y+5dYGIG zq+q8`8UNOn{=j_Xk~($|6#r)eN=i!pj{x)@ zCm|srO%oF`C@6OU0gVq2n;#zl005|{sOFi#EU@43C00001bW%=J06^y0W&i*H-;*E%6o1meZo)7O0MK*t6;Zju z)DFsRmkBg+7{7oFF>RzYi5#o2zh4Rx;(`)xw)NuJl4t6B`?K4t&F@Z*NYQwwzSQcY zmf~VG_bFL^O3|a~dcG%-fiZ>EnGm%fDk-#~m@17FXMzFm@x$RYSRc)ZucYWb$Ka>_ z&3fL>pWYHehkuS^_7l*A4s3pyA!Lo6mNl+B9KGeNj_fH7nRR9e791nh<+LfKCy2Nx zZhX_nw=|XN0J?mT3BTBJnW|{vFNJNoiB`_kcE7nD>OXC9$3u65YjOYp2H8nOK~#90 z?U{*t(_|dSSBk9IIltb_#gQWq%NySYY)mI2_c%I7DG6-rF3y ziFhFbDjs+t-Y4FQ-P*1l6LH<-_z!%Kq)nRlO`DEBdwj?j`Yg-0d%vIe_a13dhWVfA zgsi^J&+eCVV*iuC0h?w6CZJyA4;XmzfI+96dRp2Iz;qL*KA%f^v-)Iq-r)Sx8D_{C zXQovE6My>8FlvBYo>#w}=T!vR1%tDPo^|#)=cW^ndQPiAp_+i_3lq*14I4h9*qn9V z$n%F^U}5x61Jrvk1qk^B0(HLi!cqC7$C%9pB^O;hcAS;fozKO85GG;*fjWQu_zC&h zrFphuTk$2AS|?tXZaxynsmlNe>>Byj@n!iV%6}bBhr>~E`4y7}O&&Q#CqPUh36a1~ z%P+dJC_nou=hfF-d)@UnOr17;%8Z#e>I1;yVpBi`U`L~17l`@Huu+z5o5SIpHSng{ zb8fDja?8*eb8k&&Epie7ry>yWDA?^F-{o>Cym|A>7WA)jyYptm4ZsdE?T|nK`EaBZ2n)wr7A`X1Q*B;6^xm2!?xk5?FMHqoqEz!^f^(6$ z3K_;_GWlGv1}NX>^O@uT?8IU7mMyPcQLu8=>igH2A9&F0UCXAt5Z8IuiJ}9*d>`m^ zE}xt0GWkr5Nlw7lvFjgtc*7%)7CiR&6Mx=H^NJ^JrBBs2SQSk)VijU33F3#8eFy;f zd>rRuKtAvC`M?=P37(#?l5N_!VR=EtGqay{xSLzbpW9TgtU%-QSWQTY2vR!jVu(A< zaiIQS6nq@|MFy~$tysxA+{+7`UZ>OHeqoF)>qSe$TtdD?(4;0X;qns+008VXT7Q3l zfa83MeCDNDB_%UUU(PCaIA3u(3bL|FOSV|&)@cDWDFIB>=`X8*xc(6Vr&tA>U$t%> zJ@vJ1wsKqf_U(B)Uf=r0g0eU3^#H_&o;C))*!}|u683?eZ@taFGwt0Gw&Ln)_x66f z-g|#x{U~`pVF;7~vQ$_C)m(77V1NImRQ1*QgR$(S>C3iNZLF?!SLJ;85zChCu2a0D zu~Bmh$N@MQt{Mr&{;MLejQiNKWzQ#zKmF`;cf}Wz`+sR|_$r|Rjb+G?>YlJ16ZU@< zf%WTeEZ^>#v*^2N8){a6&sz7^)iXMj^pmLS`lBLXe^_H(ziRD|o7_u&@_&}))LC@p z(>7pgK7nAzPWI=f8cThPEzi3g>E<^U<__dlAOn;E8gU-Q1DfA$H1Aw$Q91fbsdX)1OjE(m_Vka$v&ANLd0 z3MBujCtuoiLHlh|4++l)6o0-dKM)9pKyqs+7zpSk5chp$zIuPw%7*~07@$=@049L- zZPU(=`H5-|hr{rNgnrRa0NeMA9i-*^DFp~eIyySw3km%a)=%J%b*EdY+)5C84Q z1bRy#Kmu`uHS#q8kb=RWc%%~mv=0c{wDYM2kSfp-jE{jn070nnLw^Fw^9k%H0T3(D zkyZtSTG&3Ci6CDcgMByz0&y>FkHqF+5LY0g3qTM9@biH-Rf^>M+mO^0;YcLX4ql;9 zC?X!}S_MLFElz;X2gDqCM$GreITQ?`FisT(4#OdR6@U>y@cBSIL{Rxk2pK?7+rW5He3I&{hLX1E? z*CYtF9|{Bx{Cxmij)25NB0x;Ed>A4UQ1%=_nve<~TmcUrI2aHG4~avdT>)wRV*>i; z4h)dsw*rDdOdwzP^)Q|<;QfG_FOcffii?j0k97mY_CMG`!hiP%ae!Ll__Ts8AQVJ` zN4?000Ro)>`-J)+0!h8iCw_;b@Q<-n`80w|=QFbQi3FL+mpuxQZ}6mt1{u07Fl5M( zAwz}?88W0p|HPFMKWToKByt12^>yTTks3gLG+iIvGHc$yr;^_t?M~Mh@7%k)yD9hY zDdb0^J<+J9&wtbXWEIG8|C1`Sb5! zLq5D6_!o)%r6TmZ4gqy#&e!@@Gt)lP8TCXv4?|HJ;FI{t{yysAwS1=2-^hqQe#0#pFh0}TKk_JH1i==V^4)IPlfB2%G82{Y_t!lO_cW7r#?*KQvZ z9z9yf(;C3OCz>H&ssLX|?;-S~9_=2c?MsC85@y(ElI{~3_6->_Wav27fAgxaq@$rL QRR91007*qoM6N<$fV=-0C=2@%DoE0FcgO2Ip-=q+Fkrxvq(zG(B6Vna%>LPM3RHvzC*!HbbDWT zTAaGxk8p#hCzmQY!Q!~tl6gtc2#dp>Ok|m(u2XeVhDFnm2~sL7c4V$)y7Sr}pptG} zezHfE%Q6K%*O-g`&zGF$Z@NV{I=I2p8|(l-m@;mxz5oCOU`a$lRCt`_n!#$@N)(2_ zT&|aS026O71MaS55ko=2i`=HKU;Tq52-?@o_Cl&ckoss zAc21e{2B+rlRWP%0_q$Q3j9C7J2eul4cHZ>;7^j*wX6)tYV9BhzT4cZOl81#lA?7K zSoHym#bPPn$8k)v*(8o*TCLVW;a}}Y8{oeJ4=DY>-zGPWqG;J{HtBY|ndPI=Xjum% zw!y2{Y8kLtES7N`)9dvBn9t`-r&9og5KO02)biIfLbv6mwx&Q7MN0(?fTN=$!Z4)M z>8!5{!;nU!0kAg0_x(yuFog$=2xvB&z)N@`#6SokFZlpWgb>`^+?+QW4MwBU#xyBQ zHt?`z6o{f|+3j|De0)R*!E81|2r*y zLJVfJ8NTnA5(P?&%fkvD42Qu)PpnLMN)C7#4U-MubD~tZOIg8##!N7dW5O_0Pf5VT z)S;SDiZXKji&AV159U+hb5?*^6{szL_3-duc~U?r^xNLuqM`IrZK4qUl>Fw%gx3Vo@K2DDnO1KEqW+ifl{FTW*4atKr_lkW#X z5PTmFhs$=mO|RE0G#e}%9t`?`!~{76%3)8A1QTEq1i>c>UsM|K;pT7aOZ!>C_k95F z@9#M~JIicQ6~0L8Yr+<9uoGP!j{-4-q|J;8Lfa zce3r8y*5BcJ8i(J=l#qnI{_}XMZr!RFb;zEMek9H0Xn%?mhz$^OFJC_swDV02;R%^ zXEmG5O#|l!=;oel*`~wZM1ZaK&VW?-hrn&#`himeOmeR-+N%gKZGG4y12W({I!kBH z46t#(WPR4TXs04z(t~JiO5N&C(Y5Y93mfp7p|8|^tJL2?GyI{T z0k1sgSK+VuANsRN16VDKD?2z+mA3u{_zRo*jSW!XFOpO1klQtQFf15nIwu`&t^qZK zcOG@7^MKmGyQ(|a0A-u%HmQ8C;6Wn-QYP#bJZPps)f<+IN>91kZH{J)`ETP75>i#B k9MsSNs5a$lmjYGmH`+|ic_SaQdH?_b07*qoM6N<$g7}ze)&Kwi literal 0 HcmV?d00001 diff --git a/icons/obj/shards.dmi b/icons/obj/shards.dmi index 94d1602fa007f3f19429bb2636cdfee21d000923..c4b6b618c45a6ed0ad302cd638d5e95b4f025dbd 100644 GIT binary patch literal 5574 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 diff --git a/icons/obj/weapons/longsword.dmi b/icons/obj/weapons/longsword.dmi index a8f7496ac45040e2c50d6fe02ca16d4947d7150e..7bba8e2b055c4ea6bb41d07db04e934eb60d9b0f 100644 GIT binary patch delta 4967 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 a5=5uZEVn8I2a?9B0Cg43rxnT;q5lVT2cUld literal 5308 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 diff --git a/sound/effects/psi_power_evoke.ogg b/sound/effects/psi_power_evoke.ogg new file mode 100644 index 0000000000000000000000000000000000000000..37d9c5a54013c3f97e6d31c13280cb109c0da40d GIT binary patch literal 17986 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 literal 0 HcmV?d00001 diff --git a/sound/effects/psi_power_feedback.ogg b/sound/effects/psi_power_feedback.ogg new file mode 100644 index 0000000000000000000000000000000000000000..139dfba0bd46f08a965336a900a1ba0f9c23c8d6 GIT binary patch literal 77856 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 =OOI`8Z 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 literal 0 HcmV?d00001 diff --git a/sound/effects/psi_power_unlock.ogg b/sound/effects/psi_power_unlock.ogg new file mode 100644 index 0000000000000000000000000000000000000000..3ba24f81b38d3c513c863d82470bcf4a4b11ca62 GIT binary patch literal 30877 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�ZG_85Kb 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 Qm Date: Fri, 5 Jul 2024 15:49:02 -0400 Subject: [PATCH 002/201] fucking sounds --- .../{psi_power_evoke.ogg => psi/power_evoke.ogg} | Bin .../power_fabrication.ogg} | Bin .../{psi_power_fail.ogg => psi/power_fail.ogg} | Bin .../power_feedback.ogg} | Bin .../{psi_power_unlock.ogg => psi/power_unlock.ogg} | Bin .../{psi_power_used.ogg => psi/power_used.ogg} | Bin sound/effects/{ => psi}/psisword.ogg | Bin 7 files changed, 0 insertions(+), 0 deletions(-) rename sound/effects/{psi_power_evoke.ogg => psi/power_evoke.ogg} (100%) rename sound/effects/{psi_power_fabrication.ogg => psi/power_fabrication.ogg} (100%) rename sound/effects/{psi_power_fail.ogg => psi/power_fail.ogg} (100%) rename sound/effects/{psi_power_feedback.ogg => psi/power_feedback.ogg} (100%) rename sound/effects/{psi_power_unlock.ogg => psi/power_unlock.ogg} (100%) rename sound/effects/{psi_power_used.ogg => psi/power_used.ogg} (100%) rename sound/effects/{ => psi}/psisword.ogg (100%) diff --git a/sound/effects/psi_power_evoke.ogg b/sound/effects/psi/power_evoke.ogg similarity index 100% rename from sound/effects/psi_power_evoke.ogg rename to sound/effects/psi/power_evoke.ogg diff --git a/sound/effects/psi_power_fabrication.ogg b/sound/effects/psi/power_fabrication.ogg similarity index 100% rename from sound/effects/psi_power_fabrication.ogg rename to sound/effects/psi/power_fabrication.ogg diff --git a/sound/effects/psi_power_fail.ogg b/sound/effects/psi/power_fail.ogg similarity index 100% rename from sound/effects/psi_power_fail.ogg rename to sound/effects/psi/power_fail.ogg diff --git a/sound/effects/psi_power_feedback.ogg b/sound/effects/psi/power_feedback.ogg similarity index 100% rename from sound/effects/psi_power_feedback.ogg rename to sound/effects/psi/power_feedback.ogg diff --git a/sound/effects/psi_power_unlock.ogg b/sound/effects/psi/power_unlock.ogg similarity index 100% rename from sound/effects/psi_power_unlock.ogg rename to sound/effects/psi/power_unlock.ogg diff --git a/sound/effects/psi_power_used.ogg b/sound/effects/psi/power_used.ogg similarity index 100% rename from sound/effects/psi_power_used.ogg rename to sound/effects/psi/power_used.ogg diff --git a/sound/effects/psisword.ogg b/sound/effects/psi/psisword.ogg similarity index 100% rename from sound/effects/psisword.ogg rename to sound/effects/psi/psisword.ogg From a35a75d279ff5a31cda0eb691a836f5bd8521566 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 16:45:35 -0400 Subject: [PATCH 003/201] fuck --- code/game/objects/items/implants/implant_psi.dm | 7 +++---- code/modules/mob/living/carbon/carbon_defense.dm | 2 +- code/modules/projectiles/projectile/bullets/shotgun.dm | 6 +++--- code/modules/psionics/complexus/complexus_helpers.dm | 4 ++-- code/modules/psionics/equipment/cerebro_enhancers.dm | 10 ---------- code/modules/psionics/equipment/psipower_blade.dm | 2 +- code/modules/psionics/events/mini_spasms.dm | 4 ++-- code/modules/psionics/faculties/coercion.dm | 6 +++--- code/modules/psionics/faculties/energistics.dm | 6 +++--- code/modules/psionics/interfaces/ui_hub.dm | 1 + .../reagents/chemistry/reagents/drug_reagents.dm | 10 +++++----- code/modules/research/designs/autolathe_designs.dm | 6 +++--- 12 files changed, 27 insertions(+), 37 deletions(-) diff --git a/code/game/objects/items/implants/implant_psi.dm b/code/game/objects/items/implants/implant_psi.dm index 38641fea5718..36a5daddac1a 100644 --- a/code/game/objects/items/implants/implant_psi.dm +++ b/code/game/objects/items/implants/implant_psi.dm @@ -2,7 +2,6 @@ name = "psi dampener implant" desc = "A safety implant for registered psi-operants." implant_color = "n" - activated = FALSE var/overload = 0 var/max_overload = 100 @@ -66,10 +65,10 @@ /obj/item/implant/psi_control/proc/get_psi_mode() if(psi_mode == PSI_IMPLANT_AUTOMATIC) - switch(get_security_level()) - if("green") + switch(SSsecurity_level.get_current_level_as_number()) + if(SEC_LEVEL_GREEN) return PSI_IMPLANT_SHOCK - if("blue") + if(SEC_LEVEL_BLUE) return PSI_IMPLANT_WARN else return PSI_IMPLANT_LOG diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index e4b980451feb..1a391b4f60f2 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -706,7 +706,7 @@ spawn_gibs() /// Causes the mob to have a seizure -/mob/living/carbon/proc/seizure(unconscious = 20 SECONDS, jitter = 1 SECONDS) +/mob/living/carbon/proc/seizure(unconscious = 20 SECONDS) visible_message(span_danger("[src] starts having a seizure!")) Unconscious(unconscious) SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "seizure", /datum/mood_event/epilepsy) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index d6db7b80a38c..7211a4c7edaf 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -224,16 +224,16 @@ armour_penetration = -40 // Energy armor is usually very low so uhh -/obj/item/projectile/bullet/pellet/nullglass +/obj/projectile/bullet/pellet/nullglass name = "nullglass pellet" damage = 6 wound_bonus = 3 bare_wound_bonus = 3 -/obj/item/projectile/bullet/pellet/nullglass/disrupts_psionics() +/obj/projectile/bullet/pellet/nullglass/disrupts_psionics() return src -/obj/item/projectile/bullet/pellet/nullglass/on_hit(atom/target) +/obj/projectile/bullet/pellet/nullglass/on_hit(atom/target) . = ..() if(prob(10)) var/obj/item/implant/nullglass/imp = new() diff --git a/code/modules/psionics/complexus/complexus_helpers.dm b/code/modules/psionics/complexus/complexus_helpers.dm index 5f594ea50263..b3619f15d8b1 100644 --- a/code/modules/psionics/complexus/complexus_helpers.dm +++ b/code/modules/psionics/complexus/complexus_helpers.dm @@ -21,11 +21,11 @@ last_armor_check = 0 return 0 -/datum/psi_complexus/proc/handle_block_chance(obj/item/projectile/projectile) +/datum/psi_complexus/proc/handle_block_chance(obj/projectile/projectile) var/effective_rank var/chance = 0 - if(istype(projectile, /obj/item/projectile/beam) || istype(projectile, /obj/item/projectile/energy)) + if(istype(projectile, /obj/projectile/beam) || istype(projectile, /obj/projectile/energy)) effective_rank = get_rank(PSI_ENERGISTICS) else effective_rank = get_rank(PSI_PSYCHOKINESIS) diff --git a/code/modules/psionics/equipment/cerebro_enhancers.dm b/code/modules/psionics/equipment/cerebro_enhancers.dm index a4281257649f..2f1fc1dab96e 100644 --- a/code/modules/psionics/equipment/cerebro_enhancers.dm +++ b/code/modules/psionics/equipment/cerebro_enhancers.dm @@ -27,9 +27,6 @@ integrate() return - if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) - to_chat(user, span_notice("You have no clue how to use this!")) - var/choice = input("Select a brainboard to install or remove.","Psionic Amplifier") as null|anything in SSpsi.faculties_by_name if(!choice) return @@ -64,9 +61,6 @@ var/mob/living/carbon/human/H = loc if(!istype(H)) return - if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) - to_chat(H, span_notice("You have no clue how to use this!")) - to_chat(H, span_warning("You feel a strange tugging sensation as \the [src] begins removing the slave-minds from your brain...")) playsound(H, 'sound/weapons/circsawhit.ogg', 50, 1, -1) @@ -105,10 +99,6 @@ to_chat(usr, span_warning("\The [src] must be worn on your head in order to be activated.")) return - if(paramount_check && !H?.mind?.has_antag_datum(/datum/antagonist/paramount)) - to_chat(H, span_notice("You have no clue how to use this!")) - return - if(LAZYLEN(boosted_faculties) < max_boosted_faculties) to_chat(usr, span_notice("You still have [max_boosted_faculties - LAZYLEN(boosted_faculties)] facult[LAZYLEN(boosted_faculties) == 1 ? "y" : "ies"] to select. Use \the [src] in-hand to select them.")) return diff --git a/code/modules/psionics/equipment/psipower_blade.dm b/code/modules/psionics/equipment/psipower_blade.dm index 9a3071dc15f4..340ccbd84945 100644 --- a/code/modules/psionics/equipment/psipower_blade.dm +++ b/code/modules/psionics/equipment/psipower_blade.dm @@ -6,7 +6,7 @@ item_state = "psiblade" lefthand_file = 'icons/mob/inhands/weapons/swords_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' - hitsound = 'sound/weapons/psisword.ogg' + hitsound = 'sound/effects/psi/psisword.ogg' var/can_break_wall = FALSE var/wall_break_time = 6 SECONDS diff --git a/code/modules/psionics/events/mini_spasms.dm b/code/modules/psionics/events/mini_spasms.dm index 47fdfc4b3b6d..6cc4b236cc93 100644 --- a/code/modules/psionics/events/mini_spasms.dm +++ b/code/modules/psionics/events/mini_spasms.dm @@ -46,11 +46,11 @@ to_chat(victim, span_danger("A hauntingly familiar sound hisses from \icon[source] \the [source], and your vision flickers!")) victim.psi.backblast(rand(5,15)) victim.Paralyze(0.5 SECONDS) - victim.Jitter(10 SECONDS) + victim.adjust_jitter(10 SECONDS) else victim.visible_message(span_danger("[victim] starts having a seizure!"), span_userdanger("An indescribable, brain-tearing sound hisses from \icon[source] \the [source], and you collapse in a seizure!")) victim.Unconscious(20 SECONDS) - victim.Jitter(1 SECONDS) + victim.adjust_jitter(1 SECONDS) SEND_SIGNAL(victim, COMSIG_ADD_MOOD_EVENT, "minispasm", /datum/mood_event/epilepsy) var/new_latencies = rand(2,4) var/list/faculties = list(PSI_COERCION, PSI_REDACTION, PSI_ENERGISTICS, PSI_PSYCHOKINESIS) diff --git a/code/modules/psionics/faculties/coercion.dm b/code/modules/psionics/faculties/coercion.dm index 6912c5c6b47e..d700deab26ba 100644 --- a/code/modules/psionics/faculties/coercion.dm +++ b/code/modules/psionics/faculties/coercion.dm @@ -39,7 +39,7 @@ M.emote("scream") to_chat(M, span_danger("Your senses are blasted into oblivion by a psionic scream!")) M.blind_eyes(1 SECONDS) - M.confused = rand(3,8) + M.adjust_confusion(10 SECONDS) return TRUE /datum/psionic_power/coercion/mindread @@ -286,10 +286,10 @@ target.SetParalyzed(0) if(coercion_rank >= PSI_RANK_PARAMOUNT) target.SetParalyzed(0) - target.drowsyness = 0 + target.SetDaze(0) if(istype(target, /mob/living/carbon)) var/mob/living/carbon/M = target - M.hallucination = max(M.hallucination, 10) + M.adjust_hallucinations(60 SECONDS) return TRUE /datum/psionic_power/coercion/commune diff --git a/code/modules/psionics/faculties/energistics.dm b/code/modules/psionics/faculties/energistics.dm index 282fc52a67de..7869913be6c0 100644 --- a/code/modules/psionics/faculties/energistics.dm +++ b/code/modules/psionics/faculties/energistics.dm @@ -72,13 +72,13 @@ to_chat(user, span_notice("You manage to stop yourself before firing a harmful laser from your eyes, you don't want to risk harming anyone...")) var/user_rank = user.psi.get_rank(faculty) - var/obj/item/projectile/pew + var/obj/projectile/pew var/pew_sound if(user.psi.zorch_harm) - pew = new /obj/item/projectile/beam/laser(get_turf(user)) + pew = new /obj/projectile/beam/laser(get_turf(user)) else - pew = new /obj/item/projectile/beam/disabler(get_turf(user)) + pew = new /obj/projectile/beam/disabler(get_turf(user)) switch(user_rank) if(PSI_RANK_PARAMOUNT) diff --git a/code/modules/psionics/interfaces/ui_hub.dm b/code/modules/psionics/interfaces/ui_hub.dm index d23ee62e72a8..23d5daffc9b1 100644 --- a/code/modules/psionics/interfaces/ui_hub.dm +++ b/code/modules/psionics/interfaces/ui_hub.dm @@ -27,6 +27,7 @@ START_PROCESSING(SSprocessing, src) /obj/screen/psi/hub/update_icon() + ..() if(!owner.psi) return cut_overlays() diff --git a/code/modules/reagents/chemistry/reagents/drug_reagents.dm b/code/modules/reagents/chemistry/reagents/drug_reagents.dm index 9c13794ba687..cb6206814fbe 100644 --- a/code/modules/reagents/chemistry/reagents/drug_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/drug_reagents.dm @@ -849,13 +849,13 @@ ..() /datum/reagent/drug/three_eye/on_mob_life(mob/living/carbon/M) - M.hallucination += 50 - M.Jitter(3) - M.Dizzy(3) + M.adjust_hallucinations_up_to(10 SECONDS, 50 SECONDS) + M.adjust_jitter(3 SECONDS) + M.adjust_dizzy(3 SECONDS) if(prob(0.1)) M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) M.Unconscious(100) - M.Jitter(350) + M.adjust_jitter(350 SECONDS) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, rand(8, 12)) if(prob(5)) to_chat(M, span_warning("[pick(dose_messages)]")) @@ -866,7 +866,7 @@ if(prob(10)) M.visible_message(span_danger("[M] starts having a seizure!"), span_userdanger("You have a seizure!")) M.Unconscious(100) - M.Jitter(350) + M.adjust_jitter(350 SECONDS) if(prob(10)) to_chat(M, span_danger("[pick(overdose_messages)]")) if(M.psi) diff --git a/code/modules/research/designs/autolathe_designs.dm b/code/modules/research/designs/autolathe_designs.dm index 985fac9132d1..8fea0f94deea 100644 --- a/code/modules/research/designs/autolathe_designs.dm +++ b/code/modules/research/designs/autolathe_designs.dm @@ -965,14 +965,14 @@ build_path = /obj/item/ammo_casing/a357 category = list("hacked", "Security") -/obj/item/projectile/bullet/a357/nullglass +/obj/projectile/bullet/a357/nullglass name = ".357 NULL bullet" damage = 30 -/obj/item/projectile/bullet/a357/nullglass/disrupts_psionics() +/obj/projectile/bullet/a357/nullglass/disrupts_psionics() return src -/obj/item/projectile/bullet/a357/nullglass/on_hit(atom/target) +/obj/projectile/bullet/a357/nullglass/on_hit(atom/target) . = ..() if(prob(50)) var/obj/item/implant/nullglass/imp = new() From e5f376d8ec992157e4ce842feeaf216009a641f2 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 16:47:25 -0400 Subject: [PATCH 004/201] adjusts latency --- code/modules/mob/living/carbon/human/_species.dm | 4 ++-- .../modules/mob/living/carbon/human/species_types/ethereal.dm | 3 ++- 2 files changed, 4 insertions(+), 3 deletions(-) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index 2223745fd3a4..eaa03228dbc5 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -212,9 +212,9 @@ GLOBAL_LIST_EMPTY(features_by_species) // Psi Stuff /// Prob chance that mobs of this species have latent psionics - var/latency_chance = 1 + var/latency_chance = 15 /// List of faculties that can be chosen for random psionics - var/possable_faculties = list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS) + var/possible_faculties = list(PSI_COERCION, PSI_PSYCHOKINESIS, PSI_REDACTION, PSI_ENERGISTICS) /// What level starting faculties are at var/starting_psi_level = PSI_RANK_LATENT diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index aac9233eef42..98ac075a8434 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -37,7 +37,8 @@ hair_color = "fixedmutcolor" hair_alpha = 140 swimming_component = /datum/component/swimming/ethereal - possable_faculties = list(PSI_ENERGISTICS) + possible_faculties = list(PSI_ENERGISTICS) + latency_chance = 25 wings_icon = "Ethereal" wings_detail = "Etherealdetails" From 4e773fd6c6b5201bf7a1f6ea819e52b78cf2b289 Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 16:50:09 -0400 Subject: [PATCH 005/201] possible --- code/modules/mob/living/carbon/human/_species.dm | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/code/modules/mob/living/carbon/human/_species.dm b/code/modules/mob/living/carbon/human/_species.dm index eaa03228dbc5..58fe6e10a083 100644 --- a/code/modules/mob/living/carbon/human/_species.dm +++ b/code/modules/mob/living/carbon/human/_species.dm @@ -513,7 +513,7 @@ GLOBAL_LIST_EMPTY(features_by_species) C.add_movespeed_modifier(MOVESPEED_ID_SPECIES, TRUE, 100, override=TRUE, multiplicative_slowdown=speedmod, movetypes=(~FLYING)) if(!C.psi && prob(latency_chance)) - C.set_psi_rank(pick(possable_faculties), starting_psi_level) + C.set_psi_rank(pick(possible_faculties), starting_psi_level) C.regenerate_icons() SEND_SIGNAL(C, COMSIG_SPECIES_GAIN, src, old_species) From 1eff43326dfa148009959a35f7aff042c2481b0f Mon Sep 17 00:00:00 2001 From: cowbot92 Date: Fri, 5 Jul 2024 18:09:49 -0400 Subject: [PATCH 006/201] only intents left --- code/__DEFINES/modular_computer.dm | 1 + .../game/objects/items/stacks/sheets/glass.dm | 2 +- .../file_system/programs/psi_monitor.dm | 146 +++++++++--------- .../ammunition/ballistic/revolver.dm | 2 +- .../ammunition/ballistic/shotgun.dm | 2 +- .../psionics/complexus/complexus_helpers.dm | 2 +- code/modules/psionics/faculties/coercion.dm | 13 -- icons/obj/machines/psimeter.dmi | Bin 0 -> 1213 bytes yogstation.dme | 1 - 9 files changed, 79 insertions(+), 90 deletions(-) create mode 100644 icons/obj/machines/psimeter.dmi diff --git a/code/__DEFINES/modular_computer.dm b/code/__DEFINES/modular_computer.dm index 60ccaac8473c..613a2a26fa9f 100644 --- a/code/__DEFINES/modular_computer.dm +++ b/code/__DEFINES/modular_computer.dm @@ -29,6 +29,7 @@ #define PROGRAM_CATEGORY_ENGINEERING "Engineering" #define PROGRAM_CATEGORY_SUPPLY "Supply" #define PROGRAM_CATEGORY_SCIENCE "Science" +#define PROGRAM_CATEGORY_CREW "Crew" ///The default amount a program should take in cell use. #define PROGRAM_BASIC_CELL_USE 15 diff --git a/code/game/objects/items/stacks/sheets/glass.dm b/code/game/objects/items/stacks/sheets/glass.dm index 1c865231f7d2..0c881007a844 100644 --- a/code/game/objects/items/stacks/sheets/glass.dm +++ b/code/game/objects/items/stacks/sheets/glass.dm @@ -262,7 +262,7 @@ GLOBAL_LIST_INIT(nullglass_recipes, list ( \ item_state = "sheet-nullglass" materials = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) merge_type = /obj/item/stack/sheet/nullglass - grind_results = list(/datum/reagent/crystal = 1) + grind_results = list(/datum/reagent/water/holywater = 1) matter_amount = 4 /obj/item/stack/sheet/nullglass/fifty diff --git a/code/modules/modular_computers/file_system/programs/psi_monitor.dm b/code/modules/modular_computers/file_system/programs/psi_monitor.dm index 96e5c1daea96..189bb374e149 100644 --- a/code/modules/modular_computers/file_system/programs/psi_monitor.dm +++ b/code/modules/modular_computers/file_system/programs/psi_monitor.dm @@ -1,104 +1,99 @@ +/obj/machinery/psi_monitor + name = "psionic implant monitor" + icon = 'icons/obj/machines/psimeter.dmi' + icon_state = "meter_on" + anchored = TRUE + density = TRUE + opacity = FALSE + req_access = list(list(ACCESS_PSYCH, ACCESS_CAPTAIN, ACCESS_CMO, ACCESS_HOS)) -/datum/computer_file/program/psimonitor - filename = "psimonitor" - filedesc = "Psi Monitor" - category = PROGRAM_CATEGORY_CREW - program_icon_state = "comm_monitor" - extended_desc = "This program monitors and configures implanted psi monitors." - size = 6 - requires_ntnet = TRUE - usage_flags = PROGRAM_CONSOLE | PROGRAM_LAPTOP | PROGRAM_TABLET | PROGRAM_PHONE | PROGRAM_TELESCREEN - transfer_access = ACCESS_MEDICAL - available_on_ntnet = TRUE - tgui_id = "NtosPsiMonitor" - var/obj/item/implant/psi_control/selected_implant + var/list/psi_violations = list() var/show_violations = FALSE var/authorized + /obj/machinery/psi_monitor/New() SSpsi.psi_monitors += src ..() -/obj/machinery/psi_monitor/emag_act(var/remaining_charges, var/mob/user) - if(!emagged) - emagged = TRUE - remaining_charges-- - req_one_access.Cut() - to_chat(user, "You short out the access protocols.") - return TRUE - return FALSE - -/datum/computer_file/program/psimonitor/ui_act(action, params) - if(..()) - return - computer.play_interact_sound() - switch(action) - if("login") - var/obj/item/card/id/ID = usr.GetID() - if(!ID || (transfer_access in ID.GetAccess())) - to_chat(usr, span_warning("Access denied.")) +/obj/machinery/psi_monitor/emag_act(remaining_charges, mob/user) + if(obj_flags & EMAGGED) + return FALSE + obj_flags |= EMAGGED + remaining_charges-- + req_access.Cut() + to_chat(user, span_notice("You short out the access protocols.")) + return TRUE + + +/obj/machinery/psi_monitor/Topic(href, href_list) + + . = ..() + if(!.) + + if(href_list["login"]) + + var/obj/item/card/id/ID = usr.get_idcard() + if(!ID || !allowed(usr)) + to_chat(usr, span_notice("Access denied.")) else authorized = "[ID.registered_name] ([ID.assignment])" - return TRUE - if("logout") + . = 1 + + else if(href_list["logout"]) authorized = FALSE - return TRUE - if("change_mode") - selected_implant.psi_mode = input("Select a new implant mode.", "Psi Dampener") as null|anything in list(PSI_IMPLANT_AUTOMATIC, PSI_IMPLANT_SHOCK, PSI_IMPLANT_WARN, PSI_IMPLANT_LOG, PSI_IMPLANT_DISABLED) - return TRUE - /* - if("remove_violation") + . = 1 + + else if(href_list["show_violations"]) + show_violations = (href_list["show_violations"] == "1") + . = 1 + + else if(href_list["remove_violation"]) var/remove_ind = text2num(href_list["remove_violation"]) - if(remove_ind > 0 && remove_ind <= psi_violations.len) + if(remove_ind > 0 && remove_ind <= length(psi_violations)) psi_violations.Cut(remove_ind, remove_ind++) - return TRUE - */ - if("change_mode") - selected_implant.psi_mode = input("Select a new implant mode.", "Psi Dampener") as null|anything in list(PSI_IMPLANT_AUTOMATIC, PSI_IMPLANT_SHOCK, PSI_IMPLANT_WARN, PSI_IMPLANT_LOG, PSI_IMPLANT_DISABLED) - return TRUE -/datum/computer_file/program/psimonitor/ui_data(mob/user) - if(!SSnetworks.station_network) - return - var/list/data = get_header_data() - data["authorized"] = authorized - data["ntnetrelays"] = SSnetworks.station_network.relays.len - data["idsstatus"] = SSnetworks.station_network.intrusion_detection_enabled - data["idsalarm"] = SSnetworks.station_network.intrusion_detection_alarm - data["config_softwaredownload"] = SSnetworks.station_network.setting_softwaredownload - data["config_peertopeer"] = SSnetworks.station_network.setting_peertopeer - data["config_communication"] = SSnetworks.station_network.setting_communication - data["config_systemcontrol"] = SSnetworks.station_network.setting_systemcontrol - data["logs"] = list() - if(selected_implant.logs) - data["logs"] = selected_implant.logs - for(var/i in SSnetworks.station_network.logs) - data["ntnetlogs"] += list(list("entry" = i)) - data["ntnetmaxlogs"] = SSnetworks.station_network.setting_maxlogcount - -/obj/machinery/psi_monitor/interact(var/mob/user) + . = 1 + + else if(href_list["change_mode"]) + var/obj/item/implant/psi_control/implant = locate(href_list["change_mode"]) + if(implant.imp_in) + var/choice = input("Select a new implant mode.", "Psi Dampener") as null|anything in list(PSI_IMPLANT_AUTOMATIC, PSI_IMPLANT_SHOCK, PSI_IMPLANT_WARN, PSI_IMPLANT_LOG, PSI_IMPLANT_DISABLED) + if(choice && implant && implant.imp_in) + implant.psi_mode = choice + implant.update_functionality() + . = 1 + + if(. && usr) + interact(usr) + +/obj/machinery/psi_monitor/ui_interact(mob/user) + interact(user) + return TRUE + +/obj/machinery/psi_monitor/interact(mob/user) + var/list/dat = list() dat += "