From d19961378d84d9fa4ede9422ba837aa8092574df Mon Sep 17 00:00:00 2001 From: Fox McCloud Date: Mon, 9 Sep 2019 14:48:29 -0400 Subject: [PATCH] first-we-burn-away-the-world-that-was --- code/__DEFINES/flags.dm | 10 +++---- code/controllers/subsystem/fires.dm | 10 +++---- code/game/atoms.dm | 1 + code/game/gamemodes/blob/theblob.dm | 5 ---- .../objects/effects/decals/Cleanable/misc.dm | 4 --- code/game/objects/effects/effects.dm | 8 ++++- code/game/objects/items.dm | 7 +++++ code/game/objects/items/candle.dm | 2 +- .../objects/items/weapons/storage/storage.dm | 14 +++++---- code/game/objects/obj_defense.dm | 30 ++++++++++--------- code/game/objects/objs.dm | 9 ------ code/game/objects/structures/bedsheet_bin.dm | 5 ++-- .../food_and_drinks/food/foods/meat.dm | 2 +- code/modules/mining/ores_coins.dm | 2 +- code/modules/paperwork/paperbin.dm | 5 ++-- .../modules/surgery/organs/subtypes/skrell.dm | 3 +- 16 files changed, 59 insertions(+), 58 deletions(-) diff --git a/code/__DEFINES/flags.dm b/code/__DEFINES/flags.dm index e3169ded7fa..e6593c52c2e 100644 --- a/code/__DEFINES/flags.dm +++ b/code/__DEFINES/flags.dm @@ -131,13 +131,11 @@ #define AFFECT_ORGANIC_ORGAN 2 #define AFFECT_ALL_ORGANS 3 -//Fire stuff, for burn_state -#define LAVA_PROOF -2 -#define FIRE_PROOF -1 -#define FLAMMABLE 0 -#define ON_FIRE 1 - //Fire and Acid stuff, for resistance_flags +#define LAVA_PROOF (1<<0) +#define FIRE_PROOF (1<<1) //100% immune to fire damage (but not necessarily to lava or heat) +#define FLAMMABLE (1<<2) +#define ON_FIRE (1<<3) #define UNACIDABLE (1<<4) //acid can't even appear on it, let alone melt it. #define ACID_PROOF (1<<5) //acid stuck on it doesn't melt it. #define INDESTRUCTIBLE (1<<6) //doesn't take damage diff --git a/code/controllers/subsystem/fires.dm b/code/controllers/subsystem/fires.dm index ce66405e1c9..aafc5ed48d5 100644 --- a/code/controllers/subsystem/fires.dm +++ b/code/controllers/subsystem/fires.dm @@ -27,11 +27,11 @@ SUBSYSTEM_DEF(fires) return continue - if(O.burn_state == ON_FIRE) - if(O.burn_world_time < world.time) - O.burn() - else - processing -= O + if(O.resistance_flags & ON_FIRE) //in case an object is extinguished while still in currentrun + if(!(O.resistance_flags & FIRE_PROOF)) + O.take_damage(20, BURN, "fire", 0) + else + O.extinguish() if(MC_TICK_CHECK) return diff --git a/code/game/atoms.dm b/code/game/atoms.dm index dc84c1836dd..37f5c521f9f 100644 --- a/code/game/atoms.dm +++ b/code/game/atoms.dm @@ -322,6 +322,7 @@ SEND_SIGNAL(src, COMSIG_ATOM_BLOB_ACT, B) /atom/proc/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume) if(reagents) reagents.temperature_reagents(exposed_temperature) diff --git a/code/game/gamemodes/blob/theblob.dm b/code/game/gamemodes/blob/theblob.dm index ed06ec4086d..9dfba97a7d0 100644 --- a/code/game/gamemodes/blob/theblob.dm +++ b/code/game/gamemodes/blob/theblob.dm @@ -48,11 +48,6 @@ Life() return -/obj/structure/blob/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - ..() - var/damage = Clamp(0.01 * exposed_temperature, 0, 4) - take_damage(damage, BURN) - /obj/structure/blob/blob_act() return diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 349b8039d92..223732d8b20 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -85,10 +85,6 @@ icon_state = "cobweb1" burntime = 1 -/obj/effect/decal/cleanable/cobweb/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - ..() - qdel(src) - /obj/effect/decal/cleanable/molten_object name = "gooey grey mass" desc = "It looks like a melted... something." diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index 6b9d89a984a..8bf451be5b8 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -48,4 +48,10 @@ if(reagents) for(var/datum/reagent/R in reagents.reagent_list) R.on_ex_act() - ..() \ No newline at end of file + ..() + +/obj/effect/decal/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + if(reagents) + reagents.temperature_reagents(exposed_temperature) + if(!(resistance_flags & FIRE_PROOF)) //non fire proof decal or being burned by lava + qdel(src) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index f61e0027e17..316ae48bc74 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -211,6 +211,13 @@ var/global/image/fire_overlay = image("icon" = 'icons/goonstation/effects/fire.d msg += "*--------*" to_chat(user, msg) +/obj/item/burn() + if(!QDELETED(src)) + var/turf/T = get_turf(src) + var/obj/effect/decal/cleanable/ash/A = new(T) + A.desc += "\nLooks like this used to be \an [name] some time ago." + ..() + /obj/item/afterattack(atom/target, mob/user, proximity, params) SEND_SIGNAL(src, COMSIG_ITEM_AFTERATTACK, target, user, proximity, params) ..() diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 5ea13308de5..6ef0338dd37 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -52,9 +52,9 @@ /obj/item/candle/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - ..() if(!lit) light() //honk + return ..() /obj/item/candle/proc/light(show_message) if(!lit) diff --git a/code/game/objects/items/weapons/storage/storage.dm b/code/game/objects/items/weapons/storage/storage.dm index 53f93775cad..1b12c828417 100644 --- a/code/game/objects/items/weapons/storage/storage.dm +++ b/code/game/objects/items/weapons/storage/storage.dm @@ -317,7 +317,7 @@ return 1 //Call this proc to handle the removal of an item from the storage item. The item will be moved to the atom sent as new_target -/obj/item/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location, burn = 0) +/obj/item/storage/proc/remove_from_storage(obj/item/W as obj, atom/new_location) if(!istype(W)) return 0 if(istype(src, /obj/item/storage/fancy)) @@ -351,17 +351,19 @@ W.on_exit_storage(src) update_icon() W.mouse_opacity = initial(W.mouse_opacity) - if(burn) - W.fire_act() return 1 /obj/item/storage/Exited(atom/A, loc) remove_from_storage(A, loc) //worry not, comrade; this only gets called once ..() -/obj/item/storage/empty_object_contents(burn, loc) - for(var/obj/item/Item in contents) - remove_from_storage(Item, loc, burn) +/obj/item/storage/deconstruct(disassembled = TRUE) + var/drop_loc = loc + if(ismob(loc)) + drop_loc = get_turf(src) + for(var/obj/item/I in contents) + remove_from_storage(I, drop_loc) + qdel(src) //This proc is called when you want to place an item into the storage item. /obj/item/storage/attackby(obj/item/I, mob/user, params) diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm index 572495b503f..0bac4aeb848 100644 --- a/code/game/objects/obj_defense.dm +++ b/code/game/objects/obj_defense.dm @@ -161,26 +161,28 @@ //// FIRE /obj/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) + if(isturf(loc)) + var/turf/T = loc + if(T.intact && level == 1) //fire can't damage things hidden below the floor. + return ..() - if(!burn_state) - burn_state = ON_FIRE + if(exposed_temperature && !(resistance_flags & FIRE_PROOF)) + take_damage(Clamp(0.02 * exposed_temperature, 0, 20), BURN, "fire", 0) + if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF)) + resistance_flags |= ON_FIRE SSfires.processing[src] = src - burn_world_time = world.time + burntime*rand(10,20) - if(global_overlay) - overlays += fire_overlay - return TRUE + add_overlay(fire_overlay, TRUE) + return 1 /obj/proc/burn() - empty_object_contents(1, loc) - var/obj/effect/decal/cleanable/ash/A = new(loc) - A.desc = "Looks like this used to be a [name] some time ago." - SSfires.processing -= src - qdel(src) + if(resistance_flags & ON_FIRE) + SSfires.processing -= src + deconstruct(FALSE) /obj/proc/extinguish() - if(burn_state == ON_FIRE) - burn_state = FLAMMABLE - overlays -= fire_overlay + if(resistance_flags & ON_FIRE) + resistance_flags &= ~ON_FIRE + cut_overlay(fire_overlay, TRUE) SSfires.processing -= src /obj/proc/tesla_act(power) diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index c2428dd8d97..569ca8250b7 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -21,9 +21,6 @@ var/Mtoollink = 0 // variable to decide if an object should show the multitool menu linking menu, not all objects use it - var/burn_state = FIRE_PROOF // LAVA_PROOF | FIRE_PROOF | FLAMMABLE | ON_FIRE - var/burntime = 10 //How long it takes to burn to ashes, in seconds - var/burn_world_time //What world time the object will burn up completely var/being_shocked = 0 var/speed_process = FALSE @@ -284,12 +281,6 @@ a { /obj/proc/CanAStarPass() . = !density -/obj/proc/empty_object_contents(burn = 0, new_loc = loc) - for(var/obj/item/Item in contents) //Empty out the contents - Item.forceMove(new_loc) - if(burn) - Item.fire_act() //Set them on fire, too - /obj/proc/on_mob_move(dir, mob/user) return diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index af57fb360f3..ceac14daa5c 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -262,8 +262,9 @@ LINEN BINS /obj/structure/bedsheetbin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - if(!amount) - return + if(amount) + amount = 0 + update_icon() ..() /obj/structure/bedsheetbin/burn() diff --git a/code/modules/food_and_drinks/food/foods/meat.dm b/code/modules/food_and_drinks/food/foods/meat.dm index c18f06c64af..0aa45994e58 100644 --- a/code/modules/food_and_drinks/food/foods/meat.dm +++ b/code/modules/food_and_drinks/food/foods/meat.dm @@ -142,7 +142,7 @@ tastes = list("tough meat" = 1) /obj/item/reagent_containers/food/snacks/goliath/burn() - visible_message("[src] finishes cooking!") + visible_message("[src] finishes cooking!") new /obj/item/reagent_containers/food/snacks/goliath_steak(loc) qdel(src) diff --git a/code/modules/mining/ores_coins.dm b/code/modules/mining/ores_coins.dm index 120dacad800..789a241a34a 100644 --- a/code/modules/mining/ores_coins.dm +++ b/code/modules/mining/ores_coins.dm @@ -59,7 +59,7 @@ return ..() /obj/item/stack/ore/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - ..() + . = ..() if(isnull(refined_type)) return else diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index c9169a09757..4771b6bef34 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -13,8 +13,9 @@ var/list/papers = list() //List of papers put in the bin for reference. /obj/item/paper_bin/fire_act(datum/gas_mixture/air, exposed_temperature, exposed_volume, global_overlay = TRUE) - if(!amount) - return + if(amount) + amount = 0 + update_icon() ..() /obj/item/paper_bin/Destroy() diff --git a/code/modules/surgery/organs/subtypes/skrell.dm b/code/modules/surgery/organs/subtypes/skrell.dm index 0443fa4f49f..3c1e3cd40ce 100644 --- a/code/modules/surgery/organs/subtypes/skrell.dm +++ b/code/modules/surgery/organs/subtypes/skrell.dm @@ -46,7 +46,8 @@ . = ..() /obj/item/organ/internal/headpocket/proc/empty_contents() - pocket.empty_object_contents(0, get_turf(owner)) + for(var/obj/item/I in pocket.contents) + pocket.remove_from_storage(I, get_turf(owner)) /obj/item/organ/internal/headpocket/proc/get_contents() return pocket.contents