Files
Batrachophreno f8c325666c Miscellaneous minor Horizon map improvements (#21716)
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."
2026-01-19 10:37:08 +00:00

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