Merge pull request #174 from Azarak/rcd-update

Ports all the RCD changes, updates from Citadel
This commit is contained in:
Dahlular
2020-01-30 04:47:41 -07:00
committed by GitHub
14 changed files with 311 additions and 35 deletions
+108 -32
View File
@@ -37,6 +37,7 @@ RLD
var/has_ammobar = FALSE //controls whether or not does update_icon apply ammo indicator overlays
var/ammo_sections = 10 //amount of divisions in the ammo indicator overlay/number of ammo indicator states
var/custom_range = 7
var/upgrade = FALSE
/obj/item/construction/Initialize()
. = ..()
@@ -45,8 +46,12 @@ RLD
spark_system.attach(src)
/obj/item/construction/examine(mob/user)
..()
to_chat(user, "\A [src]. It currently holds [matter]/[max_matter] matter-units." )
. = ..()
to_chat(user, "It currently holds [matter]/[max_matter] matter-units." )
if(upgrade & RCD_UPGRADE_FRAMES)
to_chat(user, "It contains the design for machine frames, computer frames and deconstruction." )
if(upgrade & RCD_UPGRADE_SIMPLE_CIRCUITS)
to_chat(user, "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells.")
/obj/item/construction/Destroy()
QDEL_NULL(spark_system)
@@ -82,6 +87,13 @@ RLD
loaded = loadwithsheets(W, sheetmultiplier * 0.25, user) // 1 matter for 1 floortile, as 4 tiles are produced from 1 metal
if(loaded)
to_chat(user, "<span class='notice'>[src] now holds [matter]/[max_matter] matter-units.</span>")
else if(istype(W, /obj/item/rcd_upgrade))
to_chat(user, "<span class='notice'>You upgrade the RCD with the [W]!</span>")
var/obj/item/rcd_upgrade/rcd_up = W
if(!(upgrade & rcd_up.upgrade))
upgrade |= rcd_up.upgrade
playsound(src.loc, 'sound/machines/click.ogg', 50, 1)
qdel(W)
else
return ..()
update_icon() //ensures that ammo counters (if present) get updated
@@ -110,10 +122,10 @@ RLD
if(matter < amount)
if(user)
to_chat(user, no_ammo_message)
return 0
return FALSE
matter -= amount
update_icon()
return 1
return TRUE
/obj/item/construction/proc/checkResource(amount, mob/user)
. = matter >= amount
@@ -127,15 +139,14 @@ RLD
if(!(A in range(custom_range, get_turf(user))))
to_chat(user, "<span class='warning'>The \'Out of Range\' light on [src] blinks red.</span>")
return FALSE
else
return TRUE
/obj/item/construction/proc/prox_check(proximity)
if(proximity)
return TRUE
else
var/view_range = user.client ? user.client.view : world.view
//if user can't be seen from A (only checks surroundings' opaqueness) and can't see A.
//jarring, but it should stop people from targetting atoms they can't see...
//excluding darkness, to allow RLD to be used to light pitch black dark areas.
if(!((user in view(view_range, A)) || (user in viewers(view_range, A))))
to_chat(user, "<span class='warning'>You focus, pointing \the [src] at whatever outside your field of vision in the given direction... to no avail.</span>")
return FALSE
return TRUE
/obj/item/construction/rcd
name = "rapid-construction-device (RCD)"
@@ -148,6 +159,7 @@ RLD
has_ammobar = TRUE
var/mode = 1
var/ranged = FALSE
var/computer_dir = 1
var/airlock_type = /obj/machinery/door/airlock
var/airlock_glass = FALSE // So the floor's rcd_act knows how much ammo to use
var/window_type = /obj/structure/window/fulltile
@@ -218,11 +230,10 @@ RLD
t1 += "<p><a href='?src=[REF(src)];close=1'>Close</a></p>\n"
var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500)
var/datum/browser/popup = new(user, "rcd_access", "Access Control", 900, 500, src)
popup.set_content(t1)
popup.set_title_image(user.browse_rsc_icon(icon, icon_state))
popup.open()
onclose(user, "rcd_access")
/obj/item/construction/rcd/Topic(href, href_list)
..()
@@ -270,6 +281,28 @@ RLD
return FALSE
return TRUE
/obj/item/construction/rcd/proc/change_computer_dir(mob/user)
if(!user)
return
var/list/computer_dirs = list(
"NORTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "cnorth"),
"EAST" = image(icon = 'icons/mob/radial.dmi', icon_state = "ceast"),
"SOUTH" = image(icon = 'icons/mob/radial.dmi', icon_state = "csouth"),
"WEST" = image(icon = 'icons/mob/radial.dmi', icon_state = "cwest")
)
var/computerdirs = show_radial_menu(user, src, computer_dirs, custom_check = CALLBACK(src, .proc/check_menu, user), require_near = TRUE, tooltips = TRUE)
if(!check_menu(user))
return
switch(computerdirs)
if("NORTH")
computer_dir = 1
if("EAST")
computer_dir = 4
if("SOUTH")
computer_dir = 2
if("WEST")
computer_dir = 8
/obj/item/construction/rcd/proc/change_airlock_setting(mob/user)
if(!user)
return
@@ -412,15 +445,22 @@ RLD
var/list/rcd_results = A.rcd_vals(user, src)
if(!rcd_results)
return FALSE
if(do_after(user, rcd_results["delay"] * delay_mod, target = A))
var/delay = rcd_results["delay"] * delay_mod
var/obj/effect/constructing_effect/rcd_effect = new(get_turf(A), delay, src.mode)
var/turf/the_turf = get_turf(A)
var/turf_coords = "[COORD(the_turf)]"
investigate_log("[user] is attempting to use [src] on [A] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
if(do_after(user, delay, target = A))
if(checkResource(rcd_results["cost"], user))
var/atom/cached = A
if(A.rcd_act(user, src, rcd_results["mode"]))
rcd_effect.end_animation()
useResource(rcd_results["cost"], user)
activate()
investigate_log("[user] used [src] on [cached] (now [A]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
investigate_log("[user] used [src] on [cached] (loc [turf_coords] at [the_turf]) with cost [rcd_results["cost"]], delay [rcd_results["delay"]], mode [rcd_results["mode"]].", INVESTIGATE_RCD)
playsound(src, 'sound/machines/click.ogg', 50, 1)
return TRUE
qdel(rcd_effect)
/obj/item/construction/rcd/Initialize()
. = ..()
@@ -434,10 +474,15 @@ RLD
..()
var/list/choices = list(
"Airlock" = image(icon = 'icons/mob/radial.dmi', icon_state = "airlock"),
"Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
"Grilles & Windows" = image(icon = 'icons/mob/radial.dmi', icon_state = "grillewindow"),
"Floors & Walls" = image(icon = 'icons/mob/radial.dmi', icon_state = "wallfloor")
)
if(upgrade & RCD_UPGRADE_FRAMES)
choices += list(
"Deconstruct" = image(icon= 'icons/mob/radial.dmi', icon_state = "delete"),
"Machine Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "machine"),
"Computer Frames" = image(icon = 'icons/mob/radial.dmi', icon_state = "computer_dir"),
)
if(mode == RCD_AIRLOCK)
choices += list(
"Change Access" = image(icon = 'icons/mob/radial.dmi', icon_state = "access"),
@@ -459,6 +504,12 @@ RLD
mode = RCD_DECONSTRUCT
if("Grilles & Windows")
mode = RCD_WINDOWGRILLE
if("Machine Frames")
mode = RCD_MACHINE
if("Computer Frames")
mode = RCD_COMPUTER
change_computer_dir(user)
return
if("Change Access")
change_airlock_access(user)
return
@@ -481,7 +532,12 @@ RLD
/obj/item/construction/rcd/afterattack(atom/A, mob/user, proximity)
. = ..()
if(!prox_check(proximity))
if(!proximity)
if(!ranged || !range_check(A,user)) //early return not-in-range sanity.
return
if(target_check(A,user))
user.Beam(A,icon_state="rped_upgrade",time=30)
rcd_create(A,user)
return
rcd_create(A, user)
@@ -511,6 +567,8 @@ RLD
no_ammo_message = "<span class='warning'>Insufficient charge.</span>"
desc = "A device used to rapidly build walls and floors."
canRturf = TRUE
upgrade = TRUE
var/energyfactor = 72
/obj/item/construction/rcd/borg/useResource(amount, mob/user)
@@ -521,7 +579,7 @@ RLD
if(user)
to_chat(user, no_ammo_message)
return 0
. = borgy.cell.use(amount * 72) //borgs get 1.3x the use of their RCDs
. = borgy.cell.use(amount * energyfactor) //borgs get 1.3x the use of their RCDs
if(!. && user)
to_chat(user, no_ammo_message)
return .
@@ -534,19 +592,29 @@ RLD
if(user)
to_chat(user, no_ammo_message)
return 0
. = borgy.cell.charge >= (amount * 72)
. = borgy.cell.charge >= (amount * energyfactor)
if(!. && user)
to_chat(user, no_ammo_message)
return .
/obj/item/construction/rcd/borg/syndicate
icon_state = "ircd"
item_state = "ircd"
energyfactor = 66
/obj/item/construction/rcd/loaded
materials = list(MAT_METAL=48000, MAT_GLASS=32000)
matter = 160
/obj/item/construction/rcd/loaded/upgraded
upgrade = TRUE
/obj/item/construction/rcd/combat
name = "Combat RCD"
desc = "A device used to rapidly build and deconstruct. Reload with metal, plasteel, glass or compressed matter cartridges. This RCD has been upgraded to be able to remove Rwalls!"
icon_state = "ircd"
item_state = "ircd"
upgrade = TRUE
max_matter = 500
matter = 500
canRturf = TRUE
@@ -557,6 +625,7 @@ RLD
item_state = "ircd"
max_matter = 500
matter = 500
upgrade = TRUE
delay_mod = 0.6
sheetmultiplier = 8
@@ -582,7 +651,8 @@ RLD
name = "admin RCD"
max_matter = INFINITY
matter = INFINITY
upgrade = TRUE
ranged = TRUE
// Ranged RCD
@@ -593,25 +663,16 @@ RLD
max_matter = 300
matter = 300
delay_mod = 0.6
upgrade = TRUE
ranged = TRUE
icon_state = "arcd"
item_state = "oldrcd"
has_ammobar = FALSE
/obj/item/construction/rcd/arcd/afterattack(atom/A, mob/user)
. = ..()
if(!range_check(A,user))
return
if(target_check(A,user))
user.Beam(A,icon_state="rped_upgrade",time=30)
rcd_create(A,user)
// RAPID LIGHTING DEVICE
/obj/item/construction/rld
name = "rapid-light-device (RLD)"
desc = "A device used to rapidly provide lighting sources to an area. Reload with metal, plasteel, glass or compressed matter cartridges."
@@ -776,6 +837,21 @@ RLD
return TRUE
return FALSE
/obj/item/rcd_upgrade
name = "RCD advanced design disk"
desc = "It seems to be empty."
icon = 'icons/obj/module.dmi'
icon_state = "datadisk3"
var/upgrade
/obj/item/rcd_upgrade/frames
desc = "It contains the design for machine frames, computer frames and deconstruction."
upgrade = RCD_UPGRADE_FRAMES
/obj/item/rcd_upgrade/simple_circuits
desc = "It contains the design for firelock, air alarm, fire alarm, apc circuits and crap power cells."
upgrade = RCD_UPGRADE_SIMPLE_CIRCUITS
#undef GLOW_MODE
#undef LIGHT_MODE
#undef REMOVE_MODE
#undef REMOVE_MODE