Files
SyncIt21 f640a0e972 Enhances algorithm for finding an atom mount (#94076)
## About The Pull Request
Depends on #94064 for the unit test but offers a better method for
finding an atom to mount on
- Finding a mount now takes into consideration the objects pixel x & y
offsets meaning diagonal mounting is now supported. Gives great
flexibility for mappers
- If you don't want to use pixel offsets but default back to using the
objects direction that behaviour is still preserved. Useful if your
object uses directional icon states(lights & cameras for now) AND don't
use offsets
- If no direction could be specified then as the last resort it defaults
back to the objects local turf for mounting

## Changelog
🆑
fix: all mounted objects on tables, fences, windows & walls should fall
of correctly when the atom it is placed on is destroyed
fix: security telescreen now falls off when their mounted wall is
destroyed
fix: defib wall mount falls off when their mounted wall is destroyed
fix: floor lights are mounted to the ground/catwalk/tram floor they are
sitting on meaning destroying it will destroy the light
fix: wall mounted plaques now fall off when their mounted wall is
destroyed
/🆑
2025-12-12 12:23:22 -05:00

156 lines
5.3 KiB
Plaintext

/obj/machinery/digital_clock
name = "digital clock"
desc = "An ultra-futuristic, sleek, advanced, next-gen normal digital clock that tells the time. Powered by bluespace. Despite supposedly being better in every way to classic clocks, it just doesn't feel the same. They just don't make them the way they used to..."
icon_state = "digital_clock_base"
icon = 'icons/obj/digital_clock.dmi'
verb_say = "beeps"
verb_ask = "bloops"
verb_exclaim = "blares"
density = FALSE
layer = ABOVE_WINDOW_LAYER
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4)
subsystem_type = /datum/controller/subsystem/processing/digital_clock
/obj/item/wallframe/digital_clock
name = "digital clock frame"
desc = "Used to build digital clocks, just secure to the wall."
icon_state = "digital_clock_base"
icon = 'icons/obj/digital_clock.dmi'
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 7, /datum/material/glass = SHEET_MATERIAL_AMOUNT * 4)
result_path = /obj/machinery/digital_clock
pixel_shift = 28
/obj/machinery/digital_clock/wrench_act_secondary(mob/living/user, obj/item/tool)
. = ..()
balloon_alert(user, "[anchored ? "un" : ""]securing...")
tool.play_tool_sound(src)
if(tool.use_tool(src, user, 6 SECONDS))
playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE)
balloon_alert(user, "[anchored ? "un" : ""]secured")
deconstruct()
return TRUE
/obj/machinery/digital_clock/welder_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return
if(atom_integrity >= max_integrity)
balloon_alert(user, "it doesn't need repairs!")
return TRUE
balloon_alert(user, "repairing display...")
if(!tool.use_tool(src, user, 4 SECONDS, amount = 0, volume=50))
return TRUE
balloon_alert(user, "repaired")
atom_integrity = max_integrity
set_machine_stat(machine_stat & ~BROKEN)
update_appearance()
return TRUE
/obj/machinery/digital_clock/multitool_act(mob/living/user, obj/item/tool)
if(user.combat_mode)
return
if(!(obj_flags & EMAGGED))
return
balloon_alert(user, "resetting...")
tool.play_tool_sound(src)
if(tool.use_tool(src, user, 6 SECONDS))
playsound(loc, 'sound/items/deconstruct.ogg', 50, vary = TRUE)
balloon_alert(user, "reset")
obj_flags &= ~EMAGGED
return TRUE
/obj/machinery/digital_clock/emag_act(mob/user, obj/item/card/emag/emag_card)
if(obj_flags & EMAGGED)
return FALSE
playsound(src, SFX_SPARKS, 100, vary = TRUE, extrarange = SHORT_RANGE_SOUND_EXTRARANGE)
do_sparks(3, cardinal_only = FALSE, source = src)
obj_flags |= EMAGGED
return TRUE
/obj/machinery/digital_clock/emp_act(severity)
. = ..()
emag_act()
/obj/machinery/digital_clock/on_deconstruction(disassembled)
if(disassembled)
new /obj/item/wallframe/digital_clock(drop_location())
else
new /obj/item/stack/sheet/iron(drop_location(), 2)
new /obj/item/shard(drop_location())
new /obj/item/shard(drop_location())
/obj/machinery/digital_clock/Initialize(mapload)
. = ..()
if(mapload)
find_and_mount_on_atom()
AddElement(/datum/element/beauty, 200)
/obj/machinery/digital_clock/process(seconds_per_tick)
if(machine_stat & NOPOWER)
return
update_appearance()
/obj/machinery/digital_clock/update_appearance(updates=ALL)
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
set_light(0)
return
set_light(l_range = 1.5, l_power = 0.7, l_color = LIGHT_COLOR_BLUE) // blue light
/obj/machinery/digital_clock/update_overlays()
. = ..()
if(machine_stat & (NOPOWER|BROKEN))
return
. += update_time()
return .
/obj/machinery/digital_clock/proc/update_time()
var/station_minutes
if(obj_flags & EMAGGED)
station_minutes = rand(0, 99)
else
station_minutes = text2num(station_time_timestamp(format = "mm"))
// tenth / the '3' in '31' / 31 -> 3.1 -> 3
var/station_minute_tenth = station_minutes >= 10 ? round(station_minutes * 0.1) : 0
// one / the '1' in '31' / 31 -> 31 - (3 * 10) -> 31 - 30 -> 1
var/station_minute_one = station_minutes - (station_minute_tenth * 10)
var/station_hours
if(obj_flags & EMAGGED)
station_hours = rand(0, 99)
else
station_hours = text2num(station_time_timestamp(format = "hh"))
// one / the '1' in '12' / 12 -> 1.2 -> 1
var/station_hours_tenth = station_minutes >= 10 ? round(station_hours * 0.1) : 0
// tenth / the '2' in '12' / 12 -> 12 - (1 * 10) -> 12 - 10 -> 2
var/station_hours_one = station_hours - (station_hours_tenth * 10)
var/return_overlays = list()
var/mutable_appearance/minute_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_one]")
minute_one_overlay.pixel_w = 0
return_overlays += minute_one_overlay
var/mutable_appearance/minute_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_minute_tenth]")
minute_tenth_overlay.pixel_w = -4
return_overlays += minute_tenth_overlay
var/mutable_appearance/separator = mutable_appearance('icons/obj/digital_clock.dmi', "+separator")
return_overlays += separator
var/mutable_appearance/hour_one_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_one]")
hour_one_overlay.pixel_w = -10
return_overlays += hour_one_overlay
var/mutable_appearance/hour_tenth_overlay = mutable_appearance('icons/obj/digital_clock.dmi', "+[station_hours_tenth]")
hour_tenth_overlay.pixel_w = -14
return_overlays += hour_tenth_overlay
return return_overlays
MAPPING_DIRECTIONAL_HELPERS(/obj/machinery/digital_clock, 28)