From 0a467a82461868dee1202b2aaeef233bd154faf4 Mon Sep 17 00:00:00 2001 From: Iamgoofball Date: Tue, 18 Mar 2025 20:59:55 -0700 Subject: [PATCH] [SEMI-MODULAR] Adds the Psionic Holding cosmetic quirk for roleplaying species with light psionic abilities (#3133) ## About The Pull Request Adds the Psionic Holding cosmetic quirk for roleplaying species with light psionic abilities ![jN4yXpEwRc](https://github.com/user-attachments/assets/ef5272ab-088f-423e-9c66-f0c76a7ce085) https://github.com/user-attachments/assets/2c588eb5-81ee-45f9-a375-3f1808d05c30 ## Why It's Good For The Game Allows for people to roleplay alien species with light psionic abilities who might hold stuff with telekinesis. ## Proof Of Testing look above ## Changelog :cl: Iamgoofball and ChildrenOfTheSun add: Adds the Psionic Holding cosmetic quirk for roleplaying species with light psionic abilities /:cl: --------- Co-authored-by: The Sharkening <95130227+StrangeWeirdKitten@users.noreply.github.com> --- .../~~bubber_defines/traits/declarations.dm | 3 + code/_globalvars/traits/_traits.dm | 2 + code/_globalvars/traits/admin_tooling.dm | 1 + code/modules/mob/living/carbon/human/human.dm | 9 ++ .../mob/living/carbon/human/human_defines.dm | 6 + .../living/carbon/human/human_update_icons.dm | 128 +++++++++++++++++- ...creenshot_humanoids__datum_species_pod.png | Bin 1120 -> 1120 bytes ...t_humanoids__datum_species_pod_podweak.png | Bin 1120 -> 1120 bytes .../icons/effects/tele_effects.dmi | Bin 8167 -> 11066 bytes .../quirks/positive_quirks/floating_items.dm | 52 +++++++ tgstation.dme | 1 + .../character_preferences/floating_hands.tsx | 6 + 12 files changed, 205 insertions(+), 3 deletions(-) create mode 100644 modular_zubbers/code/datums/quirks/positive_quirks/floating_items.dm create mode 100644 tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/floating_hands.tsx diff --git a/code/__DEFINES/~~bubber_defines/traits/declarations.dm b/code/__DEFINES/~~bubber_defines/traits/declarations.dm index 4c562e5747f..6b6c9ab69ab 100644 --- a/code/__DEFINES/~~bubber_defines/traits/declarations.dm +++ b/code/__DEFINES/~~bubber_defines/traits/declarations.dm @@ -36,3 +36,6 @@ // makes it so cult cannot get another blood stone from this mob #define TRAIT_HAS_BEEN_CULT_SACRIFICED "has_been_cult_sacrificed" +// makes it so held items float by their head +#define TRAIT_FLOATING_HELD "held_items_float" + diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 94e5b668294..8375d8b1bcd 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -850,6 +850,8 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA, "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, "TRAIT_CLOTHES_DAMAGED_BY_PIERCING" = TRAIT_CLOTHES_DAMAGED_BY_PIERCING, + "TRAIT_FLOATING_HELD" = TRAIT_FLOATING_HELD, + ), // SKYRAT EDIT ADDITION END )) diff --git a/code/_globalvars/traits/admin_tooling.dm b/code/_globalvars/traits/admin_tooling.dm index 9e7594138d3..02c0bb4a1fc 100644 --- a/code/_globalvars/traits/admin_tooling.dm +++ b/code/_globalvars/traits/admin_tooling.dm @@ -485,6 +485,7 @@ GLOBAL_LIST_INIT(admin_visible_traits, list( "TRAIT_XENO_HEAL_AURA" = TRAIT_XENO_HEAL_AURA, "TRAIT_XENO_INNATE" = TRAIT_XENO_INNATE, "TRAIT_CLOTHES_DAMAGED_BY_PIERCING" = TRAIT_CLOTHES_DAMAGED_BY_PIERCING, + "TRAIT_FLOATING_HELD" = TRAIT_FLOATING_HELD, ), // SKYRAT EDIT ADDITION END )) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 136c07f06f5..b92fbc7ac17 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -69,6 +69,15 @@ if (mob_mood) QDEL_NULL(mob_mood) + // BUBBER EDIT START + if(held_left) + held_left.UnregisterSignal(src, COMSIG_ATOM_DIR_CHANGE) + QDEL_NULL(held_left) + if(held_right) + held_right.UnregisterSignal(src, COMSIG_ATOM_DIR_CHANGE) + QDEL_NULL(held_right) + // BUBBER EDIT END + return ..() /mob/living/carbon/human/prepare_data_huds() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 97626d33c54..3346a07513c 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -101,3 +101,9 @@ VAR_PRIVATE/base_mob_height = HUMAN_HEIGHT_MEDIUM /// Actual height of the mob. Don't touch this one, it is set via update_mob_height() VAR_FINAL/mob_height = HUMAN_HEIGHT_MEDIUM + + // BUBBER EDIT START - Floating Hands quirk + var/obj/effect/abstract/held_tk_effect/left/held_left + var/obj/effect/abstract/held_tk_effect/right/held_right + var/held_hover_color + // BUBBER EDIT END diff --git a/code/modules/mob/living/carbon/human/human_update_icons.dm b/code/modules/mob/living/carbon/human/human_update_icons.dm index 41c0a57ca80..54c07bc3049 100644 --- a/code/modules/mob/living/carbon/human/human_update_icons.dm +++ b/code/modules/mob/living/carbon/human/human_update_icons.dm @@ -720,9 +720,72 @@ There are several things that need to be remembered: // SKYRAT EDIT END overlays_standing[BACK_LAYER] = back_overlay apply_overlay(BACK_LAYER) +// BUBBER EDIT START +/obj/effect/abstract/held_tk_effect + name = "held_tk_effect" + icon = 'modular_skyrat/master_files/icons/effects/tele_effects.dmi' + icon_state = "holder" + layer = HANDS_LAYER + vis_flags = VIS_INHERIT_DIR | VIS_INHERIT_PLANE | VIS_INHERIT_ID + var/is_right = TRUE + var/list/base_x + var/list/base_y +/obj/effect/abstract/held_tk_effect/proc/on_parent_dir_change(datum/source, _old_dir, new_dir) + SIGNAL_HANDLER + set_direction_facing(new_dir) + +/obj/effect/abstract/held_tk_effect/proc/set_direction_facing(new_dir) + if(base_x && base_y) + var/current_dir = dir2text(new_dir) + pixel_x = length(base_x) ? ((current_dir in base_x) ? base_x[current_dir] : base_x["south"]) : 0 + pixel_y = length(base_y) ? ((current_dir in base_y) ? base_y[current_dir] : base_y["south"]) : 0 + switch(new_dir) + if(NORTH) + if(is_right) + pixel_x += 5 + pixel_y += 10 + else + pixel_x += -5 + pixel_y += 10 + if(SOUTH) + if(is_right) + pixel_x += -5 + pixel_y += 10 + else + pixel_x += 5 + pixel_y += 10 + if(EAST) + if(is_right) + pixel_x += 0 + pixel_y += 10 + else + pixel_x += 0 + pixel_y += 10 + if(WEST) + if(is_right) + pixel_x += 0 + pixel_y += 10 + else + pixel_x += 0 + pixel_y += 10 + +/obj/effect/abstract/held_tk_effect/right + is_right = TRUE + +/obj/effect/abstract/held_tk_effect/left + is_right = FALSE +// BUBBER EDIT END /mob/living/carbon/human/get_held_overlays() var/list/hands = list() + // BUBBER EDIT START + if(held_left) + held_left.overlays.Cut() + held_left.underlays.Cut() + if(held_right) + held_right.overlays.Cut() + held_right.underlays.Cut() + // BUBBER EDIT END for(var/obj/item/worn_item in held_items) var/held_index = get_held_index_of_item(worn_item) if(client && hud_used && hud_used.hud_version != HUD_STYLE_NOHUD) @@ -747,9 +810,68 @@ There are several things that need to be remembered: var/icon_file = IS_RIGHT_INDEX(held_index) ? worn_item.righthand_file : worn_item.lefthand_file hand_overlay = worn_item.build_worn_icon(default_layer = HANDS_LAYER, default_icon_file = icon_file, isinhands = TRUE) var/obj/item/bodypart/arm/held_in_hand = hand_bodyparts[held_index] - held_in_hand?.held_hand_offset?.apply_offset(hand_overlay) - - hands += hand_overlay + // BUBBER EDIT START + if(HAS_TRAIT(src, TRAIT_FLOATING_HELD)) + if(!held_left) + held_left = new(src) + held_left.render_target = "*[REF(src)]_hover_left" + held_left.RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, TYPE_PROC_REF(/obj/effect/abstract/held_tk_effect, on_parent_dir_change)) + src.vis_contents += held_left + if(!held_right) + held_right = new(src) + held_right.render_target = "*[REF(src)]_hover_right" + held_right.RegisterSignal(src, COMSIG_ATOM_DIR_CHANGE, TYPE_PROC_REF(/obj/effect/abstract/held_tk_effect, on_parent_dir_change)) + src.vis_contents += held_right + if(held_index % 2 == 0) + held_right.overlays.Cut() + held_right.underlays.Cut() + held_right.pixel_y = 0 + held_right.pixel_x = 0 + held_right.overlays += hand_overlay + var/mutable_appearance/hover_effect = mutable_appearance(held_left.icon, "hover_right", HANDS_LAYER) + if(held_hover_color) + hover_effect.color = held_hover_color + held_right.underlays += hover_effect + var/list/offset = held_in_hand?.held_hand_offset?.get_offset() + if(offset) + held_right.base_x = held_in_hand?.held_hand_offset?.offset_x + held_right.base_y = held_in_hand?.held_hand_offset?.offset_y + else + held_right.base_x = list("south" = 0) + held_right.base_y = list("south" = 0) + held_right.set_direction_facing(src.dir) + else + held_left.overlays.Cut() + held_left.underlays.Cut() + held_left.pixel_y = 0 + held_left.pixel_x = 0 + held_left.overlays += hand_overlay + var/mutable_appearance/hover_effect = mutable_appearance(held_left.icon, "hover_left", HANDS_LAYER) + if(held_hover_color) + hover_effect.color = held_hover_color + held_left.underlays += hover_effect + var/list/offset = held_in_hand?.held_hand_offset?.get_offset() + if(offset) + held_left.base_x = held_in_hand?.held_hand_offset?.offset_x + held_left.base_y = held_in_hand?.held_hand_offset?.offset_y + else + held_left.base_x = list("south" = 0) + held_left.base_y = list("south" = 0) + held_left.set_direction_facing(src.dir) + var/mutable_appearance/hand_overlay_real = mutable_appearance(layer = HANDS_LAYER, offset_spokesman = src) + if(held_index % 2 == 0) + hand_overlay_real.render_source = "*[REF(src)]_hover_right" + animate(held_right, pixel_y = 2, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + else + hand_overlay_real.render_source = "*[REF(src)]_hover_left" + animate(held_left, pixel_y = 2, time = 1 SECONDS, loop = -1, flags = ANIMATION_RELATIVE) + animate(pixel_y = -2, time = 1 SECONDS, flags = ANIMATION_RELATIVE) + hands += hand_overlay_real + else + held_in_hand?.held_hand_offset?.apply_offset(hand_overlay) + hands += hand_overlay + // BUBBER EDIT END return hands /// Modifies a sprite slightly to conform to female body shapes diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod.png index 82f06aabc25a24495e7978017bbb037b2e46c564..73ad2f80113adab8e1228d46ee31e2156f10f15d 100644 GIT binary patch delta 22 ecmaFB@qlB3HM4ny+eEt%mZWLPXE#ne#S8#oWC+&) delta 22 ecmaFB@qlB3H8TSP!$i9fmOm;B<2Oz_#S8#d%?J7b diff --git a/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png b/code/modules/unit_tests/screenshots/screenshot_humanoids__datum_species_pod_podweak.png index 82f06aabc25a24495e7978017bbb037b2e46c564..73ad2f80113adab8e1228d46ee31e2156f10f15d 100644 GIT binary patch delta 22 ecmaFB@qlB3HM4ny+eEt%mZWLPXE#ne#S8#oWC+&) delta 22 ecmaFB@qlB3H8TSP!$i9fmOm;B<2Oz_#S8#d%?J7b diff --git a/modular_skyrat/master_files/icons/effects/tele_effects.dmi b/modular_skyrat/master_files/icons/effects/tele_effects.dmi index 2ace46ef27bfea9b2c38dd01ed1ef8917b5420fe..3cce136d5ccb48b6f78ab2837898999bbf6bdeda 100644 GIT binary patch literal 11066 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

SrM7f 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 lAx5VE{w32t63Pb(ecJJA725V;{{fVHyXyb| literal 8167 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 CLVR=p diff --git a/modular_zubbers/code/datums/quirks/positive_quirks/floating_items.dm b/modular_zubbers/code/datums/quirks/positive_quirks/floating_items.dm new file mode 100644 index 00000000000..d7c1683851d --- /dev/null +++ b/modular_zubbers/code/datums/quirks/positive_quirks/floating_items.dm @@ -0,0 +1,52 @@ +/datum/quirk/floating_items + name = "Psionic Holding" + desc = "You find holding items with your hands so inconvenient, and use your mind powers to do so instead." + value = 0 + icon = FA_ICON_METEOR + medical_record_text = "Subject's mind is capable of extremely limited telekinesis." + gain_text = "Your mind feels like it can lift weights!" + lose_text = "Your mind feels like it took a cheat day." + mob_trait = TRAIT_FLOATING_HELD + +/datum/quirk_constant_data/floating_items + associated_typepath = /datum/quirk/floating_items + customization_options = list(/datum/preference/color/floating_items) + +/datum/preference/color/floating_items + category = PREFERENCE_CATEGORY_MANUALLY_RENDERED + savefile_key = "floating_items" + savefile_identifier = PREFERENCE_CHARACTER + +/datum/preference/color/floating_items/apply_to_human(mob/living/carbon/human/target, value) + target.held_hover_color = value + +/datum/quirk/floating_items/add(client/client_source) + . = ..() + var/datum/action/innate/toggle_floating_items/toggle = new + toggle.Grant(quirk_holder) + +/datum/preference/color/floating_items/create_default_value() + return "#FF99FF" + +/datum/action/innate/toggle_floating_items + name = "Toggle Psionic Holding" + button_icon = 'modular_skyrat/master_files/icons/effects/tele_effects.dmi' + button_icon_state = "telekinesishead" + check_flags = AB_CHECK_INCAPACITATED|AB_CHECK_CONSCIOUS + +/datum/action/innate/toggle_floating_items/Trigger(trigger_flags) + . = ..() + if(!.) + return FALSE + if(owner) + if(HAS_TRAIT(owner, TRAIT_FLOATING_HELD)) + REMOVE_TRAIT(owner, TRAIT_FLOATING_HELD, QUIRK_TRAIT) + if(ishuman(owner)) + var/mob/living/carbon/human/owner_human = owner + owner_human.update_held_items() + else + ADD_TRAIT(owner, TRAIT_FLOATING_HELD, QUIRK_TRAIT) + if(ishuman(owner)) + var/mob/living/carbon/human/owner_human = owner + owner_human.update_held_items() + return TRUE diff --git a/tgstation.dme b/tgstation.dme index 46c1897a8ac..b598b4ddf9c 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -8850,6 +8850,7 @@ #include "modular_zubbers\code\datums\quirks\positive_quirks\dominant_aura.dm" #include "modular_zubbers\code\datums\quirks\positive_quirks\empath_override.dm" #include "modular_zubbers\code\datums\quirks\positive_quirks\featherweight.dm" +#include "modular_zubbers\code\datums\quirks\positive_quirks\floating_items.dm" #include "modular_zubbers\code\datums\quirks\positive_quirks\life_savings.dm" #include "modular_zubbers\code\datums\quirks\positive_quirks\masquerade_food.dm" #include "modular_zubbers\code\datums\quirks\positive_quirks\venemous_bite\venomous_bite.dm" diff --git a/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/floating_hands.tsx b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/floating_hands.tsx new file mode 100644 index 00000000000..608c6b77f42 --- /dev/null +++ b/tgui/packages/tgui/interfaces/PreferencesMenu/preferences/features/character_preferences/floating_hands.tsx @@ -0,0 +1,6 @@ +import { Feature, FeatureColorInput } from '../base'; + +export const floating_items: Feature = { + name: 'Hover Effect Color', + component: FeatureColorInput, +};