Merge pull request #6846 from mwerezak/fire-extinguishers

Water cools hot turfs even if they do not have a hotspot.
This commit is contained in:
Chinsky
2014-11-05 09:03:35 +03:00
4 changed files with 472 additions and 441 deletions

View File

@@ -173,11 +173,14 @@
energy_drain = 0 energy_drain = 0
range = MELEE|RANGED range = MELEE|RANGED
required_type = /obj/mecha/working required_type = /obj/mecha/working
var/spray_particles = 5
var/spray_amount = 5 //units of liquid per particle. 5 is enough to wet the floor - it's a big fire extinguisher, so should be fine
var/max_water = 1000
New() New()
reagents = new/datum/reagents(200) reagents = new/datum/reagents(max_water)
reagents.my_atom = src reagents.my_atom = src
reagents.add_reagent("water", 200) reagents.add_reagent("water", max_water)
..() ..()
return return
@@ -188,8 +191,8 @@
if(do_after_cooldown(target)) if(do_after_cooldown(target))
if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1) if(istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(chassis,target) <= 1)
var/obj/o = target var/obj/o = target
o.reagents.trans_to(src, 200) var/amount = o.reagents.trans_to(src, 200)
occupant_message("\blue Extinguisher refilled") occupant_message("\blue [amount] units transferred into internal tank.")
playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6) playsound(chassis, 'sound/effects/refill.ogg', 50, 1, -6)
else else
if(src.reagents.total_volume > 0) if(src.reagents.total_volume > 0)
@@ -200,16 +203,17 @@
var/turf/T2 = get_step(T,turn(direction, -90)) var/turf/T2 = get_step(T,turn(direction, -90))
var/list/the_targets = list(T,T1,T2) var/list/the_targets = list(T,T1,T2)
spawn(0) for(var/a=0, a<spray_particles, a++)
for(var/a=0, a<5, a++) spawn(0)
var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis)) var/obj/effect/effect/water/W = new /obj/effect/effect/water(get_turf(chassis))
if(!W) if(!W)
return return
var/turf/my_target = pick(the_targets) var/turf/my_target = pick(the_targets)
var/datum/reagents/R = new/datum/reagents(5) var/datum/reagents/R = new/datum/reagents(spray_amount)
W.reagents = R W.reagents = R
R.my_atom = W R.my_atom = W
src.reagents.trans_to(W,1) src.reagents.trans_to(W, spray_amount)
for(var/b=0, b<4, b++) for(var/b=0, b<4, b++)
if(!W) if(!W)
return return
@@ -223,6 +227,7 @@
if(W.loc == my_target) if(W.loc == my_target)
break break
sleep(2) sleep(2)
W.delete()
return 1 return 1
get_equip_info() get_equip_info()

View File

@@ -13,7 +13,10 @@
force = 10.0 force = 10.0
matter = list("metal" = 90) matter = list("metal" = 90)
attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed") attack_verb = list("slammed", "whacked", "bashed", "thunked", "battered", "bludgeoned", "thrashed")
var/max_water = 50
var/spray_particles = 6
var/spray_amount = 2 //units of liquid per particle
var/max_water = 120
var/last_use = 1.0 var/last_use = 1.0
var/safety = 1 var/safety = 1
var/sprite_name = "fire_extinguisher" var/sprite_name = "fire_extinguisher"
@@ -28,7 +31,9 @@
throwforce = 2 throwforce = 2
w_class = 2.0 w_class = 2.0
force = 3.0 force = 3.0
max_water = 30 max_water = 60
spray_particles = 6
spray_amount = 2
sprite_name = "miniFE" sprite_name = "miniFE"
/obj/item/weapon/extinguisher/New() /obj/item/weapon/extinguisher/New()
@@ -56,8 +61,8 @@
if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1) if( istype(target, /obj/structure/reagent_dispensers/watertank) && get_dist(src,target) <= 1)
var/obj/o = target var/obj/o = target
o.reagents.trans_to(src, 50) var/amount = o.reagents.trans_to(src, 50)
user << "\blue \The [src] is now refilled" user << "\blue You fill [src] with [amount] units of the contents of [target]."
playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6) playsound(src.loc, 'sound/effects/refill.ogg', 50, 1, -6)
return return
@@ -111,16 +116,17 @@
var/list/the_targets = list(T,T1,T2) var/list/the_targets = list(T,T1,T2)
for(var/a=0, a<5, a++) for(var/a=0, a < spray_particles, a++)
spawn(0) spawn(0)
var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) ) var/obj/effect/effect/water/W = new /obj/effect/effect/water( get_turf(src) )
var/turf/my_target = pick(the_targets) var/turf/my_target = pick(the_targets)
var/datum/reagents/R = new/datum/reagents(5) var/datum/reagents/R = new/datum/reagents(spray_amount)
if(!W) return if(!W) return
W.reagents = R W.reagents = R
R.my_atom = W R.my_atom = W
if(!W || !src) return if(!W || !src) return
src.reagents.trans_to(W,1) src.reagents.trans_to(W, spray_amount)
for(var/b=0, b<5, b++) for(var/b=0, b<5, b++)
step_towards(W,my_target) step_towards(W,my_target)
if(!W) return if(!W) return

