Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions code/__DEFINES/~darkpack/traits/declarations.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
1 change: 1 addition & 0 deletions code/_globalvars/traits/_traits.dm
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
253 changes: 180 additions & 73 deletions modular_darkpack/modules/powers/code/discipline/visceratika.dm
Original file line number Diff line number Diff line change
Expand Up @@ -9,146 +9,253 @@
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
name = "Bond with the Mountain"
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
name = "Flow Within the Mountain"
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))*/)
Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

not sure if the area check (gargoyles passing thru walls can only travel thru walls within a particular area, not go from area to area, for ex, they cant go from the sewers into the chantry) is a lore thing or a balance thing so might need a ruling on that...

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
*/
Original file line number Diff line number Diff line change
Expand Up @@ -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,
Expand Down
1 change: 1 addition & 0 deletions tgstation.dme
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
// DM Environment file for tgstation.dme.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\drugs\code\bloodpacks\methpack.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\drugs\code\bloodpacks\cokepack.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\drugs\code\bloodpacks\morphpack.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\drugs\code\bloodpacks\bloodpack_adulteration.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\werewolf_the_apocalypse\code\old\gifts.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\werewolf_the_apocalypse\code\gifts\tribes\tribes.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\weather\code\weather.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\computers\code\computer.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\computers\code\app.dm.

Check failure on line 1 in tgstation.dme

View workflow job for this annotation

GitHub Actions / Run Linters / linters

Ticked File Enforcement

Missing include for modular_darkpack\modules\computers\code\app_types.dm.
// All manual changes should be made outside the BEGIN_ and END_ blocks.
// New source code should be placed in .dm files: choose File/New --> Code File.

Expand Down Expand Up @@ -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"
Expand Down
Loading