Merge pull request #95 from Phantastic-Swan/feature/energy_harvester

Energy harvester
This commit is contained in:
evilew
2025-02-24 06:57:34 +01:00
committed by GitHub
5 changed files with 277 additions and 0 deletions
@@ -4,3 +4,10 @@
cost = 10000
contains = list(/obj/item/vending_refill/mealdor)
crate_name = "meal vendor supply crate"
/datum/supply_pack/engineering/energy_harvester_board
name = "Energy Harvester Board"
desc = "Engineering made some crazy power device that seems to be creating massive amounts of energy out of thin air? With the parts found in this crate, you'll be able to make some sweet cash out of the engineers hard labor. Half of the credits made by this machine go to the engineering budget."
cost = 5000
contains = list(/obj/item/circuitboard/machine/energy_harvester)
crate_name = "Energy Harvester Board supply crate"
@@ -0,0 +1,212 @@
#define DRAIN_MODIFIER 0.0125
#define CREDIT_CONVERSION_EFFICIENCY 0.0000025
/obj/machinery/power/energy_harvester
desc = "A Device which upon connection to a node, will harvest the energy and send it to engineerless stations in return for credits, derived from a syndicate powersink model. The instructions say to never use more than 4 harvesters at a time."
name = "Energy Harvesting Module"
density = TRUE
use_power = NO_POWER_USE
icon = 'GainStation13/icons/obj/energy_harvester.dmi' // by AlManiak
icon_state = "off"
circuit = /obj/item/circuitboard/machine/energy_harvester
var/datum/looping_sound/generator/soundloop
var/maximum_net_drain_percentage = 0.05
var/set_power_drain = 0.05
var/credit_conversion_rate = 0.000005
var/power_available = 0
var/active = FALSE
/obj/machinery/power/energy_harvester/Initialize(mapload)
. = ..()
soundloop = new(src, active)
RefreshParts()
if(anchored)
if(connect_to_network())
power_available = avail()
/obj/machinery/power/energy_harvester/Destroy()
disconnect_from_network()
QDEL_NULL(soundloop)
return ..()
/obj/machinery/power/energy_harvester/RefreshParts()
var/capacitor_rating = 0
var/manipulator_rating = 0
for(var/obj/item/stock_parts/capacitor/capacitor in component_parts)
capacitor_rating += capacitor.rating
maximum_net_drain_percentage = capacitor_rating * DRAIN_MODIFIER
for(var/obj/item/stock_parts/manipulator/manipulator in component_parts)
manipulator_rating += manipulator.rating
credit_conversion_rate = manipulator_rating * CREDIT_CONVERSION_EFFICIENCY
/obj/machinery/power/energy_harvester/process()
if(!active)
return
if(!is_operational())
return
if(!powernet)
src.visible_message("<span class='alert'>[src] buzzes. Seems like it's not connected to a powernet.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
active = FALSE
icon_state = "off"
set_light(0)
soundloop.stop()
return
power_available = avail()
if(power_available <= 0)
src.visible_message("<span class='alert'>[src] buzzes. Seems like there is no energy in the connected powernet.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
active = FALSE
icon_state = "off"
set_light(0)
soundloop.stop()
return
var/power_drain = power_available * set_power_drain
add_load(power_drain)
var/credits_earned = credit_conversion_rate * power_drain
var/datum/bank_account/engineering_budget = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(engineering_budget)
engineering_budget.adjust_money(credits_earned / 2)
var/datum/bank_account/cargo_budget = SSeconomy.get_dep_account(ACCOUNT_CAR)
if(cargo_budget)
cargo_budget.adjust_money(credits_earned / 2)
/obj/machinery/power/energy_harvester/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
if(anchored)
if(connect_to_network())
power_available = avail()
else
disconnect_from_network()
power_available = 0
/obj/machinery/power/energy_harvester/screwdriver_act(mob/living/user, obj/item/I)
if(..())
return TRUE
if(!active)
default_deconstruction_screwdriver(user, "open", "off", I)
return TRUE
return FALSE
/obj/machinery/power/energy_harvester/wrench_act(mob/living/user, obj/item/I)
if(panel_open)
default_unfasten_wrench(user, I)
return TRUE
return FALSE
/obj/machinery/power/energy_harvester/crowbar_act(mob/living/user, obj/item/I)
if(panel_open)
default_deconstruction_crowbar(I)
return TRUE
return FALSE
/obj/machinery/power/energy_harvester/connect_to_network()
. = ..()
if(!.)
return FALSE
if(too_many_harvesters_in_network())
src.visible_message("<span class='alert'>[src] buzzes. Seems like there are too many energy harvesters connected to this powernet.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
disconnect_from_network()
return FALSE
return TRUE
/obj/machinery/power/energy_harvester/proc/too_many_harvesters_in_network()
var/counter = 0
for(var/machine in powernet.nodes)
if(istype(machine, /obj/machinery/power/energy_harvester))
counter += 1
if(counter > 4)
return TRUE
return FALSE
/obj/machinery/power/energy_harvester/ui_interact(mob/user, datum/tgui/ui)
ui = SStgui.try_update_ui(user, src, ui)
if(!ui)
ui = new(user, src, "EnergyHarvester", name)
ui.open()
/obj/machinery/power/energy_harvester/ui_data(mob/user)
var/list/data = list()
data["active"] = active
data["power_available"] = power_available
data["set_power_drain"] = set_power_drain * 100
data["power_drain"] = power_available * set_power_drain * active
data["credit_conversion_rate"] = credit_conversion_rate
data["maximum_drain"] = maximum_net_drain_percentage * 100
return data
/obj/machinery/power/energy_harvester/ui_act(action, params)
if(..())
return
switch(action)
if("power")
if(panel_open)
return
if(!anchored)
return
if(!active && !powernet)
src.visible_message("<span class='alert'>[src] buzzes. Seems like it's not connected to a powernet.</span>")
playsound(src, 'sound/machines/buzz-two.ogg', 50)
return
if(active)
active = FALSE
icon_state = "off"
set_light(0)
soundloop.stop()
else
power_available = avail()
if(power_available <= 0)
return
active = TRUE
icon_state = "on"
set_light(1, 1, "#9999FF")
soundloop.start()
. = TRUE
if("drain_percentage")
var/target = params["target"]
if(text2num(target) != null)
target = text2num(target)
. = TRUE
if(.)
set_power_drain = clamp(target, 1, maximum_net_drain_percentage * 100)
set_power_drain /= 100
/obj/item/circuitboard/machine/energy_harvester
name = "Energy Harvester (Machine Board)"
build_path = /obj/machinery/power/energy_harvester
needs_anchored = FALSE
req_components = list(
/obj/item/stock_parts/capacitor = 4,
/obj/item/stock_parts/manipulator = 2)
#undef DRAIN_MODIFIER
#undef CREDIT_CONVERSION_EFFICIENCY
Binary file not shown.

After

Width:  |  Height:  |  Size: 1.7 KiB

+1
View File
@@ -4062,6 +4062,7 @@
#include "GainStation13\code\modules\mob\living\species.dm"
#include "GainStation13\code\modules\mob\living\vore\eating\trasheat_lists.dm"
#include "GainStation13\code\modules\mod\modules\modules_fat.dm"
#include "GainStation13\code\modules\power\energy_harvester.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\consumable_reagents.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\dwarverndrinks.dm"
#include "GainStation13\code\modules\reagents\chemistry\reagents\fatty_drinks.dm"
@@ -0,0 +1,57 @@
import { round, toFixed } from 'common/math';
import { formatPower } from '../format';
import { useBackend } from '../backend';
import { AnimatedNumber, Button, LabeledList, Slider, Section } from '../components';
import { Window } from '../layouts';
const POWER_MUL = 1e3;
export const EnergyHarvester = (props, context) => {
const { act, data } = useBackend(context);
return(
<Window width={340} height={350}>
<Window.Content>
<Section title="Status">
<LabeledList>
<LabeledList.Item label="Power in connected wire">
{formatPower(data.power_available)}
</LabeledList.Item>
<LabeledList.Item label="Current power drain">
{formatPower(data.power_drain)}
</LabeledList.Item>
<LabeledList.Item label="Conversion rate (KW per credit)">
<AnimatedNumber
value = {1/data.credit_conversion_rate}
format={value => round(value, 0)}
/>
</LabeledList.Item>
</LabeledList>
</Section>
<Section title="Controls" buttons={
(<Button
icon={data.active ? 'power-off' : 'times'}
content={data.active ? 'On' : 'Off'}
selected={data.active}
onClick={() => act('power')}
/>)
}
>
<LabeledList>
<LabeledList.Item label="Power Drained Percent">
<Slider
value = {data.set_power_drain}
minValue = {1}
maxValue = {data.maximum_drain}
step={1}
stepPixelSize={200 / data.maximum_drain}
onDrag={(e, value) => act('drain_percentage', {
target: value,
})}
/>
</LabeledList.Item>
</LabeledList>
</Section>
</Window.Content>
</Window>
);
};