mirror of
https://github.com/Bubberstation/Bubberstation.git
synced 2026-01-19 21:46:42 +00:00
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
307 lines
9.8 KiB
Plaintext
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
|