Files
Bubberstation/code/game/objects/items/rcd/RLD.dm
Mothblocks 766144a443 Gives engineers the RCD round start and nerfs its base abilities to compensate (#77641)
## 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>
2023-08-17 20:20:31 +02:00

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