From 5f7c9d5518b7876a080b5c459bc88329cb36fd18 Mon Sep 17 00:00:00 2001 From: Chinsky Date: Thu, 18 Oct 2012 21:25:24 +0400 Subject: [PATCH] Readded welder fuel. Fixed issue with fire not generating light. Fixed pre-merge issue with fuel passing through closed airlocks. --- code/ZAS/Fire.dm | 65 ++---------------- code/game/machinery/bots/cleanbot.dm | 1 + .../objects/effects/decals/Cleanable/fuel.dm | 58 ++++++++++++++++ code/modules/reagents/Chemistry-Reagents.dm | 21 +++--- icons/effects/effects.dmi | Bin 191155 -> 192531 bytes 5 files changed, 73 insertions(+), 72 deletions(-) create mode 100644 code/game/objects/effects/decals/Cleanable/fuel.dm diff --git a/code/ZAS/Fire.dm b/code/ZAS/Fire.dm index 2a8d6a2ba26..9501d4222e7 100644 --- a/code/ZAS/Fire.dm +++ b/code/ZAS/Fire.dm @@ -40,7 +40,7 @@ turf/simulated/hotspot_expose(exposed_temperature, exposed_volume, soh) if(locate(/obj/fire) in src) return 1 var/datum/gas/volatile_fuel/fuel = locate() in air_contents.trace_gases - var/obj/liquid_fuel/liquid = locate() in src + var/obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in src if(air_contents.calculate_firelevel(liquid) > vsc.IgnitionLevel && (fuel || liquid || air_contents.toxins > 0.5)) igniting = 1 if(air_contents.oxygen < 0.5) @@ -63,7 +63,7 @@ obj anchored = 1 mouse_opacity = 0 - //luminosity = 3 + luminosity = 3 icon = 'fire.dmi' icon_state = "1" @@ -90,7 +90,7 @@ obj //Get whatever trace fuels are in the area datum/gas/volatile_fuel/fuel = locate(/datum/gas/volatile_fuel/) in air_contents.trace_gases //Also get liquid fuels on the ground. - obj/liquid_fuel/liquid = locate() in S + obj/effect/decal/cleanable/liquid_fuel/liquid = locate() in S var/datum/gas_mixture/flow = air_contents.remove_ratio(0.25) //The reason we're taking a part of the air instead of all of it is so that it doesn't jump to @@ -177,67 +177,12 @@ obj ..() -obj/liquid_fuel - //Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles. - icon = 'icons/effects/effects.dmi' - icon_state = "fuel" - layer = TURF_LAYER+0.2 - anchored = 1 - var/amount = 1 //Basically moles. - - New(newLoc,amt=1) - src.amount = amt - - //Be absorbed by any other liquid fuel in the tile. - for(var/obj/liquid_fuel/other in newLoc) - if(other != src) - other.amount += src.amount - spawn other.Spread() - del src - - Spread() - . = ..() - - proc/Spread() - //Allows liquid fuels to sometimes flow into other tiles. - if(amount < 0.5) return - var/turf/simulated/S = loc - if(!istype(S)) return - for(var/d in cardinal) - if(S.air_check_directions & d) - if(rand(25)) - var/turf/simulated/O = get_step(src,d) - if(!locate(/obj/liquid_fuel) in O) - new/obj/liquid_fuel(O,amount*0.25) - amount *= 0.75 - - flamethrower_fuel - icon_state = "mustard" - anchored = 0 - New(newLoc, amt = 1, d = 0) - dir = d //Setting this direction means you won't get torched by your own flamethrower. - . = ..() - Spread() - //The spread for flamethrower fuel is much more precise, to create a wide fire pattern. - if(amount < 0.1) return - var/turf/simulated/S = loc - if(!istype(S)) return - - for(var/d in list(turn(dir,90),turn(dir,-90))) - if(S.air_check_directions & d) - var/turf/simulated/O = get_step(S,d) - new/obj/liquid_fuel/flamethrower_fuel(O,amount*0.25,d) - O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately. - - amount *= 0.5 - - turf/simulated/var/fire_protection = 0 //Protects newly extinguished tiles from being overrun again. turf/proc/apply_fire_protection() turf/simulated/apply_fire_protection() fire_protection = world.time -datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid) +datum/gas_mixture/proc/zburn(obj/effect/decal/cleanable/liquid_fuel/liquid) //This proc is similar to fire(), but uses a simple logarithm to calculate temp, and is thus more stable with ZAS. if(temperature > PLASMA_MINIMUM_BURN_TEMPERATURE) var @@ -295,7 +240,7 @@ datum/gas_mixture/proc/zburn(obj/liquid_fuel/liquid) return 0 -datum/gas_mixture/proc/calculate_firelevel(obj/liquid_fuel/liquid) +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 diff --git a/code/game/machinery/bots/cleanbot.dm b/code/game/machinery/bots/cleanbot.dm index 14f34de449a..1e6fc13a975 100644 --- a/code/game/machinery/bots/cleanbot.dm +++ b/code/game/machinery/bots/cleanbot.dm @@ -301,6 +301,7 @@ text("[src.oddbutton ? "Yes" : "No" target_types += /obj/effect/decal/cleanable/vomit target_types += /obj/effect/decal/cleanable/robot_debris target_types += /obj/effect/decal/cleanable/crayon + target_types += /obj/effect/decal/cleanable/liquid_fuel if(src.blood) target_types += /obj/effect/decal/cleanable/xenoblood/ diff --git a/code/game/objects/effects/decals/Cleanable/fuel.dm b/code/game/objects/effects/decals/Cleanable/fuel.dm new file mode 100644 index 00000000000..eae392b5a11 --- /dev/null +++ b/code/game/objects/effects/decals/Cleanable/fuel.dm @@ -0,0 +1,58 @@ +obj/effect/decal/cleanable/liquid_fuel + //Liquid fuel is used for things that used to rely on volatile fuels or plasma being contained to a couple tiles. + icon = 'icons/effects/effects.dmi' + icon_state = "fuel" + layer = TURF_LAYER+0.2 + anchored = 1 + var/amount = 1 //Basically moles. + + New(newLoc,amt=1) + src.amount = amt + + //Be absorbed by any other liquid fuel in the tile. + for(var/obj/effect/decal/cleanable/liquid_fuel/other in newLoc) + if(other != src) + other.amount += src.amount + spawn other.Spread() + del src + + Spread() + . = ..() + + proc/Spread() + //Allows liquid fuels to sometimes flow into other tiles. + if(amount < 0.5) return + var/turf/simulated/S = loc + if(!istype(S)) return + for(var/d in cardinal) + if(S.air_check_directions & d) + if(rand(25)) + var/turf/simulated/O = get_step(src,d) + var/can_pass = 1 + for (var/obj/machinery/door/airlock/door in O) + if (door.density) + can_pass = 0 + if (can_pass) + if(!locate(/obj/effect/decal/cleanable/liquid_fuel) in O) + new/obj/effect/decal/cleanable/liquid_fuel(O,amount*0.25) + amount *= 0.75 + + flamethrower_fuel + icon_state = "mustard" + anchored = 0 + New(newLoc, amt = 1, d = 0) + dir = d //Setting this direction means you won't get torched by your own flamethrower. + . = ..() + Spread() + //The spread for flamethrower fuel is much more precise, to create a wide fire pattern. + if(amount < 0.1) return + var/turf/simulated/S = loc + if(!istype(S)) return + + for(var/d in list(turn(dir,90),turn(dir,-90))) + if(S.air_check_directions & d) + var/turf/simulated/O = get_step(S,d) + new/obj/effect/decal/cleanable/liquid_fuel/flamethrower_fuel(O,amount*0.25,d) + O.hotspot_expose((T20C*2) + 380,500) //Light flamethrower fuel on fire immediately. + + amount *= 0.5 \ No newline at end of file diff --git a/code/modules/reagents/Chemistry-Reagents.dm b/code/modules/reagents/Chemistry-Reagents.dm index d454be6cb71..97e65c367b9 100644 --- a/code/modules/reagents/Chemistry-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents.dm @@ -993,25 +993,22 @@ datum color = "#660000" // rgb: 102, 0, 0 //Commenting this out as it's horribly broken. It's a neat effect though, so it might be worth making a new reagent (that is less common) with similar effects. -Pete -/* + reaction_obj(var/obj/O, var/volume) src = null var/turf/the_turf = get_turf(O) if(!the_turf) return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO - var/datum/gas_mixture/napalm = new - var/datum/gas/volatile_fuel/fuel = new - fuel.moles = 15 - napalm.trace_gases += fuel - the_turf.assume_air(napalm) + new/obj/effect/decal/cleanable/liquid_fuel(the_turf, volume) + reaction_turf(var/turf/T, var/volume) src = null - var/datum/gas_mixture/napalm = new - var/datum/gas/volatile_fuel/fuel = new - fuel.moles = 15 - napalm.trace_gases += fuel - T.assume_air(napalm) - return*/ + + if(!T) + return //No sense trying to start a fire if you don't have a turf to set on fire. --NEO + new/obj/effect/decal/cleanable/liquid_fuel(T, volume) + return + on_mob_life(var/mob/living/M as mob) if(!M) M = holder.my_atom M.adjustToxLoss(1) diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 7d42071f67788959da7f288b03d27f74ff571d49..741cd23e26d851b0bdb13dcf4a31aa39d4f78195 100644 GIT binary patch delta 5115 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 F{{gyRJ!Jp@ delta 3728 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