From 0e6939de858414f1fdf33e70f2e21cc6dc0a2182 Mon Sep 17 00:00:00 2001 From: Cael_Aislinn Date: Fri, 27 Jul 2012 02:04:44 +1000 Subject: [PATCH] multiple R-UST tweaks and slight updates. this should fix any (all?) known outstanding bugs. i also modified values to be a bit more gameplay sensible (max average output on standard operating levels is ~150-200k per gen) Signed-off-by: Cael_Aislinn --- .../Cael_Aislinn/Rust/core_field.dm | 26 +++---- .../Cael_Aislinn/Rust/core_monitor.dm | 7 +- .../Cael_Aislinn/Rust/fuel_assembly.dm | 2 +- .../Cael_Aislinn/Rust/fuel_control.dm | 68 +++++++++++++------ .../Cael_Aislinn/Rust/fuel_injector.dm | 2 +- .../Cael_Aislinn/Rust/gyrotron.dm | 28 +++++++- .../Cael_Aislinn/Rust/gyrotron_controller.dm | 4 +- code/modules/power/generator.dm | 20 ++++-- code/modules/projectiles/projectile/beams.dm | 2 +- 9 files changed, 108 insertions(+), 51 deletions(-) diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm index ad6a754ba78..9d80d37aee6 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_field.dm @@ -116,7 +116,6 @@ Deuterium-tritium fusion: 4.5 x 10^7 K volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 1000 process() - ..() //make sure the field generator is still intact if(!owned_core) del(src) @@ -131,29 +130,21 @@ Deuterium-tritium fusion: 4.5 x 10^7 K radiation = 0 //update values - var/transfer_ratio = field_strength / 50 - major_radius = field_strength * 0.21875// max = 8.75 - minor_radius = field_strength * 0.2125// max = 8.625 - volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio + var/transfer_ratio = field_strength / 50 //higher field strength will result in faster plasma aggregation + major_radius = field_strength * 0.21875// max = 8.75m + minor_radius = field_strength * 0.2125// max = 8.625m + volume_covered = PI * major_radius * minor_radius * 2.5 * 2.5 * 2.5 * 7 * 7 * transfer_ratio //one tile = 2.5m*2.5m*2.5m //add plasma from the surrounding environment var/datum/gas_mixture/environment = loc.return_air() -/* - if(air_contents.temperature > 0) - var/transfer_moles = (air_contents.return_pressure())*volume_rate/(air_contents.temperature * R_IDEAL_GAS_EQUATION) - - var/datum/gas_mixture/removed = air_contents.remove(transfer_moles) - - loc.assume_air(removed) -*/ - - //we're going to hack in some stuff to remove plasma from the air because QUANTUM PHYSICS + //hack in some stuff to remove plasma from the air because SCIENCE //the amount of plasma pulled in each update is relative to the field strength, with 50T (max field strength) = 100% of area covered by the field //at minimum strength, 0.25% of the field volume is pulled in per update (?) //have a max of 1000 moles suspended if(held_plasma.toxins < transfer_ratio * 1000) var/moles_covered = environment.return_pressure()*volume_covered/(environment.temperature * R_IDEAL_GAS_EQUATION) + //world << "\blue moles_covered: [moles_covered]" // var/datum/gas_mixture/gas_covered = environment.remove(moles_covered) var/datum/gas_mixture/plasma_captured = new /datum/gas_mixture() @@ -161,9 +152,10 @@ Deuterium-tritium fusion: 4.5 x 10^7 K plasma_captured.toxins = round(gas_covered.toxins * transfer_ratio) //world << "\blue[plasma_captured.toxins] moles of plasma captured" plasma_captured.temperature = gas_covered.temperature - //plasma_captured.update_values() + plasma_captured.update_values() + // gas_covered.toxins -= plasma_captured.toxins - //gas_covered.update_values() + gas_covered.update_values() // held_plasma.merge(plasma_captured) // diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm b/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm index c9999d2d1db..2fbf5559231 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/core_monitor.dm @@ -8,6 +8,7 @@ var/obj/machinery/rust/core/core_generator = null New() + ..() spawn(0) core_generator = locate() in world @@ -41,7 +42,7 @@ process() ..() - updateDialog() + src.updateDialog() proc interact(mob/user) @@ -60,7 +61,7 @@ t += " Energy levels (MeV): [core_generator.owned_field.mega_energy]
" t += " Core frequency: [core_generator.owned_field.frequency]
" t += " Moles of plasma: [core_generator.owned_field.held_plasma.toxins]
" - t += " Plasma temperature: [core_generator.owned_field.held_plasma.temperature]
" + t += " Core temperature: [core_generator.owned_field.held_plasma.temperature]
" t += "
" t += "Core atomic and subatomic constituents:
" if(core_generator.owned_field.dormant_reactant_quantities && core_generator.owned_field.dormant_reactant_quantities.len) @@ -74,5 +75,5 @@ t += "Core Generator unresponsive
" t += "
" t += "Close
" - user << browse(t, "window=core_monitor;size=500x800") + user << browse(t, "window=core_monitor;size=500x400") user.machine = src diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm index a08776dd0c6..681d38f9aae 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_assembly.dm @@ -4,7 +4,7 @@ icon_state = "fuel_assembly" name = "Fuel Rod Assembly" var/list/rod_quantities - var/amount_depleted = 0 //percent depleted + var/percent_depleted = 0 // New() rod_quantities = new/list diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm index 7604e05958c..4895dfe9199 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_control.dm @@ -3,22 +3,34 @@ name = "Fuel Injection Control" icon_state = "power" var/list/fuel_injectors - var/active_stage = "Cooling" + var/list/stage_status var/announce_fueldepletion = 0 var/announce_stageprogression = 0 //var/obj/machinery/rust/fuel_injector/Injector = null New() + ..() //these are the only three stages we can accept //we have another console for SCRAM fuel_injectors = new/list + stage_status = new/list + fuel_injectors.Add("One") fuel_injectors["One"] = new/list + stage_status.Add("One") + stage_status["One"] = 0 fuel_injectors.Add("Two") fuel_injectors["Two"] = new/list + stage_status.Add("Two") + stage_status["Two"] = 0 fuel_injectors.Add("Three") fuel_injectors["Three"] = new/list + stage_status.Add("Three") + stage_status["Three"] = 0 fuel_injectors.Add("SCRAM") fuel_injectors["SCRAM"] = new/list + stage_status.Add("SCRAM") + stage_status["SCRAM"] = 0 + spawn(0) for(var/obj/machinery/rust/fuel_injector/Injector in world) if(Injector.stage in fuel_injectors) @@ -46,20 +58,33 @@ usr.machine = null return if( href_list["beginstage"] ) - active_stage = href_list["beginstage"] - if(active_stage in fuel_injectors) - for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[active_stage]) - Injector.BeginInjecting() + var/stage_name = href_list["beginstage"] + if(stage_name in fuel_injectors) + var/success = 1 + for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name]) + if(!Injector.BeginInjecting()) + success = 0 + if(!success) //may still partially complete + usr << "\red Unable to complete command." + stage_status[stage_name] = 1 + updateDialog() + return + if( href_list["begincool"] ) + var/stage_name = href_list["begincool"] + if(stage_name in fuel_injectors) + for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name]) + Injector.StopInjecting() + stage_status[stage_name] = 0 updateDialog() return if( href_list["restart"] ) updateDialog() return if( href_list["cooldown"] ) - if(active_stage in fuel_injectors) - for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[active_stage]) + for(var/stage_name in fuel_injectors) + for(var/obj/machinery/rust/fuel_injector/Injector in fuel_injectors[stage_name]) Injector.StopInjecting() - active_stage = "Cooling" + stage_status[stage_name] = 0 updateDialog() return if( href_list["update"] ) @@ -94,7 +119,7 @@ process() ..() - updateDialog() + src.updateDialog() proc interact(mob/user) @@ -104,12 +129,17 @@ user << browse(null, "window=fuel_monitor") return var/t = "Reactor Core Fuel Control
" - t += "Current fuel injection stage: [active_stage]
" - if(active_stage == "Cooling") - //t += "Restart injection cycle
" + var/cooling = 0 + for(var/stage in stage_status) + if(stage_status[stage]) + t += "Fuel injection: Active
" + t += "Enter cooldown phase
" + cooling = 1 + break + if(!cooling) + t += "Fuel injection: Cooling
" t += "----
" - else - t += "Enter cooldown phase
" + // t += "Fuel depletion announcement: " t += "[announce_fueldepletion ? "Disable" : "Disabled"] " t += "[announce_fueldepletion == 1 ? "Announcing" : "Announce"] " @@ -126,18 +156,18 @@ t += "Fuel Assembly Port" t += "Assembly depletion percentage" t += "" - for(var/stage in fuel_injectors) - var/list/cur_stage = fuel_injectors[stage] - t += "Fuel Injection Stage: [stage] [active_stage == stage ? " (Currently active)" : "Activate"]" + for(var/stage_name in fuel_injectors) + var/list/cur_stage = fuel_injectors[stage_name] + t += "Fuel Injection Stage: [stage_name], [stage_status[stage_name] ? "Active \[Enter cooldown\]" : "Cooling \[Begin injection\]"]" for(var/obj/machinery/rust/fuel_injector/Injector in cur_stage) t += "" t += "[Injector.on && Injector.remote_enabled ? "Operational" : "Unresponsive"]" t += "[Injector.rate/10] Modify" t += "[Injector.fuel_usage*100]% Modify" t += "[Injector.owned_assembly_port ? "[Injector.owned_assembly_port.cur_assembly ? "Loaded": "Empty"]" : "Disconnected" ]" - t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[100 - Injector.owned_assembly_port.cur_assembly.amount_depleted*100]%" : ""]" + t += "[Injector.owned_assembly_port && Injector.owned_assembly_port.cur_assembly ? "[Injector.owned_assembly_port.cur_assembly.percent_depleted]%" : ""]" t += "" t += "" t += "Close
" - user << browse(t, "window=fuel_monitor;size=500x800") + user << browse(t, "window=fuel_monitor;size=500x600") user.machine = src diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm index db78be7bb6f..493ac1a96c3 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/fuel_injector.dm @@ -196,7 +196,7 @@ // owned_assembly_port.cur_assembly.rod_quantities[reagent] -= amount amount_left += owned_assembly_port.cur_assembly.rod_quantities[reagent] - owned_assembly_port.cur_assembly.amount_depleted = amount_left / 300 + owned_assembly_port.cur_assembly.percent_depleted = amount_left / 300 flick("injector-emitting",src) use_power(fuel_usage * 10000 + 100) //0.0001 if(injecting) diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm index 2619029c6c6..181792bca88 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron.dm @@ -88,9 +88,33 @@ for(var/obj/machinery/computer/rust/gyrotron_controller/comp in range(25)) comp.updateDialog() return - +/* + var/obj/item/projectile/beam/emitter/A = new /obj/item/projectile/beam/emitter( src.loc ) + playsound(src.loc, 'emitter.ogg', 25, 1) + if(prob(35)) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + A.dir = src.dir + if(src.dir == 1)//Up + A.yo = 20 + A.xo = 0 + else if(src.dir == 2)//Down + A.yo = -20 + A.xo = 0 + else if(src.dir == 4)//Right + A.yo = 0 + A.xo = 20 + else if(src.dir == 8)//Left + A.yo = 0 + A.xo = -20 + else // Any other + A.yo = -20 + A.xo = 0 + A.fired() +*/ proc/Emit() - var/obj/item/projectile/beam/ehf_beam/A = new ( src.loc ) + var/obj/item/projectile/beam/ehf_beam/A = new /obj/item/projectile/beam/ehf_beam( src.loc ) A.frequency = frequency A.damage = mega_energy * 500 // diff --git a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm index df34958c236..3cfd65adf47 100644 --- a/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm +++ b/code/WorkInProgress/Cael_Aislinn/Rust/gyrotron_controller.dm @@ -33,7 +33,7 @@ process() ..() - //updateDialog() + src.updateDialog() proc interact(mob/user) @@ -96,5 +96,5 @@ t += "" */ t += "Close
" - user << browse(t, "window=gyrotron_controller;size=500x800") + user << browse(t, "window=gyrotron_controller;size=500x400") user.machine = src diff --git a/code/modules/power/generator.dm b/code/modules/power/generator.dm index 22a0659b4c0..17bec612819 100644 --- a/code/modules/power/generator.dm +++ b/code/modules/power/generator.dm @@ -1,8 +1,6 @@ // thermo electric generator powered by twinned gas turbines // more realistic than type 2, and also cooler #define ENERGY_TRANSFER_FACTOR 10 -#define POWER_PRODUCTION_FACTOR 1.25 - /*/obj/machinery/power/generator/verb/set_amount(var/g as num) set src in view(1) @@ -31,7 +29,8 @@ if(lastgenlev != 0) overlays += image('power.dmi', "teg-op[lastgenlev]") -#define GENRATE 800 // generator output coefficient from Q +#define GENRATE 0.05 // generator output coefficient from Q +#define MAX_SAFE_OUTPUT 500000 /obj/machinery/power/generator/process() @@ -62,7 +61,7 @@ var/energy_transfer = delta_temperature*hot_air_heat_capacity*cold_air_heat_capacity/(hot_air_heat_capacity+cold_air_heat_capacity) var/heat = energy_transfer*(1-efficiency) - lastgen = POWER_PRODUCTION_FACTOR * energy_transfer*efficiency + lastgen = energy_transfer * efficiency * GENRATE //ENERGY_TRANSFER_FACTOR to beef up the amount of heat passed over hot_air.temperature -= energy_transfer/hot_air_heat_capacity @@ -71,7 +70,18 @@ //world << "POWER: [lastgen] W generated at [efficiency*100]% efficiency and sinks sizes [cold_air_heat_capacity], [hot_air_heat_capacity]" + //if producing more than 1 million watts, emit sparks and waste a little power + var/runoff = 0 + if(lastgen > MAX_SAFE_OUTPUT) + runoff = lastgen - MAX_SAFE_OUTPUT + if( prob(max( 100, (100 * runoff / MAX_SAFE_OUTPUT) )) ) + lastgen -= rand(1, 10) * (runoff / 100) + var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread + s.set_up(5, 1, src) + s.start() + // add_avail(lastgen) + // update icon overlays only if displayed level has changed if(air1) @@ -80,7 +90,7 @@ if(air2) circ2.air2.merge(air2) - var/genlev = max(0, min( round(11*lastgen / 250000), 11)) + var/genlev = max(0, min( round(11*lastgen / MAX_SAFE_OUTPUT), 11)) if(genlev != lastgenlev) lastgenlev = genlev updateicon() diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm index fddea20b2f9..8d9fcef035a 100644 --- a/code/modules/projectiles/projectile/beams.dm +++ b/code/modules/projectiles/projectile/beams.dm @@ -45,7 +45,7 @@ var/list/beam_master = list() beam_master["[icon_state][target_dir]"] = I //And cache it! //Finally add the overlay - loc.overlays += beam_master["[icon_state][target_dir]"] + src.loc.overlays += beam_master["[icon_state][target_dir]"] //Add the turf to a list in the beam master so they can be cleaned up easily. if(reference in beam_master)