diff --git a/code/__DEFINES/~darkpack/traits/declarations.dm b/code/__DEFINES/~darkpack/traits/declarations.dm index ad4ab74a8f39..6f455ddc589f 100644 --- a/code/__DEFINES/~darkpack/traits/declarations.dm +++ b/code/__DEFINES/~darkpack/traits/declarations.dm @@ -92,7 +92,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_UNAGING "unaging" // Does the mob have ghostsight? #define TRAIT_GHOST_VISION "ghost_vision" +// Does the mob have hardened skin via Serpentis? #define TRAIT_SERPENTIS_SKIN "serpent_skin" +// Is the mob melted into a wall via Visceratika? +#define TRAIT_BOND_WITHIN_THE_MOUNTAIN "bond_within_the_mountain" // Allows the user to pass through doors diff --git a/code/_globalvars/traits/_traits.dm b/code/_globalvars/traits/_traits.dm index 6c35637a7d3f..476148ebb49c 100644 --- a/code/_globalvars/traits/_traits.dm +++ b/code/_globalvars/traits/_traits.dm @@ -668,6 +668,7 @@ GLOBAL_LIST_INIT(traits_by_type, list( "TRAIT_BLOODY_SUCKER" = TRAIT_BLOODY_SUCKER, // DARKPACK EDIT ADD "TRAIT_BLOOD_DRINKER" = TRAIT_BLOOD_DRINKER, // DARKPACK EDIT ADD "TRAIT_BLUSH_OF_HEALTH" = TRAIT_BLUSH_OF_HEALTH, // DARKPACK EDIT ADD + "TRAIT_BOND_WITHIN_THE_MOUNTAIN" = TRAIT_BOND_WITHIN_THE_MOUNTAIN, // DARKPACK EDIT ADD - Visceratika "TRAIT_CANNOT_RESIST_MIND_CONTROL" = TRAIT_CANNOT_RESIST_MIND_CONTROL, // DARKPACK EDIT ADD "TRAIT_CAN_ENTER_TORPOR" = TRAIT_CAN_ENTER_TORPOR, // DARKPACK EDIT ADD "TRAIT_CHARMER" = TRAIT_CHARMER, // DARKPACK EDIT ADD diff --git a/modular_darkpack/modules/powers/code/discipline/visceratika.dm b/modular_darkpack/modules/powers/code/discipline/visceratika.dm index 9e22d5c54d7d..ef49e30afbce 100644 --- a/modular_darkpack/modules/powers/code/discipline/visceratika.dm +++ b/modular_darkpack/modules/powers/code/discipline/visceratika.dm @@ -9,47 +9,106 @@ name = "Visceratika power name" desc = "Visceratika power description" - activate_sound = 'modular_darkpack/modules/deprecated/sounds/visceratika.ogg' - -//WHISPERS OF THE CHAMBER -/datum/discipline_power/visceratika/whispers_of_the_chamber - name = "Whispers of the Chamber" - desc = "Sense everyone in the same area as you." + activate_sound = 'modular_darkpack/modules/powers/sounds/visceratika.ogg' +/datum/discipline/visceratika/post_gain() + . = ..() + // it is rumored that, if a non-gargoyle kindred were to learn Visceratika, their skin would turn stony + owner.skin_tone = "albino" + owner.set_body_sprite("gargoyle") + owner.update_body_parts() + owner.update_body() + // since dot 4 is always active and requires no roll + if(level >= 4) + owner.physiology.brute_mod *= 0.8 + owner.physiology.heat_mod *= 0.5 + //owner.physiology.clone_mod *= 0.9 + //ADD_TRAIT(owner, TRAIT_IGNOREDAMAGESLOWDOWN, TRAIT_GENERIC) + ADD_TRAIT(owner, TRAIT_NOSOFTCRIT, DISCIPLINE_TRAIT) + if(!(owner.is_clan(/datum/subsplat/vampire_clan/gargoyle))) + ADD_TRAIT(owner, TRAIT_MASQUERADE_VIOLATING_FACE, DISCIPLINE_TRAIT) + +//SKIN OF THE CHAMELEON +/datum/discipline_power/visceratika/skin_of_the_chameleon + name = "Skin of the Chameleon" + desc = "Change your skin to become a reasonable fascimile of whatever your surroundings are, allowing you increased stealth." level = 1 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE + cooldown_length = 2 SCENES + duration_length = 1 SCENES + cancelable = TRUE + vitae_cost = 1 - cooldown_length = 5 SECONDS +/datum/discipline_power/visceratika/skin_of_the_chameleon/activate() + . = ..() + skin_chameleon_run() + RegisterSignal(owner, COMSIG_MOVE_INTENT_TOGGLED, PROC_REF(skin_chameleon_run)) -/datum/discipline_power/visceratika/whispers_of_the_chamber/activate() +/datum/discipline_power/visceratika/skin_of_the_chameleon/deactivate(atom/target, direct) . = ..() - for(var/mob/living/player in GLOB.player_list) - if(get_area(player) == get_area(owner)) - var/their_name = player.name - if(ishuman(player)) - var/mob/living/carbon/human/human_player = player - their_name = human_player.real_name - to_chat(owner, "- [their_name]") + UnregisterSignal(owner, COMSIG_MOVE_INTENT_TOGGLED) + owner.alpha = 255 + remove_wibbly_filters(owner) + +/datum/discipline_power/visceratika/skin_of_the_chameleon/proc/skin_chameleon_run() + SIGNAL_HANDLER + if(owner.move_intent == MOVE_INTENT_RUN) + owner.alpha = 40 + apply_wibbly_filters(owner) + else + owner.alpha = 10 + remove_wibbly_filters(owner) //SCRY THE HEARTHSTONE /datum/discipline_power/visceratika/scry_the_hearthstone name = "Scry the Hearthstone" desc = "Sense the exact locations of individuals around you." + willpower_cost = 1 level = 2 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_SEE + toggled = TRUE + var/area/starting_area + var/datum/storyteller_roll/scry_the_hearthstone/scry_roll - cancelable = TRUE - duration_length = 15 SECONDS - cooldown_length = 10 SECONDS +/datum/storyteller_roll/scry_the_hearthstone + bumper_text = "scry the hearthstone" + difficulty = 6 + applicable_stats = list(STAT_PERCEPTION, STAT_AWARENESS) -/datum/discipline_power/visceratika/scry_the_hearthstone/activate() +/datum/discipline_power/visceratika/scry_the_hearthstone/pre_activation_checks() . = ..() - ADD_TRAIT(owner, TRAIT_THERMAL_VISION, "Visceratika Scry the Hearthstone") + if(!scry_roll) + scry_roll = new() + if(scry_roll.st_roll(owner, owner) == ROLL_SUCCESS) + return TRUE + else + return FALSE -/datum/discipline_power/visceratika/scry_the_hearthstone/deactivate() +/datum/discipline_power/visceratika/scry_the_hearthstone/activate() . = ..() - REMOVE_TRAIT(owner, TRAIT_THERMAL_VISION, "Visceratika Scry the Hearthstone") + for(var/mob/living/player in GLOB.player_list) + if(get_area(player) == get_area(owner)) + var/their_name = player.name + if(ishuman(player)) + var/mob/living/carbon/human/human_player = player + their_name = human_player.real_name + to_chat(owner, "- [their_name]") + starting_area = get_area(owner) + ADD_TRAIT(owner, TRAIT_THERMAL_VISION, DISCIPLINE_TRAIT) + owner.update_sight() + //visceratika 2 gives a gargoyle a heatmap of all living people in a building. if they leave the building, they need to re-cast it. + RegisterSignal(owner, COMSIG_EXIT_AREA, PROC_REF(on_area_exited)) + +/datum/discipline_power/visceratika/scry_the_hearthstone/proc/on_area_exited(atom/movable/source, area/old_area) + SIGNAL_HANDLER + + to_chat(owner, span_warning("You lose your connection to the stone as you leave the area.")) + starting_area = null + REMOVE_TRAIT(owner, TRAIT_THERMAL_VISION, DISCIPLINE_TRAIT) + owner.update_sight() + UnregisterSignal(owner, COMSIG_EXIT_AREA) + try_deactivate() //BOND WITH THE MOUNTAIN /datum/discipline_power/visceratika/bond_with_the_mountain @@ -57,69 +116,70 @@ desc = "Merge with your surroundings and become difficult to see." level = 3 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE | DISC_CHECK_LYING - + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE + vitae_cost = 2 cancelable = TRUE - duration_length = 15 SECONDS + toggled = TRUE + duration_length = 0 cooldown_length = 10 SECONDS + var/turf/exit_turf + var/turf/stone_turf + +/datum/discipline_power/visceratika/bond_with_the_mountain/pre_activation_checks() + . = ..() + for(var/turf/closed/adjacent in orange(1, owner)) + stone_turf = adjacent + break + + if(!stone_turf) + to_chat(owner, span_warning("You must be adjacent to a stone surface to bond with the mountain.")) + return FALSE + return TRUE /datum/discipline_power/visceratika/bond_with_the_mountain/activate() . = ..() - owner.alpha = 10 -/datum/discipline_power/visceratika/bond_with_the_mountain/deactivate() + exit_turf = get_turf(owner) + to_chat(owner, span_purple("You begin to sink into the stone...")) + + if(!do_after(owner, 2 TURNS)) + to_chat(owner, span_warning("Your bond with the nearby stone is interrupted!")) + exit_turf = null + return FALSE + owner.forceMove(stone_turf) + owner.alpha = 30 + ADD_TRAIT(owner, TRAIT_BOND_WITHIN_THE_MOUNTAIN, DISCIPLINE_TRAIT) + ADD_TRAIT(owner, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT) + owner.density = FALSE + owner.damage_deflection = 3 TTRPG_DAMAGE + +/datum/discipline_power/visceratika/bond_with_the_mountain/deactivate(forced = TRUE) . = ..() - owner.alpha = 255 + REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, DISCIPLINE_TRAIT) + REMOVE_TRAIT(owner, TRAIT_BOND_WITHIN_THE_MOUNTAIN, DISCIPLINE_TRAIT) + owner.density = TRUE + owner.damage_deflection = 0 + if(forced) //only false when using visceratika 5. we inherit the alpha from this ability and when visceratika 5 deactivates, return to 255 + if(exit_turf) + owner.forceMove(exit_turf) + owner.alpha = 255 + exit_turf = null + stone_turf = null //ARMOR OF TERRA /datum/discipline_power/visceratika/armor_of_terra name = "Armor of Terra" - desc = "Solidify into stone and become invulnerable." + desc = "This power requires no roll and is always active. Your stony skin has hardened to the point where nearly all damage against you is lessened." level = 4 check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_LYING - violates_masquerade = TRUE - - toggled = TRUE - cooldown_length = 1 MINUTES - duration_length = 1 MINUTES + vitae_cost = 0 /datum/discipline_power/visceratika/armor_of_terra/activate() . = ..() - addtimer(CALLBACK(src, PROC_REF(try_deactivate), null, TRUE), duration_length * 2) //failsafe (no, you can't stay in statue mode forever, 2 mins is enough) - to_chat(owner, span_warning("You harden your skin far more than you're able to take for long!")) - ADD_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC) - ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC) - ADD_TRAIT(owner, TRAIT_NOBLEED, MAGIC_TRAIT) - ADD_TRAIT(owner, TRAIT_MUTE, STATUE_MUTE) - ADD_TRAIT(owner, TRAIT_IMMOBILIZED, MAGIC_TRAIT) - ADD_TRAIT(owner, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT) + to_chat(owner, span_danger("This is a passive ability. The effects are already active!")) - owner.name_override = "Statue of [owner.real_name]" - owner.status_flags |= GODMODE - var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) - owner.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) - - for(var/obj/stuff in owner.contents) //no stealing - ADD_TRAIT(stuff, TRAIT_NODROP, MAGIC) - -/datum/discipline_power/visceratika/armor_of_terra/deactivate() - . = ..() - to_chat(owner, span_warning("You soften your skin, to your normal hardness.")) - REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC) - REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC) - REMOVE_TRAIT(owner, TRAIT_NOBLEED, MAGIC_TRAIT) - REMOVE_TRAIT(owner, TRAIT_MUTE, STATUE_MUTE) - REMOVE_TRAIT(owner, TRAIT_IMMOBILIZED, MAGIC_TRAIT) - REMOVE_TRAIT(owner, TRAIT_HANDS_BLOCKED, MAGIC_TRAIT) - - owner.name_override = null - owner.status_flags &= GODMODE - owner.remove_atom_colour(FIXED_COLOUR_PRIORITY) - - for(var/obj/item/stuff in owner.contents) - REMOVE_TRAIT(stuff, TRAIT_NODROP, MAGIC) //FLOW WITHIN THE MOUNTAIN /datum/discipline_power/visceratika/flow_within_the_mountain @@ -127,28 +187,75 @@ desc = "Merge with solid stone, and move through it without disturbing it." level = 5 - check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_IMMOBILE - + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE + vitae_cost = 2 violates_masquerade = TRUE cancelable = TRUE - duration_length = 15 SECONDS + duration_length = 1 SCENES // might be too long... cooldown_length = 10 SECONDS +/datum/discipline_power/visceratika/flow_within_the_mountain/try_activate() + // placed in try_activate instead of pre_activation_checks so as to not consume blood while running this check + if(!HAS_TRAIT(owner, TRAIT_BOND_WITHIN_THE_MOUNTAIN)) + to_chat(owner, span_notice("You must cast Bond with the Mountain first before using Flow within the Mountain")) + return FALSE + ..() + /datum/discipline_power/visceratika/flow_within_the_mountain/activate() . = ..() - ADD_TRAIT(owner, TRAIT_PASS_THROUGH_WALLS, "Visceratika Flow Within the Mountain") - owner.alpha = 10 + var/datum/discipline_power/visceratika/bond_with_the_mountain/bond = discipline.get_power(/datum/discipline_power/visceratika/bond_with_the_mountain) + bond.deactivate(forced = FALSE) + ADD_TRAIT(owner, TRAIT_PASS_THROUGH_WALLS, DISCIPLINE_TRAIT) + apply_wibbly_filters(owner) /datum/discipline_power/visceratika/flow_within_the_mountain/deactivate() . = ..() owner.alpha = 255 - REMOVE_TRAIT(owner, TRAIT_PASS_THROUGH_WALLS, "Visceratika Flow Within the Mountain") + REMOVE_TRAIT(owner, TRAIT_PASS_THROUGH_WALLS, DISCIPLINE_TRAIT) + remove_wibbly_filters(owner) +// there has to be a better way to do this /turf/closed/Enter(atom/movable/mover, atom/oldloc) if(isliving(mover)) var/mob/living/moving_mob = mover - if(HAS_TRAIT(moving_mob, TRAIT_PASS_THROUGH_WALLS) && (get_area(moving_mob) == get_area(src))) + if(HAS_TRAIT(moving_mob, TRAIT_PASS_THROUGH_WALLS)/* && (get_area(moving_mob) == get_area(src))*/) return TRUE return ..() +/* +//ROCKHEART +/datum/discipline_power/visceratika/rockheart + name = "Rockheart" + desc = "Solidify your innermost organs to prevent damage" + + level = 6 + check_flags = DISC_CHECK_CONSCIOUS | DISC_CHECK_CAPABLE | DISC_CHECK_LYING + + violates_masquerade = FALSE + + toggled = TRUE + cooldown_length = 1 MINUTES + +/datum/discipline_power/visceratika/rockheart/activate() + . = ..() + to_chat(owner, span_warning("You harden your internal organs, protecting you against many forms of damage and stakes!")) + ADD_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC) + ADD_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC) + ADD_TRAIT(owner, TRAIT_NOBLEED, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_PIERCEIMMUNE, MAGIC_TRAIT) + ADD_TRAIT(owner, TRAIT_NEVER_WOUNDED, MAGIC_TRAIT) + + owner.stakeimmune = TRUE + +/datum/discipline_power/visceratika/rockheart/deactivate() + . = ..() + to_chat(owner, span_warning("You soften your internal organs, to their normal durability.")) + REMOVE_TRAIT(owner, TRAIT_STUNIMMUNE, MAGIC) + REMOVE_TRAIT(owner, TRAIT_PUSHIMMUNE, MAGIC) + REMOVE_TRAIT(owner, TRAIT_NOBLEED, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PIERCEIMMUNE, MAGIC_TRAIT) + REMOVE_TRAIT(owner, TRAIT_NEVER_WOUNDED, MAGIC_TRAIT) + + owner.stakeimmune = FALSE +*/ diff --git a/modular_darkpack/modules/deprecated/sounds/visceratika.ogg b/modular_darkpack/modules/powers/sounds/visceratika.ogg similarity index 100% rename from modular_darkpack/modules/deprecated/sounds/visceratika.ogg rename to modular_darkpack/modules/powers/sounds/visceratika.ogg diff --git a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm index 2c50be3a53e9..7a0d6d686bb1 100644 --- a/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm +++ b/modular_darkpack/modules/vampire_the_masquerade/code/vampire_clan/clans/gargoyle.dm @@ -7,7 +7,7 @@ clan_disciplines = list( /datum/discipline/fortitude, /datum/discipline/potence, - // /datum/discipline/visceratika + /datum/discipline/visceratika ) clan_traits = list( TRAIT_CANNOT_RESIST_MIND_CONTROL, diff --git a/tgstation.dme b/tgstation.dme index 16f285eae546..b42d587f7d06 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -7405,6 +7405,7 @@ #include "modular_darkpack\modules\powers\code\discipline\obtenebration.dm" #include "modular_darkpack\modules\powers\code\discipline\serpentis.dm" #include "modular_darkpack\modules\powers\code\discipline\torpor.dm" +#include "modular_darkpack\modules\powers\code\discipline\visceratika.dm" #include "modular_darkpack\modules\powers\code\discipline\auspex\aura_component.dm" #include "modular_darkpack\modules\powers\code\discipline\auspex\auspex.dm" #include "modular_darkpack\modules\powers\code\discipline\auspex\emotion_panel.dm"