mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-20 14:04:43 +00:00
## About The Pull Request - Gives engineers an RCD as part of their round start equipment - RCD by default will build/deconstruct slower if you already have another one in progress. This can be upgraded with the new cooling upgrade disk. Reconstructing (anything that was there roundstart as per the destructive scan) doesn't have this downside, only construction/deconstruction. - RCD construction effects can now be attacked in order to cancel them. This can be deterred with the anti-disruption upgrade disk. - RCDs for nukies and whatever don't have these downsides - The CE's roundstart RCD also doesn't have these downsides ## Why It's Good For The Game Construction and reconstruction are currently one of the worst aspects of SS13--they are so slow and tedious that any sort of mass destruction goes unfixed for 10-30+ minutes, if fixed at all. This limits us because it means people don't want traitors to create large explosions, for instance--I do and so I think it's crucial that we fix construction. Reconstruction has already been improved on the RCD with the destructive scans, but I see no reason to limit this to something so out of the way. Ideally the RCD even gets more functionalities, like the ability to print stock parts (or having stock parts removed), etc, in order to lessen this burden. ## Changelog 🆑 add: Engineers now have an RCD round start. balance: RCD construction/deconstruction effects can now be attacked in order to cancel them. You can get the anti-disruption upgrade disk to prevent this. balance: RCD construction/deconstruction is now slower if you already have another effect up. This does not effect reconstruction. balance: Both of the above effects do not effect the CE's roundstart RCD, nor any other RCDs such as combat RCDs. /🆑 --------- Co-authored-by: Fikou <23585223+Fikou@users.noreply.github.com>
207 lines
6.3 KiB
Plaintext
207 lines
6.3 KiB
Plaintext
// RAPID LIGHTING DEVICE
|
|
|
|
#define GLOW_MODE 3
|
|
#define LIGHT_MODE 2
|
|
#define REMOVE_MODE 1
|
|
|
|
/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
|
|
///it does not make sense why any of these should be installed
|
|
banned_upgrades = RCD_UPGRADE_FRAMES | RCD_UPGRADE_SIMPLE_CIRCUITS | RCD_UPGRADE_FURNISHING | RCD_UPGRADE_ANTI_INTERRUPT | RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN
|
|
|
|
var/mode = LIGHT_MODE
|
|
var/wallcost = 10
|
|
var/floorcost = 15
|
|
var/launchcost = 5
|
|
var/deconcost = 10
|
|
|
|
var/condelay = 10
|
|
var/decondelay = 15
|
|
|
|
///reference to thr original icons
|
|
var/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/mining.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 = ReadRGB(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(deconcost, 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, decondelay, target = A))
|
|
qdel(beam)
|
|
return FALSE
|
|
if(!checkResource(deconcost, user))
|
|
return FALSE
|
|
|
|
if(!useResource(deconcost, user))
|
|
return FALSE
|
|
activate()
|
|
qdel(A)
|
|
return TRUE
|
|
|
|
if(LIGHT_MODE)
|
|
//resource sanity checks before & after delay
|
|
if(!checkResource(floorcost, user))
|
|
return FALSE
|
|
var/beam = user.Beam(A,icon_state="light_beam", time = condelay)
|
|
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
|
|
playsound(loc, 'sound/effects/light_flicker.ogg', 50, FALSE)
|
|
if(!do_after(user, condelay, target = A))
|
|
qdel(beam)
|
|
return FALSE
|
|
if(!checkResource(floorcost, 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(wallcost, 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(floorcost, 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(launchcost, 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.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 GLOW_MODE
|
|
#undef LIGHT_MODE
|
|
#undef REMOVE_MODE
|