upstream-merge-28109

upstream-merge-28352
This commit is contained in:
LetterJay
2017-06-13 01:10:21 -05:00
parent 2a5be91970
commit 226345d82a
13 changed files with 594 additions and 369 deletions
+173
View File
@@ -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