Files
Aurora.3/code/modules/mining/ore_detector.dm
Cody Brittain ddb14f4036 Planes & Layers part 1: The Re-Layering Redux (#18741)
This is part 1 of a project to, eventually, bring the render planes
system from /tg/ and bay into Aurora. This is a prerequisite and blocker
for many things the development team and community want to have, and
this was long overdue.

Many objects have been re-assigned layers, which are now thoroughly
defined. Maps have had their custom layer defines purged, as we should
be moving away from this in favor of saner definitions in the base
items.

This should be a test-merge due to the sheer amount of layers changed,
which will very likely create issues that I cannot possibly discover and
debug in a reasonable amount of time myself.

---------

Co-authored-by: Cody Brittain <cbrittain10@live.com>
2024-04-01 14:50:27 +00:00

177 lines
4.7 KiB
Plaintext

#define MINOR_ARTIFACTS "Minor Artifacts" // defined solely so someone doesn't typo it
#define MAJOR_ARTIFACTS "Major Artifacts"
#define SURFACE_MINERALS "Surface Minerals"
#define PRECIOUS_METALS "Precious Metals"
#define NUCLEAR_FUEL "Nuclear Fuel"
#define EXOTIC_MATTER "Exotic Matter"
/obj/item/ore_detector
name = "ore detector"
desc = "A device capable of locating and displaying ores to the average untrained hole explorer."
icon = 'icons/obj/item/tools/ore_scanner.dmi'
icon_state = "ore_scanner"
item_state = "ore_scanner"
w_class = ITEMSIZE_SMALL
slot_flags = SLOT_BELT
force = 1
var/active = FALSE
var/datum/weakref/our_user
var/list/ore_pings = list()
var/list/search_ores = list()
var/ping_rate = 4 SECONDS
var/last_ping = 0
var/list/ore_names
/obj/item/ore_detector/get_examine_text(mob/user, distance, is_adjacent, infix, suffix)
. = ..()
if(distance <= 1)
. += FONT_SMALL(SPAN_NOTICE("Alt-click to set the ore you wish to search for."))
/obj/item/ore_detector/Destroy()
deactivate()
return ..()
/obj/item/ore_detector/update_icon()
icon_state = "ore_scanner[active ? "-active" : ""]"
/obj/item/ore_detector/attack_self(mob/user)
ui_interact(user)
/obj/item/ore_detector/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "OreDetector", ui_x=400, ui_y=420)
ui.open()
/obj/item/ore_detector/ui_data(mob/user)
if(!length(ore_names))
ore_names = list()
for(var/ore_n in GLOB.ore_data)
var/ore/O = GLOB.ore_data[ore_n]
var/ore_name = O.display_name
ore_names += ore_name
ore_names += SURFACE_MINERALS
ore_names += PRECIOUS_METALS
ore_names += NUCLEAR_FUEL
ore_names += EXOTIC_MATTER
ore_names += MINOR_ARTIFACTS
ore_names += MAJOR_ARTIFACTS
var/list/data = list()
data["ore_names"] = ore_names
data["search_ores"] = search_ores
data["enabled"] = active
return data
/obj/item/ore_detector/ui_act(action,params)
. = ..()
if(.)
return
if(action=="toggle")
if(active)
deactivate()
else
activate(usr)
. = TRUE
update_icon()
if(action=="select_ore")
if(params["ore_name"] in search_ores)
search_ores -= params["ore_name"]
else
search_ores += params["ore_name"]
if(!length(search_ores))
deactivate()
. = TRUE
/obj/item/ore_detector/process()
if(last_ping + ping_rate > world.time)
return
if(isnull(our_user))
deactivate()
return
clear_images()
var/mob/M = our_user.resolve()
if(loc != M && loc.loc != M)
deactivate()
return
last_ping = world.time
var/turf/our_turf = get_turf(src)
for(var/turf/turf as anything in RANGE_TURFS(7, our_turf))
if(isnull(our_user)) // in the event it's dropped midsweep
return
var/found_ores = FALSE
if(
length(turf.resources) && \
( \
((SURFACE_MINERALS in search_ores) && (ORE_IRON in turf.resources)) || \
((PRECIOUS_METALS in search_ores) && ((ORE_GOLD in turf.resources) || (ORE_SILVER in turf.resources) || (ORE_DIAMOND in turf.resources))) || \
((NUCLEAR_FUEL in search_ores) && (ORE_URANIUM in turf.resources)) || \
((EXOTIC_MATTER in search_ores) && ((ORE_PHORON in turf.resources) || (ORE_PLATINUM in turf.resources) || (ORE_HYDROGEN in turf.resources))) \
) \
)
found_ores = TRUE
if(!found_ores)
var/turf/simulated/mineral/mine_turf = turf
if(istype(mine_turf, /turf/simulated/mineral))
if((length(mine_turf.finds) && (MINOR_ARTIFACTS in search_ores)) || (mine_turf.artifact_find && (MAJOR_ARTIFACTS in search_ores)) || (mine_turf.mineral && (mine_turf.mineral.display_name in search_ores)))
found_ores = TRUE
if(found_ores)
var/image/ore_ping = image(icon = 'icons/obj/item/tools/ore_scanner.dmi', icon_state = "signal_overlay", loc = our_turf, layer = UNDER_HUD_LAYER)
ore_ping.pixel_x = rand(-6, 6)
ore_ping.pixel_y = rand(-6, 6)
ore_ping.alpha = rand(180, 255)
pixel_shift_to_turf(ore_ping, our_turf, turf)
if(M.client)
M.client.images += ore_ping
ore_pings += ore_ping
/obj/item/ore_detector/emp_act(severity)
. = ..()
deactivate()
/obj/item/ore_detector/proc/activate(var/mob/user)
if(!length(search_ores))
return
START_PROCESSING(SSprocessing, src)
our_user = WEAKREF(user)
active = TRUE
update_icon()
/obj/item/ore_detector/proc/deactivate()
active = FALSE
STOP_PROCESSING(SSprocessing, src)
clear_images()
our_user = null
update_icon()
/obj/item/ore_detector/proc/clear_images()
var/mob/M = our_user?.resolve()
if(M?.client)
M.client.images -= ore_pings
ore_pings.Cut()
/obj/item/ore_detector/throw_at()
..()
deactivate()
/obj/item/ore_detector/dropped()
..()
deactivate()
/obj/item/ore_detector/on_give()
deactivate()
#undef MINOR_ARTIFACTS
#undef MAJOR_ARTIFACTS
#undef SURFACE_MINERALS
#undef PRECIOUS_METALS
#undef NUCLEAR_FUEL
#undef EXOTIC_MATTER