diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 31c3085f40..023d60acf0 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -30,7 +30,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) var/igniting = 0 var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src - + if(air_contents.check_combustability(liquid)) igniting = 1 @@ -55,87 +55,28 @@ obj icon = 'fire.dmi' icon_state = "1" - layer = TURF_LAYER + 0.2 + layer = TURF_LAYER var firelevel = 10000 //Calculated by gas_mixture.calculate_firelevel() process() . = 1 - + //get location and check if it is in a proper ZAS zone var/turf/simulated/floor/S = loc if(!S.zone) del src - + if(!istype(S)) del src - + var/datum/gas_mixture/air_contents = S.return_air() //get liquid fuels on the ground. var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S //and the volatile stuff from the air var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases - //get scorchmarks - var/obj/effect/decal/cleanable/scorchmark/scorch = locate() in S - - //check if it found a scorchmark and add one if there isnt one already - if (!scorch) - scorch = new/obj/effect/decal/cleanable/scorchmark(S,0) - - //try to burn the floor - //initialize the temperature needed for burning the floor - //initialize the fuel gained by burning this floor - //initialize the speed modifier for the floor to catch on fire - var/floor_target_temp = 0 - var/floor_fuel = 1 - var/floor_speed_modifier = 1 - if(S.is_plasteel_floor()) - floor_target_temp = 800 - else if (S.is_light_floor()) - floor_target_temp = 600 - else if (S.is_grass_floor()) - floor_target_temp = 500 - floor_fuel = 2 - floor_speed_modifier = 1.5 - else if (S.is_wood_floor()) - floor_target_temp = 500 - floor_fuel = 3 - floor_speed_modifier = 1.25 - else if (S.is_carpet_floor()) - floor_target_temp = 500 - floor_fuel = 3 - floor_speed_modifier = 1.5 - else - floor_target_temp = 1200 - floor_speed_modifier = 0.8 - - //check if the floor is burnable - if(floor_target_temp > 0) - //calculate a random factor for the equation - var/turf_burn_random = max( min(floor_speed_modifier * 5 * ( ( max(air_contents.temperature - floor_target_temp,0) / floor_target_temp )^2 ), 100), 0) - //check if the random check is passed - if (prob(turf_burn_random)) - //check if the tile has already been damaged once - if (S.burnt || S.broken) - //check if the tile is plating, if not break it and release some fuel, also some randomness to slow down the process - if (!S.is_plating() && prob(10)) - scorch.amount += floor_fuel - S.break_tile_to_plating() - - //damage it and release fuel - else - scorch.amount += floor_fuel - S.burn_tile() - - //now burn some items! - for(var/obj/o in loc) - if(o.fire_min_burn_temp) - var/obj_burn_random = max( min(o.fire_burn_multiplier * 5 * ( ( max(air_contents.temperature - o.fire_min_burn_temp,0) / o.fire_min_burn_temp )^2 ), 100), 0) - if(prob(obj_burn_random)) - scorch.amount += fire_fuel_worth - o.fire_burn() - + //since the air is processed in fractions, we need to make sure not to have any minuscle residue or //the amount of moles might get to low for some functions to catch them and thus result in wonky behaviour if(air_contents.oxygen < 0.001) @@ -145,29 +86,29 @@ obj if(fuel) if(fuel.moles < 0.001) air_contents.trace_gases.Remove(fuel) - + //check if there is something to combust - if(!air_contents.check_combustability(liquid,scorch)) + if(!air_contents.check_combustability(liquid)) del src - + //get a firelevel and set the icon - firelevel = air_contents.calculate_firelevel(liquid,scorch) - - if(firelevel > 3) + firelevel = air_contents.calculate_firelevel(liquid) + + if(firelevel > 6) icon_state = "3" SetLuminosity(7) - else if(firelevel > 2) + else if(firelevel > 2.5) icon_state = "2" SetLuminosity(5) else icon_state = "1" SetLuminosity(3) - + //im not sure how to implement a version that works for every creature so for now monkeys are firesafe for(var/mob/living/carbon/human/M in loc) M.FireBurn(firelevel, air_contents.temperature, air_contents.return_pressure() ) //Burn the humans! - + //spread! for(var/direction in cardinal) if(S.air_check_directions&direction) //Grab all valid bordering tiles @@ -177,7 +118,7 @@ obj if(istype(enemy_tile)) //If extinguisher mist passed over the turf it's trying to spread to, don't spread and //reduce firelevel. - if(prob( 100 * (1 - min( max( ( (world.time - 30) - enemy_tile.fire_protection ), 0 ) / 30, 1) ) ) ) + if(enemy_tile.fire_protection > world.time-30) firelevel -= 1.5 continue @@ -185,29 +126,29 @@ obj if(!(locate(/obj/fire) in enemy_tile)) if( prob( 50 + 50 * (firelevel/vsc.fire_firelevel_multiplier) ) && S.CanPass(null, enemy_tile, 0,0) && enemy_tile.CanPass(null, S, 0,0)) new/obj/fire(enemy_tile,firelevel) - + //seperate part of the present gas //this is done to prevent the fire burning all gases in a single pass var/datum/gas_mixture/flow = air_contents.remove_ratio(vsc.fire_consuption_rate) - + ///////////////////////////////// FLOW HAS BEEN CREATED /// DONT DELETE THE FIRE UNTIL IT IS MERGED BACK OR YOU WILL DELETE AIR /////////////////////////////////////////////// - + if(flow) - if(flow.check_combustability(liquid,scorch)) + if(flow.check_combustability(liquid)) //Ensure flow temperature is higher than minimum fire temperatures. //this creates some energy ex nihilo but is necessary to get a fire started //lets just pretend this energy comes from the ignition source and dont mention this again //flow.temperature = max(PLASMA_MINIMUM_BURN_TEMPERATURE+0.1,flow.temperature) - + //burn baby burn! - flow.zburn(liquid,scorch,1) - + flow.zburn(liquid,1) + //merge the air back S.assume_air(flow) ///////////////////////////////// FLOW HAS BEEN REMERGED /// feel free to delete the fire again from here on ////////////////////////////////////////////////////////////////// - + New(newLoc,fl) ..() @@ -237,15 +178,15 @@ turf/simulated/apply_fire_protection() fire_protection = world.time -datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch, force_burn) +datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid,force_burn) var/value = 0 - - if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid,scorch) ) - var/total_fuel = 0 + + if((temperature > PLASMA_MINIMUM_BURN_TEMPERATURE || force_burn) && check_combustability(liquid) ) + var/total_fuel = 0 var/datum/gas/volatile_fuel/fuel = locate() in trace_gases total_fuel += toxins - + if(fuel) //Volatile Fuel total_fuel += fuel.moles @@ -257,12 +198,8 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ else total_fuel += liquid.amount - if(scorch) - //fuel created by destroying objects and turfs - total_fuel += scorch.amount - //Calculate the firelevel. - var/firelevel = calculate_firelevel(liquid, scorch) + var/firelevel = calculate_firelevel(liquid) //get the current inner energy of the gas mix //this must be taken here to prevent the addition or deletion of energy by a changing heat capacity @@ -270,7 +207,7 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ //determine the amount of oxygen used var/total_oxygen = min(oxygen, 2 * total_fuel) - + //determine the amount of fuel actually used var/used_fuel_ratio = min(oxygen / 2 , total_fuel) / total_fuel total_fuel = total_fuel * used_fuel_ratio @@ -295,39 +232,33 @@ datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/ liquid.amount -= liquid.amount * used_fuel_ratio * used_reactants_ratio if(liquid.amount <= 0) del liquid - if(scorch) - scorch.amount -= min(scorch.amount, scorch.amount * used_fuel_ratio * used_reactants_ratio) - //calculate the energy produced by the reaction and then set the new temperature of the mix temperature = (starting_energy + vsc.fire_fuel_energy_release * total_fuel) / heat_capacity() - + update_values() value = total_reactants * used_reactants_ratio return value -datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) +datum/gas_mixture/proc/check_combustability(obj/effect/decal/cleanable/liquid_fuel/liquid) //this check comes up very often and is thus centralized here to ease adding stuff - - var/datum/gas/volatile_fuel/fuel = locate() in trace_gases + + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/value = 0 - + if(oxygen && (toxins || fuel || liquid)) value = 1 - else if (scorch) - if (oxygen && scorch.amount > 0) - value = 1 - + return value -datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid, obj/effect/decal/cleanable/scorchmark/scorch) +datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fuel/liquid) //Calculates the firelevel based on one equation instead of having to do this multiple times in different areas. - + var/datum/gas/volatile_fuel/fuel = locate() in trace_gases var/total_fuel = 0 var/firelevel = 0 - + if(check_combustability(liquid)) - + total_fuel += toxins if(liquid) @@ -336,20 +267,17 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue if(fuel) total_fuel += fuel.moles - if(scorch) - total_fuel += scorch.amount - var/total_combustables = (total_fuel + oxygen) - + if(total_fuel > 0 && oxygen > 0) - + //slows down the burning when the concentration of the reactants is low var/dampening_multiplier = total_combustables / (total_combustables + nitrogen + carbon_dioxide) //calculates how close the mixture of the reactants is to the optimum var/mix_multiplier = 1 / (1 + (5 * ((oxygen / total_combustables) ^2))) //toss everything together firelevel = vsc.fire_firelevel_multiplier * mix_multiplier * dampening_multiplier - + return max( 0, firelevel) @@ -395,4 +323,6 @@ datum/gas_mixture/proc/calculate_firelevel(obj/effect/decal/cleanable/liquid_fue apply_damage(0.6*mx*legs_exposure, BURN, "l_leg", 0, 0, "Fire") apply_damage(0.6*mx*legs_exposure, BURN, "r_leg", 0, 0, "Fire") apply_damage(0.4*mx*arms_exposure, BURN, "l_arm", 0, 0, "Fire") - apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") \ No newline at end of file + apply_damage(0.4*mx*arms_exposure, BURN, "r_arm", 0, 0, "Fire") + + //flash_pain() diff --git a/code/defines/obj.dm b/code/defines/obj.dm index 116136bfaf..661f4c43b3 100644 --- a/code/defines/obj.dm +++ b/code/defines/obj.dm @@ -80,17 +80,7 @@ var/name = t.fields["name"] var/rank = t.fields["rank"] var/real_rank = t.fields["real_rank"] - - var/active = 0 - for(var/mob/M in player_list) if(M.name == name) - // For dead ones, have a chance to get their status wrong - if(M.stat == 2) - active = M.x % 2 // Should be good enough, avoids their status flipping constantly - break - else if(M.client && M.client.inactivity <= 10 * 60 * 10) - active = 1 - break - isactive[name] = active ? "Active" : "SSD" + isactive[name] = t.fields["p_stat"] //world << "[name]: [rank]" diff --git a/code/game/objects/effects/decals/Cleanable/scorchmark.dm b/code/game/objects/effects/decals/Cleanable/scorchmark.dm deleted file mode 100644 index 9274708d6e..0000000000 --- a/code/game/objects/effects/decals/Cleanable/scorchmark.dm +++ /dev/null @@ -1,15 +0,0 @@ -obj/effect/decal/cleanable/scorchmark - //this is used as an additional visual result of fire and as a reagent holder for fuel created by burning of turfs and items. - icon = 'icons/effects/scorchmark.dmi' - name = "Soot" - icon_state = "1" - layer = TURF_LAYER+0.1 - anchored = 1 - var/amount = 0 //starts always empty and is filled by procs called by fire - - New(newLoc,start_amount=0) - ..() - - icon_state = pick("1","2","3","4","5","6","7","8","9") - dir = pick(cardinal) - amount = start_amount \ No newline at end of file diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm index 309d667553..d3e7144297 100644 --- a/code/game/objects/effects/effect_system.dm +++ b/code/game/objects/effects/effect_system.dm @@ -39,25 +39,25 @@ would spawn and follow the beaker, even if it is carried or thrown. /obj/effect/effect/water/New() ..() - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX spawn( 70 ) delete() return return /obj/effect/effect/water/Del() - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX ..() return /obj/effect/effect/water/Move(turf/newloc) - var/turf/simulated/floor/T = src.loc - if (istype(T, /turf/simulated/floor)) - T.fire_protection = world.time + //var/turf/T = src.loc + //if (istype(T, /turf)) + // T.firelevel = 0 //TODO: FIX if (--src.life < 1) //SN src = null delete() diff --git a/code/game/objects/items/stacks/sheets/mineral.dm b/code/game/objects/items/stacks/sheets/mineral.dm index f559c7f830..834029e7c4 100644 --- a/code/game/objects/items/stacks/sheets/mineral.dm +++ b/code/game/objects/items/stacks/sheets/mineral.dm @@ -103,9 +103,6 @@ var/global/list/datum/stack_recipe/uranium_recipes = list ( \ origin_tech = "plasmatech=2;materials=2" perunit = 2000 sheettype = "plasma" - fire_min_burn_temp = 500 - fire_burn_multiplier = 3 //made of burnium - fire_fuel_worth = 0 var/global/list/datum/stack_recipe/plasma_recipes = list ( \ new/datum/stack_recipe("plasma door", /obj/structure/mineral_door/transparent/plasma, 10, one_per_turf = 1, on_floor = 1), \ @@ -117,18 +114,6 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ pixel_y = rand(0,4)-4 ..() -/obj/item/stack/sheet/mineral/plasma/fire_burn() - //get location and check if it is in a proper ZAS zone - var/turf/simulated/floor/S = loc - if(S.zone) - var/datum/gas_mixture/air_contents = S.return_air() - if(air_contents) - air_contents.toxins += 20 - air_contents.update_values() - amount -= 1 - if(amount <= 0) - del src - /obj/item/stack/sheet/mineral/plastic name = "Plastic" icon_state = "sheet-plastic" @@ -139,6 +124,7 @@ var/global/list/datum/stack_recipe/plasma_recipes = list ( \ throw_range = 3 origin_tech = "materials=3" perunit = 2000 + sheettype = "plastic" var/global/list/datum/stack_recipe/plastic_recipes = list ( \ new/datum/stack_recipe("plastic crate", /obj/structure/closet/pcrate, 10, one_per_turf = 1, on_floor = 1), \ @@ -268,4 +254,4 @@ var/global/list/datum/stack_recipe/silver_recipes = list ( \ throw_speed = 3 throw_range = 3 origin_tech = "materials=4" - perunit = 2000 + perunit = 2000 diff --git a/code/game/objects/items/weapons/power_cells.dm b/code/game/objects/items/weapons/power_cells.dm index 0a1cda9b2b..353790d22f 100644 --- a/code/game/objects/items/weapons/power_cells.dm +++ b/code/game/objects/items/weapons/power_cells.dm @@ -20,10 +20,6 @@ var/construction_cost = list("metal"=750,"glass"=75) var/construction_time=100 - fire_min_burn_temp = 1000 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - suicide_act(mob/user) viewers(user) << "\red [user] is licking the electrodes of the [src.name]! It looks like \he's trying to commit suicide." return (FIRELOSS) @@ -118,7 +114,9 @@ g_amt = 0 /obj/item/weapon/cell/fire_burn() + viewers(src) << "\red Charge: [src.charge]" var/radius = round( (sqrt(charge)/30)+0.5, 1 ) + viewers(src) << "\red Radius: [radius]" if (radius >= 1) explosion(src.loc,0,0,radius) - ..() + ..() diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm index ea3f42247d..143ff13a04 100644 --- a/code/game/objects/items/weapons/tanks/tanks.dm +++ b/code/game/objects/items/weapons/tanks/tanks.dm @@ -16,11 +16,6 @@ var/integrity = 3 var/volume = 70 - m_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - /obj/item/weapon/tank/New() ..() @@ -266,11 +261,4 @@ integrity-- else if(integrity < 3) - integrity++ - -/obj/item/weapon/tank/fire_burn() - //get location and check if it is in a proper ZAS zone - var/turf/simulated/floor/S = loc - if(S.zone) - S.assume_air(air_contents) - ..() \ No newline at end of file + integrity++ \ No newline at end of file diff --git a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm index 6e421c9443..762888a4b4 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -76,19 +76,11 @@ icon_state = "wooden_chair" name = "wooden chair" desc = "Old is never too old to not be in fashion." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 5 - m_amt = 0 /obj/structure/stool/bed/chair/wood/wings icon_state = "wooden_chair_wings" name = "wooden chair" desc = "Old is never too old to not be in fashion." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 5 - m_amt = 0 /obj/structure/stool/bed/chair/wood/attackby(obj/item/weapon/W as obj, mob/user as mob) if(istype(W, /obj/item/weapon/wrench)) @@ -101,9 +93,6 @@ /obj/structure/stool/bed/chair/comfy name = "comfy chair" desc = "It looks comfy." - fire_min_burn_temp = 500 - fire_burn_multiplier = 1.25 - fire_fuel_worth = 4 /obj/structure/stool/bed/chair/comfy/brown icon_state = "comfychair_brown" diff --git a/code/game/objects/structures/stool_bed_chair_nest/stools.dm b/code/game/objects/structures/stool_bed_chair_nest/stools.dm index fcd404f165..ab7a55e1da 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/stools.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/stools.dm @@ -6,10 +6,6 @@ anchored = 1.0 flags = FPRINT pressure_resistance = 15 - m_amt = 3750 - fire_min_burn_temp = 600 - fire_burn_multiplier = 1 - fire_fuel_worth = 2 /obj/structure/stool/ex_act(severity) switch(severity) diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 55a00acfdc..2879122972 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -373,9 +373,8 @@ return /obj/structure/window/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) - //Since glasslocks are the only thing you can do to prevent spreading atmos issues, this was disabled for the time being - //if(exposed_temperature > T0C + 800) - // hit(round(exposed_volume / 100), 0) + if(exposed_temperature > T0C + 800) + hit(round(exposed_volume / 100), 0) ..() diff --git a/code/modules/reagents/reagent_dispenser.dm b/code/modules/reagents/reagent_dispenser.dm index 4762b3212f..93cb235649 100644 --- a/code/modules/reagents/reagent_dispenser.dm +++ b/code/modules/reagents/reagent_dispenser.dm @@ -1,3 +1,5 @@ + + /obj/structure/reagent_dispensers name = "Dispenser" desc = "..." @@ -64,6 +66,12 @@ new /obj/effect/effect/water(src.loc) del(src) + + + + + + //Dispensers /obj/structure/reagent_dispensers/watertank name = "watertank" @@ -71,39 +79,10 @@ icon = 'icons/obj/objects.dmi' icon_state = "watertank" amount_per_transfer_from_this = 10 - - m_amt = 7500 - g_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 0.75 - fire_fuel_worth = 0 - New() ..() reagents.add_reagent("water",1000) -/obj/structure/reagent_dispensers/watertank/fire_burn() - src.reagents.update_total() - var/number_of_gusts = src.reagents.total_volume / 50 - for(var/a=0, a < number_of_gusts , a++) - var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) - var/turf/my_target = get_step(get_step(get_step(get_step(get_step(get_turf(src),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)),pick(cardinal)) - var/datum/reagents/R = new/datum/reagents(50) - if(!W) return - W.reagents = R - R.my_atom = W - if(!W || !src) return - src.reagents.trans_to(W,50) - for(var/b=0, b<5, b++) - step_towards(W,my_target) - if(!W) return - W.reagents.reaction(get_turf(W)) - for(var/atom/atm in get_turf(W)) - if(!W) return - W.reagents.reaction(atm) - if(W.loc == my_target) break - ..() - /obj/structure/reagent_dispensers/fueltank name = "fueltank" desc = "A fueltank" @@ -112,13 +91,6 @@ amount_per_transfer_from_this = 10 var/modded = 0 var/obj/item/device/assembly_holder/rig = null - - m_amt = 7500 - g_amt = 3750 - fire_min_burn_temp = 800 - fire_burn_multiplier = 1 - fire_fuel_worth = 0 - New() ..() reagents.add_reagent("fuel",1000) @@ -192,11 +164,6 @@ if(src) del(src) -/obj/structure/reagent_dispensers/fueltank/fire_burn() - src.reagents.update_total() - new/obj/effect/decal/cleanable/liquid_fuel(src.loc, src.reagents.total_volume) - ..() - /obj/structure/reagent_dispensers/peppertank name = "Pepper Spray Refiller" desc = "Refill pepper spray canisters." @@ -247,4 +214,4 @@ New() ..() - reagents.add_reagent("virusfood", 1000) + reagents.add_reagent("virusfood", 1000) diff --git a/html/changelog.html b/html/changelog.html index afa541edf7..9e59bcd6e9 100644 --- a/html/changelog.html +++ b/html/changelog.html @@ -40,7 +40,7 @@ Header Section