//Wraith spectacles: Grants x-ray and night vision at the eventual cost of the wearer's sight if worn too long. Nar-Sian cultists are instantly blinded. /obj/item/clothing/glasses/wraith_spectacles name = "antique spectacles" desc = "Unnerving glasses with opaque yellow lenses." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "wraith_specs" item_state = "glasses" actions_types = list(/datum/action/item_action/toggle) resistance_flags = FIRE_PROOF | ACID_PROOF flags_cover = GLASSESCOVERSEYES visor_flags_inv = HIDEEYES visor_vars_to_toggle = NONE //we don't actually toggle anything we just set it tint = 3 //this'll get reset, but it won't handle vision updates properly otherwise /obj/item/clothing/glasses/wraith_spectacles/Initialize() . = ..() GLOB.all_clockwork_objects += src /obj/item/clothing/glasses/wraith_spectacles/Destroy() GLOB.all_clockwork_objects -= src return ..() /obj/item/clothing/glasses/wraith_spectacles/attack_self(mob/user) weldingvisortoggle(user) /obj/item/clothing/glasses/wraith_spectacles/visor_toggling() ..() set_vision_vars(FALSE) /obj/item/clothing/glasses/wraith_spectacles/weldingvisortoggle(mob/user) . = ..() if(ishuman(loc)) var/mob/living/carbon/human/H = loc if(src == H.glasses && !up) if(H.disabilities & BLIND) to_chat(H, "\"You're blind, idiot. Stop embarrassing yourself.\"") return if(blind_cultist(H)) return if(is_servant_of_ratvar(H)) to_chat(H, "You push the spectacles down, and all is revealed to you.[GLOB.ratvar_awakens ? "" : " Your eyes begin to itch - you cannot do this for long."]") var/datum/status_effect/wraith_spectacles/WS = H.has_status_effect(STATUS_EFFECT_WRAITHSPECS) if(WS) WS.apply_eye_damage(H) H.apply_status_effect(STATUS_EFFECT_WRAITHSPECS) else to_chat(H, "You push the spectacles down, but you can't see through the glass.") /obj/item/clothing/glasses/wraith_spectacles/proc/blind_cultist(mob/living/victim) if(iscultist(victim)) to_chat(victim, "\"It looks like Nar-Sie's dogs really don't value their eyes.\"") to_chat(victim, "Your eyes explode with horrific pain!") victim.emote("scream") victim.become_blind() victim.adjust_blurriness(30) victim.adjust_blindness(30) return TRUE /obj/item/clothing/glasses/wraith_spectacles/proc/set_vision_vars(update_vision) lighting_alpha = null tint = 0 vision_flags = NONE darkness_view = 2 if(!up) if(is_servant_of_ratvar(loc)) lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE vision_flags = SEE_MOBS | SEE_TURFS | SEE_OBJS darkness_view = 3 else tint = 3 if(update_vision && iscarbon(loc)) var/mob/living/carbon/C = loc C.head_update(src, forced = 1) /obj/item/clothing/glasses/wraith_spectacles/equipped(mob/living/user, slot) ..() if(slot != slot_glasses || up) return if(user.disabilities & BLIND) to_chat(user, "\"You're blind, idiot. Stop embarrassing yourself.\"" ) return if(blind_cultist(user)) //Cultists instantly go blind return set_vision_vars(TRUE) if(is_servant_of_ratvar(user)) to_chat(user, "As you put on the spectacles, all is revealed to you.[GLOB.ratvar_awakens || GLOB.ratvar_approaches ? "" : " Your eyes begin to itch - you cannot do this for long."]") var/datum/status_effect/wraith_spectacles/WS = user.has_status_effect(STATUS_EFFECT_WRAITHSPECS) if(WS) WS.apply_eye_damage(user) user.apply_status_effect(STATUS_EFFECT_WRAITHSPECS) else to_chat(user, "You put on the spectacles, but you can't see through the glass.") //The effect that causes/repairs the damage the spectacles cause. /datum/status_effect/wraith_spectacles id = "wraith_spectacles" duration = -1 //remains until eye damage done reaches 0 while the glasses are not worn tick_interval = 20 alert_type = /obj/screen/alert/status_effect/wraith_spectacles var/eye_damage_done = 0 var/nearsight_breakpoint = 30 var/blind_breakpoint = 45 /obj/screen/alert/status_effect/wraith_spectacles name = "Wraith Spectacles" desc = "You shouldn't actually see this, as it should be procedurally generated." icon_state = "wraithspecs" alerttooltipstyle = "clockcult" /obj/screen/alert/status_effect/wraith_spectacles/MouseEntered(location,control,params) var/mob/living/carbon/human/L = usr if(istype(L)) //this is probably more safety than actually needed var/datum/status_effect/wraith_spectacles/W = attached_effect var/glasses_right = istype(L.glasses, /obj/item/clothing/glasses/wraith_spectacles) var/obj/item/clothing/glasses/wraith_spectacles/WS = L.glasses desc = "[glasses_right && !WS.up ? "":""]You are [glasses_right ? "":"not "]wearing wraith spectacles[glasses_right && !WS.up ? "!":"."]
\ You have taken [W.eye_damage_done] eye damage from them.
" if(L.disabilities & NEARSIGHT) desc += "You are nearsighted!
" else if(glasses_right && !WS.up) desc += "You will become nearsighted at [W.nearsight_breakpoint] eye damage.
" if(L.disabilities & BLIND) desc += "You are blind!" else if(glasses_right && !WS.up) desc += "You will become blind at [W.blind_breakpoint] eye damage." ..() /datum/status_effect/wraith_spectacles/on_apply() if(ishuman(owner)) var/mob/living/carbon/human/H = owner apply_eye_damage(H) return ..() /datum/status_effect/wraith_spectacles/tick() if(!ishuman(owner)) qdel(src) return var/mob/living/carbon/human/H = owner var/glasses_right = istype(H.glasses, /obj/item/clothing/glasses/wraith_spectacles) var/obj/item/clothing/glasses/wraith_spectacles/WS = H.glasses if(glasses_right && !WS.up && !GLOB.ratvar_awakens && !GLOB.ratvar_approaches) apply_eye_damage(H) else if(GLOB.ratvar_awakens) H.cure_nearsighted() H.cure_blind() H.adjust_eye_damage(-eye_damage_done) eye_damage_done = 0 else if(prob(50) && eye_damage_done) H.adjust_eye_damage(-1) eye_damage_done = max(0, eye_damage_done - 1) if(!eye_damage_done) qdel(src) /datum/status_effect/wraith_spectacles/proc/apply_eye_damage(mob/living/carbon/human/H) if(H.disabilities & BLIND) return H.adjust_eye_damage(0.5) eye_damage_done += 0.5 if(eye_damage_done >= 20) H.adjust_blurriness(2) if(eye_damage_done >= nearsight_breakpoint) if(H.become_nearsighted()) to_chat(H, "Your vision doubles, then trebles. Darkness begins to close in. You can't keep this up!") if(eye_damage_done >= blind_breakpoint) if(H.become_blind()) to_chat(H, "A piercing white light floods your vision. Suddenly, all goes dark!") if(prob(min(20, 5 + eye_damage_done))) to_chat(H, "Your eyes continue to burn.")