// stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
#define RAD_COLLECTOR_EFFICIENCY 80 // radiation needs to be over this amount to get power
#define RAD_COLLECTOR_COEFFICIENT 100
#define RAD_COLLECTOR_STORED_OUT 0.04 // (this*100)% of stored power outputted per tick. Doesn't actualy change output total, lower numbers just means collectors output for longer in absence of a source
#define RAD_COLLECTOR_MINING_CONVERSION_RATE 0.00001 //This is gonna need a lot of tweaking to get right. This is the number used to calculate the conversion of watts to research points per process()
#define RAD_COLLECTOR_OUTPUT min(stored_power, (stored_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored
/obj/machinery/power/rad_collector
name = "Radiation Collector Array"
desc = "A device which uses Hawking Radiation and plasma to produce power."
icon = 'icons/obj/singularity.dmi'
icon_state = "ca"
anchored = FALSE
density = TRUE
req_access = list(ACCESS_ENGINE_EQUIP)
// use_power = NO_POWER_USE
max_integrity = 350
integrity_failure = 80
circuit = /obj/item/circuitboard/machine/rad_collector
rad_insulation = RAD_EXTREME_INSULATION
var/obj/item/tank/internals/plasma/loaded_tank = null
var/stored_power = 0
var/active = 0
var/locked = FALSE
var/drainratio = 1
var/powerproduction_drain = 0.001
var/bitcoinproduction_drain = 0.15
var/bitcoinmining = FALSE
/obj/machinery/power/rad_collector/anchored
anchored = TRUE
/obj/machinery/power/rad_collector/Destroy()
return ..()
/obj/machinery/power/rad_collector/process()
if(!loaded_tank)
return
if(!bitcoinmining)
if(!loaded_tank.air_contents.gases[/datum/gas/plasma])
investigate_log("out of fuel.", INVESTIGATE_SINGULO)
playsound(src, 'sound/machines/ding.ogg', 50, 1)
eject()
else
var/gasdrained = min(powerproduction_drain*drainratio,loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES])
loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= gasdrained
loaded_tank.air_contents.assert_gas(/datum/gas/tritium)
loaded_tank.air_contents.gases[/datum/gas/tritium][MOLES] += gasdrained
loaded_tank.air_contents.garbage_collect()
var/power_produced = RAD_COLLECTOR_OUTPUT
add_avail(power_produced)
stored_power-=power_produced
else if(is_station_level(z) && SSresearch.science_tech)
if(!loaded_tank.air_contents.gases[/datum/gas/tritium] || !loaded_tank.air_contents.gases[/datum/gas/oxygen])
playsound(src, 'sound/machines/ding.ogg', 50, 1)
eject()
else
var/gasdrained = bitcoinproduction_drain*drainratio
loaded_tank.air_contents.gases[/datum/gas/tritium][MOLES] -= gasdrained
loaded_tank.air_contents.gases[/datum/gas/oxygen][MOLES] -= gasdrained
loaded_tank.air_contents.assert_gas(/datum/gas/carbon_dioxide)
loaded_tank.air_contents.gases[/datum/gas/carbon_dioxide][MOLES] += gasdrained*2
loaded_tank.air_contents.garbage_collect()
var/bitcoins_mined = RAD_COLLECTOR_OUTPUT
var/datum/bank_account/D = SSeconomy.get_dep_account(ACCOUNT_ENG)
if(D)
D.adjust_money(bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE)
SSresearch.science_tech.add_point_type(TECHWEB_POINT_TYPE_DEFAULT, bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE)
stored_power-=bitcoins_mined
/obj/machinery/power/rad_collector/interact(mob/user)
if(anchored)
if(!src.locked)
toggle_power()
user.visible_message("[user.name] turns the [src.name] [active? "on":"off"].", \
"You turn the [src.name] [active? "on":"off"].")
var/fuel
if(loaded_tank)
fuel = loaded_tank.air_contents.gases[/datum/gas/plasma]
fuel = fuel ? fuel[MOLES] : 0
investigate_log("turned [active?"on":"off"] by [key_name(user)]. [loaded_tank?"Fuel: [round(fuel/0.29)]%":"It is empty"].", INVESTIGATE_SINGULO)
return
else
to_chat(user, "The controls are locked!")
return
/obj/machinery/power/rad_collector/can_be_unfasten_wrench(mob/user, silent)
if(loaded_tank)
if(!silent)
to_chat(user, "Remove the plasma tank first!")
return FAILED_UNFASTEN
return ..()
/obj/machinery/power/rad_collector/default_unfasten_wrench(mob/user, obj/item/I, time = 20)
. = ..()
if(. == SUCCESSFUL_UNFASTEN)
if(anchored)
connect_to_network()
else
disconnect_from_network()
/obj/machinery/power/rad_collector/attackby(obj/item/W, mob/user, params)
if(istype(W, /obj/item/tank/internals/plasma))
if(!anchored)
to_chat(user, "[src] needs to be secured to the floor first!")
return TRUE
if(loaded_tank)
to_chat(user, "There's already a plasma tank loaded!")
return TRUE
if(panel_open)
to_chat(user, "Close the maintenance panel first!")
return TRUE
if(!user.transferItemToLoc(W, src))
return
loaded_tank = W
update_icons()
else if(W.GetID())
if(allowed(user))
if(active)
locked = !locked
to_chat(user, "You [locked ? "lock" : "unlock"] the controls.")
else
to_chat(user, "The controls can only be locked when \the [src] is active!")
else
to_chat(user, "Access denied.")
return TRUE
else
return ..()
/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/I)
default_unfasten_wrench(user, I)
return TRUE
/obj/machinery/power/rad_collector/screwdriver_act(mob/living/user, obj/item/I)
if(..())
return TRUE
if(loaded_tank)
to_chat(user, "Remove the plasma tank first!")
else
default_deconstruction_screwdriver(user, icon_state, icon_state, I)
return TRUE
/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/I)
if(loaded_tank)
if(locked)
to_chat(user, "The controls are locked!")
return TRUE
eject()
return TRUE
if(default_deconstruction_crowbar(I))
return TRUE
to_chat(user, "There isn't a tank loaded!")
return TRUE
/obj/machinery/power/rad_collector/multitool_act(mob/living/user, obj/item/I)
if(!is_station_level(z) && !SSresearch.science_tech)
to_chat(user, "[src] isn't linked to a research system!")
return TRUE
if(locked)
to_chat(user, "[src] is locked!")
return TRUE
if(active)
to_chat(user, "[src] is currently active, producing [bitcoinmining ? "research points":"power"].")
return TRUE
bitcoinmining = !bitcoinmining
to_chat(user, "You [bitcoinmining ? "enable":"disable"] the research point production feature of [src].")
return TRUE
/obj/machinery/power/rad_collector/analyzer_act(mob/living/user, obj/item/I)
if(loaded_tank)
loaded_tank.analyzer_act(user, I)
/obj/machinery/power/rad_collector/examine(mob/user)
. = ..()
if(active)
if(!bitcoinmining)
to_chat(user, "[src]'s display states that it has stored [DisplayPower(stored_power)], and processing [DisplayPower(RAD_COLLECTOR_OUTPUT)].")
else
to_chat(user, "[src]'s display states that it has stored a total of [stored_power*RAD_COLLECTOR_MINING_CONVERSION_RATE], and producing [RAD_COLLECTOR_OUTPUT*RAD_COLLECTOR_MINING_CONVERSION_RATE] research points per minute.")
else
if(!bitcoinmining)
to_chat(user,"[src]'s display displays the words: \"Power production mode. Please insert Plasma. Use a multitool to change production modes.\"")
else
to_chat(user,"[src]'s display displays the words: \"Research point production mode. Please insert Tritium and Oxygen. Use a multitool to change production modes.\"")
/obj/machinery/power/rad_collector/obj_break(damage_flag)
if(!(stat & BROKEN) && !(flags_1 & NODECONSTRUCT_1))
eject()
stat |= BROKEN
/obj/machinery/power/rad_collector/proc/eject()
locked = FALSE
var/obj/item/tank/internals/plasma/Z = src.loaded_tank
if (!Z)
return
Z.forceMove(drop_location())
Z.layer = initial(Z.layer)
Z.plane = initial(Z.plane)
src.loaded_tank = null
if(active)
toggle_power()
else
update_icons()
/obj/machinery/power/rad_collector/rad_act(pulse_strength)
. = ..()
if(loaded_tank && active && pulse_strength > RAD_COLLECTOR_EFFICIENCY)
stored_power += (pulse_strength-RAD_COLLECTOR_EFFICIENCY)*RAD_COLLECTOR_COEFFICIENT
/obj/machinery/power/rad_collector/proc/update_icons()
cut_overlays()
if(loaded_tank)
add_overlay("ptank")
if(stat & (NOPOWER|BROKEN))
return
if(active)
add_overlay("on")
/obj/machinery/power/rad_collector/proc/toggle_power()
active = !active
if(active)
icon_state = "ca_on"
flick("ca_active", src)
else
icon_state = "ca"
flick("ca_deactive", src)
update_icons()
return
#undef RAD_COLLECTOR_EFFICIENCY
#undef RAD_COLLECTOR_COEFFICIENT
#undef RAD_COLLECTOR_STORED_OUT
#undef RAD_COLLECTOR_MINING_CONVERSION_RATE
#undef RAD_COLLECTOR_OUTPUT