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
Original file line number Diff line number Diff line change
@@ -1,11 +1,36 @@
#define AUSPEX_LAYER BELOW_MOB_LAYER

/datum/atom_hud/data/auspex_aura
hud_icons = list(AUSPEX_AURA_HUD)

/obj/effect/aura_overlay
mouse_opacity = MOUSE_OPACITY_TRANSPARENT
anchored = TRUE

/particles/smoke/aura
count = 1024
spawning = 6
lifespan = 3 SECONDS
fade = 2.5 SECONDS
fadein = 0.5 SECONDS
gravity = list(0, 0, 0)
friction = 0.01
velocity = generator(GEN_SPHERE, 0, 0.5, UNIFORM_RAND)
drift = list(0, 0, 0)
position = generator(GEN_BOX, list(-8, -8, 0), list(10, 10, 0), UNIFORM_RAND)
scale = list(0.75, 0.75)
grow = 0.015
color = "#ffffff28"

/datum/component/aura
// A list of currently selected emotions by the player
var/current_aura = AURA_INNOCENT
var/current_emotion_name = "Innocent"
var/obj/effect/abstract/shared_particle_holder/aura_smoke
var/examine_message = ""
var/obj/effect/aura_overlay/aura_glow_image
var/obj/effect/aura_overlay/aura_base_image
var/obj/effect/aura_overlay/aura_smoke_image

var/obj/effect/aura_overlay/aura_classic_image

/datum/component/aura/RegisterWithParent()
. = ..()
Expand All @@ -15,14 +40,26 @@

RegisterSignal(parent_mob, COMSIG_MOB_EMOTION_CHANGED, PROC_REF(update_emotions))
RegisterSignal(parent_mob, COMSIG_MOB_UPDATE_AURA, PROC_REF(update_aura))
RegisterSignal(parent_mob, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
if(isnpc(parent_mob))
RegisterSignal(parent_mob, COMSIG_COMBAT_MODE_TOGGLED, PROC_REF(on_combat_mode_toggled))

update_aura()

/datum/component/aura/UnregisterFromParent()
var/mob/parent_mob = parent
var/datum/atom_hud/data/auspex_aura/target_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
target_hud.remove_atom_from_hud(parent_mob)
examine_message = ""
UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA, COMSIG_ATOM_EXAMINE))
if(isnpc(parent_mob))
UnregisterSignal(parent_mob, list(COMSIG_COMBAT_MODE_TOGGLED))
QDEL_NULL(aura_smoke)
QDEL_NULL(aura_glow_image)
QDEL_NULL(aura_base_image)
QDEL_NULL(aura_smoke_image)

UnregisterSignal(parent_mob, list(COMSIG_MOB_EMOTION_CHANGED, COMSIG_MOB_UPDATE_AURA))
QDEL_NULL(aura_classic_image)
return ..()

/datum/component/aura/proc/update_emotions(mob/changed_mob, new_emotion)
Expand All @@ -31,20 +68,121 @@
if(current_aura == new_emotion)
return

current_emotion_name = new_emotion
current_aura = GLOB.aura_list[new_emotion]
update_aura()

/datum/component/aura/proc/on_combat_mode_toggled(datum/source)
SIGNAL_HANDLER
var/mob/living/carbon/human/npc/parent_mob = parent
if(parent_mob.combat_mode)
SEND_SIGNAL(parent_mob, COMSIG_MOB_EMOTION_CHANGED, "Angry")
if(current_aura == AURA_ANGRY && !parent_mob.combat_mode)
SEND_SIGNAL(parent_mob, COMSIG_MOB_EMOTION_CHANGED, "Innocent")


/datum/component/aura/proc/on_examine(datum/source, mob/user, list/examine_list)
SIGNAL_HANDLER
if(!examine_message)
return
var/datum/atom_hud/data/auspex_aura/auspex_hud = GLOB.huds[DATA_HUD_AUSPEX_AURAS]
if(!(user in auspex_hud.hud_users_all_z_levels))
return
examine_list += examine_message

/datum/component/aura/proc/update_examine_message(mutable_appearance/aura_appearance)
var/mob/parent_mob = parent

