Files
Bubberstation/code/game/objects/items/rcd/RHD.dm
SyncIt21 9aed3b6a8f General code maintenance for Mat container related stuff (#77671)
1. Removes `/obj/machinery/ore_silo/proc/remote_attackby()`. This proc
calls `datum/component/material_container/user_insert()` anyway which
performs all the checks necessary for inserting stuff into the ore silo
and `/obj/machinery/ore_silo/proc/remote_attackby()` was just repeating
its code & checks. So now inserting into the ore silo is directly
handled by the mat container without this proxy proc making the
operation slightly faster
2. Removed silo `attackby` code. Same operations can be done via
`screwdriver_act` & `crowbar_act` procs much cleaner
3. The ore silo now hooks onto signals
`COMSIG_MATCONTAINER_ITEM_CONSUMED` and
`COMSIG_MATCONTAINER_SHEETS_RETRIVED` and logs into silo when they are
triggered. This means when you insert/eject sheets from the silo the
connected machine performing the operation no longer has to do the
logging manually thus the proc `silo_log` has been removed from a lot of
places ,reducing overall code size
4. A lot of stuff that use materials from the ore silo follow this
pattern.

i.e. They first use the materials from the silo and then log it via
`silo_log` proc. This code pattern is repeated in a lot of places so
let's just merge these 2 lines with some extra sanity checks into a
single proc inside `remote_materials` itself. That's what was done and
the number of places where you log manually into the silo has been
removed further reducing code size everywhere.
5. Added auto doc & cleaned up some procs

Since logging is now done by the ore silo directly, we need a way to
pass the machine that is inserting items into the silo to the signal
handlers of the ore silo [via the `context` var]. So other code changes
elsewhere is because of this var
2023-08-21 22:23:01 +00:00

307 lines
9.8 KiB
Plaintext

//RAPID HANDHELD DEVICE. the base for all rapid devices
#define SILO_USE_AMOUNT (SHEET_MATERIAL_AMOUNT / 4)
/obj/item/construction
name = "not for ingame use"
desc = "A device used to rapidly build and deconstruct. Reload with iron, plasteel, glass or compressed matter cartridges."
opacity = FALSE
density = FALSE
anchored = FALSE
flags_1 = CONDUCT_1
item_flags = NOBLUDGEON
force = 0
throwforce = 10
throw_speed = 3
throw_range = 5
w_class = WEIGHT_CLASS_NORMAL
custom_materials = list(/datum/material/iron = SHEET_MATERIAL_AMOUNT * 50)
req_access = list(ACCESS_ENGINE_EQUIP)
armor_type = /datum/armor/item_construction
resistance_flags = FIRE_PROOF
/// the spark system which sparks whever the ui options are dited
var/datum/effect_system/spark_spread/spark_system
/// current local matter inside the device, not used when silo link is on
var/matter = 0
/// maximum local matter this device can hold, not used when silo link is on
var/max_matter = 100
/// controls whether or not does update_icon apply ammo indicator overlays
var/has_ammobar = FALSE
/// amount of divisions in the ammo indicator overlay/number of ammo indicator states
var/ammo_sections = 10
/// bitflags for upgrades
var/upgrade = NONE
/// bitflags for banned upgrades
var/banned_upgrades = NONE
/// remote connection to the silo
var/datum/component/remote_materials/silo_mats
/// switch to use internal or remote storage
var/silo_link = FALSE
/datum/armor/item_construction
fire = 100
acid = 50
/obj/item/construction/Initialize(mapload)
. = ..()
spark_system = new /datum/effect_system/spark_spread
spark_system.set_up(5, 0, src)
spark_system.attach(src)
if(upgrade & RCD_UPGRADE_SILO_LINK)
silo_mats = AddComponent(/datum/component/remote_materials, mapload, FALSE)
update_appearance()
///used for examining the RCD and for its UI
/obj/item/construction/proc/get_silo_iron()
if(silo_link && silo_mats.mat_container && !silo_mats.on_hold())
return silo_mats.mat_container.get_material_amount(/datum/material/iron) / SILO_USE_AMOUNT
return 0
///returns local matter units available. overriden by rcd borg to return power units available
/obj/item/construction/proc/get_matter(mob/user)
return matter
/obj/item/construction/examine(mob/user)
. = ..()
. += "It currently holds [get_matter(user)]/[max_matter] matter-units."
if(upgrade & RCD_UPGRADE_SILO_LINK)
. += "Remote storage link state: [silo_link ? "[silo_mats.on_hold() ? "ON HOLD" : "ON"]" : "OFF"]."
var/iron = get_silo_iron()
if(iron)
. += "Remote connection has iron in equivalent to [iron] RCD unit\s." //1 matter for 1 floor tile, as 4 tiles are produced from 1 iron
/obj/item/construction/Destroy()
QDEL_NULL(spark_system)
silo_mats = null
return ..()
/obj/item/construction/pre_attack(atom/target, mob/user, params)
if(istype(target, /obj/item/rcd_upgrade))
install_upgrade(target, user)
return TRUE
if(insert_matter(target, user))
return TRUE
return ..()
/obj/item/construction/attackby(obj/item/item, mob/user, params)
if(istype(item, /obj/item/rcd_upgrade))
install_upgrade(item, user)
return TRUE
if(insert_matter(item, user))
return TRUE
return ..()
/// Installs an upgrade into the RCD checking if it is already installed, or if it is a banned upgrade
/obj/item/construction/proc/install_upgrade(obj/item/rcd_upgrade/design_disk, mob/user)
if(design_disk.upgrade & upgrade)
balloon_alert(user, "already installed!")
return
if(design_disk.upgrade & banned_upgrades)
balloon_alert(user, "cannot install upgrade!")
return
upgrade |= design_disk.upgrade
if((design_disk.upgrade & RCD_UPGRADE_SILO_LINK) && !silo_mats)
silo_mats = AddComponent(/datum/component/remote_materials, FALSE, FALSE)
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
qdel(design_disk)
/// Inserts matter into the RCD allowing it to build
/obj/item/construction/proc/insert_matter(obj/item, mob/user)
if(iscyborg(user))
return FALSE
var/loaded = FALSE
if(istype(item, /obj/item/rcd_ammo))
var/obj/item/rcd_ammo/ammo = item
var/load = min(ammo.ammoamt, max_matter - matter)
if(load <= 0)
balloon_alert(user, "storage full!")
return FALSE
ammo.ammoamt -= load
if(ammo.ammoamt <= 0)
qdel(ammo)
matter += load
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
loaded = TRUE
else if(isstack(item))
loaded = loadwithsheets(item, user)
if(loaded)
update_appearance() //ensures that ammo counters (if present) get updated
return loaded
/obj/item/construction/proc/loadwithsheets(obj/item/stack/the_stack, mob/user)
if(the_stack.matter_amount <= 0)
balloon_alert(user, "invalid sheets!")
return FALSE
var/maxsheets = round((max_matter-matter) / the_stack.matter_amount) //calculate the max number of sheets that will fit in RCD
if(maxsheets > 0)
var/amount_to_use = min(the_stack.amount, maxsheets)
the_stack.use(amount_to_use)
matter += the_stack.matter_amount * amount_to_use
playsound(loc, 'sound/machines/click.ogg', 50, TRUE)
return TRUE
balloon_alert(user, "storage full!")
return FALSE
/obj/item/construction/proc/activate()
playsound(loc, 'sound/items/deconstruct.ogg', 50, TRUE)
/obj/item/construction/attack_self(mob/user)
playsound(loc, 'sound/effects/pop.ogg', 50, FALSE)
if(prob(20))
spark_system.start()
/obj/item/construction/update_overlays()
. = ..()
if(has_ammobar)
var/ratio = CEILING((matter / max_matter) * ammo_sections, 1)
if(ratio > 0)
. += "[icon_state]_charge[ratio]"
/obj/item/construction/proc/useResource(amount, mob/user)
if(!silo_mats || !silo_link)
if(matter < amount)
if(user)
balloon_alert(user, "not enough matter!")
return FALSE
matter -= amount
update_appearance()
return TRUE
else
if(silo_mats.on_hold())
if(user)
balloon_alert(user, "silo on hold!")
return FALSE
if(!silo_mats.mat_container)
if(user)
balloon_alert(user, "no silo detected!")
return FALSE
if(!silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT))
if(user)
balloon_alert(user, "not enough silo material!")
return FALSE
silo_mats.use_materials(list(/datum/material/iron = SILO_USE_AMOUNT), multiplier = amount, action = "build", name = "consume")
return TRUE
///shared data for rcd,rld & plumbing
/obj/item/construction/ui_data(mob/user)
var/list/data = list()
//matter in the rcd
var/total_matter = ((upgrade & RCD_UPGRADE_SILO_LINK) && silo_link) ? get_silo_iron() : get_matter(user)
if(!total_matter)
total_matter = 0
data["matterLeft"] = total_matter
//silo details
data["silo_upgraded"] = !!(upgrade & RCD_UPGRADE_SILO_LINK)
data["silo_enabled"] = silo_link
return data
/obj/item/construction/proc/toggle_silo(mob/user)
if(!silo_mats)
to_chat(user, span_warning("no remote storage connection."))
return FALSE
if(!silo_mats.mat_container && !silo_link) // Allow them to turn off an invalid link.
to_chat(user, span_warning("no silo link detected."))
return FALSE
silo_link = !silo_link
to_chat(user, span_notice("silo link state: [silo_link ? "on" : "off"]"))
return TRUE
///shared action for toggling silo link rcd,rld & plumbing
/obj/item/construction/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
if(action == "toggle_silo" && (upgrade & RCD_UPGRADE_SILO_LINK))
toggle_silo(ui.user)
return TRUE
/obj/item/construction/proc/checkResource(amount, mob/user)
if(!silo_mats || !silo_mats.mat_container || !silo_link)
if(silo_link)
balloon_alert(user, "silo link invalid!")
return FALSE
else
. = matter >= amount
else
if(silo_mats.on_hold())
if(user)
balloon_alert(user, "silo on hold!")
return FALSE
. = silo_mats.mat_container.has_enough_of_material(/datum/material/iron, amount * SILO_USE_AMOUNT)
if(!. && user)
balloon_alert(user, "low ammo!")
if(has_ammobar)
flick("[icon_state]_empty", src) //somewhat hacky thing to make RCDs with ammo counters actually have a blinking yellow light
return .
/obj/item/construction/proc/range_check(atom/target, mob/user)
if(target.z != user.z)
return
if(!(target in dview(7, get_turf(user))))
balloon_alert(user, "out of range!")
flick("[icon_state]_empty", src)
return FALSE
else
return TRUE
/**
* Checks if we are allowed to interact with a radial menu
*
* Arguments:
* * user The living mob interacting with the menu
* * remote_anchor The remote anchor for the menu
*/
/obj/item/construction/proc/check_menu(mob/living/user, remote_anchor)
if(!istype(user))
return FALSE
if(user.incapacitated())
return FALSE
if(remote_anchor && user.remote_control != remote_anchor)
return FALSE
return TRUE
/obj/item/rcd_upgrade
name = "RCD advanced design disk"
desc = "It seems to be empty."
icon = 'icons/obj/assemblies/module.dmi'
icon_state = "datadisk3"
var/upgrade
/obj/item/rcd_upgrade/frames
desc = "It contains the design for machine frames and computer frames."
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
/obj/item/rcd_upgrade/anti_interrupt
desc = "It contains the upgrades necessary to prevent interruption of RCD construction and deconstruction."
upgrade = RCD_UPGRADE_ANTI_INTERRUPT
/obj/item/rcd_upgrade/cooling
desc = "It contains the upgrades necessary to allow more frequent use of the RCD."
upgrade = RCD_UPGRADE_NO_FREQUENT_USE_COOLDOWN
/obj/item/rcd_upgrade/silo_link
desc = "It contains direct silo connection RCD upgrade."
upgrade = RCD_UPGRADE_SILO_LINK
/obj/item/rcd_upgrade/furnishing
desc = "It contains the design for chairs, stools, tables, and glass tables."
upgrade = RCD_UPGRADE_FURNISHING
/datum/action/item_action/rcd_scan
name = "Destruction Scan"
desc = "Scans the surrounding area for destruction. Scanned structures will rebuild significantly faster."
#undef SILO_USE_AMOUNT