Skip to content

Commit

Permalink
Notes towards fire system.
Browse files Browse the repository at this point in the history
  • Loading branch information
MistakeNot4892 committed Jan 20, 2025
1 parent 42ac5a3 commit 2dd4230
Show file tree
Hide file tree
Showing 40 changed files with 786 additions and 326 deletions.
24 changes: 20 additions & 4 deletions code/__defines/fires.dm
Original file line number Diff line number Diff line change
@@ -1,4 +1,20 @@
#define FUEL_VALUE_SUPPRESSANT -1
#define FUEL_VALUE_NONE 0
#define FUEL_VALUE_ACCELERANT 1
#define FUEL_VALUE_VOLATILE 2
#define FIRE_CONSUME_CONSTANT 5
#define FIRE_INTENSITY_CONSTANT 0.8
#define FIRE_SPREAD_CONSTANT 3
#define FIRE_W_CLASS_BURN_CONSTANT 1
#define FIRE_SPREAD_THRESHOLD 5
#define FIRE_THERMAL_ENERGY_CONSTANT 1
#define FIRE_TURF_SPREAD_MULTIPLIER 12
#define FIRE_INTENSITY_WILL_NOT_BURN -1

// Constants for flammable material/exhaust list indices
#define FUEL_MATTER "fm"
#define FUEL_REAGENTS "fr"
#define FUEL_GAS "fg"
#define FIRE_BURN_TOTAL_INDEX "bt"

// Constants for material fuel values
#define FUEL_VALUE_SUPPRESSANT -1
#define FUEL_VALUE_NONE 0
#define FUEL_VALUE_ACCELERANT 1
#define FUEL_VALUE_VOLATILE 2
10 changes: 5 additions & 5 deletions code/__defines/research.dm
Original file line number Diff line number Diff line change
Expand Up @@ -2,14 +2,14 @@
#define SHEET_UNIT "<small>cm<sup>3</sup></small>"

#define REAGENT_WORTH_MULTIPLIER 1 //0.01
#define GAS_WORTH_MULTIPLIER 1 //0.001
#define GAS_WORTH_MULTIPLIER 1 //0.001
#define MATERIAL_WORTH_MULTIPLIER 1 //0.005

#define REAGENT_UNITS_PER_MATERIAL_SHEET 20
#define REAGENT_UNITS_PER_GAS_MOLE 10
#define REAGENT_UNITS_PER_MATERIAL_UNIT (REAGENT_UNITS_PER_MATERIAL_SHEET / SHEET_MATERIAL_AMOUNT)
#define REAGENT_UNITS_PER_MATERIAL_SHEET 20
#define REAGENT_UNITS_PER_GAS_MOLE 10
#define REAGENT_UNITS_PER_MATERIAL_UNIT (REAGENT_UNITS_PER_MATERIAL_SHEET / SHEET_MATERIAL_AMOUNT)
#define MATERIAL_UNITS_TO_REAGENTS_UNITS(AMT) (AMT * REAGENT_UNITS_PER_MATERIAL_UNIT)
#define MOLES_PER_MATERIAL_UNIT(AMT) round(MATERIAL_UNITS_TO_REAGENTS_UNITS(AMT) / REAGENT_UNITS_PER_GAS_MOLE)
#define MOLES_PER_MATERIAL_UNIT(AMT) round(MATERIAL_UNITS_TO_REAGENTS_UNITS(AMT) / REAGENT_UNITS_PER_GAS_MOLE)

