diff --git a/code/datums/components/overlay_lighting.dm b/code/datums/components/overlay_lighting.dm index b4796b5a4f0..9546826270e 100644 --- a/code/datums/components/overlay_lighting.dm +++ b/code/datums/components/overlay_lighting.dm @@ -5,8 +5,6 @@ #define GET_PARENT (parent_attached_to || parent) -#define GET_LIGHT_SOURCE (directional_atom || current_holder) - #define SHORT_CAST 2 /** @@ -53,7 +51,7 @@ ) ///Overlay effect to cut into the darkness and provide light. - var/obj/effect/overlay/light_visible/visible_mask + var/image/visible_mask ///Lazy list to track the turfs being affected by our light, to determine their visibility. var/list/turf/affected_turfs ///Movable atom currently holding the light. Parent might be a flashlight, for example, but that might be held by a mob or something else. @@ -61,13 +59,15 @@ ///Movable atom the parent is attached to. For example, a flashlight into a helmet or gun. We'll need to track the thing the parent is attached to as if it were the parent itself. var/atom/movable/parent_attached_to ///Whether we're a directional light - var/directional - ///Abstractional atom for directional light, we move this around to make the directional effect - var/obj/effect/abstract/directional_lighting/directional_atom + var/directional = FALSE ///A cone overlay for directional light, it's alpha and color are dependant on the light - var/obj/effect/overlay/light_cone/cone + var/image/cone ///Current tracked direction for the directional cast behaviour var/current_direction + ///Tracks current directional x offset so we dont update unecessarily + var/directional_offset_x + ///Tracks current directional y offset so we dont update unecessarily + var/directional_offset_y ///Cast range for the directional cast (how far away the atom is moved) var/cast_range = 2 @@ -82,11 +82,16 @@ . = ..() - visible_mask = new() + visible_mask = image('icons/effects/light_overlays/light_32.dmi', icon_state = "light") + visible_mask.plane = O_LIGHTING_VISUAL_PLANE + visible_mask.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + visible_mask.alpha = 0 if(is_directional) directional = TRUE - directional_atom = new() - cone = new() + cone = image('icons/effects/light_overlays/light_cone.dmi', icon_state = "light") + cone.plane = O_LIGHTING_VISUAL_PLANE + cone.appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM + cone.alpha = 110 cone.transform = cone.transform.Translate(-32, -32) set_direction(movable_parent.dir) if(!isnull(_range)) @@ -149,10 +154,9 @@ set_parent_attached_to(null) set_holder(null) clean_old_turfs() - QDEL_NULL(visible_mask) - if(directional) - QDEL_NULL(directional_atom) - QDEL_NULL(cone) + visible_mask = null + cone = null + parent_attached_to = null return ..() @@ -167,9 +171,8 @@ /datum/component/overlay_lighting/proc/get_new_turfs() if(!current_holder) return - var/atom/movable/light_source = GET_LIGHT_SOURCE . = list() - for(var/turf/lit_turf in view(lumcount_range, get_turf(light_source))) + for(var/turf/lit_turf in view(lumcount_range, get_turf(current_holder))) lit_turf.dynamic_lumcount += lum_power . += lit_turf if(length(.)) @@ -188,22 +191,19 @@ ///Adds the luminosity and source for the afected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/add_dynamic_lumi() - var/atom/movable/light_source = GET_LIGHT_SOURCE - LAZYSET(light_source.affected_dynamic_lights, src, lumcount_range + 1) - light_source.vis_contents += visible_mask - light_source.update_dynamic_luminosity() + LAZYSET(current_holder.affected_dynamic_lights, src, lumcount_range + 1) + current_holder.underlays += visible_mask + current_holder.update_dynamic_luminosity() if(directional) - current_holder.vis_contents += cone + current_holder.underlays += cone ///Removes the luminosity and source for the afected movable atoms to keep track of their visibility. /datum/component/overlay_lighting/proc/remove_dynamic_lumi() - var/atom/movable/light_source = GET_LIGHT_SOURCE - LAZYREMOVE(light_source.affected_dynamic_lights, src) - light_source.vis_contents -= visible_mask - light_source.update_dynamic_luminosity() + LAZYREMOVE(current_holder.affected_dynamic_lights, src) + current_holder.underlays -= visible_mask + current_holder.update_dynamic_luminosity() if(directional) - current_holder.vis_contents -= cone - directional_atom.moveToNullspace() + current_holder.underlays -= cone ///Called to change the value of parent_attached_to. /datum/component/overlay_lighting/proc/set_parent_attached_to(atom/movable/new_parent_attached_to) @@ -330,6 +330,8 @@ range = clamp(CEILING(new_range, 0.5), 1, 6) var/pixel_bounds = ((range - 1) * 64) + 32 lumcount_range = CEILING(range, 1) + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask visible_mask.icon = light_overlays["[pixel_bounds]"] if(pixel_bounds == 32) visible_mask.transform = null @@ -338,6 +340,8 @@ var/matrix/transform = new transform.Translate(-offset, -offset) visible_mask.transform = transform + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask if(directional) cast_range = clamp(round(new_range * 0.5), 1, 3) if(overlay_lighting_flags & LIGHTING_ON) @@ -350,18 +354,36 @@ var/new_power = source.light_power set_lum_power(new_power >= 0 ? 0.5 : -0.5) set_alpha = min(230, (abs(new_power) * 120) + 30) + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask visible_mask.alpha = set_alpha - if(directional) - cone.alpha = min(200, (abs(new_power) * 90)+20) + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + if(!directional) + return + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= cone + cone.alpha = min(200, (abs(new_power) * 90)+20) + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += cone ///Changes the light's color, pretty straightforward. /datum/component/overlay_lighting/proc/set_color(atom/source, old_color) SIGNAL_HANDLER var/new_color = source.light_color + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= visible_mask visible_mask.color = new_color - if(directional) - cone.color = new_color + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask + if(!directional) + return + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays -= cone + cone.color = new_color + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += cone ///Toggles the light on and off. @@ -433,9 +455,31 @@ for(var/i in 1 to final_distance) var/turf/next_turf = get_step(scanning, current_direction) if(isnull(next_turf) || IS_OPAQUE_TURF(next_turf)) + final_distance = i break scanning = next_turf - directional_atom.forceMove(scanning) + + current_holder.underlays -= visible_mask + + var/translate_x = -((range - 1) * 32) + var/translate_y = translate_x + switch(current_direction) + if(NORTH) + translate_y += 32 * final_distance + if(SOUTH) + translate_y += -32 * final_distance + if(EAST) + translate_x += 32 * final_distance + if(WEST) + translate_x += -32 * final_distance + if((directional_offset_x != translate_x) || (directional_offset_y != translate_y)) + directional_offset_x = translate_x + directional_offset_y = translate_y + var/matrix/transform = matrix() + transform.Translate(translate_x, translate_y) + visible_mask.transform = transform + if(overlay_lighting_flags & LIGHTING_ON) + current_holder.underlays += visible_mask ///Called when current_holder changes loc. /datum/component/overlay_lighting/proc/on_holder_dir_change(atom/movable/source, olddir, newdir) @@ -454,7 +498,6 @@ if(current_direction == newdir) return current_direction = newdir - cone.setDir(newdir) if(overlay_lighting_flags & LIGHTING_ON) make_luminosity_update() @@ -477,5 +520,4 @@ #undef LIGHTING_ON #undef LIGHTING_ATTACHED #undef GET_PARENT -#undef GET_LIGHT_SOURCE #undef SHORT_CAST diff --git a/code/game/objects/effects/misc.dm b/code/game/objects/effects/misc.dm index e42a45182a6..e5bdececf79 100644 --- a/code/game/objects/effects/misc.dm +++ b/code/game/objects/effects/misc.dm @@ -95,5 +95,3 @@ if(!ismob(loc)) return INITIALIZE_HINT_QDEL -/obj/effect/abstract/directional_lighting - mouse_opacity = MOUSE_OPACITY_TRANSPARENT diff --git a/code/game/objects/effects/overlays.dm b/code/game/objects/effects/overlays.dm index 0a38171dfa3..d5ae3073d6c 100644 --- a/code/game/objects/effects/overlays.dm +++ b/code/game/objects/effects/overlays.dm @@ -65,25 +65,3 @@ mouse_opacity = MOUSE_OPACITY_TRANSPARENT plane = ATMOS_GROUP_PLANE - -/obj/effect/overlay/light_visible - name = "" - icon = 'icons/effects/light_overlays/light_32.dmi' - icon_state = "light" - plane = O_LIGHTING_VISUAL_PLANE - appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - alpha = 0 - vis_flags = NONE - blocks_emissive = NONE - -/obj/effect/overlay/light_cone - name = "" - icon = 'icons/effects/light_overlays/light_cone.dmi' - icon_state = "light" - plane = O_LIGHTING_VISUAL_PLANE - appearance_flags = RESET_COLOR | RESET_ALPHA | RESET_TRANSFORM - mouse_opacity = MOUSE_OPACITY_TRANSPARENT - vis_flags = NONE - alpha = 110 - blocks_emissive = NONE