mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2025-12-22 16:12:19 +00:00
175 lines
4.6 KiB
Plaintext
175 lines
4.6 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/examine(mob/user, distance)
|
|
. = ..()
|
|
if(distance <= 1)
|
|
to_chat(user, 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 ore_data)
|
|
var/ore/O = 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 = OBFUSCATION_LAYER + 0.1)
|
|
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()
|
|
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
|