Reworking eyes of god to be risk / reward / from colossus (#20163)

* eye see what is happening here

* loot it and ship it

* more progress

* more progress

* eye see

Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>

* Apply suggestions from code review

Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>

* removing extra comment to rerun checks while I think on sprite

* name / sprite, good to go™️

* BSH no longer spawns invisible penguins

* oops wrong branch

Co-authored-by: Ryan <80364400+Sirryan2002@users.noreply.github.com>
This commit is contained in:
Qwertytoforty
2023-01-20 19:28:22 -05:00
committed by GitHub
co-authored by Ryan
parent 67c6813568
commit aec7c3ff3f
16 changed files with 177 additions and 49 deletions
-37
View File
@@ -463,43 +463,6 @@
item_state = "eyepatch"
flags = NODROP
/obj/item/clothing/glasses/godeye
name = "eye of god"
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
see_in_dark = 8
scan_reagents = 1
prescription = TRUE
flags = NODROP
flags_cover = null
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
resistance_flags = LAVA_PROOF | FIRE_PROOF
sprite_sheets = list(
"Vox" = 'icons/mob/clothing/species/vox/eyes.dmi',
"Grey" = 'icons/mob/clothing/species/grey/eyes.dmi',
"Drask" = 'icons/mob/clothing/species/drask/eyes.dmi'
)
///Have we combined this with another godeye?
var/double_eye = FALSE
/obj/item/clothing/glasses/godeye/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/clothing/glasses/godeye) && W != src)
var/obj/item/clothing/glasses/godeye/second_eye = W
if(!second_eye.double_eye && !double_eye)
double_eye = TRUE
icon_state = "doublegodeye"
item_state = "doublegodeye"
name = "eyes of god"
desc = "A pair of strange eyes, said to have been torn from an omniscient creature that used to roam the wastes. There's no real reason to have two, but that isn't stopping you."
if(iscarbon(user))
var/mob/living/carbon/C = user
C.update_inv_wear_mask()
qdel(W)
..()
/obj/item/clothing/glasses/tajblind
name = "embroidered veil"
desc = "An Ahdominian made veil that allows the user to see while obscuring their eyes."
@@ -3,10 +3,12 @@
name = "colossus chest"
/obj/structure/closet/crate/necropolis/colossus/populate_contents()
var/list/choices = subtypesof(/obj/machinery/anomalous_crystal)
var/random_crystal = pick(choices)
new random_crystal(src)
new /obj/item/organ/internal/vocal_cords/colossus(src)
var/list/crystalchoices = subtypesof(/obj/machinery/anomalous_crystal)
var/random_crystal = pick(crystalchoices)
var/list/choices = list(/obj/item/organ/internal/vocal_cords/colossus, /obj/item/organ/internal/eyes/cybernetic/eyesofgod, random_crystal)
for(var/I in 1 to 2)
var/loot = pick_n_take(choices)
new loot(src)
/obj/structure/closet/crate/necropolis/colossus/crusher
name = "angelic colossus chest"
@@ -12,7 +12,7 @@
desc = "It's watching you suspiciously."
/obj/structure/closet/crate/necropolis/tendril/populate_contents()
var/loot = rand(1, 24)
var/loot = rand(1, 23)
switch(loot)
if(1)
new /obj/item/shared_storage/red(src)
@@ -24,7 +24,7 @@
if(4)
new /obj/item/organ/internal/cyberimp/arm/katana(src)
if(5)
new /obj/item/clothing/glasses/godeye(src)
new /obj/item/book_of_babel(src)
if(6)
new /obj/item/pickaxe/diamond(src)
if(7)
@@ -67,8 +67,6 @@
if(22)
new /obj/item/spellbook/oneuse/summonitem(src)
if(23)
new /obj/item/book_of_babel(src)
if(24)
new /obj/item/borg/upgrade/modkit/lifesteal(src)
new /obj/item/bedsheet/cult(src)
+3 -1
View File
@@ -357,8 +357,10 @@
if(HAS_TRAIT(H, TRAIT_SKELETONIZED) && (!H.w_uniform) && (!H.wear_suit))
H.play_xylophone()
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, laser_pointer = FALSE, type = /obj/screen/fullscreen/flash)
. = ..()
SIGNAL_HANDLER
SEND_SIGNAL(src, COMSIG_CARBON_FLASH_EYES, laser_pointer)
var/damage = intensity - check_eye_prot()
var/extra_damage = 0
if(.)
@@ -565,6 +565,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
update_tail_layer()
update_wing_layer()
update_halo_layer()
update_eyes_overlay_layer()
overlays.Cut() // Force all overlays to regenerate
update_fire()
update_icons()
@@ -1365,6 +1366,17 @@ GLOBAL_LIST_EMPTY(damage_icon_parts)
apply_overlay(HALO_LAYER)
/mob/living/carbon/human/proc/update_eyes_overlay_layer()
remove_overlay(EYES_OVERLAY_LAYER)
var/obj/item/organ/internal/eyes/eyes_organ = get_int_organ(/obj/item/organ/internal/eyes)
if(istype(eyes_organ, /obj/item/organ/internal/eyes/cybernetic/eyesofgod))
var/obj/item/organ/internal/eyes/cybernetic/eyesofgod/E = eyes_organ
if(E.active)
var/mutable_appearance/new_eye_overlay = mutable_appearance('icons/effects/32x64.dmi', "eyesofgod", -EYES_OVERLAY_LAYER)
overlays_standing[EYES_OVERLAY_LAYER] = new_eye_overlay
apply_overlay(EYES_OVERLAY_LAYER)
/mob/living/carbon/human/admin_Freeze(client/admin, skip_overlays = TRUE, mech = null)
if(..())
+1 -1
View File
@@ -831,7 +831,7 @@
return "You can't fit into that vent."
//called when the mob receives a bright flash
/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash)
/mob/living/proc/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, laser_pointer = FALSE, type = /obj/screen/fullscreen/flash)
if(check_eye_prot() < intensity && (override_blindness_check || !HAS_TRAIT(src, TRAIT_BLIND)) && !HAS_TRAIT(src, TRAIT_FLASH_PROTECTION))
overlay_fullscreen("flash", type)
addtimer(CALLBACK(src, PROC_REF(clear_fullscreen), "flash", 25), 25)
+141
View File
@@ -207,3 +207,144 @@
/obj/item/organ/internal/eyes/cybernetic/shield/emp_act(severity)
return
#define INTACT 0
#define ONE_SHATTERED 1
#define BOTH_SHATTERED 2
/obj/item/organ/internal/eyes/cybernetic/eyesofgod //no occuline allowed
name = "\improper Eyes of the Gods"
desc = "Two eyes said to belong to the gods. But such vision comes at a price"
icon_state = "eyesofgod"
eye_color = "#58a5ec"
see_in_dark = 8
flash_protect = FLASH_PROTECTION_SENSITIVE
emp_proof = TRUE //They are crystal artifacts, not metal
min_bruised_damage = 30
min_broken_damage = 60
actions_types = list(/datum/action/item_action/organ_action/use/eyesofgod)
var/active = FALSE
var/shatter_state = INTACT
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/Destroy()
deactivate()
return ..()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/remove(mob/living/carbon/human/M, special)
owner.cure_nearsighted() //Let's not leave the owner with blindness permamently that only admins / re-adding the eyes can remove
owner.cure_blind()
deactivate()
return ..()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/on_life()
. = ..()
if(is_mining_level(owner.z)) //More lavaland use cause magic or something. Don't worry about the ash in peoples eyes.
heal_internal_damage(1, 1)
if(!active)
switch(damage)
if(0 to 10)
heal_internal_damage(1, 1)
if(prob(25))
owner.cure_nearsighted()
owner.cure_blind()
unshatter()
if(10 to 30)
heal_internal_damage(0.5, 1)
if(prob(10))
owner.cure_blind()
unshatter()
if(30 to 60)
heal_internal_damage(0.33, 1)
if(60 to INFINITY)
heal_internal_damage(0.25, 1)
else
owner.mob_light("#58a5ec", 3, _duration = 2 SECONDS)
receive_damage(1.5, 1)
for(var/obj/O in range(7, owner))
var/turf/T = get_turf(O)
for(var/mob/M in O.contents)
receive_damage(0.25, 1)
new /obj/effect/temp_visual/eyesofgod(T)
if(prob(25))
to_chat(M, "<span class='warning'>You feel like you are being watched...</span>")
switch(damage)
if(25 to 30)
if(prob(50))
to_chat(owner, "<span class='warning'>Your eyes are hurting a lot!</span>")
if(30 to 54)
receive_damage(0.75, 1) //more pain when damaged
if(55 to 60)
if(prob(50))
to_chat(owner, "<span class='warning'>Your eyes feel like they are going to explode!</span>")
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/proc/unshatter()
if(shatter_state == INTACT)
return
if(damage <= 10)
shatter_state = INTACT
else
if(shatter_state == ONE_SHATTERED)
return
shatter_state = ONE_SHATTERED
to_chat(owner, "<span class='notice'>Your feel better as your [shatter_state ? "left eye" : "right eye"] fixes itself!</span>")
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/receive_damage(amount, silent)
. = ..()
if(damage >= 30 && shatter_state == INTACT || damage >= 60 && shatter_state == ONE_SHATTERED)
shatter()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/proc/shatter()
var/msg = "no eye?"
switch(shatter_state)
if(ONE_SHATTERED)
shatter_state = BOTH_SHATTERED
msg = "left eye"
owner.become_blind(EYES_OF_GOD) //Special flag otherwise occuline heals it :gatto:
if(INTACT)
shatter_state = ONE_SHATTERED
msg = "right eye"
owner.become_nearsighted(EYES_OF_GOD)
to_chat(owner, "<span class='userdanger'>You scream out in pain as your [msg] shatters!</span>")
owner.emote("scream")
owner.bleed(5)
deactivate()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/proc/activate()
receive_damage(2, 1) //No flicky flicky on / off to fully negate damage
RegisterSignal(owner, COMSIG_CARBON_FLASH_EYES, PROC_REF(got_flashed))
active = TRUE
see_invisible = SEE_INVISIBLE_OBSERVER_AI_EYE
vision_flags = SEE_MOBS | SEE_OBJS | SEE_TURFS
lighting_alpha = LIGHTING_PLANE_ALPHA_MOSTLY_INVISIBLE
flash_protect = FLASH_PROTECTION_VERYVUNERABLE //Flashing is it's weakness. I don't care how many protections you have up
owner?.client?.color = LIGHT_COLOR_PURE_CYAN
owner.update_sight()
owner.update_eyes_overlay_layer()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/proc/deactivate()
UnregisterSignal(owner, COMSIG_CARBON_FLASH_EYES)
active = FALSE
see_invisible = initial(see_invisible)
vision_flags = initial(vision_flags)
lighting_alpha = initial(lighting_alpha)
flash_protect = initial(flash_protect)
owner?.client?.color = null
owner.update_sight()
owner.update_eyes_overlay_layer()
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/proc/got_flashed(mob/living/carbon/C, laser_pointer)
if(active && !laser_pointer) //Should be active but double checking, and no laser pointer memes, since that is ranged flashes with no skill / counter, unlike a more predectable flashbang
addtimer(CALLBACK(src, TYPE_PROC_REF(/obj/item/organ, receive_damage), 22), 0.1 SECONDS)//Enough with base flashing to kick people out of vision in a moment due to damage. Don't want to do it instantly, or it lets people take less damage from the base flash
/obj/item/organ/internal/eyes/cybernetic/eyesofgod/ui_action_click()
if(!active && shatter_state < BOTH_SHATTERED)
activate()
return
deactivate()
/obj/effect/temp_visual/eyesofgod
name = "eye mark"
icon_state = "shield_reversed"
duration = 2 SECONDS
invisibility = INVISIBILITY_OBSERVER