switch(current_aura)
if(AURA_AFRAID)
examine_message = "[parent_mob.p_Their()] aura burns a bright orange, tense and flickering at the edges."
if(AURA_AGGRESSIVE)
examine_message = "[parent_mob.p_Their()] aura radiates a deep purple, pulsing like an engine."
if(AURA_ANGRY)
examine_message = "[parent_mob.p_Their()] aura blazes a fierce red, hot and agitated."
if(AURA_BITTER)
examine_message = "[parent_mob.p_Their()] aura settles in a muddy brown, murky and stagnant."
if(AURA_CALM)
examine_message = "[parent_mob.p_Their()] aura glows a soft blue, steady and unhurried."
if(AURA_COMPASSIONATE)
examine_message = "[parent_mob.p_Their()] aura shines a warm pink, open and gentle."
if(AURA_CONSERVATIVE)
examine_message = "[parent_mob.p_Their()] aura holds a muted lavender, contained and composed."
if(AURA_DEPRESSED)
examine_message = "[parent_mob.p_Their()] aura fades to a dull gray, thin and sluggish."
if(AURA_DESIROUS)
examine_message = "[parent_mob.p_Their()] aura smolders a deep red, heavy and pulling."
if(AURA_DISTRUSTFUL)
examine_message = "[parent_mob.p_Their()] aura flickers a pale green, guarded and watchful."
if(AURA_ENVIOUS)
examine_message = "[parent_mob.p_Their()] aura coils a dark green, tight and covetous."
if(AURA_EXCITED)
examine_message = "[parent_mob.p_Their()] aura crackles with violet, quick and restless."
if(AURA_GENEROUS)
examine_message = "[parent_mob.p_Their()] aura blooms a soft rose, warm and outward-reaching."
if(AURA_HAPPY)
examine_message = "[parent_mob.p_Their()] aura shines a vivid vermillion, bright and expansive."
if(AURA_HATEFUL)
examine_message = "[parent_mob.p_Their()] aura darkens to black, heavy and oppressive."
if(AURA_IDEALISTIC)
examine_message = "[parent_mob.p_Their()] aura gleams a bright yellow, clear and radiant."
if(AURA_INNOCENT)
examine_message = "[parent_mob.p_Their()] aura glows a clean white, simple and unguarded."
if(AURA_LOVESTRUCK)
examine_message = "[parent_mob.p_Their()] aura pulses a warm blue, soft and yearning."
if(AURA_OBSESSED)
examine_message = "[parent_mob.p_Their()] aura burns a steady green, fixed and unyielding."
if(AURA_SAD)
examine_message = "[parent_mob.p_Their()] aura dims to a pale silver, quiet and withdrawn."
if(AURA_SPIRITUAL)
examine_message = "[parent_mob.p_Their()] aura shimmers gold, with a ghostly hue."
if(AURA_SUSPICIOUS)
examine_message = "[parent_mob.p_Their()] aura shifts a dark blue, restless and searching."
if(AURA_ANXIOUS)
examine_message = "[parent_mob.p_Their()] aura appears scrambled, like static or white noise."
if(AURA_CONFUSED)
examine_message = "[parent_mob.p_Their()] aura shifts between mottled, flickering colors."
if(AURA_DAYDREAMING)
examine_message = "[parent_mob.p_Their()] aura flickers with sharp, slow colors."
if(AURA_PSYCHOTIC)
examine_message = "[parent_mob.p_Their()] aura swirls with hypnotic, fast colors."
else
examine_message = ""
var/quality = GLOB.emotion_to_quality[current_emotion_name]
if(examine_message && quality)
examine_message += " You sense [quality]."
examine_message += "\n \n" // makes the below stand out more
if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE))
examine_message += "Black veins pulse through [parent_mob.p_their()] aura."
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
examine_message += "[parent_mob.p_Their()] aura appears especially energetic."
if(get_ghoul_splat(parent_mob))
examine_message += "Pale blotches mark [parent_mob.p_their()] aura."
if(get_kindred_splat(parent_mob))
var/mob/living/carbon/human/lick = parent_mob
var/datum/st_stat/morality_path/morality/stat_morality = lick.storyteller_stats[STAT_MORALITY]
if(!stat_morality.morality_path.alignment == MORALITY_HUMANITY) // non-humanity licks have standard kindred auras that give them away
examine_message += "[parent_mob.p_Their()] aura colors appear pale."
if(isavatar(parent_mob) || isobserver(parent_mob))
examine_message += "[parent_mob.p_Their()] aura is weak and intermittent, fading in and out."

/datum/component/aura/proc/update_aura()
SIGNAL_HANDLER