View File

@@ -184,7 +184,7 @@ datum
M.resistances += self.data M.resistances += self.data
return return
#define WATER_LATENT_HEAT 19000 // How much heat is removed when applied to a hot turf, in J/unit (19000 makes 120 u of water roughly equivalent to 4L)
water water
name = "Water" name = "Water"
id = "water" id = "water"
@@ -195,37 +195,44 @@ datum
reaction_turf(var/turf/simulated/T, var/volume) reaction_turf(var/turf/simulated/T, var/volume)
if (!istype(T)) return if (!istype(T)) return
src = null
if(volume >= 3)
if(T.wet >= 1) return
T.wet = 1
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
spawn(800) //If the turf is hot enough, remove some heat
if (!istype(T)) return var/datum/gas_mixture/environment = T.return_air()
if(T.wet >= 2) return var/min_temperature = T0C + 100 //100C, the boiling point of water
T.wet = 0
if (environment && environment.temperature > min_temperature) //abstracted as steam or something
var/removed_heat = between(0, volume*WATER_LATENT_HEAT, -environment.get_thermal_energy_change(min_temperature))
environment.add_thermal_energy(-removed_heat)
if (prob(5))
T.visible_message("\red The water sizzles as it lands on \the [T]!")
else //otherwise, the turf gets wet
if(volume >= 3)
if(T.wet >= 1) return
T.wet = 1
if(T.wet_overlay) if(T.wet_overlay)
T.overlays -= T.wet_overlay T.overlays -= T.wet_overlay
T.wet_overlay = null T.wet_overlay = null
T.wet_overlay = image('icons/effects/water.dmi',T,"wet_floor")
T.overlays += T.wet_overlay
for(var/mob/living/carbon/slime/M in T) src = null
M.apply_water() spawn(800)
if (!istype(T)) return
if(T.wet >= 2) return
T.wet = 0
if(T.wet_overlay)
T.overlays -= T.wet_overlay
T.wet_overlay = null
//Put out fires.
var/hotspot = (locate(/obj/fire) in T) var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space)) if(hotspot)
var/datum/gas_mixture/lowertemp = T.remove_air( T:air:total_moles )
lowertemp.temperature = max( min(lowertemp.temperature-2000,lowertemp.temperature / 2) ,0)
lowertemp.react()
T.assume_air(lowertemp)
del(hotspot) del(hotspot)
return if(environment)
environment.react() //react at the new temperature
reaction_obj(var/obj/O, var/volume) reaction_obj(var/obj/O, var/volume)
src = null
var/turf/T = get_turf(O) var/turf/T = get_turf(O)
var/hotspot = (locate(/obj/fire) in T) var/hotspot = (locate(/obj/fire) in T)
if(hotspot && !istype(T, /turf/space)) if(hotspot && !istype(T, /turf/space))
@@ -238,7 +245,11 @@ datum
var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O
if(!cube.wrapped) if(!cube.wrapped)
cube.Expand() cube.Expand()
return
reaction_mob(var/mob/M, var/method=TOUCH, var/volume)
if (istype(M, /mob/living/carbon/slime))
var/mob/living/carbon/slime/S = M
S.apply_water()
water/holywater water/holywater
name = "Holy Water" name = "Holy Water"

File diff suppressed because it is too large Load Diff