From a0a323236027df87b978a8620c905afd4eafb2e8 Mon Sep 17 00:00:00 2001 From: deathride58 Date: Wed, 17 Jan 2018 17:17:25 +0000 Subject: [PATCH] [READY] Allows the supermatter's radiation collectors to produce research points in short bursts (#33916) * allows radiation collectors present on the station roundstart to generate research points * fixes bitcoin production rate, fixes multitool not activating multitool_act properly * adds sounds, adds hint text, makes all rad collectors created on the station z-level connect to rnd, and fixes multitools acting weird * nerfs criticism, makes rad collectors simply check for techwebs and z-level each process instead of during initialization * fixes compiling error, is_station_level --- code/game/objects/items/devices/multitool.dm | 3 +- code/modules/power/singularity/collector.dm | 87 +++++++++++++++----- 2 files changed, 69 insertions(+), 21 deletions(-) diff --git a/code/game/objects/items/devices/multitool.dm b/code/game/objects/items/devices/multitool.dm index 9445cd73a6..20ab8199a5 100644 --- a/code/game/objects/items/devices/multitool.dm +++ b/code/game/objects/items/devices/multitool.dm @@ -26,6 +26,7 @@ var/obj/machinery/buffer // simple machine buffer for device linkage hitsound = 'sound/weapons/tap.ogg' toolspeed = 1 + tool_behaviour = TOOL_MULTITOOL var/datum/integrated_io/selected_io = null //functional for integrated circuits. var/mode = 0 @@ -159,4 +160,4 @@ desc = "An omni-technological interface." icon = 'icons/obj/abductor.dmi' icon_state = "multitool" - toolspeed = 0.1 \ No newline at end of file + toolspeed = 0.1 diff --git a/code/modules/power/singularity/collector.dm b/code/modules/power/singularity/collector.dm index a5e9db1fde..8523ab9f43 100644 --- a/code/modules/power/singularity/collector.dm +++ b/code/modules/power/singularity/collector.dm @@ -2,6 +2,7 @@ #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() /obj/machinery/power/rad_collector name = "Radiation Collector Array" @@ -19,6 +20,10 @@ 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 @@ -31,19 +36,37 @@ return ..() /obj/machinery/power/rad_collector/process() - if(loaded_tank) + 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 - loaded_tank.air_contents.gases[/datum/gas/plasma][MOLES] -= 0.001*drainratio + var/gasdrained = powerproduction_drain*drainratio + 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] += 0.001*drainratio + loaded_tank.air_contents.gases[/datum/gas/tritium][MOLES] += gasdrained 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 + 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 = min(last_power, (last_power*RAD_COLLECTOR_STORED_OUT)+1000) + SSresearch.science_tech.research_points += bitcoins_mined*RAD_COLLECTOR_MINING_CONVERSION_RATE + last_power-=bitcoins_mined /obj/machinery/power/rad_collector/attack_hand(mob/user) if(..()) @@ -79,10 +102,7 @@ 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) + 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) @@ -95,19 +115,6 @@ 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) @@ -121,6 +128,46 @@ else return ..() +/obj/machinery/power/rad_collector/wrench_act(mob/living/user, obj/item/wrench) + default_unfasten_wrench(user, wrench, 0) + return TRUE + +/obj/machinery/power/rad_collector/crowbar_act(mob/living/user, obj/item/crowbar) + if(loaded_tank) + if(locked) + to_chat(user, "The controls are locked!") + return TRUE + eject() + 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/multitool) + 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/examine(mob/user) + . = ..() + if(active) + if(!bitcoinmining) + to_chat(user, "[src]'s display states that it is processing [DisplayPower(last_power)].") + else + to_chat(user, "[src]'s display states that it is producing a total of [last_power*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))