#define MATTER_AMOUNT_PRIMARY SHEET_MATERIAL_AMOUNT
#define MATTER_AMOUNT_SECONDARY (MATTER_AMOUNT_PRIMARY * 0.75)
Expand Down
1 change: 1 addition & 0 deletions code/__defines/subsystem-priority.dm
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@
#define SS_PRIORITY_RADIATION 20 // Radiation processing and cache updates.
#define SS_PRIORITY_OPEN_SPACE 20 // Open turf updates.
#define SS_PRIORITY_AIRFLOW 15 // Object movement from ZAS airflow.
#define SS_PRIORITY_FIRES 12 // Object fires.
#define SS_PRIORITY_FLUIDS 11 // Liquid flows.
#define SS_PRIORITY_VOTE 10 // Vote management.
#define SS_PRIORITY_INACTIVITY 10 // Idle kicking.
Expand Down
70 changes: 70 additions & 0 deletions code/controllers/subsystems/fires.dm
Original file line number Diff line number Diff line change
@@ -0,0 +1,70 @@
SUBSYSTEM_DEF(fires)
name = "Fires"
priority = SS_PRIORITY_FIRES
wait = 2 SECONDS
flags = SS_NO_INIT

var/list/burning_fires = list()
var/list/processing_fires
var/list/burning_turfs

/datum/controller/subsystem/fires/stat_entry()
..("F:[burning_fires.len] T:[burning_turfs.len]")

/datum/controller/subsystem/fires/fire(resumed = 0)

if(!resumed)
processing_fires = burning_fires.Copy()
burning_turfs = list()

var/atom/current_fire
while(processing_fires.len)
current_fire = processing_fires[processing_fires.len]
processing_fires.len--
if(QDELETED(current_fire) || current_fire.fire_intensity <= 0)
continue
var/fire_product = current_fire.process_fire()
if(fire_product > 0 && !QDELETED(current_fire) && current_fire.fire_intensity >= FIRE_SPREAD_THRESHOLD)
var/turf/burning_turf = current_fire.loc
if(istype(burning_turf))
burning_turfs[burning_turf] = max(burning_turfs[burning_turf], current_fire.fire_intensity)
if(MC_TICK_CHECK)
return

var/fire_intensity
var/turf/current_turf
while(burning_turfs.len)

current_turf = burning_turfs[burning_turfs.len]
fire_intensity = burning_turfs[current_turf]
burning_turfs.len--

var/initial_spread_prob = fire_intensity * FIRE_TURF_SPREAD_MULTIPLIER * FIRE_SPREAD_CONSTANT
if(!prob(initial_spread_prob))
continue

var/list/spread_to_atoms = current_turf.get_contained_external_atoms()
for(var/spread_dir in global.cardinal)
var/turf/spreading = get_step(current_turf, spread_dir)
if(spreading)
spread_to_atoms |= spreading
spread_to_atoms |= spreading.get_contained_external_atoms()

var/spread_prob = fire_intensity * FIRE_SPREAD_CONSTANT
var/list/spread_to_turf = list()
while(length(spread_to_atoms))
var/atom/spread_to = pick_n_take(spread_to_atoms)
if(!istype(spread_to) || !spread_to.is_flammable() || spread_to.is_on_fire() || !spread_to.Adjacent(current_turf))
continue
if(!prob(spread_prob))
break
spread_to.ignite_fire()
var/turf/spreading_to_turf = get_turf(spread_to)
if(!burning_turfs[spreading_to_turf])
spread_to_turf[spreading_to_turf] = TRUE

for(var/spreading_to_turf in spread_to_turf)
new /obj/effect/fire/ember(current_turf, spreading_to_turf)

if(MC_TICK_CHECK)
return
2 changes: 1 addition & 1 deletion code/datums/composite_sounds/machinery_sounds.dm
Original file line number Diff line number Diff line change
Expand Up @@ -4,4 +4,4 @@
mid_sounds = list('sound/machines/microwave/microwave-mid1.ogg'=10, 'sound/machines/microwave/microwave-mid2.ogg'=1)
mid_length = 10
end_sound = 'sound/machines/microwave/microwave-end.ogg'
volume = 1
volume = 1
1 change: 1 addition & 0 deletions code/game/atoms.dm
Original file line number Diff line number Diff line change
Expand Up @@ -155,6 +155,7 @@

/atom/proc/on_reagent_change()
SHOULD_CALL_PARENT(TRUE)
update_flammability()
if(storage && reagents?.total_volume)
for(var/obj/item/thing in get_stored_inventory())
thing.fluid_act(reagents)
Expand Down
Loading

0 comments on commit 2dd4230

Please sign in to comment.