mirror of
https://github.com/Aurorastation/Aurora.3.git
synced 2026-07-19 20:06:28 +01:00
f8c325666c
Fixes https://github.com/Aurorastation/Aurora.3/issues/21682 Fixes https://github.com/Aurorastation/Aurora.3/issues/21719 changes: - bugfix: "Fixes shield diffusers no longer diffusing targeted shield segments (used for mass driver ejection paths)." - bugfix: "Moves air alarm hidden behind D3 starboard central hallway shutters to visible free spot on opposite wall." - rscadd: "Adds tintable window control to the Horizon's exam room." - rscadd: "Adds tintable window controls for both the interior and exterior windows of the Horizon's recovery room." - rscadd: "Adds an additional light to a particularly dark corner of the Horizon's d2 hard storage room."
109 lines
4.3 KiB
Plaintext
109 lines
4.3 KiB
Plaintext
// This is an abstracted energy field to cut down on processing thousands of shields per process tick.
|
|
/datum/energy_field
|
|
/// A gigantic ass fucking list of energy fields.
|
|
var/list/field = list()
|
|
/// The actual strength of the field.
|
|
var/field_strength = 0
|
|
/// Current strengthening rate of a single field.
|
|
var/strengthen_rate = 0.2
|
|
/// Maximum rate by which an energy field can be strengthened.
|
|
var/max_strengthen_rate = 0.5
|
|
/// The percentage of the shield strength that needs to be replaced each second
|
|
var/dissipation_rate = 0.030
|
|
/// An energy field will dissipate by at least this rate in renwicks per field tile (otherwise field would never dissipate completely as dissipation is a percentage)
|
|
var/min_dissipation = 0.01
|
|
/// Our target field strength.
|
|
var/target_field_strength = 10
|
|
/// The maximum field strength we can go to.
|
|
var/max_field_strength = 10
|
|
/// The time passed since the last "fail", AKA losing charge faster than you can replenish it.
|
|
var/time_since_fail = 100
|
|
/// How many renwicks per watt.
|
|
var/energy_conversion_rate = 0.0002
|
|
/// If the field is strong, then the energy field objects will turn dense.
|
|
var/strong_field = FALSE
|
|
|
|
/datum/energy_field/Destroy(force)
|
|
clear_field()
|
|
return ..()
|
|
|
|
/**
|
|
* This proc, called when a shield generator processes, makes the whole thing tick by updating strength and etc.
|
|
* @assumed_charge: the charge that is given to this energy field. You have to get the required energy first, if you want a balanced field.
|
|
*/
|
|
/datum/energy_field/proc/handle_strength(assumed_charge = 0)
|
|
if(length(field))
|
|
time_since_fail++
|
|
//the amount of renwicks that the generator can add this tick, over the entire field
|
|
var/total_renwick_increase = assumed_charge * energy_conversion_rate
|
|
|
|
var/renwick_increase_per_field = total_renwick_increase / length(field) //per field tile
|
|
var/renwick_upkeep_per_field = max(field_strength * dissipation_rate, min_dissipation)
|
|
var/amount_to_strengthen = renwick_increase_per_field - renwick_upkeep_per_field
|
|
field_strength = min(field_strength + amount_to_strengthen, max_field_strength)
|
|
|
|
if(field_strength < 1)
|
|
if(strong_field)
|
|
strong_field = FALSE
|
|
SEND_SIGNAL(src, COMSIG_SHIELDS_UPDATE_STRENGTH_STATUS)
|
|
time_since_fail = 0
|
|
else
|
|
if(!strong_field)
|
|
strong_field = TRUE
|
|
SEND_SIGNAL(src, COMSIG_SHIELDS_UPDATE_STRENGTH_STATUS)
|
|
else
|
|
field_strength = 0
|
|
|
|
/**
|
|
* Returns the required energy upkeep for the field.
|
|
*/
|
|
/datum/energy_field/proc/get_required_energy()
|
|
var/required_energy = 0
|
|
if(length(field))
|
|
var/renwick_upkeep_per_field = max(field_strength * dissipation_rate, min_dissipation)
|
|
var/target_renwick_increase = min(target_field_strength - field_strength, strengthen_rate) + renwick_upkeep_per_field //per field tile
|
|
required_energy = length(field) * target_renwick_increase / energy_conversion_rate
|
|
return required_energy
|
|
|
|
/**
|
|
* Clears the field of active field objects.
|
|
*/
|
|
/datum/energy_field/proc/clear_field()
|
|
field_strength = 0
|
|
strong_field = FALSE
|
|
for(var/obj/effect/energy_field/D as anything in field)
|
|
field.Remove(D)
|
|
qdel(D)
|
|
|
|
/**
|
|
* Sets the shielded turfs of the energy field.
|
|
*/
|
|
/datum/energy_field/proc/set_shielded_turfs(list/shielded_turfs)
|
|
if(length(shielded_turfs))
|
|
for(var/turf/T in shielded_turfs)
|
|
var/obj/effect/energy_field/F = new(T, src)
|
|
field += F
|
|
|
|
/**
|
|
* Removes the field from the managed list and deletes it. Called by shield diffusion.
|
|
*/
|
|
/datum/energy_field/proc/remove_individual_field(var/obj/effect/energy_field/field_to_remove)
|
|
field.Remove(field_to_remove)
|
|
qdel(field_to_remove)
|
|
|
|
/**
|
|
* Adds a bunch of UI data for TGUIs with relevant field data.
|
|
*/
|
|
/datum/energy_field/proc/add_field_ui_data(list/data)
|
|
if(!istype(data))
|
|
return
|
|
|
|
data["average_field"] = round(field_strength, 0.01)
|
|
data["progress_field"] = (target_field_strength ? round(100 * field_strength / target_field_strength, 0.1) : "NA")
|
|
data["power_take"] = round(length(field) * max(field_strength * dissipation_rate, min_dissipation) / energy_conversion_rate)
|
|
data["shield_power"] = round(length(field) * min(strengthen_rate, target_field_strength - field_strength) / energy_conversion_rate)
|
|
data["strengthen_rate"] = (strengthen_rate * 10)
|
|
data["max_strengthen_rate"] = (max_strengthen_rate * 10)
|
|
data["target_field_strength"] = target_field_strength
|
|
return data
|