var/mob/parent_mob = parent
var/image/holder = parent_mob.hud_list[AUSPEX_AURA_HUD]
if(!holder)
holder = new
var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", AUSPEX_LAYER, parent_mob, GAME_PLANE)
holder.plane = ABOVE_LIGHTING_PLANE
if(!aura_smoke)
aura_smoke = new /obj/effect/abstract/shared_particle_holder(null, /particles/smoke/aura)
aura_smoke.blend_mode = 2
aura_smoke.add_filter("particle_blur", 1, gauss_blur_filter(8))
var/mutable_appearance/aura_appearance = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "aura", ABOVE_MOB_LAYER, parent_mob, ABOVE_GAME_PLANE)
update_aura_colors(aura_appearance, holder)
update_aura_overlays(aura_appearance, holder)
update_aura_filters(aura_appearance, holder)
update_examine_message(aura_appearance)

/datum/component/aura/proc/is_color(input_text)
if(findtext(input_text, GLOB.is_color))
Expand All @@ -59,67 +197,115 @@
output_color = null

aura_appearance.color = output_color
holder.appearance = aura_appearance

var/mob/parent_mob = parent
if(get_kindred_splat(parent_mob))
var/icon/temporary_icon_holder = holder.appearance
var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "aura", AUSPEX_LAYER, parent_mob, GAME_PLANE)
if(aura_smoke)
aura_smoke.particles.color = output_color ? (output_color + pick("20","30")) : "#ffffff09"

