upstream-merge-28109
upstream-merge-28352
This commit is contained in:
@@ -132,3 +132,176 @@
|
||||
|
||||
/obj/item/organ/eyes/robotic/shield/emp_act(severity)
|
||||
return
|
||||
|
||||
#define RGB2EYECOLORSTRING(definitionvar) ("[copytext(definitionvar,2,3)][copytext(definitionvar,4,5)][copytext(definitionvar,6,7)]")
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow
|
||||
name = "High Luminosity Eyes"
|
||||
desc = "Special glowing eyes, used by snowflakes who want to be special."
|
||||
origin_tech = "material=3;biotech=3;engineering=3;magnets=4"
|
||||
eye_color = "000"
|
||||
actions_types = list(/datum/action/item_action/organ_action/use, /datum/action/item_action/organ_action/toggle)
|
||||
var/current_color_string = "#ffffff"
|
||||
var/active = FALSE
|
||||
var/max_light_beam_distance = 5
|
||||
var/light_beam_distance = 5
|
||||
var/light_object_range = 1
|
||||
var/light_object_power = 2
|
||||
var/list/obj/effect/abstract/eye_lighting/eye_lighting
|
||||
var/obj/effect/abstract/eye_lighting/on_mob
|
||||
var/image/mob_overlay
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Initialize()
|
||||
. = ..()
|
||||
mob_overlay = image('icons/mob/human_face.dmi', "eyes_glow_gs")
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Destroy()
|
||||
terminate_effects()
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/Remove()
|
||||
terminate_effects()
|
||||
. = ..()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/terminate_effects()
|
||||
if(owner && active)
|
||||
deactivate()
|
||||
active = FALSE
|
||||
clear_visuals(TRUE)
|
||||
STOP_PROCESSING(SSfastprocess, src)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/ui_action_click(owner, action)
|
||||
if(istype(action, /datum/action/item_action/organ_action/toggle))
|
||||
toggle_active()
|
||||
else if(istype(action, /datum/action/item_action/organ_action/use))
|
||||
prompt_for_controls(owner)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/toggle_active()
|
||||
if(active)
|
||||
deactivate()
|
||||
else
|
||||
activate()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/prompt_for_controls(mob/user)
|
||||
var/C = input(owner, "Select Color", "Select color", "#ffffff") as null|color
|
||||
if(!C || QDELETED(src) || QDELETED(user) || QDELETED(owner) || owner != user)
|
||||
return
|
||||
var/range = input(user, "Enter range (0 - [max_light_beam_distance])", "Range Select", 0) as null|num
|
||||
|
||||
set_distance(Clamp(range, 0, max_light_beam_distance))
|
||||
assume_rgb(C)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/assume_rgb(newcolor)
|
||||
current_color_string = newcolor
|
||||
eye_color = RGB2EYECOLORSTRING(current_color_string)
|
||||
sync_light_effects()
|
||||
cycle_mob_overlay()
|
||||
if(!QDELETED(owner) && ishuman(owner)) //Other carbon mobs don't have eye color.
|
||||
owner.dna.species.handle_body(owner)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/cycle_mob_overlay()
|
||||
remove_mob_overlay()
|
||||
mob_overlay.color = current_color_string
|
||||
add_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/add_mob_overlay()
|
||||
if(!QDELETED(owner))
|
||||
owner.add_overlay(mob_overlay)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/remove_mob_overlay()
|
||||
if(!QDELETED(owner))
|
||||
owner.cut_overlay(mob_overlay)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/emp_act()
|
||||
if(active)
|
||||
deactivate(silent = TRUE)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/on_mob_move()
|
||||
if(QDELETED(owner) || !active)
|
||||
return
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/on_mob_turn()
|
||||
if(QDELETED(owner) || !active)
|
||||
return
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/activate(silent = FALSE)
|
||||
start_visuals()
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='warning'>Your [src] clicks and makes a whining noise, before shooting out a beam of light!</span>")
|
||||
active = TRUE
|
||||
cycle_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/deactivate(silent = FALSE)
|
||||
clear_visuals()
|
||||
if(!silent)
|
||||
to_chat(owner, "<span class='warning'>Your [src] shuts off!</span>")
|
||||
active = FALSE
|
||||
remove_mob_overlay()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/update_visuals()
|
||||
if((LAZYLEN(eye_lighting) < light_beam_distance) || !on_mob)
|
||||
regenerate_light_effects()
|
||||
var/turf/scanfrom = get_turf(owner)
|
||||
var/scandir = owner.dir
|
||||
if(!istype(scanfrom))
|
||||
clear_visuals()
|
||||
var/turf/scanning = scanfrom
|
||||
var/stop = FALSE
|
||||
on_mob.forceMove(scanning)
|
||||
for(var/i in 1 to light_beam_distance)
|
||||
scanning = get_step(scanning, scandir)
|
||||
if(scanning.opacity || scanning.has_opaque_atom)
|
||||
stop = TRUE
|
||||
var/obj/effect/abstract/eye_lighting/L = LAZYACCESS(eye_lighting, i)
|
||||
if(stop)
|
||||
L.forceMove(src)
|
||||
else
|
||||
L.forceMove(scanning)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/clear_visuals(delete_everything = FALSE)
|
||||
if(delete_everything)
|
||||
QDEL_LIST(eye_lighting)
|
||||
QDEL_NULL(on_mob)
|
||||
else
|
||||
for(var/i in eye_lighting)
|
||||
var/obj/effect/abstract/eye_lighting/L = i
|
||||
L.forceMove(src)
|
||||
if(!QDELETED(on_mob))
|
||||
on_mob.forceMove(src)
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/start_visuals()
|
||||
if(!islist(eye_lighting))
|
||||
regenerate_light_effects()
|
||||
if((eye_lighting.len < light_beam_distance) || !on_mob)
|
||||
regenerate_light_effects()
|
||||
sync_light_effects()
|
||||
update_visuals()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/set_distance(dist)
|
||||
light_beam_distance = dist
|
||||
regenerate_light_effects()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/regenerate_light_effects()
|
||||
clear_visuals(TRUE)
|
||||
on_mob = new(src)
|
||||
for(var/i in 1 to light_beam_distance)
|
||||
LAZYADD(eye_lighting,new /obj/effect/abstract/eye_lighting(src))
|
||||
sync_light_effects()
|
||||
|
||||
/obj/item/organ/eyes/robotic/glow/proc/sync_light_effects()
|
||||
for(var/I in eye_lighting)
|
||||
var/obj/effect/abstract/eye_lighting/L = I
|
||||
L.set_light(light_object_range, light_object_power, current_color_string)
|
||||
if(on_mob)
|
||||
on_mob.set_light(1, 1, current_color_string)
|
||||
|
||||
/obj/effect/abstract/eye_lighting
|
||||
var/obj/item/organ/eyes/robotic/glow/parent
|
||||
|
||||
/obj/effect/abstract/eye_lighting/Initialize()
|
||||
. = ..()
|
||||
parent = loc
|
||||
if(!istype(parent))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
Reference in New Issue
Block a user