diff --git a/code/game/objects/structures/lavaland/ore_vent.dm b/code/game/objects/structures/lavaland/ore_vent.dm index 4870d33304e..f4ef87a2c09 100644 --- a/code/game/objects/structures/lavaland/ore_vent.dm +++ b/code/game/objects/structures/lavaland/ore_vent.dm @@ -54,12 +54,21 @@ /mob/living/basic/mining/brimdemon, /mob/living/basic/mining/bileworm, ) - ///What items can be used to scan a vent? + /// What items can be used to scan a vent? var/static/list/scanning_equipment = list( /obj/item/t_scanner/adv_mining_scanner, /obj/item/mining_scanner, ) + /// Turf above us that we're currently tracking, stored in case of movement jank + var/turf/tracked_turf = null + /// Visual overlay for our vent tap + var/obj/effect/abstract/vent_visual = null + /// Underlay visual for when we turn transparent + var/obj/effect/abstract/top_bit = null + /// Are we currently hiding our top half because someone is above us? + var/trimmed = FALSE + /// What base icon_state do we use for this vent's boulders? var/boulder_icon_state = "boulder" /// Percent chance that this vent will produce an artifact boulder. @@ -82,13 +91,13 @@ )) if(tapped) SSore_generation.processed_vents += src - icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) - add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) + add_tapped_visual() RegisterSignal(src, COMSIG_SPAWNER_SPAWNED_DEFAULT, PROC_REF(anti_cheese)) RegisterSignal(src, COMSIG_SPAWNER_SPAWNED, PROC_REF(log_mob_spawned)) AddElement(/datum/element/give_turf_traits, string_list(list(TRAIT_NO_TERRAFORM))) + set_turf_tracking() return ..() /obj/structure/ore_vent/Destroy() @@ -286,7 +295,6 @@ ) COOLDOWN_START(src, wave_cooldown, wave_timer) addtimer(CALLBACK(src, PROC_REF(handle_wave_conclusion)), wave_timer) - icon_state = icon_state_tapped update_appearance(UPDATE_ICON_STATE) /** @@ -321,7 +329,6 @@ */ /obj/structure/ore_vent/proc/initiate_wave_loss(loss_message) visible_message(span_danger(loss_message)) - icon_state = base_icon_state update_appearance(UPDATE_ICON_STATE) reset_drone(success = FALSE) @@ -335,23 +342,113 @@ log_game("Ore vent [key_name_and_tag(src)] was tapped") SSblackbox.record_feedback("tally", "ore_vent_completed", 1, type) balloon_alert_to_viewers("vent tapped!") - icon_state = icon_state_tapped - update_appearance(UPDATE_ICON_STATE) - qdel(GetComponent(/datum/component/gps)) - if(!forced) - for(var/mob/living/miner in range(7, src)) //Give the miners who are near the vent points and xp. - var/obj/item/card/id/user_id_card = miner.get_idcard(TRUE) - if(miner.stat <= SOFT_CRIT) - miner.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * boulder_size) - if(!user_id_card) - continue - var/point_reward_val = (MINER_POINT_MULTIPLIER * boulder_size) - MINER_POINT_MULTIPLIER // We remove the base value of discovering the vent - if(user_id_card.registered_account) - user_id_card.registered_account.mining_points += point_reward_val - user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") + update_appearance(UPDATE_ICON_STATE) + add_tapped_visual() + qdel(GetComponent(/datum/component/gps)) reset_drone(success = TRUE) - add_overlay(mutable_appearance('icons/obj/mining_zones/terrain.dmi', "well", ABOVE_MOB_LAYER)) + + if(forced) + return + + for(var/mob/living/miner in range(7, src)) //Give the miners who are near the vent points and xp. + var/obj/item/card/id/user_id_card = miner.get_idcard(TRUE) + if(miner.stat <= SOFT_CRIT) + miner.mind?.adjust_experience(/datum/skill/mining, MINING_SKILL_BOULDER_SIZE_XP * boulder_size) + if(!user_id_card) + continue + var/point_reward_val = (MINER_POINT_MULTIPLIER * boulder_size) - MINER_POINT_MULTIPLIER // We remove the base value of discovering the vent + if(user_id_card.registered_account) + user_id_card.registered_account.mining_points += point_reward_val + user_id_card.registered_account.bank_card_talk("You have been awarded [point_reward_val] mining points for your efforts.") + +/obj/structure/ore_vent/proc/add_tapped_visual() + if (vent_visual) + vis_contents |= vent_visual + return + + vent_visual = new(src) + vent_visual.icon = 'icons/obj/mining_zones/terrain.dmi' + vent_visual.icon_state = "well" + vent_visual.layer = ABOVE_MOB_LAYER + vent_visual.vis_flags = VIS_INHERIT_PLANE | VIS_INHERIT_ID + vis_contents += vent_visual + +/obj/structure/ore_vent/update_icon_state() + if (tapped) + icon_state = "[base_icon_state]_active" + else + icon_state = base_icon_state + if (trimmed) + icon_state = "[icon_state]_trimmed" + return ..() + +/obj/structure/ore_vent/Moved(atom/old_loc, movement_dir, forced, list/old_locs, momentum_change) + . = ..() + set_turf_tracking() + +/// Update the turf which we track for mobs entering/exiting +/obj/structure/ore_vent/proc/set_turf_tracking() + if (tracked_turf) + UnregisterSignal(tracked_turf, list(COMSIG_ATOM_ENTERED, COMSIG_ATOM_EXITED)) + + tracked_turf = locate(x, y + 1, z) + if (!isnull(tracked_turf)) + RegisterSignal(tracked_turf, COMSIG_ATOM_ENTERED, PROC_REF(on_entered)) + RegisterSignal(tracked_turf, COMSIG_ATOM_EXITED, PROC_REF(on_exited)) + +/obj/structure/ore_vent/proc/on_entered(atom/source, atom/movable/entered) + SIGNAL_HANDLER + + if (!isliving(entered)) + return + + if (!trimmed) + trim_vent() + +/obj/structure/ore_vent/proc/on_exited(atom/source, atom/movable/exited, direction) + SIGNAL_HANDLER + + if (!isliving(exited) || !isnull(locate(/mob/living) in tracked_turf)) + return + + if (trimmed) + untrim_vent() + +/// Turn the top part of the vent transparent and clickthrough +/obj/structure/ore_vent/proc/trim_vent() + trimmed = TRUE + update_appearance(UPDATE_ICON_STATE) + + if (vent_visual) + vent_visual.vis_flags &= ~VIS_INHERIT_ID + vent_visual.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + + if (!top_bit) + top_bit = new(src) + top_bit.icon = 'icons/obj/mining_zones/terrain.dmi' + // Because its transparent we can't just underlay the full thing + top_bit.icon_state = "[base_icon_state][tapped ? "_active" : ""]_trimmed_top" + top_bit.layer = ABOVE_MOB_LAYER + top_bit.vis_flags = VIS_INHERIT_PLANE | VIS_INHERIT_LAYER | VIS_UNDERLAY + top_bit.mouse_opacity = MOUSE_OPACITY_TRANSPARENT + + vis_contents |= top_bit + animate(src, 0.5 SECONDS, alpha = 128) + +/// Revert the transparency of the top half of the vent +/obj/structure/ore_vent/proc/untrim_vent() + trimmed = FALSE + update_appearance(UPDATE_ICON_STATE) + + if (vent_visual) + vent_visual.mouse_opacity = MOUSE_OPACITY_ICON + vent_visual.vis_flags |= VIS_INHERIT_ID + + if (top_bit) + vis_contents -= top_bit + + animate(src, 0.5 SECONDS, alpha = 255) /** * Sends our node back to base and cleans up after the reference @@ -420,12 +517,13 @@ */ /obj/structure/ore_vent/proc/add_mineral_overlays() if(mineral_breakdown.len && !discovered) - var/obj/effect/temp_visual/mining_overlay/vent/new_mat = new /obj/effect/temp_visual/mining_overlay/vent(drop_location()) - new_mat.icon_state = "unknown" + var/atom/movable/flick_visual/visual = flick_overlay_view(mutable_appearance('icons/effects/vent_overlays.dmi', "unknown"), 4.5 SECONDS) + animate(visual, alpha = 0, time = 4.5 SECONDS, easing = CIRCULAR_EASING|EASE_IN) return + for(var/datum/material/selected_mat as anything in mineral_breakdown) - var/obj/effect/temp_visual/mining_overlay/vent/new_mat = new /obj/effect/temp_visual/mining_overlay/vent(drop_location()) - new_mat.icon_state = selected_mat.name + var/atom/movable/flick_visual/visual = flick_overlay_view(mutable_appearance('icons/effects/vent_overlays.dmi', selected_mat.name), 4.5 SECONDS) + animate(visual, alpha = 0, time = 4.5 SECONDS, easing = CIRCULAR_EASING|EASE_IN) /** * Here is where we handle producing a new boulder, based on the qualities of this ore vent. @@ -562,7 +660,7 @@ /obj/structure/ore_vent/random/icebox //The one that shows up on the top level of icebox icon_state = "ore_vent_ice" - icon_state_tapped = "ore_vent_ice_active" + base_icon_state = "ore_vent_ice" defending_mobs = list( /mob/living/basic/mining/lobstrosity, /mob/living/basic/mining/legion/snow/spawner_made, @@ -653,7 +751,7 @@ /obj/structure/ore_vent/boss/icebox icon_state = "ore_vent_ice" - icon_state_tapped = "ore_vent_ice_active" + base_icon_state = "ore_vent_ice" defending_mobs = list( /mob/living/simple_animal/hostile/megafauna/demonic_frost_miner, /mob/living/simple_animal/hostile/megafauna/wendigo/noportal, diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index 420aad1ceaa..8d763fd2f67 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -113,7 +113,7 @@ layer = FLASH_LAYER icon = 'icons/effects/ore_visuals.dmi' appearance_flags = NONE // to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are - duration = 35 + duration = 3.5 SECONDS pixel_x = -224 pixel_y = -224 /// What animation easing to use when we create the ore overlay on rock walls/ore vents. @@ -122,11 +122,3 @@ /obj/effect/temp_visual/mining_overlay/Initialize(mapload) . = ..() animate(src, alpha = 0, time = duration, easing = easing_style) - -/obj/effect/temp_visual/mining_overlay/vent - icon = 'icons/effects/vent_overlays.dmi' - icon_state = "unknown" - duration = 45 - pixel_x = 0 - pixel_y = 0 - easing_style = CIRCULAR_EASING|EASE_IN diff --git a/icons/obj/mining_zones/terrain.dmi b/icons/obj/mining_zones/terrain.dmi index 5351cde085c..f46a677296b 100644 Binary files a/icons/obj/mining_zones/terrain.dmi and b/icons/obj/mining_zones/terrain.dmi differ