Files
Aurora.3/code/modules/power/fusion/kinetic_harvester.dm
BatrachophrenoandGitHub 5277251959 Tool behaviors port (#21663)
For a robust crafting system, I need a new materials framework.
For a new materials framework, I need to clean up reagents.
To clean up reagents, I need to pare down foods from reagent holders.
To pare down foods from reagent holders, I need to port edibility
components.
To port edibility components, I need to port processing components.
To port processing components, I need to port tool behaviors.

This is all back-end code, no new features or functionality from this.
2026-01-27 08:44:49 +00:00

139 lines
4.5 KiB
Plaintext

/obj/machinery/kinetic_harvester
name = "kinetic harvester"
desc = "A complicated mechanism for harvesting rapidly moving particles from a fusion toroid and condensing them into a usable form."
density = TRUE
anchored = TRUE
use_power = POWER_USE_IDLE
icon = 'icons/obj/kinetic_harvester.dmi'
icon_state = "off"
manufacturer = "hephaestus"
var/initial_id_tag
var/list/stored = list()
var/list/harvesting = list()
var/obj/machinery/power/fusion_core/harvest_from
/obj/machinery/kinetic_harvester/Initialize()
AddComponent(/datum/component/local_network_member, initial_id_tag)
find_core()
queue_icon_update()
. = ..()
/obj/machinery/kinetic_harvester/attack_hand(mob/user)
. = ..()
if(.)
return
ui_interact(user)
return TRUE
/obj/machinery/kinetic_harvester/attackby(obj/item/attacking_item, mob/user)
if(attacking_item.tool_behaviour == TOOL_MULTITOOL)
var/datum/component/local_network_member/lanm = GetComponent(/datum/component/local_network_member)
if(lanm.get_new_tag(user))
find_core()
return
return ..()
/obj/machinery/kinetic_harvester/proc/find_core()
harvest_from = null
var/datum/component/local_network_member/lanm = GetComponent(/datum/component/local_network_member)
var/datum/local_network/lan = lanm.get_local_network()
if(lan)
var/list/fusion_cores = lan.get_devices(/obj/machinery/power/fusion_core)
if(fusion_cores && length(fusion_cores))
harvest_from = fusion_cores[1]
return harvest_from
/obj/machinery/kinetic_harvester/ui_interact(mob/user, datum/tgui/ui)
if(!harvest_from && !find_core())
to_chat(user, SPAN_WARNING("This machine cannot locate a fusion core. Please ensure the machine is correctly configured to share a fusion plant network."))
return
ui = SStgui.try_update_ui(user, src, ui)
if (!ui)
ui = new(user, src, "KineticHarvester", "Kinetic Harvester")
ui.open()
/obj/machinery/kinetic_harvester/ui_data(mob/user)
. = ..()
var/datum/component/local_network_member/fusion = GetComponent(/datum/component/local_network_member)
var/datum/local_network/plant = fusion.get_local_network()
var/list/data = list()
data["manufacturer"] = manufacturer
data["id"] = plant ? plant.id_tag : null
data["status"] = (use_power >= POWER_USE_ACTIVE)
data["materials"] = list()
for(var/mat in stored)
var/material/material = SSmaterials.get_material_by_name(mat)
if(material)
var/sheets = FLOOR(stored[mat]/(SHEET_MATERIAL_AMOUNT * 2), 1)
data["materials"] += list(list("material" = mat, "rawamount" = stored[mat], "amount" = sheets, "harvest" = harvesting[mat]))
return data
/obj/machinery/kinetic_harvester/process()
if(harvest_from && get_dist(src, harvest_from) > 10)
harvest_from = null
if(use_power >= POWER_USE_ACTIVE)
if(harvest_from && harvest_from.owned_field)
for(var/mat in harvest_from.owned_field.reactants)
if(SSmaterials.materials_by_name[mat] && !stored[mat])
stored[mat] = 0
for(var/mat in harvesting)
if(!SSmaterials.materials_by_name[mat] || !harvest_from.owned_field.reactants[mat])
harvesting -= mat
else
var/harvest = min(harvest_from.owned_field.reactants[mat], rand(100,200))
// Leave a few counts of the reactant to avoid deactivating harvest mode
harvest_from.owned_field.reactants[mat] -= (harvest - rand(0,5))
if(harvest_from.owned_field.reactants[mat] <= 0)
harvest_from.owned_field.reactants -= mat
stored[mat] += harvest
else
harvesting.Cut()
/obj/machinery/kinetic_harvester/update_icon()
if(!operable())
icon_state = "broken"
else if(use_power >= POWER_USE_ACTIVE)
icon_state = "on"
else
icon_state = "off"
/obj/machinery/kinetic_harvester/ui_act(action, list/params, datum/tgui/ui, datum/ui_state/state)
. = ..()
if(.)
return
switch(action)
if("remove_mat")
var/mat = params["remove_mat"]
var/material/material = SSmaterials.get_material_by_name(mat)
if(material)
var/sheet_cost = (SHEET_MATERIAL_AMOUNT * 1.5)
var/sheets = min(FLOOR(stored[mat]/sheet_cost, 1), 50)
if(sheets > 0)
var/obj/item/stack/material/M = new material.stack_type(get_turf(src), sheets)
M.update_icon()
stored[mat] -= sheets * sheet_cost
if(stored[mat] <= 0)
stored -= mat
return TRUE
if("toggle_power")
use_power = (use_power >= POWER_USE_ACTIVE ? POWER_USE_IDLE : POWER_USE_ACTIVE)
queue_icon_update()
return TRUE
if("toggle_harvest")
var/mat = params["toggle_harvest"]
if(harvesting[mat])
harvesting -= mat
else
harvesting[mat] = TRUE
if(!(mat in stored))
stored[mat] = 0
return TRUE