Files
Batrachophreno 5277251959 Tool behaviors port (#21663)
For a robust crafting system, I need a new materials framework.
For a new materials framework, I need to clean up reagents.
To clean up reagents, I need to pare down foods from reagent holders.
To pare down foods from reagent holders, I need to port edibility
components.
To port edibility components, I need to port processing components.
To port processing components, I need to port tool behaviors.

This is all back-end code, no new features or functionality from this.
2026-01-27 08:44:49 +00:00

197 lines
5.4 KiB
Plaintext

/obj/machinery/floor_light
name = "floor light"
icon = 'icons/obj/machinery/floor_light.dmi'
icon_state = "base"
desc = "A backlit floor panel."
layer = EXPOSED_WIRE_LAYER
anchored = 0
use_power = POWER_USE_ACTIVE
idle_power_usage = 2
active_power_usage = 20
power_channel = AREA_USAGE_LIGHT
matter = list(DEFAULT_WALL_MATERIAL = 2500, MATERIAL_GLASS = 2750)
recyclable = TRUE
var/on
var/on_state = "on"
var/damaged
var/default_light_range = 4
var/default_light_power = 2
var/default_light_colour = "#FFFFFF"
/obj/machinery/floor_light/prebuilt
anchored = 1
/obj/machinery/floor_light/attackby(obj/item/attacking_item, mob/user)
if(attacking_item.tool_behaviour == TOOL_SCREWDRIVER)
anchored = !anchored
visible_message(SPAN_NOTICE("\The [user] has [anchored ? "attached" : "detached"] \the [src]."))
playsound(src.loc, 'sound/items/Screwdriver.ogg', 100, 1)
return TRUE
else if(attacking_item.tool_behaviour == TOOL_WELDER && (damaged || (stat & BROKEN)))
var/obj/item/weldingtool/WT = attacking_item
if(!WT.use(0, user))
to_chat(user, SPAN_WARNING("\The [src] must be on to complete this task."))
return TRUE
if(!attacking_item.use_tool(src, user, 20, volume = 50))
return TRUE
if(!src || !WT.isOn())
return TRUE
visible_message(SPAN_NOTICE("\The [user] has repaired \the [src]."))
update_icon()
stat &= ~BROKEN
damaged = null
update_brightness()
return TRUE
else if(attacking_item.force && user.a_intent == "hurt")
return attack_hand(user)
else if(attacking_item.tool_behaviour == TOOL_CROWBAR)
if(anchored)
to_chat(user, SPAN_WARNING("\The [src] must be unfastened from the [loc] first!"))
return TRUE
else
to_chat(user, SPAN_NOTICE("You lever off the [name]."))
playsound(src.loc, 'sound/items/crowbar_tile.ogg', 100, TRUE)
if(stat & BROKEN)
qdel(src)
return TRUE
else
new /obj/item/stack/tile/light(user.loc)
qdel(src)
return TRUE
/obj/machinery/floor_light/attack_hand(var/mob/user)
if(user.a_intent == I_HURT && !issmall(user))
if(!isnull(damaged) && !(stat & BROKEN))
visible_message(SPAN_DANGER("\The [user] smashes \the [src]!"))
playsound(src, SFX_BREAK_GLASS, 70, 1)
update_icon()
stat |= BROKEN
else
visible_message(SPAN_DANGER("\The [user] attacks \the [src]!"))
playsound(src.loc, 'sound/effects/glass_hit.ogg', 75, 1)
if(isnull(damaged)) damaged = 0
update_brightness()
return
else
if(!anchored)
to_chat(user, SPAN_WARNING("\The [src] must be screwed down first."))
return
if(stat & BROKEN)
to_chat(user, SPAN_WARNING("\The [src] is too damaged to be functional."))
return
if(stat & NOPOWER)
to_chat(user, SPAN_WARNING("\The [src] is unpowered."))
return
on = !on
if(on)
update_use_power(POWER_USE_ACTIVE)
visible_message(SPAN_NOTICE("\The [user] turns \the [src] [on ? "on" : "off"]."))
update_brightness()
return
/obj/machinery/floor_light/process()
..()
var/need_update
if((!anchored || broken()) && on)
update_use_power(POWER_USE_OFF)
on = 0
need_update = 1
else if(use_power && !on)
update_use_power(POWER_USE_OFF)
need_update = 1
if(need_update)
update_brightness()
/obj/machinery/floor_light/proc/update_brightness()
if(on && use_power == POWER_USE_ACTIVE)
if(light_range != default_light_range || light_power != default_light_power || light_color != default_light_colour)
set_light(default_light_range, default_light_power, default_light_colour)
else
update_use_power(POWER_USE_OFF)
if(light_range || light_power)
set_light(0)
change_power_consumption((light_range + light_power) * 10, POWER_USE_ACTIVE)
update_icon()
/obj/machinery/floor_light/update_icon()
ClearOverlays()
var/list/floor_light_cache = SSicon_cache.floor_light_cache
if(use_power && !broken())
if(damaged == null)
var/cache_key = "floorlight-[default_light_colour]"
if(!floor_light_cache[cache_key])
var/image/I = image("[on_state]")
I.color = default_light_colour
I.layer = layer+0.001
floor_light_cache[cache_key] = I
var/mutable_appearance/I_emis = emissive_appearance(icon, "[on_state]")
AddOverlays(floor_light_cache[cache_key])
AddOverlays(I_emis)
else
if(damaged == 0) //Needs init.
damaged = rand(1,4)
var/cache_key = "floorlight-broken[damaged]-[default_light_colour]"
if(!floor_light_cache[cache_key])
var/image/I = image("flicker[damaged]")
I.color = default_light_colour
I.layer = layer+0.001
floor_light_cache[cache_key] = I
AddOverlays(floor_light_cache[cache_key])
var/mutable_appearance/I_emis = emissive_appearance(icon, "flicker[damaged]")
AddOverlays(I_emis)
if(stat & BROKEN)
icon_state = "broken"
else
icon_state = "base"
/obj/machinery/floor_light/proc/broken()
return (stat & (BROKEN|NOPOWER))
/obj/machinery/floor_light/ex_act(severity)
switch(severity)
if(1)
qdel(src)
if(2)
if (prob(50))
qdel(src)
else if(prob(20))
stat |= BROKEN
else
if(isnull(damaged))
damaged = 0
if(3)
if (prob(5))
qdel(src)
else if(isnull(damaged))
damaged = 0
return
/obj/machinery/floor_light/Destroy()
var/area/A = get_area(src)
if(A)
on = 0
return ..()
/obj/machinery/floor_light/cultify()
default_light_colour = "#FF0000"
update_brightness()
/obj/machinery/floor_light/dance
name = "dance floor"
on_state = "light_on-dancefloor_A"
anchored = 1
on = TRUE
use_power = POWER_USE_ACTIVE
/obj/machinery/floor_light/dance/alternate
name = "dance floor"
on_state = "light_on-dancefloor_B"
anchored = 1