// last_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 /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 var/obj/item/tank/internals/plasma/loaded_tank = null var/last_power = 0 var/active = 0 var/locked = FALSE var/drainratio = 1 /obj/machinery/power/rad_collector/anchored anchored = TRUE /obj/machinery/power/rad_collector/ComponentInitialize() . = ..() AddComponent(/datum/component/rad_insulation, RAD_EXTREME_INSULATION, FALSE, FALSE) /obj/machinery/power/rad_collector/Destroy() return ..() /obj/machinery/power/rad_collector/process() if(loaded_tank) if(!loaded_tank.air_contents.gases[/datum/gas/plasma]) investigate_log("out of fuel.", INVESTIGATE_SINGULO) eject() else loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio ASSERT_GAS(/datum/gas/tritium,loaded_tank.air_contents) loaded_tank.air_contents.gases[/datum/gas/tritium][MOLES] += 0.001*drainratio loaded_tank.air_contents.garbage_collect() var/power_produced = min(last_power, (last_power*RAD_COLLECTOR_STORED_OUT)+1000) //Produces at least 1000 watts if it has more than that stored add_avail(power_produced) last_power-=power_produced /obj/machinery/power/rad_collector/attack_hand(mob/user) if(..()) return 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 [user.key]. [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/wrench/W, 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/device/multitool)) to_chat(user, "[W] detects that [last_power]W is being processed.") return TRUE else if(istype(W, /obj/item/device/analyzer) && loaded_tank) atmosanalyzer_scan(loaded_tank.air_contents, user) else 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(!user.transferItemToLoc(W, src)) return loaded_tank = W update_icons() else if(istype(W, /obj/item/crowbar)) if(loaded_tank) if(locked) to_chat(user, "The controls are locked!") return TRUE eject() return TRUE else to_chat(user, "There isn't a tank loaded!") return TRUE else if(istype(W, /obj/item/wrench)) default_unfasten_wrench(user, W, 0) return TRUE 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/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.loc = get_turf(src) 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) last_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