diff --git a/code/__DEFINES/lighting.dm b/code/__DEFINES/lighting.dm index ca56fab92ac..08e76678fff 100644 --- a/code/__DEFINES/lighting.dm +++ b/code/__DEFINES/lighting.dm @@ -38,6 +38,8 @@ ///How many tiles standard fires glow. #define LIGHT_RANGE_FIRE 3 +#define LIGHT_POWER_FIRE 2 + #define LIGHT_FIRE_BLOSSOM 2.1 #define LIGHT_RANGE_FIRE_BLOSSOM_HARVESTED 2.7 #define LIGHT_POWER_FIRE_BLOSSOM_HARVESTED 1.5 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index 5900f1308c4..0432ebdc2d7 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -52,7 +52,7 @@ /// Max amounts of fire stacks a mob can get #define MAX_FIRE_STACKS 20 /// If a mob has a higher threshold than this, the icon shown will be increased to the big fire icon. -#define MOB_BIG_FIRE_STACK_THRESHOLD 3 +#define MOB_BIG_FIRE_STACK_THRESHOLD 5 // Grouped effect sources, see also code/__DEFINES/traits.dm diff --git a/code/datums/elements/permanent_fire_overlay.dm b/code/datums/elements/permanent_fire_overlay.dm index 514d0f121a4..5e93568cb3d 100644 --- a/code/datums/elements/permanent_fire_overlay.dm +++ b/code/datums/elements/permanent_fire_overlay.dm @@ -20,5 +20,5 @@ var/mutable_appearance/created_overlay = source.get_fire_overlay(stacks = MAX_FIRE_STACKS, on_fire = TRUE) if(isnull(created_overlay)) return - overlays |= created_overlay + overlays |= source.make_fire_emissive(created_overlay) diff --git a/code/datums/status_effects/debuffs/fire_stacks.dm b/code/datums/status_effects/debuffs/fire_stacks.dm index b4b46a8a1c2..d55ed23e165 100644 --- a/code/datums/status_effects/debuffs/fire_stacks.dm +++ b/code/datums/status_effects/debuffs/fire_stacks.dm @@ -136,7 +136,7 @@ /// Reference to the mob light emitter itself var/obj/effect/dummy/lighting_obj/moblight /// Type of mob light emitter we use when on fire - var/moblight_type = /obj/effect/dummy/lighting_obj/moblight/fire + var/obj/effect/dummy/lighting_obj/moblight/moblight_type = /obj/effect/dummy/lighting_obj/moblight/fire /// Cached particle type var/cached_state @@ -157,8 +157,14 @@ /datum/status_effect/fire_handler/fire_stacks/on_remove() UnregisterSignal(owner, COMSIG_ATOM_TOUCHED_SPARKS) - if (cached_state) - owner.remove_shared_particles(cached_state) + +/datum/status_effect/fire_handler/fire_stacks/cache_stacks() + . = ..() + if(isnull(moblight)) + return + var/stack_percent = stacks / stack_limit + moblight.set_light_power(max(0.5, round(moblight_type::light_power * stack_percent, 0.1))) + moblight.set_light_range(max(1.5, round(moblight_type::light_range * stack_percent, 0.1))) /datum/status_effect/fire_handler/fire_stacks/tick(seconds_between_ticks) if(stacks <= 0) @@ -183,25 +189,6 @@ deal_damage(seconds_between_ticks) -/datum/status_effect/fire_handler/fire_stacks/update_particles() - if (!on_fire) - if (cached_state) - owner.remove_shared_particles(cached_state) - cached_state = null - return - - var/particle_type = /particles/embers/minor - if(stacks > MOB_BIG_FIRE_STACK_THRESHOLD) - particle_type = /particles/embers - - if (cached_state == particle_type) - return - - if (cached_state) - owner.remove_shared_particles(cached_state) - owner.add_shared_particles(particle_type) - cached_state = particle_type - /** * Proc that handles damage dealing and all special effects * @@ -309,6 +296,7 @@ return overlays |= created_overlay + overlays |= source.make_fire_emissive(created_overlay) /datum/status_effect/fire_handler/wet_stacks id = "wet_stacks" diff --git a/code/game/objects/effects/lighting.dm b/code/game/objects/effects/lighting.dm index caeedbd22bb..8ff28513b65 100644 --- a/code/game/objects/effects/lighting.dm +++ b/code/game/objects/effects/lighting.dm @@ -37,7 +37,7 @@ name = "mob fire lighting" light_color = LIGHT_COLOR_FIRE light_range = LIGHT_RANGE_FIRE - light_power = 2 + light_power = LIGHT_POWER_FIRE /obj/effect/dummy/lighting_obj/moblight/species name = "species lighting" diff --git a/code/modules/mob/living/basic/basic.dm b/code/modules/mob/living/basic/basic.dm index 0965a5cc5ab..bb89e69b42c 100644 --- a/code/modules/mob/living/basic/basic.dm +++ b/code/modules/mob/living/basic/basic.dm @@ -305,16 +305,7 @@ adjust_bodytemperature((maximum_survivable_temperature + (fire_handler.stacks * 12)) * 0.5 * seconds_per_tick) /mob/living/basic/get_fire_overlay(stacks, on_fire) - var/fire_icon = "generic_fire" - if(!GLOB.fire_appearances[fire_icon]) - GLOB.fire_appearances[fire_icon] = mutable_appearance( - 'icons/mob/effects/onfire.dmi', - fire_icon, - -HIGHEST_LAYER, - appearance_flags = RESET_COLOR|KEEP_APART, - ) - - return GLOB.fire_appearances[fire_icon] + return make_generic_fire_overlay() /mob/living/basic/put_in_hands(obj/item/I, del_on_fail = FALSE, merge_stacks = TRUE, ignore_animation = TRUE) . = ..() @@ -351,4 +342,3 @@ return TRUE else return FALSE - diff --git a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm index 8a74590fe78..c4531313769 100644 --- a/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm +++ b/code/modules/mob/living/carbon/alien/adult/adult_update_icons.dm @@ -3,6 +3,8 @@ cut_overlays() for(var/I in overlays_standing) add_overlay(I) + for(var/I in managed_overlays) + add_overlay(I) var/are_we_drooling = istype(click_intercept, /datum/action/cooldown/alien/acid) diff --git a/code/modules/mob/living/carbon/alien/adult/queen.dm b/code/modules/mob/living/carbon/alien/adult/queen.dm index 74c23220dd3..b388bba684d 100644 --- a/code/modules/mob/living/carbon/alien/adult/queen.dm +++ b/code/modules/mob/living/carbon/alien/adult/queen.dm @@ -35,6 +35,23 @@ /mob/living/carbon/alien/adult/royal/can_inject(mob/user, target_zone, injection_flags) return FALSE +/mob/living/carbon/alien/adult/royal/get_fire_overlay(stacks, on_fire) + var/fire_key = "royal_fire" + + if(!GLOB.fire_appearances[fire_key]) + var/mutable_appearance/fire = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + "generic_fire", + ABOVE_ALL_MOB_LAYER, + appearance_flags = RESET_COLOR|KEEP_APART|PIXEL_SCALE, + ) + fire.pixel_x = 16 + fire.pixel_y = 8 + fire.transform = fire.transform.Scale(2, 2) + GLOB.fire_appearances[fire_key] = fire + + return GLOB.fire_appearances[fire_key] + /mob/living/carbon/alien/adult/royal/queen name = "alien queen" caste = "q" diff --git a/code/modules/mob/living/carbon/alien/alien.dm b/code/modules/mob/living/carbon/alien/alien.dm index dd1c97daee1..a524b6c91b6 100644 --- a/code/modules/mob/living/carbon/alien/alien.dm +++ b/code/modules/mob/living/carbon/alien/alien.dm @@ -200,3 +200,6 @@ Des: Removes all infected images from the alien. /mob/living/carbon/alien/get_footprint_sprite() return FOOTPRINT_SPRITE_CLAWS + +/mob/living/carbon/alien/get_fire_overlay(stacks, on_fire) + return make_generic_fire_overlay() diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index fe3fff35db1..25cc456dda3 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -1896,6 +1896,26 @@ GLOBAL_LIST_EMPTY(fire_appearances) RETURN_TYPE(/mutable_appearance) return null +/// Create a fire overlay using the generic fire sprites +/mob/living/proc/make_generic_fire_overlay() + var/fire_key = "[base_pixel_x]_[base_pixel_y]_fire" + if(!GLOB.fire_appearances[fire_key]) + var/mutable_appearance/fire = mutable_appearance( + 'icons/mob/effects/onfire.dmi', + "generic_fire", + ABOVE_ALL_MOB_LAYER, + appearance_flags = RESET_COLOR|KEEP_APART, + ) + fire.pixel_x = -1 * base_pixel_x + fire.pixel_y = -1 * base_pixel_y + GLOB.fire_appearances[fire_key] = fire + + return GLOB.fire_appearances[fire_key] + +/// Takes a fire overlay and generates an emissive appearance for it +/mob/living/proc/make_fire_emissive(mutable_appearance/fire_overlay) + return emissive_appearance(fire_overlay.icon, fire_overlay.icon_state, src, fire_overlay.layer) + /** * Handles effects happening when mob is on normal fire * diff --git a/code/modules/mob/living/silicon/robot/robot.dm b/code/modules/mob/living/silicon/robot/robot.dm index 176caf3f346..b132ce92987 100644 --- a/code/modules/mob/living/silicon/robot/robot.dm +++ b/code/modules/mob/living/silicon/robot/robot.dm @@ -1047,18 +1047,7 @@ to_chat(src, span_notice("Your frustration has empowered you! You can now right yourself faster!")) /mob/living/silicon/robot/get_fire_overlay(stacks, on_fire) - var/fire_icon = "generic_fire" - - if(!GLOB.fire_appearances[fire_icon]) - var/mutable_appearance/new_fire_overlay = mutable_appearance( - 'icons/mob/effects/onfire.dmi', - fire_icon, - -HIGHEST_LAYER, - appearance_flags = RESET_COLOR|KEEP_APART, - ) - GLOB.fire_appearances[fire_icon] = new_fire_overlay - - return GLOB.fire_appearances[fire_icon] + return make_generic_fire_overlay() /// Draw power from the robot /mob/living/silicon/robot/proc/draw_power(power_to_draw) diff --git a/icons/mob/effects/onfire.dmi b/icons/mob/effects/onfire.dmi index 0ef0b16c011..09ffc089c78 100644 Binary files a/icons/mob/effects/onfire.dmi and b/icons/mob/effects/onfire.dmi differ