mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-28 01:51:46 +00:00
* Implements rgb2num, uses it to replace all our manual rgb reading. Redoes HSV management (#81182) [Converts all manual extraction of rbg with rgb2num. It's just better](ae798eabd5) [Yanks out old HSV management, replaces it with list stuff](4997e86051) There's this old lummy era clunky code that passed HSV as text We can now cleanly replace it with passing hsv as lists from a rgb2hsv proc So let's just do that. Also, cleans up spraytan code (and ethereal lighting) Code better * Refactors fire overlays once again to make it not get stuck so often (#81367) Maybe finally fixes #77701 A big reason why this kept happening is because fire uses standing overlays. But fire isn't managed by mobs anymore. Meaning in some situations, fire can cease to exist but the overlay can still be on the mob. So it gets stuck. So like, why use standing overlays anymore? We can just hook `update_overlays` signal. Isn't that neat. 🆑 Melbert refactor: Fire effects get added to mobs in a different way now. Maybe it will get stuck less. Report any oddities. /🆑 * Fix Flaky Failure From Fire (#81399) ## About The Pull Request Closes #81396 , Closes #81391 , Closes #81403, Closes #81402 I don't know why but I thought this proc was only called once, when the mob entered the turf. That was silly. And going back at it, I'm not entirely sure why I tied `TRAIT_NO_EXTINGUISH` to the element anyways, rather than the lava like it originally was. While going back over this, I cleaned up the proc a bit. ## Changelog Not necessary * There we go? * Bruh moment --------- Co-authored-by: LemonInTheDark <58055496+LemonInTheDark@users.noreply.github.com> Co-authored-by: MrMelbert <51863163+MrMelbert@users.noreply.github.com>
221 lines
6.5 KiB
Plaintext
221 lines
6.5 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/afterattack(atom/A, mob/user)
|
|
. = ..()
|
|
if(!range_check(A,user))
|
|
return
|
|
var/turf/start = get_turf(src)
|
|
switch(mode)
|
|
if(REMOVE_MODE)
|
|
if(!istype(A, /obj/machinery/light/))
|
|
return FALSE
|
|
|
|
//resource sanity checks before & after delay
|
|
if(!checkResource(DECONSTRUCT_COST, user))
|
|
return FALSE
|
|
var/beam = user.Beam(A,icon_state="light_beam", time = 15)
|
|
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
|
|
if(!do_after(user, REMOVE_DELAY, target = A))
|
|
qdel(beam)
|
|
return FALSE
|
|
if(!checkResource(DECONSTRUCT_COST, user))
|
|
return FALSE
|
|
|
|
if(!useResource(DECONSTRUCT_COST, user))
|
|
return FALSE
|
|
activate()
|
|
qdel(A)
|
|
return TRUE
|
|
|
|
if(LIGHT_MODE)
|
|
//resource sanity checks before & after delay
|
|
var/cost = iswallturf(A) ? LIGHT_TUBE_COST : FLOOR_LIGHT_COST
|
|
|
|
if(!checkResource(cost, user))
|
|
return FALSE
|
|
var/beam = user.Beam(A,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 = A))
|
|
qdel(beam)
|
|
return FALSE
|
|
if(!checkResource(cost, user))
|
|
return FALSE
|
|
|
|
if(iswallturf(A))
|
|
var/turf/open/winner = null
|
|
var/winning_dist = null
|
|
var/skip = FALSE
|
|
for(var/direction in GLOB.cardinals)
|
|
var/turf/C = get_step(A, direction)
|
|
//turf already has a light
|
|
skip = FALSE
|
|
for(var/obj/machinery/light/dupe in C)
|
|
if(istype(dupe, /obj/machinery/light))
|
|
skip = TRUE
|
|
break
|
|
if(skip)
|
|
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 FALSE
|
|
|
|
if(!useResource(cost, user))
|
|
return FALSE
|
|
activate()
|
|
var/obj/machinery/light/L = new /obj/machinery/light(get_turf(winner))
|
|
L.setDir(get_dir(winner, A))
|
|
L.color = color_choice
|
|
L.set_light_color(color_choice)
|
|
return TRUE
|
|
|
|
if(isfloorturf(A))
|
|
var/turf/target = get_turf(A)
|
|
for(var/obj/machinery/light/floor/dupe in target)
|
|
if(istype(dupe))
|
|
return FALSE
|
|
|
|
if(!useResource(cost, user))
|
|
return FALSE
|
|
activate()
|
|
var/obj/machinery/light/floor/FL = new /obj/machinery/light/floor(target)
|
|
FL.color = color_choice
|
|
FL.set_light_color(color_choice)
|
|
return TRUE
|
|
|
|
if(GLOW_MODE)
|
|
if(!useResource(GLOW_STICK_COST, user))
|
|
return FALSE
|
|
activate()
|
|
var/obj/item/flashlight/glowstick/G = new /obj/item/flashlight/glowstick(start)
|
|
G.color = color_choice
|
|
G.set_light_color(G.color)
|
|
G.throw_at(A, 9, 3, user)
|
|
G.light_on = TRUE
|
|
G.update_brightness()
|
|
|
|
return TRUE
|
|
|
|
/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
|