Files
Bubberstation/code/game/objects/items/rcd/RLD.dm
SyncIt21 7afed12a58 Fixes RHD storage interaction (#87679)
## About The Pull Request
- Fixes #87568

Not just for RLD but for RCD, RPLD & RTD. They don't touch storage atoms

## Changelog
🆑
fix: RLD won't try to put lights on storage objects like bags & such
/🆑
2024-11-07 05:09:26 +01:00

232 lines
7.6 KiB
Plaintext

// RAPID LIGHTING DEVICE
// modes of operation
#define GLOW_MODE 1
#define LIGHT_MODE 2
#define REMOVE_MODE 3
// operation costs
#define LIGHT_TUBE_COST 10
#define FLOOR_LIGHT_COST 15
#define GLOW_STICK_COST 5
#define DECONSTRUCT_COST 10
//operation delays
#define BUILD_DELAY 10
#define REMOVE_DELAY 15
/obj/item/construction/rld
name = "Rapid Lighting Device"
desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
icon_state = "rld"
worn_icon_state = "RPD"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 200
max_matter = 200
slot_flags = ITEM_SLOT_BELT
has_ammobar = TRUE
ammo_sections = 6
banned_upgrades = RCD_ALL_UPGRADES & ~RCD_UPGRADE_SILO_LINK
/// mode of operation see above defines
var/mode = LIGHT_MODE
///reference to thr original icons
var/static/list/original_options = list(
"Color Pick" = icon(icon = 'icons/hud/radial.dmi', icon_state = "omni"),
"Glow Stick" = icon(icon = 'icons/obj/lighting.dmi', icon_state = "glowstick"),
"Deconstruct" = icon(icon = 'icons/obj/tools.dmi', icon_state = "wrench"),
"Light Fixture" = icon(icon = 'icons/obj/lighting.dmi', icon_state = "ltube"),
)
///will contain the original icons modified with the color choice
var/list/display_options = list()
var/color_choice = "#ffffff"
/obj/item/construction/rld/Initialize(mapload)
. = ..()
for(var/option in original_options)
display_options[option] = icon(original_options[option])
/obj/item/construction/rld/attack_self(mob/user)
. = ..()
if((upgrade & RCD_UPGRADE_SILO_LINK) && display_options["Silo Link"] == null) //silo upgrade instaled but option was not updated then update it just one
display_options["Silo Link"] = icon(icon = 'icons/obj/machines/ore_silo.dmi', icon_state = "silo")
var/choice = show_radial_menu(user, src, display_options, custom_check = CALLBACK(src, PROC_REF(check_menu), user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
if(!choice)
return
switch(choice)
if("Light Fixture")
mode = LIGHT_MODE
to_chat(user, span_notice("You change RLD's mode to 'Permanent Light Construction'."))
if("Glow Stick")
mode = GLOW_MODE
to_chat(user, span_notice("You change RLD's mode to 'Light Launcher'."))
if("Color Pick")
var/new_choice = input(user,"","Choose Color",color_choice) as color
if(new_choice == null)
return
var/list/new_rgb = rgb2num(new_choice)
for(var/option in original_options)
if(option == "Color Pick" || option == "Deconstruct" || option == "Silo Link")
continue
var/icon/icon = icon(original_options[option])
icon.SetIntensity(new_rgb[1]/255, new_rgb[2]/255, new_rgb[3]/255) //apply new scale
display_options[option] = icon
color_choice = new_choice
if("Deconstruct")
mode = REMOVE_MODE
to_chat(user, span_notice("You change RLD's mode to 'Deconstruct'."))
else
toggle_silo(user)
/obj/item/construction/rld/ranged_interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
if(!range_check(interacting_with, user))
return NONE
return try_lighting(interacting_with, user)
/obj/item/construction/rld/interact_with_atom(atom/interacting_with, mob/living/user, list/modifiers)
. = ..()
if(. & ITEM_INTERACT_ANY_BLOCKER)
return .
return try_lighting(interacting_with, user)
/**
* Try to place/remove a light or throw a glowstick
* Arguments
*
* * atom/interacting_with - the target atom to light or throw glowsticks at
* * mob/user - the player doing this action
*/
/obj/item/construction/rld/proc/try_lighting(atom/interacting_with, mob/user)
PRIVATE_PROC(TRUE)
if(HAS_TRAIT(interacting_with, TRAIT_COMBAT_MODE_SKIP_INTERACTION))
return NONE
var/turf/start = get_turf(src)
switch(mode)
if(REMOVE_MODE)
if(!istype(interacting_with, /obj/machinery/light))
return NONE
//resource sanity checks before & after delay
if(!checkResource(DECONSTRUCT_COST, user))
return ITEM_INTERACT_BLOCKING
var/beam = user.Beam(interacting_with, icon_state="light_beam", time = 15)
playsound(src, 'sound/machines/click.ogg', 50, TRUE)
if(!do_after(user, REMOVE_DELAY, target = interacting_with))
qdel(beam)
return ITEM_INTERACT_BLOCKING
if(!checkResource(DECONSTRUCT_COST, user))
return ITEM_INTERACT_BLOCKING
if(!useResource(DECONSTRUCT_COST, user))
return ITEM_INTERACT_BLOCKING
activate()
qdel(interacting_with)
return ITEM_INTERACT_SUCCESS
if(LIGHT_MODE)
//resource sanity checks before & after delay
var/cost = iswallturf(interacting_with) ? LIGHT_TUBE_COST : FLOOR_LIGHT_COST
if(!checkResource(cost, user))
return ITEM_INTERACT_BLOCKING
var/beam = user.Beam(interacting_with, icon_state="light_beam", time = BUILD_DELAY)
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE)
if(!do_after(user, BUILD_DELAY, target = interacting_with))
qdel(beam)
return ITEM_INTERACT_BLOCKING
if(!checkResource(cost, user))
return ITEM_INTERACT_BLOCKING
if(iswallturf(interacting_with))
var/turf/open/winner = null
var/winning_dist = null
for(var/direction in GLOB.cardinals)
var/turf/C = get_step(interacting_with, direction)
//turf already has a light
if(locate(/obj/machinery/light) in C)
continue
//can't put a light here
if(!(isspaceturf(C) || TURF_SHARES(C)))
continue
//find turf closest to our player
var/x0 = C.x
var/y0 = C.y
var/contender = CHEAP_HYPOTENUSE(start.x, start.y, x0, y0)
if(!winner)
winner = C
winning_dist = contender
else if(contender < winning_dist) // lower is better
winner = C
winning_dist = contender
if(!winner)
balloon_alert(user, "no valid target!")
return ITEM_INTERACT_BLOCKING
if(!useResource(cost, user))
return ITEM_INTERACT_BLOCKING
activate()
var/obj/machinery/light/L = new /obj/machinery/light(get_turf(winner))
L.setDir(get_dir(winner, interacting_with))
L.color = color_choice
L.set_light_color(color_choice)
return ITEM_INTERACT_SUCCESS
if(isfloorturf(interacting_with))
var/turf/target = get_turf(interacting_with)
if(locate(/obj/machinery/light/floor) in target)
return ITEM_INTERACT_BLOCKING
if(!useResource(cost, user))
return ITEM_INTERACT_BLOCKING
activate()
var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(target)
FL.color = color_choice
FL.set_light_color(color_choice)
return ITEM_INTERACT_SUCCESS
if(GLOW_MODE)
if(!useResource(GLOW_STICK_COST, user))
return ITEM_INTERACT_BLOCKING
activate()
var/obj/item/flashlight/glowstick/new_stick = new /obj/item/flashlight/glowstick(start)
new_stick.color = color_choice
new_stick.set_light_color(new_stick.color)
new_stick.throw_at(interacting_with, 9, 3, user)
new_stick.turn_on()
new_stick.update_brightness()
return ITEM_INTERACT_SUCCESS
return NONE
/obj/item/construction/rld/mini
name = "mini-rapid-light-device"
desc = "A device used to rapidly provide lighting sources to an area. Reload with iron, plasteel, glass or compressed matter cartridges."
icon = 'icons/obj/tools.dmi'
icon_state = "rld"
lefthand_file = 'icons/mob/inhands/equipment/tools_lefthand.dmi'
righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi'
matter = 100
max_matter = 100
#undef LIGHT_TUBE_COST
#undef FLOOR_LIGHT_COST
#undef GLOW_STICK_COST
#undef DECONSTRUCT_COST
#undef BUILD_DELAY
#undef REMOVE_DELAY
#undef GLOW_MODE
#undef LIGHT_MODE
#undef REMOVE_MODE