diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index ded8343df597..66ac58fc66b4 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -84,6 +84,8 @@ #define STATUS_EFFECT_BLOODLETTING /datum/status_effect/saw_bleed/bloodletting //same but smaller +#define STATUS_EFFECT_EXPOSED /datum/status_effect/exposed //increases incoming damage + #define STATUS_EFFECT_NECROPOLIS_CURSE /datum/status_effect/necropolis_curse #define STATUS_EFFECT_HIVEMIND_CURSE /datum/status_effect/necropolis_curse/hivemind #define CURSE_BLINDING 1 //makes the edges of the target's screen obscured diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index 01ac3768af49..12160164d2bb 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -1024,3 +1024,44 @@ /datum/status_effect/cloudstruck/Destroy() . = ..() QDEL_NULL(mob_overlay) + +/datum/status_effect/exposed + id = "exposed" + duration = 10 SECONDS + ///damage multiplier + var/power = 1.15 + +/datum/status_effect/exposed/on_apply() + . = ..() + if(.) + owner.add_filter("exposed", 2, list("type" = "outline", "color" = COLOR_YELLOW, "size" = 1)) + if(ismegafauna(owner)) + power = 1.30 + duration *= 4 + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod *= power + H.physiology.burn_mod *= power + H.physiology.tox_mod *= power + H.physiology.oxy_mod *= power + H.physiology.clone_mod *= power + H.physiology.stamina_mod *= power + else if(isanimal(owner)) + var/mob/living/simple_animal/S = owner + for(var/i in S.damage_coeff) + S.damage_coeff[i] *= power + +/datum/status_effect/exposed/on_remove() + owner.remove_filter("exposed") + if(ishuman(owner)) + var/mob/living/carbon/human/H = owner + H.physiology.brute_mod /= power + H.physiology.burn_mod /= power + H.physiology.tox_mod /= power + H.physiology.oxy_mod /= power + H.physiology.clone_mod /= power + H.physiology.stamina_mod /= power + else if(isanimal(owner)) + var/mob/living/simple_animal/S = owner + for(var/i in S.damage_coeff) + S.damage_coeff[i] /= power diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 531cb24d23a7..8476fdfff783 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -419,15 +419,29 @@ desc = "A strange eye, said to have been torn from an omniscient creature that used to roam the wastes." icon_state = "godeye" item_state = "godeye" - vision_flags = SEE_TURFS|SEE_MOBS|SEE_OBJS + vision_flags = SEE_TURFS darkness_view = 8 lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE resistance_flags = LAVA_PROOF | FIRE_PROOF clothing_flags = SCAN_REAGENTS + var/obj/effect/proc_holder/expose/expose_ability /obj/item/clothing/glasses/godeye/Initialize() . = ..() - ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) + expose_ability = new(expose_ability) + +/obj/item/clothing/glasses/godeye/equipped(mob/living/user, slot) + . = ..() + if(ishuman(user) && slot == ITEM_SLOT_EYES) + ADD_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) + user.AddAbility(expose_ability) + +/obj/item/clothing/glasses/godeye/dropped(mob/living/user) + . = ..() + // Behead someone, their "glasses" drop on the floor + // and thus, the god eye should no longer be sticky + REMOVE_TRAIT(src, TRAIT_NODROP, EYE_OF_GOD_TRAIT) + user.RemoveAbility(expose_ability) /obj/item/clothing/glasses/godeye/attackby(obj/item/W as obj, mob/user as mob, params) if(istype(W, src) && W != src && W.loc == user) @@ -438,11 +452,62 @@ if(iscarbon(user)) var/mob/living/carbon/C = user C.update_inv_wear_mask() - else - to_chat(user, span_notice("The eye winks at you and vanishes into the abyss, you feel really unlucky.")) - qdel(src) + qdel(src) ..() +/obj/effect/proc_holder/expose + name = "Expose" + desc = "Expose an enemy, increasing all damage dealt to them by 15% for 10 seconds, effect is magnified on megafauna." + action_background_icon_state = "bg_demon" + action_icon = 'icons/mob/actions/actions_items.dmi' + action_icon_state = "expose" + ranged_mousepointer = 'icons/effects/mouse_pointers/expose_target.dmi' + var/cooldown_time = 1 MINUTES + COOLDOWN_DECLARE(scan_cooldown) + +/obj/effect/proc_holder/expose/on_lose(mob/living/user) + remove_ranged_ability() + +/obj/effect/proc_holder/expose/Click(location, control, params) + . = ..() + if(!isliving(usr)) + return TRUE + var/mob/living/user = usr + fire(user) + +/obj/effect/proc_holder/expose/fire(mob/living/carbon/user) + if(active) + remove_ranged_ability(span_notice("You relax your god eye.")) + else + add_ranged_ability(user, span_notice("You squint your god eye. Left-click a creature to expose it!"), TRUE) + +/obj/effect/proc_holder/expose/InterceptClickOn(mob/living/caller, params, atom/target) + . = ..() + if(.) + return + if(ranged_ability_user.stat) + remove_ranged_ability() + return + if(!COOLDOWN_FINISHED(src, scan_cooldown)) + to_chat(ranged_ability_user, span_warning("You try to focus your god eye, but it's too tired. Give it some time to recharge!")) + return + if(!isliving(target) || target == ranged_ability_user) + return + var/mob/living/living_target = target + living_target.apply_status_effect(STATUS_EFFECT_EXPOSED) + living_target.Jitter(5) + to_chat(living_target, span_warning("You feel the gaze of a malevolent presence focus on you!")) + ranged_ability_user.playsound_local(get_turf(ranged_ability_user), 'sound/magic/smoke.ogg', 50, TRUE) + living_target.playsound_local(get_turf(living_target), 'sound/hallucinations/i_see_you1.ogg', 50, TRUE) + to_chat(ranged_ability_user, "You glare at [living_target], exposing them!") + COOLDOWN_START(src, scan_cooldown, cooldown_time) + addtimer(CALLBACK(src, .proc/cooldown_over, ranged_ability_user), cooldown_time) + remove_ranged_ability() + return TRUE + +/obj/effect/proc_holder/expose/proc/cooldown_over() + to_chat(usr, (span_notice("Your god eye is focused enough to expose again!"))) + /obj/item/clothing/glasses/AltClick(mob/user) if(glass_colour_type && ishuman(user)) var/mob/living/carbon/human/H = user diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 42552ff61bf0..3699ff40587b 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -24,54 +24,52 @@ if(4) new /obj/item/katana/cursed(src) if(5) - new /obj/item/clothing/glasses/godeye(src) - if(6) new /obj/item/reagent_containers/glass/bottle/potion/flight(src) - if(7) + if(6) new /obj/item/stack/sheet/mineral/mythril(src) - if(8) + if(7) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/resonator_blast(src) else new /obj/item/disk/design_disk/modkit_disc/rapid_repeater(src) - if(9) + if(8) new /obj/item/rod_of_asclepius(src) - if(10) + if(9) new /obj/item/organ/heart/cursed/wizard(src) - if(11) + if(10) new /obj/item/ship_in_a_bottle(src) - if(12) + if(11) new /obj/item/reagent_containers/glass/bottle/necropolis_seed(src) - if(13) + if(12) new /obj/item/jacobs_ladder(src) - if(14) + if(13) new /obj/item/nullrod/scythe/talking(src) - if(15) + if(14) new /obj/item/nullrod/armblade(src) - if(16) + if(15) if(prob(50)) new /obj/item/disk/design_disk/modkit_disc/mob_and_turf_aoe(src) else new /obj/item/disk/design_disk/modkit_disc/bounty(src) - if(17) + if(16) new /obj/item/warp_cube/red(src) - if(18) + if(17) new /obj/item/organ/heart/gland/heals(src) - if(19) + if(18) new /obj/item/immortality_talisman(src) - if(20) + if(19) new /obj/item/voodoo(src) - if(21) + if(20) new /obj/item/reagent_containers/food/drinks/bottle/holywater/hell(src) new /obj/item/clothing/suit/space/hardsuit/ert/paranormal/inquisitor(src) - if(22) + if(21) new /obj/item/book_of_babel(src) - if(23) + if(22) new /obj/item/borg/upgrade/modkit/lifesteal(src) new /obj/item/bedsheet/cult(src) - if(24) + if(23) new /obj/item/clothing/neck/necklace/memento_mori(src) - if(25) + if(24) new /obj/item/rune_scimmy(src) //KA modkit design discs /obj/item/disk/design_disk/modkit_disc @@ -1126,6 +1124,7 @@ var/random_crystal = pick(choices) new random_crystal(src) new /obj/item/organ/vocal_cords/colossus(src) + new /obj/item/clothing/glasses/godeye(src) /obj/structure/closet/crate/necropolis/colossus/crusher name = "angelic colossus chest" diff --git a/icons/effects/mouse_pointers/expose_target.dmi b/icons/effects/mouse_pointers/expose_target.dmi new file mode 100644 index 000000000000..f2e1c5170a63 Binary files /dev/null and b/icons/effects/mouse_pointers/expose_target.dmi differ diff --git a/icons/mob/actions/actions_items.dmi b/icons/mob/actions/actions_items.dmi index a5fdbfb41efd..83e30b8dd7cb 100644 Binary files a/icons/mob/actions/actions_items.dmi and b/icons/mob/actions/actions_items.dmi differ