var/list/hsv_color_value = rgb2hsv(holder.color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred
holder.icon = null
holder.icon_state = null
holder.color = null

aura_image.color = hsv2rgb(hsv_color_value)
holder.appearance = aura_image
var/mob/parent_mob = parent
if(get_kindred_splat(parent_mob) && output_color)
var/mob/living/carbon/human/lick = parent_mob
var/datum/st_stat/morality_path/morality/stat_morality = lick.storyteller_stats[STAT_MORALITY]
if(!stat_morality?.morality_path.alignment == MORALITY_HUMANITY) // non-humanity licks have standard kindred auras that give them away
var/list/hsv_color_value = rgb2hsv(output_color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for kindred
aura_appearance.color = hsv2rgb(hsv_color_value)

// DARKPACK TODO - aura still needs real sprites.
if(HAS_TRAIT(parent_mob, TRAIT_FRENETIC_AURA))
var/icon/temporary_icon_holder = holder.appearance
var/mutable_appearance/aura_image = mutable_appearance(temporary_icon_holder, "old_aura_bright", AUSPEX_LAYER, parent_mob, GAME_PLANE)

var/list/hsv_color_value = rgb2hsv(holder.color)
var/list/hsv_color_value = rgb2hsv(aura_appearance.color || "#ffffff")
hsv_color_value[2] = hsv_color_value[2] * 1.5 // Way brighter for shapeshifters

aura_image.color = hsv2rgb(hsv_color_value)
holder.appearance = aura_image
aura_appearance.color = hsv2rgb(hsv_color_value)
aura_appearance.icon_state = "old_aura_bright"


/datum/component/aura/proc/update_aura_overlays(mutable_appearance/aura_appearance, image/holder)
holder.cut_overlays()
holder.vis_contents = aura_smoke ? list(aura_smoke) : list()
var/mob/parent_mob = parent
if(!aura_glow_image)
aura_glow_image = new(null)
aura_glow_image.icon = 'modular_darkpack/modules/powers/icons/auras.dmi'
aura_glow_image.icon_state = "aura"
aura_glow_image.layer = ABOVE_MOB_LAYER - 0.01
aura_glow_image.plane = ABOVE_LIGHTING_PLANE
aura_glow_image.add_filter("ambient_blur", 1, gauss_blur_filter(12))
aura_glow_image.color = aura_appearance.color
aura_glow_image.alpha = 20
holder.vis_contents += aura_glow_image

if(!aura_base_image)
aura_base_image = new(null)
aura_base_image.icon = 'modular_darkpack/modules/powers/icons/auras.dmi'
aura_base_image.icon_state = "aura"
aura_base_image.layer = ABOVE_MOB_LAYER
aura_base_image.plane = ABOVE_LIGHTING_PLANE
aura_base_image.color = aura_appearance.color
aura_base_image.icon_state = aura_appearance.icon_state || "aura"
aura_base_image.transform = matrix(0.8, MATRIX_SCALE)
aura_base_image.alpha = 175
holder.vis_contents += aura_base_image


if(!aura_classic_image)
aura_classic_image = new(null)
aura_classic_image.icon = 'modular_darkpack/modules/powers/icons/auras.dmi'
aura_classic_image.icon_state = "old_aura"
aura_classic_image.layer = ABOVE_MOB_LAYER + 4.03
aura_classic_image.plane = ABOVE_LIGHTING_PLANE
aura_classic_image.color = aura_appearance.color
aura_classic_image.icon_state = "old_aura"
aura_classic_image.alpha = 255

if(!aura_smoke_image)
aura_smoke_image = new(null)
aura_smoke_image.icon = 'modular_darkpack/modules/powers/icons/auras.dmi'
aura_smoke_image.icon_state = "smoke"
aura_smoke_image.layer = ABOVE_MOB_LAYER + 4.01
aura_smoke_image.plane = ABOVE_LIGHTING_PLANE
aura_smoke_image.color = aura_appearance.color
aura_smoke_image.alpha = 50

if(HAS_TRAIT(parent_mob, TRAIT_DIABLERIE))
var/image/diablerie_image = image('modular_darkpack/modules/powers/icons/auras.dmi', parent_mob, "diab", ABOVE_MOB_LAYER+1)
var/mutable_appearance/diablerie_image = mutable_appearance('modular_darkpack/modules/powers/icons/auras.dmi', "diab", ABOVE_MOB_LAYER + 1, parent_mob, ABOVE_GAME_PLANE)
holder.add_overlay(diablerie_image)
aura_classic_image.color = "#1717178b"

if(current_aura == AURA_ANXIOUS)
var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aura")
var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "old_aura")
var/icon/static_icon = getStaticIcon(temporary_icon_holder)
var/mutable_appearance/static_image = mutable_appearance(static_icon, "aura", AUSPEX_LAYER+0.01, parent_mob, GAME_PLANE)
var/obj/effect/aura_overlay/static_image = new(null)
static_image.icon = static_icon
static_image.icon_state = "old_aura"
static_image.layer = ABOVE_MOB_LAYER + 2
static_image.plane = ABOVE_LIGHTING_PLANE
static_image.appearance_flags |= RESET_COLOR
holder.add_overlay(static_image)
static_image.alpha = 150
holder.vis_contents += static_image

if(get_ghoul_splat(parent_mob))
var/icon/temporary_icon_holder = icon('modular_darkpack/modules/powers/icons/auras.dmi', "aurablotch")
var/mutable_appearance/aura_blotches = mutable_appearance(temporary_icon_holder, "aurablotch", AUSPEX_LAYER+0.02, parent_mob, GAME_PLANE)

var/list/hsv_color_value = rgb2hsv(aura_appearance.color)
hsv_color_value[2] = hsv_color_value[2] * 0.7 // Reduce saturation for ghouls

var/icon/icon_mask = getIconMask(aura_blotches)
var/mutable_appearance/aura_icon = new(aura_appearance)
aura_icon.color = hsv2rgb(hsv_color_value)
aura_icon.add_filter("alpha_mask", 1, alpha_mask_filter(icon = icon_mask))
holder.add_overlay(aura_icon)
aura_smoke_image.color = hsv2rgb(hsv_color_value)
aura_classic_image.icon_state = "old_aura_ghoul"

if(isavatar(parent_mob) || isobserver(parent_mob))
holder.opacity = holder.opacity * 0.5

/datum/component/aura/proc/update_aura_filters(mutable_appearance/aura_appearance, image/holder)
var/mob/parent_mob = parent
var/matrix/smoke_transform = matrix()
smoke_transform.Scale(1, pick(1.25, 1.5))
aura_smoke_image.transform = smoke_transform

remove_wibbly_filters(holder)
if(HAS_TRAIT(parent_mob, TRAIT_IN_FRENZY))
apply_wibbly_filters(holder)
var/matrix/classic_aura_transform = matrix()
classic_aura_transform.Scale(pick(0.65, 0.75), 1)
aura_classic_image.transform = classic_aura_transform

#undef AUSPEX_LAYER
holder.vis_contents += aura_classic_image
holder.vis_contents += aura_smoke_image


/datum/component/aura/proc/update_aura_filters(mutable_appearance/aura_appearance, image/holder)
remove_wibbly_filters(holder)
apply_wibbly_filters(holder)
holder.add_filter("aura_glow", 1, gauss_blur_filter(2))
Binary file modified modular_darkpack/modules/powers/icons/auras.dmi
Binary file not shown.
Loading