From aebc4192820e01c2585f4e86317a03e271507faf Mon Sep 17 00:00:00 2001 From: SmArtKar <44720187+SmArtKar@users.noreply.github.com> Date: Wed, 27 Aug 2025 19:40:56 +0200 Subject: [PATCH] Resprites all mineral overlays (from mining scanners) (#92725) --- code/game/objects/items/stacks/bscrystal.dm | 2 +- code/game/turfs/closed/minerals.dm | 24 ++++++------- .../mining/equipment/mineral_scanner.dm | 33 ++++++++++-------- code/modules/mining/ores_coins.dm | 16 ++++----- icons/effects/ore_visuals.dmi | Bin 27421 -> 5843 bytes 5 files changed, 39 insertions(+), 36 deletions(-) diff --git a/code/game/objects/items/stacks/bscrystal.dm b/code/game/objects/items/stacks/bscrystal.dm index 9219c1e1f39..1082d682c4f 100644 --- a/code/game/objects/items/stacks/bscrystal.dm +++ b/code/game/objects/items/stacks/bscrystal.dm @@ -11,7 +11,7 @@ points = 50 refined_type = /obj/item/stack/sheet/bluespace_crystal grind_results = list(/datum/reagent/bluespace = 20) - scan_state = "rock_BScrystal" + scan_state = "rock_bscrystal" merge_type = /obj/item/stack/ore/bluespace_crystal /// The teleport range when crushed/thrown at someone. var/blink_range = 8 diff --git a/code/game/turfs/closed/minerals.dm b/code/game/turfs/closed/minerals.dm index 714991c1b55..505371164bf 100644 --- a/code/game/turfs/closed/minerals.dm +++ b/code/game/turfs/closed/minerals.dm @@ -85,12 +85,12 @@ /turf/closed/mineral/proc/Change_Ore(ore_type, random = 0) if(random) mineralAmt = rand(1, 5) - if(ispath(ore_type, /obj/item/stack/ore)) //If it has a scan_state, switch to it + if(ispath(ore_type, /obj/item/stack/ore)) // If it has a scan_state, switch to it var/obj/item/stack/ore/the_ore = ore_type scan_state = initial(the_ore.scan_state) // I SAID. SWITCH. TO. IT. mineralType = ore_type // Everything else assumes that this is typed correctly so don't set it to non-ores thanks. if(ispath(ore_type, /obj/item/boulder)) - scan_state = "rock_Boulder" //Yes even the lowly boulder has a scan state + scan_state = "rock_boulder" // Yes even the lowly boulder has a scan state spawned_boulder = /obj/item/boulder/gulag_expanded /** @@ -545,7 +545,7 @@ /turf/closed/mineral/iron mineralType = /obj/item/stack/ore/iron - scan_state = "rock_Iron" + scan_state = "rock_iron" /turf/closed/mineral/iron/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -565,7 +565,7 @@ /turf/closed/mineral/uranium mineralType = /obj/item/stack/ore/uranium - scan_state = "rock_Uranium" + scan_state = "rock_uranium" /turf/closed/mineral/uranium/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -575,7 +575,7 @@ /turf/closed/mineral/diamond mineralType = /obj/item/stack/ore/diamond - scan_state = "rock_Diamond" + scan_state = "rock_diamond" /turf/closed/mineral/diamond/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -595,7 +595,7 @@ /turf/closed/mineral/gold mineralType = /obj/item/stack/ore/gold - scan_state = "rock_Gold" + scan_state = "rock_gold" /turf/closed/mineral/gold/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -605,7 +605,7 @@ /turf/closed/mineral/silver mineralType = /obj/item/stack/ore/silver - scan_state = "rock_Silver" + scan_state = "rock_silver" /turf/closed/mineral/silver/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -620,7 +620,7 @@ /turf/closed/mineral/titanium mineralType = /obj/item/stack/ore/titanium - scan_state = "rock_Titanium" + scan_state = "rock_titanium" /turf/closed/mineral/titanium/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -630,7 +630,7 @@ /turf/closed/mineral/plasma mineralType = /obj/item/stack/ore/plasma - scan_state = "rock_Plasma" + scan_state = "rock_plasma" /turf/closed/mineral/plasma/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -651,7 +651,7 @@ /turf/closed/mineral/bananium mineralType = /obj/item/stack/ore/bananium mineralAmt = 3 - scan_state = "rock_Bananium" + scan_state = "rock_bananium" /turf/closed/mineral/bananium/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -662,7 +662,7 @@ /turf/closed/mineral/bscrystal mineralType = /obj/item/stack/ore/bluespace_crystal mineralAmt = 1 - scan_state = "rock_BScrystal" + scan_state = "rock_bscrystal" /turf/closed/mineral/bscrystal/volcanic turf_type = /turf/open/misc/asteroid/basalt/lava_land_surface @@ -770,7 +770,7 @@ /turf/closed/mineral/gibtonite mineralAmt = 1 MAP_SWITCH(, icon_state = "rock_Gibtonite_inactive") - scan_state = "rock_Gibtonite" + scan_state = "rock_gibtonite" var/det_time = 8 //Countdown till explosion, but also rewards the player for how close you were to detonation when you defuse it var/stage = GIBTONITE_UNSTRUCK //How far into the lifecycle of gibtonite we are var/activated_ckey = null //These are to track who triggered the gibtonite deposit for logging purposes diff --git a/code/modules/mining/equipment/mineral_scanner.dm b/code/modules/mining/equipment/mineral_scanner.dm index bfb709912e1..b662242fb84 100644 --- a/code/modules/mining/equipment/mineral_scanner.dm +++ b/code/modules/mining/equipment/mineral_scanner.dm @@ -70,15 +70,12 @@ var/turf/t = get_turf(src) mineral_scan_pulse(t, range, src) -/proc/mineral_scan_pulse(turf/T, range = world.view, obj/item/scanner) - var/list/minerals = list() +/proc/mineral_scan_pulse(turf/start_turf, range = world.view, obj/item/scanner) var/vents_nearby = FALSE var/undiscovered = FALSE var/radar_volume = 30 - for(var/turf/closed/mineral/mineral in RANGE_TURFS(range, T)) - if(mineral.scan_state) - minerals += mineral - for(var/obj/structure/ore_vent/vent in range(range, T)) + + for(var/obj/structure/ore_vent/vent in range(range, start_turf)) if(!vents_nearby && (!vent.discovered || !vent.tapped)) vents_nearby = TRUE if(vent.discovered) @@ -87,27 +84,33 @@ radar_volume = max(potential_volume, radar_volume) vent.add_mineral_overlays() - if(LAZYLEN(minerals)) - for(var/turf/closed/mineral/M in minerals) - var/obj/effect/temp_visual/mining_overlay/oldC = locate(/obj/effect/temp_visual/mining_overlay) in M - if(oldC) - qdel(oldC) - var/obj/effect/temp_visual/mining_overlay/C = new /obj/effect/temp_visual/mining_overlay(M) - C.icon_state = M.scan_state + for(var/turf/closed/mineral/mineral in RANGE_TURFS(range, start_turf)) + if(!mineral.scan_state) + continue + + var/obj/effect/temp_visual/mining_overlay/scan_overlay = locate(/obj/effect/temp_visual/mining_overlay) in mineral + if(!scan_overlay) + scan_overlay = new(mineral) + scan_overlay.icon_state = mineral.scan_state + continue + + deltimer(scan_overlay.timerid) + scan_overlay.timerid = QDEL_IN_STOPPABLE(scan_overlay, scan_overlay.duration) + animate(scan_overlay, alpha = 0, time = scan_overlay.duration, easing = scan_overlay.easing_style) if(vents_nearby && scanner) if(undiscovered) playsound(scanner, 'sound/machines/radar-ping.ogg', radar_volume, FALSE) + scanner.balloon_alert_to_viewers("ore vent nearby") else playsound(scanner, 'sound/machines/sonar-ping.ogg', radar_volume, FALSE) - scanner.balloon_alert_to_viewers("ore vent nearby") scanner.spasm_animation(1.5 SECONDS) /obj/effect/temp_visual/mining_overlay plane = HIGH_GAME_PLANE layer = FLASH_LAYER icon = 'icons/effects/ore_visuals.dmi' - appearance_flags = 0 //to avoid having TILE_BOUND in the flags, so that the 480x480 icon states let you see it no matter where you are + 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 pixel_x = -224 pixel_y = -224 diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index bc8ef95ef2f..599f446017d 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -77,7 +77,7 @@ mats_per_unit = list(/datum/material/uranium=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/uranium mine_experience = 6 - scan_state = "rock_Uranium" + scan_state = "rock_uranium" spreadChance = 5 merge_type = /obj/item/stack/ore/uranium @@ -89,7 +89,7 @@ mats_per_unit = list(/datum/material/iron=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/iron mine_experience = 1 - scan_state = "rock_Iron" + scan_state = "rock_iron" spreadChance = 20 merge_type = /obj/item/stack/ore/iron @@ -153,7 +153,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mats_per_unit = list(/datum/material/plasma=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/plasma mine_experience = 5 - scan_state = "rock_Plasma" + scan_state = "rock_plasma" spreadChance = 8 merge_type = /obj/item/stack/ore/plasma @@ -169,7 +169,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 3 mats_per_unit = list(/datum/material/silver=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/silver - scan_state = "rock_Silver" + scan_state = "rock_silver" spreadChance = 5 merge_type = /obj/item/stack/ore/silver @@ -181,7 +181,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mine_experience = 5 mats_per_unit = list(/datum/material/gold=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/gold - scan_state = "rock_Gold" + scan_state = "rock_gold" spreadChance = 5 merge_type = /obj/item/stack/ore/gold @@ -193,7 +193,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mats_per_unit = list(/datum/material/diamond=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/diamond mine_experience = 10 - scan_state = "rock_Diamond" + scan_state = "rock_diamond" merge_type = /obj/item/stack/ore/diamond /obj/item/stack/ore/diamond/five @@ -207,7 +207,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mats_per_unit = list(/datum/material/bananium=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/bananium mine_experience = 15 - scan_state = "rock_Bananium" + scan_state = "rock_bananium" merge_type = /obj/item/stack/ore/bananium /obj/item/stack/ore/titanium @@ -218,7 +218,7 @@ GLOBAL_LIST_INIT(sand_recipes, list(\ mats_per_unit = list(/datum/material/titanium=SHEET_MATERIAL_AMOUNT) refined_type = /obj/item/stack/sheet/mineral/titanium mine_experience = 3 - scan_state = "rock_Titanium" + scan_state = "rock_titanium" spreadChance = 5 merge_type = /obj/item/stack/ore/titanium diff --git a/icons/effects/ore_visuals.dmi b/icons/effects/ore_visuals.dmi index 87c31c8c7df6cee8e523011812724482a30ffb3f..a27dbc30a3b95f7c946ab5786b91ac21082c55cc 100644 GIT binary patch literal 5843 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 M)cr`w;eZ?e1?&S