From 3d5f1267791ced45d15a64635246a7dd6e60668b Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Thu, 25 Jun 2015 00:06:47 -0600 Subject: [PATCH 1/3] Destructible Clothing [WIP] - Clothes can be set on fire and extinguished - Any item can technically be set on fire and extinguished now, but only clothes (and paper) actually burn right now - All of a mob's clothing are burned if the mob is husked by fire - Clothes will also have a chance of being shredded if you are caught in a bomb blast - The bigger the explosion, the higher the chance they have of being destroyed - Outer layer clothing (headgear and exosuits) take the shock first, which absorbs some of the shock for the clothes it covers, according to it's bomb armor --- .../objects/effects/decals/Cleanable/misc.dm | 18 ++++- code/game/objects/items.dm | 18 +++++ .../objects/items/weapons/extinguisher.dm | 3 + .../objects/items/weapons/tanks/watertank.dm | 2 + code/game/objects/structures/watercloset.dm | 9 ++- code/modules/clothing/clothing.dm | 25 ++++++ code/modules/mob/living/carbon/human/human.dm | 8 +- .../mob/living/carbon/human/human_damage.dm | 3 +- .../mob/living/carbon/human/inventory.dm | 81 +++++++++++++++++++ code/modules/paperwork/paper.dm | 31 ++++--- .../Chemistry-Reagents/Other-Reagents.dm | 7 +- 11 files changed, 182 insertions(+), 23 deletions(-) diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index 71d209de6a6..f8d8ec3136b 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -142,4 +142,20 @@ gender = PLURAL icon = 'icons/obj/objects.dmi' icon_state = "ash" - anchored = 1 \ No newline at end of file + anchored = 1 + +/obj/effect/decal/cleanable/shreds + name = "shreds" + desc = "The shredded remains of what appears to be clothing." + icon = 'icons/effects/effects.dmi' + icon_state = "shreds" + gender = PLURAL + density = 0 + anchored = 1 + layer = 2 + +/obj/effect/decal/cleanable/shreds/New(loc,var/clothing) + ..(loc) + if(clothing) + name = "shredded [clothing]" + desc = "The sad remains of what used to be a glorious [clothing]." \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 0468739411b..2ad3dfd5afa 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -20,6 +20,7 @@ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags + var/burning = 0 //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -102,6 +103,18 @@ if(!gc_destroyed) contents_explosion(severity, target) +/obj/item/proc/burn() + src.visible_message("[src] disintegrates, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/item/proc/extinguish() + if(burning) + burning = 0 + for(var/image/img in overlays) + if(img.icon_state == "fire") + overlays -= img + //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -155,6 +168,11 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return + + if(burning) + burn() //It just disintigrates if you try to pick it up + return + if (istype(src.loc, /obj/item/weapon/storage)) //If the item is in a storage item, take it out var/obj/item/weapon/storage/S = src.loc diff --git a/code/game/objects/items/weapons/extinguisher.dm b/code/game/objects/items/weapons/extinguisher.dm index 2dfa4b44c66..19e57dbb30b 100644 --- a/code/game/objects/items/weapons/extinguisher.dm +++ b/code/game/objects/items/weapons/extinguisher.dm @@ -151,6 +151,9 @@ if(isliving(atm)) //For extinguishing mobs on fire var/mob/living/M = atm M.ExtinguishMob() + if(istype(atm,/obj/item)) + var/obj/item/Item = atm + Item.extinguish() if(W.loc == my_target) break sleep(2) diff --git a/code/game/objects/items/weapons/tanks/watertank.dm b/code/game/objects/items/weapons/tanks/watertank.dm index d634d9a832c..d247c0134e8 100644 --- a/code/game/objects/items/weapons/tanks/watertank.dm +++ b/code/game/objects/items/weapons/tanks/watertank.dm @@ -362,6 +362,8 @@ V.visible_message("[V] was frozen shut!") for(var/mob/living/L in T) L.ExtinguishMob() + for(var/obj/item/Item in T) + Item.extinguish() return /datum/effect/effect/system/freezing_smoke_spread diff --git a/code/game/objects/structures/watercloset.dm b/code/game/objects/structures/watercloset.dm index d62a69d769f..240f9e63517 100644 --- a/code/game/objects/structures/watercloset.dm +++ b/code/game/objects/structures/watercloset.dm @@ -229,6 +229,7 @@ //Yes, showers are super powerful as far as washing goes. /obj/machinery/shower/proc/wash(atom/movable/O) if(!on) return + if(ismob(O)) mobpresent += 1 check_heat(O) @@ -303,6 +304,13 @@ else O.clean_blood() + else + O.clean_blood() + + if(istype(O,/obj/item)) + var/obj/item/Item = O + Item.extinguish() + if(isturf(loc)) var/turf/tile = loc loc.clean_blood() @@ -310,7 +318,6 @@ if(is_cleanable(E)) qdel(E) - /obj/machinery/shower/process() if(!on || !mobpresent) return for(var/mob/living/carbon/C in loc) diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 049e675e104..51a14b46738 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -17,6 +17,31 @@ var/can_flashlight = 0 var/gang //Is this a gang outfit? +/obj/item/clothing/ex_act(severity, target) + if(prob(armor["bomb"])) + return + switch(severity) + if(1.0) + shred(1,100) + if(2.0) + shred(1,50) + if(3.0) + if(!prob(armor["bomb"])) + shred(1,10) + return + +/obj/item/clothing/fire_act() + if(burning) + return + if(max_heat_protection_temperature) + return + src.visible_message("[src] catches on fire.") + burning = 1 + overlays += image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") + spawn(100) + if(burning) + burn() + //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index ca9468d1986..b99a78d7e9e 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -116,17 +116,17 @@ gib() return else + shred_clothing(1,150) var/atom/target = get_edge_target_turf(src, get_dir(src, get_step_away(src, src))) throw_at(target, 200, 4) - //return -// var/atom/target = get_edge_target_turf(user, get_dir(src, get_step_away(user, src))) - //user.throw_at(target, 200, 4) if (2.0) b_loss += 60 f_loss += 60 + shred_clothing(1,50) + if (prob(getarmor(null, "bomb"))) b_loss = b_loss/1.5 f_loss = f_loss/1.5 @@ -140,6 +140,8 @@ b_loss += 30 if (prob(getarmor(null, "bomb"))) b_loss = b_loss/2 + else + shred_clothing(1,10) if (!istype(ears, /obj/item/clothing/ears/earmuffs)) adjustEarDamage(15,60) if (prob(50)) diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm index 7c0773877c1..4ba2758a8f1 100644 --- a/code/modules/mob/living/carbon/human/human_damage.dm +++ b/code/modules/mob/living/carbon/human/human_damage.dm @@ -10,9 +10,10 @@ total_brute += O.brute_dam total_burn += O.burn_dam health = maxHealth - getOxyLoss() - getToxLoss() - getCloneLoss() - total_burn - total_brute - //TODO: fix husking if( ((maxHealth - total_burn) < config.health_threshold_dead) && stat == DEAD ) ChangeToHusk() + if(bodytemperature > FIRE_MINIMUM_TEMPERATURE_TO_EXIST) + shred_clothing() med_hud_set_health() med_hud_set_status() return diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 1a4cd41351c..4117d85627e 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -390,3 +390,84 @@ src << "You are trying to equip this item to an unsupported inventory slot. Report this to a coder!" return +//Cycles through all clothing slots and tests them for destruction +/mob/living/carbon/human/proc/shred_clothing(var/bomb,var/shock) + var/covered_parts //The body parts that are protected by exterior clothing/armor + var/head_absorbed = 0 //How much of the shock the headgear absorbs when it is shredded. -1=it survives + var/suit_absorbed = 0 //How much of the shock the exosuit absorbs when it is shredded. -1=it survives + + //Backpacks can never be protected but are annoying as fuck to lose, so they get a lower chance to be shredded + if(back) + back.shred(bomb,shock-30,src) + + if(head) + covered_parts |= head.flags_inv + head_absorbed = head.shred(bomb,shock,src) + if(wear_mask) + var/absorbed = ((covered_parts & HIDEMASK) ? head_absorbed : 0) //Check if clothing covering this part absorbed any of the shock + if(!(absorbed < 0)) + //Masks can be used to shield other parts, but are simplified to simply add their absorbsion to the head armor if it covers the face + var/mask_absorbed = wear_mask.shred(bomb,shock-absorbed,src) + if(wear_mask.flags_inv & HIDEFACE) + covered_parts |= wear_mask.flags_inv + if(mask_absorbed < 0) //If the mask didn't get shredded, everything else on the head is protected + head_absorbed = -1 + else + head_absorbed += mask_absorbed + if(ears) + var/absorbed = ((covered_parts & HIDEEARS) ? head_absorbed : 0) + if(!(absorbed < 0)) + ears.shred(bomb,shock-absorbed,src) + if(glasses) + var/absorbed = ((covered_parts & HIDEEYES) ? head_absorbed : 0) + if(!(absorbed < 0)) + glasses.shred(bomb,shock-absorbed,src) + + if(wear_suit) + covered_parts |= wear_suit.flags_inv + suit_absorbed = wear_suit.shred(bomb,shock,src) + if(gloves) + var/absorbed = ((covered_parts & HIDEGLOVES) ? suit_absorbed : 0) + if(!(absorbed < 0)) + gloves.shred(bomb,shock-absorbed,src) + if(shoes) + var/absorbed = ((covered_parts & HIDESHOES) ? suit_absorbed : 0) + if(!(absorbed < 0)) + shoes.shred(bomb,shock-absorbed,src) + if(w_uniform) + var/absorbed = ((covered_parts & HIDEJUMPSUIT) ? suit_absorbed : 0) + if(!(absorbed < 0)) + w_uniform.shred(bomb,shock-absorbed,src) + +/obj/item/proc/shred(var/bomb,var/shock,var/mob/living/carbon/human/Human) + var/shredded + + if(!bomb) + if(!max_heat_protection_temperature) + shredded = 1 //No heat protection, it burns + else + shredded = -1 //Heat protection = Fireproof + + else if(shock > 0) + if(prob(max(10,shock))) + shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount + else + shredded = -1 //It survives explosion + + if(shredded) + if(Human) //Unequip if equipped + Human.unEquip(src) + + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + + if(bomb) + var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) + Shreds.name = "shredded [src]" + Shreds.desc = "The sad remains of what used to be a glorious [src]." + else + new /obj/effect/decal/cleanable/ash(loc) + + qdel(src) + + return shredded \ No newline at end of file diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index df5d9101500..4ed586cebd6 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -26,7 +26,6 @@ var/list/stamped var/rigged = 0 var/spam_flag = 0 - var/burning = 0 //Whether or not the paper is on fire /obj/item/weapon/paper/New() @@ -39,6 +38,9 @@ /obj/item/weapon/paper/update_icon() + if(burning) + icon_state = "paper_onfire" + return if(info) icon_state = "paper_words" return @@ -89,15 +91,6 @@ spam_flag = 0 -/obj/item/weapon/paper/attack_hand() - var/mob/living/carbon/M = usr - if(burning) - M << "Picking up a burning paper seems awfully stupid." - return //Doesn't make any sense to pick up a burning paper - else //Probably isn't necessary but it's safer - ..() - - /obj/item/weapon/paper/attack_ai(mob/living/silicon/ai/user) var/dist if(istype(user) && user.current) //is AI @@ -325,16 +318,16 @@ user.unEquip(src) user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - burn(0, 100) + paper_burn(0, 100) add_fingerprint(user) /obj/item/weapon/paper/fire_act() - burn(1, 50) + paper_burn(1, 50) -/obj/item/weapon/paper/proc/burn(var/showmsg, var/burntime) +/obj/item/weapon/paper/proc/paper_burn(var/showmsg, var/burntime) if (burning) return if(showmsg) @@ -343,9 +336,15 @@ icon_state = "paper_onfire" info = "[stars(info)]" spawn(burntime) //7 seconds - src.visible_message("[src] burns away, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + if(burning) + src.visible_message("[src] burns away, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/item/weapon/paper/extinguish() + burning = 0 + update_icon() + return /* * Premade paper diff --git a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm index 270ddfdabb6..5a3f47db923 100644 --- a/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm +++ b/code/modules/reagents/Chemistry-Reagents/Other-Reagents.dm @@ -144,6 +144,11 @@ /datum/reagent/water/reaction_obj(var/obj/O, var/volume) src = null + + if(istype(O,/obj/item)) + var/obj/item/Item = O + Item.extinguish() + // Monkey cube if(istype(O,/obj/item/weapon/reagent_containers/food/snacks/monkeycube)) var/obj/item/weapon/reagent_containers/food/snacks/monkeycube/cube = O @@ -151,7 +156,7 @@ cube.Expand() // Dehydrated carp - if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) + else if(istype(O,/obj/item/toy/carpplushie/dehy_carp)) var/obj/item/toy/carpplushie/dehy_carp/dehy = O dehy.Swell() // Makes a carp From 8759f56f6ff7d7367165523dd5fb832dbea46e18 Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Thu, 25 Jun 2015 00:22:42 -0600 Subject: [PATCH 2/3] Squashed Commits --- code/game/objects/buckling.dm | 3 ++ .../objects/effects/decals/Cleanable/misc.dm | 13 +++--- code/game/objects/items.dm | 33 ++++++++-------- code/game/objects/items/candle.dm | 5 ++- .../game/objects/items/devices/instruments.dm | 2 + code/game/objects/items/devices/pizza_bomb.dm | 5 +++ .../objects/items/devices/taperecorder.dm | 5 +++ code/game/objects/items/stacks/cash.dm | 1 + code/game/objects/items/stacks/medical.dm | 2 + .../items/stacks/sheets/sheet_types.dm | 3 ++ .../objects/items/stacks/tiles/tile_types.dm | 3 ++ code/game/objects/items/toys.dm | 12 +++++- code/game/objects/items/trash.dm | 3 ++ code/game/objects/items/weapons/courtroom.dm | 2 + .../objects/items/weapons/gift_wrappaper.dm | 3 +- .../objects/items/weapons/grenades/grenade.dm | 5 +++ code/game/objects/items/weapons/mop.dm | 1 + code/game/objects/items/weapons/paint.dm | 2 + code/game/objects/items/weapons/scrolls.dm | 1 + code/game/objects/items/weapons/signs.dm | 1 + .../objects/items/weapons/storage/backpack.dm | 12 ++++++ .../objects/items/weapons/storage/bags.dm | 3 ++ .../objects/items/weapons/storage/book.dm | 1 + .../objects/items/weapons/storage/boxes.dm | 1 + .../items/weapons/storage/briefcase.dm | 2 + .../objects/items/weapons/storage/fancy.dm | 1 + .../objects/items/weapons/storage/wallets.dm | 1 + code/game/objects/items/weapons/weaponry.dm | 1 + code/game/objects/objs.dm | 29 +++++++++++++- code/game/objects/structures/artstuff.dm | 3 ++ code/game/objects/structures/bedsheet_bin.dm | 13 ++++++ code/game/objects/structures/flora.dm | 5 +++ code/game/objects/structures/mineral_doors.dm | 2 + .../structures/stool_bed_chair_nest/bed.dm | 3 ++ .../structures/stool_bed_chair_nest/chairs.dm | 7 ++++ code/game/objects/structures/table_frames.dm | 1 + code/game/objects/structures/tables_racks.dm | 2 + code/modules/clothing/clothing.dm | 18 +++------ code/modules/clothing/gloves/color.dm | 5 ++- code/modules/clothing/gloves/miscellaneous.dm | 4 +- code/modules/clothing/head/collectable.dm | 5 ++- code/modules/clothing/head/hardhat.dm | 1 + code/modules/clothing/head/helmet.dm | 1 + code/modules/clothing/head/misc.dm | 8 +--- code/modules/clothing/head/misc_special.dm | 1 + code/modules/clothing/masks/gasmask.dm | 11 +++++- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 3 ++ code/modules/clothing/suits/armor.dm | 4 +- code/modules/clothing/suits/bio.dm | 2 + code/modules/clothing/suits/jobs.dm | 1 + code/modules/clothing/suits/miscellaneous.dm | 7 +++- code/modules/clothing/suits/utility.dm | 8 ++-- code/modules/clothing/suits/wiz_robe.dm | 6 ++- code/modules/clothing/under/chameleon.dm | 1 + code/modules/clothing/under/color.dm | 1 + .../clothing/under/jobs/engineering.dm | 2 + code/modules/clothing/under/miscellaneous.dm | 4 ++ code/modules/clothing/under/ties.dm | 1 + code/modules/food&drinks/drinks/drinks.dm | 1 + .../drinks/drinks/drinkingglass.dm | 14 +++++++ code/modules/food&drinks/food.dm | 1 + code/modules/hydroponics/grown.dm | 1 + code/modules/hydroponics/growninedible.dm | 1 + code/modules/hydroponics/seeds.dm | 1 + code/modules/library/lib_items.dm | 3 ++ code/modules/mining/money_bag.dm | 2 + .../mob/living/carbon/human/inventory.dm | 23 ++++++----- code/modules/paperwork/clipboard.dm | 2 +- code/modules/paperwork/folders.dm | 1 + code/modules/paperwork/paper.dm | 26 ++++-------- code/modules/paperwork/paperbin.dm | 11 ++++++ code/modules/paperwork/photography.dm | 6 ++- code/modules/recycling/sortingmachinery.dm | 1 + html/changelogs/ikarrus-shredme.yml | 37 ++++++++++++++++++ icons/effects/effects.dmi | Bin 295135 -> 295406 bytes 76 files changed, 330 insertions(+), 89 deletions(-) create mode 100644 html/changelogs/ikarrus-shredme.yml diff --git a/code/game/objects/buckling.dm b/code/game/objects/buckling.dm index 43cd9f186cf..0c781f27f9b 100644 --- a/code/game/objects/buckling.dm +++ b/code/game/objects/buckling.dm @@ -47,6 +47,9 @@ M.update_canmove() post_buckle_mob(M) M.throw_alert("buckled", new_master = src) + if(burn_state == 1) //Sets the mob on fire if you buckle them to a burning object + M.adjust_fire_stacks(1) + M.IgniteMob() return 1 /obj/proc/unbuckle_mob() diff --git a/code/game/objects/effects/decals/Cleanable/misc.dm b/code/game/objects/effects/decals/Cleanable/misc.dm index f8d8ec3136b..1a205f1607a 100644 --- a/code/game/objects/effects/decals/Cleanable/misc.dm +++ b/code/game/objects/effects/decals/Cleanable/misc.dm @@ -19,6 +19,9 @@ /obj/effect/decal/cleanable/ash/New() ..() reagents.add_reagent("ash", 30) + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) + /obj/effect/decal/cleanable/greenglow name = "green glow" @@ -71,6 +74,8 @@ layer = 3 icon = 'icons/effects/effects.dmi' icon_state = "cobweb1" + burn_state = 0 //Burnable + burntime = 1 /obj/effect/decal/cleanable/molten_item name = "gooey grey mass" @@ -154,8 +159,6 @@ anchored = 1 layer = 2 -/obj/effect/decal/cleanable/shreds/New(loc,var/clothing) - ..(loc) - if(clothing) - name = "shredded [clothing]" - desc = "The sad remains of what used to be a glorious [clothing]." \ No newline at end of file +/obj/effect/decal/cleanable/shreds/New() + pixel_x = rand(-5, 5) + pixel_y = rand(-5, 5) \ No newline at end of file diff --git a/code/game/objects/items.dm b/code/game/objects/items.dm index 2ad3dfd5afa..54484ef4f14 100644 --- a/code/game/objects/items.dm +++ b/code/game/objects/items.dm @@ -1,3 +1,5 @@ +var/global/image/fire_overlay = image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") + /obj/item name = "item" icon = 'icons/obj/items.dmi' @@ -20,7 +22,6 @@ var/cold_protection = 0 //flags which determine which body parts are protected from cold. Use the HEAD, CHEST, GROIN, etc. flags. See setup.dm var/max_heat_protection_temperature //Set this variable to determine up to which temperature (IN KELVIN) the item protects against heat damage. Keep at null to disable protection. Only protects areas set by heat_protection flags var/min_cold_protection_temperature //Set this variable to determine down to which temperature (IN KELVIN) the item protects against cold damage. 0 is NOT an acceptable number due to if(varname) tests!! Keep at null to disable protection. Only protects areas set by cold_protection flags - var/burning = 0 //If this is set, The item will make an action button on the player's HUD when picked up. var/action_button_name //It is also the text which gets displayed on the action button. If not set it defaults to 'Use [name]'. If it's not set, there'll be no button. @@ -103,18 +104,6 @@ if(!gc_destroyed) contents_explosion(severity, target) -/obj/item/proc/burn() - src.visible_message("[src] disintegrates, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) - -/obj/item/proc/extinguish() - if(burning) - burning = 0 - for(var/image/img in overlays) - if(img.icon_state == "fire") - overlays -= img - //user: The mob that is suiciding //damagetype: The type of damage the item will inflict on the user //BRUTELOSS = 1 @@ -169,9 +158,21 @@ /obj/item/attack_hand(mob/user as mob) if (!user) return - if(burning) - burn() //It just disintigrates if you try to pick it up - return + if(burn_state == 1) + var/mob/living/carbon/human/H = user + if(istype(H)) + if(H.gloves && (H.gloves.max_heat_protection_temperature > 360)) + extinguish() + user << "You put out the fire on [src]." + else + user << "You burn your hand on [src]!" + var/obj/item/organ/limb/affecting = H.get_organ("[user.hand ? "l" : "r" ]_arm") + if(affecting.take_damage( 0, 5 )) // 5 burn damage + H.update_damage_overlays(0) + H.updatehealth() + return + else + extinguish() if (istype(src.loc, /obj/item/weapon/storage)) //If the item is in a storage item, take it out diff --git a/code/game/objects/items/candle.dm b/code/game/objects/items/candle.dm index 5d63211a30d..276d614a9ad 100644 --- a/code/game/objects/items/candle.dm +++ b/code/game/objects/items/candle.dm @@ -6,7 +6,6 @@ icon_state = "candle1" item_state = "candle1" w_class = 1 - var/wax = 200 var/lit = 0 proc @@ -46,6 +45,10 @@ if(M.lit) light() +/obj/item/candle/fire_act() + if(!src.lit) + light() //honk + return /obj/item/candle/light(var/flavor_text = "[usr] lights the [name].") if(!src.lit) diff --git a/code/game/objects/items/devices/instruments.dm b/code/game/objects/items/devices/instruments.dm index 6ecc1a86125..dcfaceeffc3 100644 --- a/code/game/objects/items/devices/instruments.dm +++ b/code/game/objects/items/devices/instruments.dm @@ -1,6 +1,8 @@ //copy pasta of the space piano, don't hurt me -Pete /obj/item/device/instrument name = "generic instrument" + burn_state = 0 //Burnable + burntime = 20 var/datum/song/handheld/song var/instrumentId = "generic" var/instrumentExt = "ogg" diff --git a/code/game/objects/items/devices/pizza_bomb.dm b/code/game/objects/items/devices/pizza_bomb.dm index 6a1cdcd1151..a77f96f1e9b 100644 --- a/code/game/objects/items/devices/pizza_bomb.dm +++ b/code/game/objects/items/devices/pizza_bomb.dm @@ -3,6 +3,7 @@ desc = "A box suited for pizzas." icon = 'icons/obj/food/containers.dmi' icon_state = "pizzabox1" + burn_state = 0 //Burnable var/timer = 10 //Adjustable timer var/timer_set = 0 var/primed = 0 @@ -54,6 +55,10 @@ sleep(timer) return go_boom() +/obj/item/device/pizza_bomb/burn() //Instead of burning to ashes, it will just explode + go_boom() + return + /obj/item/device/pizza_bomb/proc/go_boom() if(disarmed) visible_message("\icon[src] Sparks briefly jump out of the [correct_wire] wire on \the [src], but it's disarmed!") diff --git a/code/game/objects/items/devices/taperecorder.dm b/code/game/objects/items/devices/taperecorder.dm index 206e6f64739..60e0ba98c3a 100644 --- a/code/game/objects/items/devices/taperecorder.dm +++ b/code/game/objects/items/devices/taperecorder.dm @@ -56,6 +56,9 @@ mytape = null update_icon() +/obj/item/device/taperecorder/fire_act() + mytape.ruin() //Fires destroy the tape + return() /obj/item/device/taperecorder/attack_hand(mob/user) if(loc == user) @@ -264,6 +267,8 @@ var/list/timestamp = list() var/ruined = 0 +/obj/item/device/tape/fire_act() + ruin() /obj/item/device/tape/attack_self(mob/user) if(!ruined) diff --git a/code/game/objects/items/stacks/cash.dm b/code/game/objects/items/stacks/cash.dm index 6c391dcc3e6..eff17423b61 100644 --- a/code/game/objects/items/stacks/cash.dm +++ b/code/game/objects/items/stacks/cash.dm @@ -10,6 +10,7 @@ throw_speed = 2 throw_range = 2 w_class = 1.0 + burn_state = 0 //Burnable /obj/item/stack/spacecash/c10 icon_state = "spacecash10" diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 55493399fad..33c7ad85fed 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -7,6 +7,8 @@ w_class = 1 throw_speed = 3 throw_range = 7 + burn_state = 0 //Burnable + burntime = 5 var/heal_brute = 0 var/heal_burn = 0 var/stop_bleeding = 0 diff --git a/code/game/objects/items/stacks/sheets/sheet_types.dm b/code/game/objects/items/stacks/sheets/sheet_types.dm index 34c8445a8d5..28794e5bd7a 100644 --- a/code/game/objects/items/stacks/sheets/sheet_types.dm +++ b/code/game/objects/items/stacks/sheets/sheet_types.dm @@ -108,6 +108,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ icon = 'icons/obj/items.dmi' origin_tech = "materials=1;biotech=1" sheettype = "wood" + burn_state = 0 //Burnable /obj/item/stack/sheet/mineral/wood/New(var/loc, var/amount=null) recipes = wood_recipes @@ -122,6 +123,7 @@ var/global/list/datum/stack_recipe/wood_recipes = list ( \ singular_name = "cloth roll" icon_state = "sheet-cloth" origin_tech = "materials=2" + burn_state = 0 //Burnable /* * Cardboard @@ -143,6 +145,7 @@ var/global/list/datum/stack_recipe/cardboard_recipes = list ( \ singular_name = "cardboard sheet" icon_state = "sheet-card" origin_tech = "materials=1" + burn_state = 0 //Burnable /obj/item/stack/sheet/cardboard/New(var/loc, var/amount=null) recipes = cardboard_recipes diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm index 6d81c36bb2c..e498bc3ebce 100644 --- a/code/game/objects/items/stacks/tiles/tile_types.dm +++ b/code/game/objects/items/stacks/tiles/tile_types.dm @@ -84,6 +84,7 @@ max_amount = 60 origin_tech = "biotech=1" turf_type = /turf/simulated/floor/fancy/grass + burn_state = 0 //Burnable /* * Wood @@ -101,6 +102,7 @@ max_amount = 60 origin_tech = "biotech=1" turf_type = /turf/simulated/floor/wood + burn_state = 0 //Burnable /* * Carpets @@ -117,6 +119,7 @@ throw_range = 7 max_amount = 60 turf_type = /turf/simulated/floor/fancy/carpet + burn_state = 0 //Burnable /* * High-traction diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 515176b16a2..5bc5733aa4b 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -271,6 +271,7 @@ item_state = "arm_blade" attack_verb = list("pricked", "absorbed", "gored") w_class = 2 + burn_state = 0 //Burnable /* @@ -527,6 +528,10 @@ icon_state = "snappop" w_class = 1 +/obj/item/toy/snappop/fire_act() + throw_impact() + return + /obj/item/toy/snappop/throw_impact(atom/hit_atom) ..() var/datum/effect/effect/system/spark_spread/s = new /datum/effect/effect/system/spark_spread @@ -710,6 +715,8 @@ /obj/item/toy/cards + burn_state = 0 //Burnable + burntime = 5 var/parentdeck = null var/deckstyle = "nanotrasen" var/card_hitsound = null @@ -949,7 +956,8 @@ newobj.card_throw_speed = sourceobj.card_throw_speed newobj.card_throw_range = sourceobj.card_throw_range newobj.card_attack_verb = sourceobj.card_attack_verb - + if(sourceobj.burn_state == -1) + newobj.burn_state = -1 /obj/item/toy/cards/singlecard name = "card" @@ -1065,6 +1073,7 @@ card_throw_speed = 3 card_throw_range = 7 card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") + burn_state = -1 //Not Burnable /* * Fake nuke @@ -1123,6 +1132,7 @@ icon_state = "carpplushie" w_class = 2.0 attack_verb = list("bitten", "eaten", "fin slapped") + burn_state = 0 //Burnable var/bitesound = 'sound/weapons/bite.ogg' // Attack mob diff --git a/code/game/objects/items/trash.dm b/code/game/objects/items/trash.dm index 2e22500c790..12e705d193b 100644 --- a/code/game/objects/items/trash.dm +++ b/code/game/objects/items/trash.dm @@ -3,6 +3,7 @@ icon = 'icons/obj/janitor.dmi' desc = "This is rubbish." w_class = 1.0 + burn_state = 0 //Burnable /obj/item/trash/raisins name = "\improper 4no raisins" @@ -51,6 +52,7 @@ /obj/item/trash/tray name = "tray" icon_state = "tray" + burn_state = -1 //Not Burnable /obj/item/trash/candle name = "candle" @@ -60,6 +62,7 @@ /obj/item/trash/can name = "crushed can" icon_state = "cola" + burn_state = -1 //Not Burnable /obj/item/trash/attack(mob/M, mob/living/user) return \ No newline at end of file diff --git a/code/game/objects/items/weapons/courtroom.dm b/code/game/objects/items/weapons/courtroom.dm index c3f62193260..408cbe25a01 100644 --- a/code/game/objects/items/weapons/courtroom.dm +++ b/code/game/objects/items/weapons/courtroom.dm @@ -11,6 +11,7 @@ throwforce = 6.0 w_class = 2.0 attack_verb = list("bashed", "battered", "judged", "whacked") + burn_state = 0 //Burnable /obj/item/weapon/gavelhammer/suicide_act(mob/user) user.visible_message("[user] has sentenced \himself to death with the [src.name]! It looks like \he's trying to commit suicide.") @@ -25,6 +26,7 @@ force = 2.0 throwforce = 2.0 w_class = 1.0 + burn_state = 0 //Burnable /obj/item/weapon/gavelblock/attackby(obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/gavelhammer)) diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm index 26bdda71d65..f2caf4bc4d4 100644 --- a/code/game/objects/items/weapons/gift_wrappaper.dm +++ b/code/game/objects/items/weapons/gift_wrappaper.dm @@ -13,7 +13,7 @@ icon = 'icons/obj/storage.dmi' icon_state = "giftcrate3" item_state = "gift1" - + burn_state = 0 //Burnable /obj/item/weapon/a_gift/New() ..() @@ -86,6 +86,7 @@ flags = NOBLUDGEON amount = 25 max_amount = 25 + burn_state = 0 //Burnable /obj/item/stack/wrapping_paper/attack_self(mob/user) user << "You need to use it on a package that has already been wrapped!" diff --git a/code/game/objects/items/weapons/grenades/grenade.dm b/code/game/objects/items/weapons/grenades/grenade.dm index 85375327940..51272bbd0a7 100644 --- a/code/game/objects/items/weapons/grenades/grenade.dm +++ b/code/game/objects/items/weapons/grenades/grenade.dm @@ -9,10 +9,15 @@ throw_range = 7 flags = CONDUCT slot_flags = SLOT_BELT + burn_state = 0 //Burnable + burntime = 5 var/active = 0 var/det_time = 50 var/display_timer = 1 +/obj/item/weapon/grenade/burn() + prime() + /obj/item/weapon/grenade/proc/clown_check(var/mob/living/carbon/human/user) if(user.disabilities & CLUMSY && prob(50)) user << "Huh? How does this thing work?" diff --git a/code/game/objects/items/weapons/mop.dm b/code/game/objects/items/weapons/mop.dm index ff0a719e4bb..60b08e58e64 100644 --- a/code/game/objects/items/weapons/mop.dm +++ b/code/game/objects/items/weapons/mop.dm @@ -11,6 +11,7 @@ throw_range = 7 w_class = 3.0 attack_verb = list("mopped", "bashed", "bludgeoned", "whacked") + burn_state = 0 //Burnable var/mopping = 0 var/mopcount = 0 var/mopcap = 5 diff --git a/code/game/objects/items/weapons/paint.dm b/code/game/objects/items/weapons/paint.dm index 48809459247..14ddda46e57 100644 --- a/code/game/objects/items/weapons/paint.dm +++ b/code/game/objects/items/weapons/paint.dm @@ -10,6 +10,8 @@ item_color = "FFFFFF" item_state = "paintcan" w_class = 3.0 + burn_state = 0 //Burnable + burntime = 5 var/paintleft = 10 /obj/item/weapon/paint/red diff --git a/code/game/objects/items/weapons/scrolls.dm b/code/game/objects/items/weapons/scrolls.dm index 521f5ab64e7..03c15e6fedb 100644 --- a/code/game/objects/items/weapons/scrolls.dm +++ b/code/game/objects/items/weapons/scrolls.dm @@ -9,6 +9,7 @@ throw_speed = 3 throw_range = 7 origin_tech = "bluespace=4" + burn_state = 0 //Burnable /obj/item/weapon/teleportation_scroll/apprentice name = "lesser scroll of teleportation" diff --git a/code/game/objects/items/weapons/signs.dm b/code/game/objects/items/weapons/signs.dm index 15451d602a8..67467ce35c1 100644 --- a/code/game/objects/items/weapons/signs.dm +++ b/code/game/objects/items/weapons/signs.dm @@ -5,6 +5,7 @@ force = 5 w_class = 4.0 attack_verb = list("bashed","smacked") + burn_state = 0 //Burnable var/label = "" var/last_wave = 0 diff --git a/code/game/objects/items/weapons/storage/backpack.dm b/code/game/objects/items/weapons/storage/backpack.dm index d8aed9fdd9d..a2d03a9ca25 100644 --- a/code/game/objects/items/weapons/storage/backpack.dm +++ b/code/game/objects/items/weapons/storage/backpack.dm @@ -18,6 +18,8 @@ slot_flags = SLOT_BACK //ERROOOOO max_w_class = 3 max_combined_w_class = 21 + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/storage/backpack/attackby(obj/item/weapon/W as obj, mob/user as mob, params) playsound(src.loc, "rustle", 50, 1, -5) @@ -34,6 +36,7 @@ icon_state = "holdingpack" max_w_class = 5 max_combined_w_class = 35 + burn_state = -1 // NotBurnable /obj/item/weapon/storage/backpack/holding/suicide_act(mob/user) user.visible_message("[user] is jumping into [src]! It looks like \he's trying to commit suicide.") @@ -129,12 +132,14 @@ desc = "It's a special backpack made exclusively for Nanotrasen officers." icon_state = "captainpack" item_state = "captainpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/industrial name = "industrial backpack" desc = "It's a tough backpack for the daily grind of station life." icon_state = "engiepack" item_state = "engiepack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/botany name = "botany backpack" @@ -159,6 +164,7 @@ desc = "A specially designed backpack. It's fire resistant and smells vaguely of plasma." icon_state = "toxpack" item_state = "toxpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/virology name = "virology backpack" @@ -175,6 +181,7 @@ name = "leather satchel" desc = "It's a very fancy satchel made with fine leather." icon_state = "satchel" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel/withwallet/New() ..() @@ -190,6 +197,7 @@ desc = "A tough satchel with extra pockets." icon_state = "satchel-eng" item_state = "engiepack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_med name = "medical satchel" @@ -220,6 +228,7 @@ desc = "Useful for holding research materials." icon_state = "satchel-tox" item_state = "satchel-tox" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_hyd name = "botanist satchel" @@ -238,6 +247,7 @@ desc = "An exclusive satchel for Nanotrasen officers." icon_state = "satchel-cap" item_state = "captainpack" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/satchel_flat name = "smuggler's satchel" @@ -310,6 +320,7 @@ desc = "A large dufflebag for holding extra captainly goods." icon_state = "duffle-captain" item_state = "duffle-captain" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/dufflebag/med name = "medical dufflebag" @@ -328,6 +339,7 @@ desc = "A large dufflebag for holding extra tools and supplies." icon_state = "duffle-eng" item_state = "duffle-eng" + burn_state = -1 //Not Burnable /obj/item/weapon/storage/backpack/dufflebag/clown name = "clown's dufflebag" diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm index 7519804b005..9790b77e206 100644 --- a/code/game/objects/items/weapons/storage/bags.dm +++ b/code/game/objects/items/weapons/storage/bags.dm @@ -103,6 +103,7 @@ max_w_class = 3 w_class = 1 can_hold = list(/obj/item/weapon/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/weapon/grown) + burn_state = 0 //Burnable //////// @@ -280,6 +281,7 @@ max_w_class = 3 w_class = 4 //Bigger than a book because physics can_hold = list(/obj/item/weapon/book, /obj/item/weapon/storage/book, /obj/item/weapon/spellbook) + burn_state = 0 //Burnable /* * Trays - Agouri @@ -349,3 +351,4 @@ w_class = 1 preposition = "in" can_hold = list(/obj/item/weapon/reagent_containers/pill, /obj/item/weapon/reagent_containers/glass/beaker, /obj/item/weapon/reagent_containers/glass/bottle) + burn_state = 0 //Burnable diff --git a/code/game/objects/items/weapons/storage/book.dm b/code/game/objects/items/weapons/storage/book.dm index 1efe547141c..dcb45f1fe5d 100644 --- a/code/game/objects/items/weapons/storage/book.dm +++ b/code/game/objects/items/weapons/storage/book.dm @@ -6,6 +6,7 @@ throw_speed = 2 throw_range = 5 w_class = 3.0 + burn_state = 0 //Burnable var/title = "book" /obj/item/weapon/storage/book/attack_self(mob/user) user << "The pages of [title] have been cut out!" diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm index 936f6e72425..d8ea59ab5f4 100644 --- a/code/game/objects/items/weapons/storage/boxes.dm +++ b/code/game/objects/items/weapons/storage/boxes.dm @@ -24,6 +24,7 @@ desc = "It's just an ordinary box." icon_state = "box" item_state = "syringe_kit" + burn_state = 0 //Burnable var/foldable = /obj/item/stack/sheet/cardboard diff --git a/code/game/objects/items/weapons/storage/briefcase.dm b/code/game/objects/items/weapons/storage/briefcase.dm index 93a6fdc2679..b37091113a6 100644 --- a/code/game/objects/items/weapons/storage/briefcase.dm +++ b/code/game/objects/items/weapons/storage/briefcase.dm @@ -11,6 +11,8 @@ max_w_class = 3 max_combined_w_class = 21 attack_verb = list("bashed", "battered", "bludgeoned", "thrashed", "whacked") + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/storage/briefcase/New() ..() diff --git a/code/game/objects/items/weapons/storage/fancy.dm b/code/game/objects/items/weapons/storage/fancy.dm index 121a7b505ca..51bfd6cdb6f 100644 --- a/code/game/objects/items/weapons/storage/fancy.dm +++ b/code/game/objects/items/weapons/storage/fancy.dm @@ -18,6 +18,7 @@ icon = 'icons/obj/food/containers.dmi' icon_state = "donutbox6" name = "donut box" + burn_state = 0 //Burnable var/icon_type = "donut" /obj/item/weapon/storage/fancy/update_icon(var/itemremoved = 0) diff --git a/code/game/objects/items/weapons/storage/wallets.dm b/code/game/objects/items/weapons/storage/wallets.dm index 5f2e841eff0..a1b73157d55 100644 --- a/code/game/objects/items/weapons/storage/wallets.dm +++ b/code/game/objects/items/weapons/storage/wallets.dm @@ -4,6 +4,7 @@ storage_slots = 4 icon_state = "wallet" w_class = 2 + burn_state = 0 //Burnable can_hold = list( /obj/item/stack/spacecash, /obj/item/weapon/card, diff --git a/code/game/objects/items/weapons/weaponry.dm b/code/game/objects/items/weapons/weaponry.dm index bfda5735a2b..15bee3c691d 100644 --- a/code/game/objects/items/weapons/weaponry.dm +++ b/code/game/objects/items/weapons/weaponry.dm @@ -242,6 +242,7 @@ w_class = 2 flags = NOSHIELD attack_verb = list("bludgeoned", "whacked", "disciplined") + burn_state = 0 //Burnable /obj/item/weapon/staff/broom name = "broom" diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index e6a76907189..9eb1d4258ac 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -9,6 +9,9 @@ var/damtype = "brute" var/force = 0 + var/burn_state = -1 // -1=fireproof | 0=will burn in fires | 1=currently on fire + var/burntime = 10 //How long it takes to burn to ashes, in seconds + /obj/Destroy() if(!istype(src, /obj/machinery)) SSobj.processing.Remove(src) // TODO: Have a processing bitflag to reduce on unnecessary loops through the processing lists @@ -155,4 +158,28 @@ /obj/storage_contents_dump_act(obj/item/weapon/storage/src_object, mob/user) var/turf/T = get_turf(src) - return T.storage_contents_dump_act(src_object, user) \ No newline at end of file + return T.storage_contents_dump_act(src_object, user) + +/obj/fire_act(var/global_overlay=1) + if(!burn_state) + burn_state = 1 + if(global_overlay) + overlays += fire_overlay + spawn(burntime*10) + if(burn_state == 1) + burn() + +/obj/proc/burn(var/visible=1) + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + Item.fire_act() //Set them on fire, too + + if(visible) + src.visible_message("[src] burns away, leaving behind a pile of ashes.") + new /obj/effect/decal/cleanable/ash(src.loc) + qdel(src) + +/obj/proc/extinguish() + if(burn_state == 1) + burn_state = 0 + overlays -= fire_overlay \ No newline at end of file diff --git a/code/game/objects/structures/artstuff.dm b/code/game/objects/structures/artstuff.dm index 495c7b9c394..ae56de30fb6 100644 --- a/code/game/objects/structures/artstuff.dm +++ b/code/game/objects/structures/artstuff.dm @@ -9,6 +9,8 @@ icon = 'icons/obj/artstuff.dmi' icon_state = "easel" density = 1 + burn_state = 0 //Burnable + burntime = 15 var/obj/item/weapon/canvas/painting = null @@ -50,6 +52,7 @@ var/global/list/globalBlankCanvases[AMT_OF_CANVASES] desc = "draw out your soul on this canvas!" icon = 'icons/obj/artstuff.dmi' icon_state = "11x11" + burn_state = 0 //Burnable var/whichGlobalBackup = 1 //List index /obj/item/weapon/canvas/nineteenXnineteen diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm index 073ae4e2e53..c27a4f0513e 100644 --- a/code/game/objects/structures/bedsheet_bin.dm +++ b/code/game/objects/structures/bedsheet_bin.dm @@ -17,6 +17,7 @@ LINEN BINS throw_range = 2 w_class = 1.0 item_color = "white" + burn_state = 0 //Burnable /obj/item/weapon/bedsheet/attack(mob/living/M, mob/user) @@ -170,6 +171,8 @@ LINEN BINS icon = 'icons/obj/structures.dmi' icon_state = "linenbin-full" anchored = 1 + burn_state = 0 //Burnable + burntime = 20 var/amount = 10 var/list/sheets = list() var/obj/item/hidden = null @@ -191,6 +194,16 @@ LINEN BINS if(1 to 5) icon_state = "linenbin-half" else icon_state = "linenbin-full" +/obj/structure/bedsheetbin/fire_act() + if(!amount) + return + ..() + +/obj/structure/bedsheetbin/burn() + amount = 0 + extinguish() + update_icon() + return /obj/structure/bedsheetbin/attackby(obj/item/I as obj, mob/user as mob, params) if(istype(I, /obj/item/weapon/bedsheet)) diff --git a/code/game/objects/structures/flora.dm b/code/game/objects/structures/flora.dm index 6ee88dda1bb..f2a83e01012 100644 --- a/code/game/objects/structures/flora.dm +++ b/code/game/objects/structures/flora.dm @@ -1,3 +1,7 @@ +/obj/structure/flora + burn_state = 0 //Burnable + burntime = 30 + //trees /obj/structure/flora/tree name = "tree" @@ -217,6 +221,7 @@ icon_state = "rock1" icon = 'icons/obj/flora/rocks.dmi' anchored = 1 + burn_state = -1 //Not Burnable /obj/structure/flora/rock/New() ..() diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index a5494427e55..23be1ce7c31 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -242,6 +242,8 @@ hardness = 1 openSound = 'sound/effects/doorcreaky.ogg' closeSound = 'sound/effects/doorcreaky.ogg' + burn_state = 0 //Burnable + burntime = 30 /obj/structure/mineral_door/wood/Dismantle(devastated = 0) if(!devastated) diff --git a/code/game/objects/structures/stool_bed_chair_nest/bed.dm b/code/game/objects/structures/stool_bed_chair_nest/bed.dm index af9c059a8f7..1682c22403b 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/bed.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/bed.dm @@ -13,6 +13,8 @@ icon_state = "bed" can_buckle = 1 buckle_lying = 1 + burn_state = 0 //Burnable + burntime = 30 /obj/structure/stool/bed/alien name = "resting contraption" @@ -59,6 +61,7 @@ icon = 'icons/obj/rollerbed.dmi' icon_state = "down" anchored = 0 + burn_state = -1 //Not Burnable /obj/structure/stool/bed/roller/post_buckle_mob(mob/living/M) if(M == buckled_mob) 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 915f56b9ac0..1dea5a15dde 100644 --- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm +++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm @@ -3,6 +3,7 @@ desc = "You sit in this. Either by will or force." icon_state = "chair" buckle_lying = 0 //you sit in a chair, not lay + burn_state = -1 //Not Burnable /obj/structure/stool/bed/chair/New() ..() @@ -73,6 +74,10 @@ // Chair types +/obj/structure/stool/bed/chair/wood + burn_state = 0 //Burnable + burntime = 20 + /obj/structure/stool/bed/chair/wood/normal icon_state = "wooden_chair" name = "wooden chair" @@ -96,6 +101,8 @@ desc = "It looks comfy." icon_state = "comfychair" color = rgb(255,255,255) + burn_state = 0 //Burnable + burntime = 30 var/image/armrest = null /obj/structure/stool/bed/chair/comfy/New() diff --git a/code/game/objects/structures/table_frames.dm b/code/game/objects/structures/table_frames.dm index 5196a37fa9d..18288c5f670 100644 --- a/code/game/objects/structures/table_frames.dm +++ b/code/game/objects/structures/table_frames.dm @@ -75,6 +75,7 @@ icon_state = "wood_frame" framestack = /obj/item/stack/sheet/mineral/wood framestackamount = 2 + burn_state = 0 //Burnable /obj/structure/table_frame/wood/attackby(var/obj/item/I, mob/user, params) if(istype(I, /obj/item/weapon/wrench)) diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index cf8b9476c2f..7258982885d 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -432,6 +432,8 @@ frame = /obj/structure/table_frame/wood framestack = /obj/item/stack/sheet/mineral/wood buildstack = /obj/item/stack/sheet/mineral/wood + burn_state = 0 //Burnable + burntime = 20 /obj/structure/table/wood/poker //No specialties, Just a mapping object. name = "gambling table" diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 51a14b46738..cb0ec817f87 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,5 +1,7 @@ /obj/item/clothing name = "clothing" + burn_state = 0 //Burnable + burntime = 15 var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets @@ -30,24 +32,13 @@ shred(1,10) return -/obj/item/clothing/fire_act() - if(burning) - return - if(max_heat_protection_temperature) - return - src.visible_message("[src] catches on fire.") - burning = 1 - overlays += image("icon" = 'icons/effects/fire.dmi', "icon_state" = "fire") - spawn(100) - if(burning) - burn() - //Ears: currently only used for headsets and earmuffs /obj/item/clothing/ears name = "ears" w_class = 1.0 throwforce = 0 slot_flags = SLOT_EARS + burn_state = -1 //Won't burn in fires /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -73,6 +64,7 @@ var/list/icon/current = list() //the current hud icons strip_delay = 20 put_on_delay = 25 + burn_state = -1 //Won't burn in fires /* SEE_SELF // can see self, no matter what @@ -204,6 +196,7 @@ BLIND // can't see anything flash_protect = 2 strip_delay = 50 put_on_delay = 50 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/space name = "space suit" @@ -225,6 +218,7 @@ BLIND // can't see anything max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 put_on_delay = 80 + burn_state = -1 //Won't burn in fires //Under clothing /obj/item/clothing/under diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 9d7bf51d33c..18f5c7937f4 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -6,6 +6,7 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 item_color="yellow" + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/yellow/fake desc = "These gloves will protect the wearer from electric shock. They don't feel like rubber..." @@ -19,6 +20,7 @@ siemens_coefficient = 1 //Set to a default of 1, gets overridden in New() permeability_coefficient = 0.05 item_color="yellow" + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/fyellow/New() siemens_coefficient = pick(0,0.5,0.5,0.5,0.5,0.75,1.5) @@ -33,7 +35,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/black/hos item_color = "hosred" //Exists for washing machines. Is not different from black gloves in any way. @@ -148,6 +150,7 @@ permeability_coefficient = 0.01 item_color="white" transfer_prints = TRUE + burn_state = -1 //Won't burn in fires /obj/item/clothing/gloves/color/latex/nitrile name = "nitrile gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index 317ae88ac81..257394e13ce 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -21,6 +21,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + burn_state = -1 //Not Burnable /obj/item/clothing/gloves/combat name = "combat gloves" @@ -33,4 +34,5 @@ cold_protection = HANDS min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS - max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT \ No newline at end of file + max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT + burn_state = -1 //Won't burn in fires \ No newline at end of file diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm index 4ada082a0fa..7dad46544c3 100644 --- a/code/modules/clothing/head/collectable.dm +++ b/code/modules/clothing/head/collectable.dm @@ -58,6 +58,7 @@ desc = "A collectable welding helmet. Now with 80% less lead! Not for actual welding. Any welding done while wearing this helmet is done so at the owner's own risk!" icon_state = "welding" item_state = "welding" + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/collectable/slime name = "collectable slime hat" @@ -110,9 +111,11 @@ desc = "Go Red! I mean Green! I mean Red! No Green!" icon_state = "thunderdome" item_state = "thunderdome" + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/collectable/swat name = "collectable SWAT helmet" desc = "That's not real blood. That's red paint." //Reference to the actual description icon_state = "swat" - item_state = "swat" \ No newline at end of file + item_state = "swat" + burn_state = -1 //Won't burn in fires \ No newline at end of file diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index cf491f337dd..16d33da43c8 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -9,6 +9,7 @@ armor = list(melee = 15, bullet = 5, laser = 20,energy = 10, bomb = 20, bio = 10, rad = 20) flags_inv = 0 action_button_name = "Toggle Helmet Light" + burn_state = -1 //Won't burn in fires attack_self(mob/user) if(!isturf(user.loc)) diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index ef549cf4acb..eb2da09dbe7 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -11,6 +11,7 @@ heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 60 + burn_state = -1 //Won't burn in fires var/obj/machinery/camera/portable/helmetCam = null var/spawnWithHelmetCam = 0 var/canAttachCam = 0 diff --git a/code/modules/clothing/head/misc.dm b/code/modules/clothing/head/misc.dm index 7130556f958..b75de520c4f 100644 --- a/code/modules/clothing/head/misc.dm +++ b/code/modules/clothing/head/misc.dm @@ -56,13 +56,6 @@ flags = BLOCKHAIR flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE -/obj/item/clothing/head/that - name = "sturdy top-hat" - desc = "It's an amish looking armored top hat." - icon_state = "tophat" - item_state = "that" - flags_inv = 0 - /obj/item/clothing/head/cardborg name = "cardborg helmet" desc = "A helmet made out of a box." @@ -213,6 +206,7 @@ throw_range = 5 w_class = 2.0 attack_verb = list("warned", "cautioned", "smashed") + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/santa name = "santa hat" diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm index 6eee2eaf8a0..e8ad38ac95b 100644 --- a/code/modules/clothing/head/misc_special.dm +++ b/code/modules/clothing/head/misc_special.dm @@ -27,6 +27,7 @@ action_button_name = "Toggle Welding Helmet" visor_flags = HEADCOVERSEYES | HEADCOVERSMOUTH visor_flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/welding/attack_self() toggle() diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index bf59b9d3278..7ffa365cb39 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -8,6 +8,7 @@ item_state = "gas_alt" gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 + burn_state = -1 //Won't burn in fires // **** Welding gas mask **** @@ -198,6 +199,7 @@ icon_state = "plaguedoctor" item_state = "gas_mask" armor = list(melee = 0, bullet = 0, laser = 2,energy = 2, bomb = 0, bio = 75, rad = 0) + max_heat_protection_temperature = 0 /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" @@ -225,6 +227,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "clown" item_state = "clown_hat" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/clown_hat/attack_self(mob/user) @@ -248,6 +251,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexyclown" item_state = "sexyclown" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/mime name = "mime mask" @@ -255,6 +259,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "mime" item_state = "mime" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/monkeymask name = "monkey mask" @@ -262,6 +267,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "monkeymask" item_state = "monkeymask" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/sexymime name = "sexy mime mask" @@ -269,6 +275,7 @@ flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS icon_state = "sexymime" item_state = "sexymime" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/death_commando name = "Death Commando Mask" @@ -279,9 +286,11 @@ name = "cyborg visor" desc = "Beep boop." icon_state = "death" + burn_state = 0 //Burnable /obj/item/clothing/mask/gas/owl_mask name = "owl mask" desc = "Twoooo!" flags = MASKCOVERSEYES | BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS - icon_state = "owl" \ No newline at end of file + icon_state = "owl" + burn_state = 0 //Burnable \ No newline at end of file diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index 8d742f983db..843f69e25c5 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -8,7 +8,7 @@ action_button_name = "Toggle Magboots" strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/magboots/verb/toggle() set name = "Toggle Magboots" diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 1a0a0a4f98c..0bebe7a3ee0 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -15,6 +15,7 @@ permeability_coefficient = 0.05 flags = NOSLIP origin_tech = "syndicate=3" + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/sneakers/mime name = "mime shoes" @@ -35,6 +36,7 @@ permeability_coefficient = 0.01 flags = NOSLIP armor = list(melee = 40, bullet = 30, laser = 25, energy = 25, bomb = 50, bio = 30, rad = 30) + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/sandal desc = "A pair of rather plain, wooden sandals." @@ -58,6 +60,7 @@ slowdown = SHOES_SLOWDOWN+1 strip_delay = 50 put_on_delay = 50 + burn_state = -1 //Won't burn in fires /obj/item/clothing/shoes/clown_shoes desc = "The prankster's standard-issue clowning shoes. Damn, they're huge!" diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 26e08d66b64..77a76ffd640 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -7,6 +7,7 @@ max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT strip_delay = 60 put_on_delay = 40 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/armor/vest name = "armor" @@ -45,6 +46,7 @@ cold_protection = CHEST|GROIN|ARMS|HANDS heat_protection = CHEST|GROIN|ARMS|HANDS strip_delay = 70 + burn_state = 0 //Burnable /obj/item/clothing/suit/armor/vest/warden/alt name = "warden's armored jacket" @@ -112,7 +114,7 @@ desc = "An armored vest with a detective's badge on it." icon_state = "detective-armor" allowed = list(/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/weapon/reagent_containers/spray/pepper,/obj/item/device/flashlight,/obj/item/weapon/gun/energy,/obj/item/weapon/gun/projectile,/obj/item/ammo_box,/obj/item/ammo_casing,/obj/item/weapon/melee/baton,/obj/item/weapon/restraints/handcuffs,/obj/item/weapon/storage/fancy/cigarettes,/obj/item/weapon/lighter,/obj/item/device/detective_scanner,/obj/item/device/taperecorder) - + burn_state = 0 //Burnable //Reactive armor diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 7d75bef57d4..bee7db48b5f 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -8,6 +8,7 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 100, rad = 20) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES unacidable = 1 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/bio_suit name = "bio suit" @@ -26,6 +27,7 @@ strip_delay = 70 put_on_delay = 70 unacidable = 1 + burn_state = -1 //Won't burn in fires //Standard biosuit, orange stripe /obj/item/clothing/head/bio_hood/general diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 7bad9b13400..1ae33b0de80 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -100,6 +100,7 @@ item_state = "hazard" blood_overlay_type = "armor" allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/device/t_scanner,) + burn_state = -1 //Won't burn in fires //Lawyer /obj/item/clothing/suit/toggle/lawyer diff --git a/code/modules/clothing/suits/miscellaneous.dm b/code/modules/clothing/suits/miscellaneous.dm index 6a9109a3532..d6e1399c1a4 100644 --- a/code/modules/clothing/suits/miscellaneous.dm +++ b/code/modules/clothing/suits/miscellaneous.dm @@ -16,6 +16,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST allowed = list (/obj/item/weapon/gun/energy/laser/bluetag) + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/redtag name = "red laser tag armor" @@ -25,6 +26,7 @@ blood_overlay_type = "armor" body_parts_covered = CHEST allowed = list (/obj/item/weapon/gun/energy/laser/redtag) + burn_state = -1 //Won't burn in fires /* * Costume @@ -88,7 +90,7 @@ w_class = 3 allowed = list(/obj/item/device/flashlight,/obj/item/weapon/tank/internals/emergency_oxygen,/obj/item/toy) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/hastur name = "\improper Hastur's robe" @@ -236,7 +238,8 @@ desc = "Pompadour not included." icon_state = "leatherjacket" item_state = "hostrench" - + burn_state = -1 //Not Burnable + max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT /obj/item/clothing/suit/jacket/leather/overcoat name = "leather overcoat" diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index c32db545664..bb494884c21 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -28,6 +28,7 @@ min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT strip_delay = 60 put_on_delay = 60 + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/fire/firefighter icon_state = "firesuit" @@ -64,7 +65,7 @@ max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/bomb_suit name = "bomb suit" @@ -85,7 +86,7 @@ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT strip_delay = 70 put_on_delay = 70 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/bomb_hood/security @@ -109,7 +110,7 @@ armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 60, rad = 100) strip_delay = 60 put_on_delay = 60 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/radiation name = "radiation suit" @@ -127,3 +128,4 @@ strip_delay = 60 put_on_delay = 60 flags_inv = HIDEJUMPSUIT + burn_state = -1 //Won't burn in fires diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index dd22a1e9f5c..299daf63152 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -8,6 +8,7 @@ strip_delay = 50 put_on_delay = 50 unacidable = 1 + burn_state = -1 //Won't burn in fires /obj/item/clothing/head/wizard/red name = "red wizard hat" @@ -63,7 +64,7 @@ strip_delay = 50 put_on_delay = 50 unacidable = 1 - + burn_state = -1 //Won't burn in fires /obj/item/clothing/suit/wizrobe/red name = "red wizard robe" @@ -117,6 +118,7 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable /obj/item/clothing/head/wizard/marisa/fake name = "witch hat" @@ -126,6 +128,7 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable /obj/item/clothing/suit/wizrobe/marisa/fake name = "witch robe" @@ -136,3 +139,4 @@ permeability_coefficient = 1 armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0) unacidable = 0 + burn_state = 0 //Burnable \ No newline at end of file diff --git a/code/modules/clothing/under/chameleon.dm b/code/modules/clothing/under/chameleon.dm index 20acefb09d6..f550d51edd5 100644 --- a/code/modules/clothing/under/chameleon.dm +++ b/code/modules/clothing/under/chameleon.dm @@ -9,6 +9,7 @@ origin_tech = "syndicate=3" var/list/clothing_choices = list() var/malfunctioning = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/chameleon/New() ..() diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 84355443233..c5bc98a2cc1 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -16,6 +16,7 @@ icon_state = "black" item_state = "bl_suit" item_color = "black" + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/color/grey name = "grey jumpsuit" diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index bdd52e6ba23..57709b5bdfe 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -6,6 +6,7 @@ item_state = "gy_suit" item_color = "chief" armor = list(melee = 0, bullet = 0, laser = 0,energy = 0, bomb = 0, bio = 0, rad = 10) + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/rank/atmospheric_technician desc = "It's a jumpsuit worn by atmospheric technicians." @@ -13,6 +14,7 @@ icon_state = "atmos" item_state = "atmos_suit" item_color = "atmos" + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/rank/engineer desc = "It's an orange high visibility jumpsuit worn by engineers. It has minor radiation shielding." diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 42dae95f077..6d19ef1244f 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -37,6 +37,7 @@ item_state = "armor" can_adjust = 0 strip_delay = 100 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/waiter name = "waiter's outfit" @@ -115,6 +116,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/acj name = "administrative cybernetic jumpsuit" @@ -131,6 +133,7 @@ heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/owl name = "owl uniform" @@ -338,6 +341,7 @@ body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = 0 + burn_state = -1 //Won't burn in fires /obj/item/clothing/under/sundress name = "sundress" diff --git a/code/modules/clothing/under/ties.dm b/code/modules/clothing/under/ties.dm index 1dda5f2ebd2..e828b3fe049 100644 --- a/code/modules/clothing/under/ties.dm +++ b/code/modules/clothing/under/ties.dm @@ -84,6 +84,7 @@ desc = "A bronze medal." icon_state = "bronze" item_color = "bronze" + burn_state = -1 //Won't burn in fires //Pinning medals on people /obj/item/clothing/tie/medal/attack(mob/living/carbon/human/M, mob/living/user) diff --git a/code/modules/food&drinks/drinks/drinks.dm b/code/modules/food&drinks/drinks/drinks.dm index 1f07766a523..21a17114618 100644 --- a/code/modules/food&drinks/drinks/drinks.dm +++ b/code/modules/food&drinks/drinks/drinks.dm @@ -10,6 +10,7 @@ var/gulp_size = 5 //This is now officially broken ... need to think of a nice way to fix it. possible_transfer_amounts = list(5,10,25) volume = 50 + burn_state = -1 /obj/item/weapon/reagent_containers/food/drinks/New() ..() diff --git a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm index 911362474c1..d145ef39fb3 100644 --- a/code/modules/food&drinks/drinks/drinks/drinkingglass.dm +++ b/code/modules/food&drinks/drinks/drinks/drinkingglass.dm @@ -6,6 +6,20 @@ icon_state = "glass_empty" amount_per_transfer_from_this = 10 volume = 50 + burn_state = 0 //Burnable + burntime = 5 + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/fire_act() + if(!reagents.total_volume) + return + ..() + +/obj/item/weapon/reagent_containers/food/drinks/drinkingglass/burn() + reagents.total_volume = 0 //Burns away all the alcohol :( + reagents.reagent_list.Cut() + on_reagent_change() + extinguish() + return /obj/item/weapon/reagent_containers/food/drinks/drinkingglass/on_reagent_change() overlays.Cut() diff --git a/code/modules/food&drinks/food.dm b/code/modules/food&drinks/food.dm index 20f54c684eb..5a7dbde5102 100644 --- a/code/modules/food&drinks/food.dm +++ b/code/modules/food&drinks/food.dm @@ -4,6 +4,7 @@ /obj/item/weapon/reagent_containers/food possible_transfer_amounts = null volume = 50 //Sets the default container amount for all food items. + burn_state = 0 //Burnable /obj/item/weapon/reagent_containers/food/New() ..() diff --git a/code/modules/hydroponics/grown.dm b/code/modules/hydroponics/grown.dm index 38c9be4e471..8fe33dc7e58 100644 --- a/code/modules/hydroponics/grown.dm +++ b/code/modules/hydroponics/grown.dm @@ -20,6 +20,7 @@ icon = 'icons/obj/hydroponics/harvest.dmi' potency = -1 dried_type = -1 //bit different. saves us from having to define each stupid grown's dried_type as itself. If you don't want a plant to be driable (watermelons) set this to null in the time definition. + burn_state = 0 //Burnable /obj/item/weapon/reagent_containers/food/snacks/grown/New(newloc, new_potency = 50) ..() diff --git a/code/modules/hydroponics/growninedible.dm b/code/modules/hydroponics/growninedible.dm index 07ee7c17a2e..f0ca0943691 100644 --- a/code/modules/hydroponics/growninedible.dm +++ b/code/modules/hydroponics/growninedible.dm @@ -5,6 +5,7 @@ /obj/item/weapon/grown // Grown weapons name = "grown_weapon" icon = 'icons/obj/hydroponics/harvest.dmi' + burn_state = 0 //Burnable var/seed = null var/plantname = "" var/product //a type path diff --git a/code/modules/hydroponics/seeds.dm b/code/modules/hydroponics/seeds.dm index 0e491e575bf..662f76cb686 100644 --- a/code/modules/hydroponics/seeds.dm +++ b/code/modules/hydroponics/seeds.dm @@ -7,6 +7,7 @@ icon = 'icons/obj/hydroponics/seeds.dmi' icon_state = "seed" //Unknown plant seed - these shouldn't exist in-game. w_class = 1 //Pocketable. + burn_state = 0 //Burnable var/plantname = "Plants" //Name of plant when planted. var/product //A type path. The thing that is created when the plant is harvested. var/species = "" //Used to update icons. Should match the name in the sprites. diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index c3e1af939be..96dc3f1b9a1 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -17,6 +17,8 @@ anchored = 0 density = 1 opacity = 0 + burn_state = 0 //Burnable + burntime = 30 var/state = 0 var/list/allowed_books = list(/obj/item/weapon/book, /obj/item/weapon/spellbook, /obj/item/weapon/storage/book) //Things allowed in the bookcase @@ -165,6 +167,7 @@ throw_range = 5 w_class = 3 //upped to three because books are, y'know, pretty big. (and you could hide them inside eachother recursively forever) attack_verb = list("bashed", "whacked", "educated") + burn_state = 0 //Burnable var/dat //Actual page content var/due_date = 0 //Game time in 1/10th seconds var/author //Who wrote the thing, can be changed by pen or PC. It is not automatically assigned diff --git a/code/modules/mining/money_bag.dm b/code/modules/mining/money_bag.dm index e9befa30d43..a8eefeb5bfc 100644 --- a/code/modules/mining/money_bag.dm +++ b/code/modules/mining/money_bag.dm @@ -8,6 +8,8 @@ force = 10.0 throwforce = 0 w_class = 4.0 + burn_state = 0 //Burnable + burntime = 20 /obj/item/weapon/moneybag/attack_hand(user as mob) var/amt_gold = 0 diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 4117d85627e..525242cfb2d 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -443,31 +443,30 @@ var/shredded if(!bomb) - if(!max_heat_protection_temperature) + if(burn_state != -1) shredded = 1 //No heat protection, it burns else shredded = -1 //Heat protection = Fireproof else if(shock > 0) - if(prob(max(10,shock))) + if(prob(min(90,max(10,shock)))) shredded = armor["bomb"] + 10 //It gets shredded, but it also absorbs the shock the clothes underneath would recieve by this amount else shredded = -1 //It survives explosion - if(shredded) + if(shredded > 0) if(Human) //Unequip if equipped Human.unEquip(src) - for(var/obj/item/Item in contents) //Empty out the contents - Item.loc = src.loc - if(bomb) - var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) - Shreds.name = "shredded [src]" - Shreds.desc = "The sad remains of what used to be a glorious [src]." + for(var/obj/item/Item in contents) //Empty out the contents + Item.loc = src.loc + spawn(1) //so the shreds aren't instantly deleted by the explosion + var/obj/effect/decal/cleanable/shreds/Shreds = new(loc) + Shreds.name = "shredded [src.name]" + Shreds.desc = "The sad remains of what used to be a glorious [src.name]." + qdel(src) else - new /obj/effect/decal/cleanable/ash(loc) - - qdel(src) + burn(0) return shredded \ No newline at end of file diff --git a/code/modules/paperwork/clipboard.dm b/code/modules/paperwork/clipboard.dm index 8ae11c8f83c..46ddcd420fd 100644 --- a/code/modules/paperwork/clipboard.dm +++ b/code/modules/paperwork/clipboard.dm @@ -10,7 +10,7 @@ var/obj/item/weapon/pen/haspen //The stored pen. var/obj/item/weapon/paper/toppaper //The topmost piece of paper. slot_flags = SLOT_BELT - + burn_state = 0 //Burnable /obj/item/weapon/clipboard/New() update_icon() diff --git a/code/modules/paperwork/folders.dm b/code/modules/paperwork/folders.dm index 6f725e04187..1e632fa976a 100644 --- a/code/modules/paperwork/folders.dm +++ b/code/modules/paperwork/folders.dm @@ -5,6 +5,7 @@ icon_state = "folder" w_class = 2 pressure_resistance = 2 + burn_state = 0 //Burnable /obj/item/weapon/folder/blue desc = "A blue folder." diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm index 4ed586cebd6..411f5de8522 100644 --- a/code/modules/paperwork/paper.dm +++ b/code/modules/paperwork/paper.dm @@ -18,6 +18,8 @@ pressure_resistance = 0 slot_flags = SLOT_HEAD body_parts_covered = HEAD + burn_state = 0 //Burnable + burntime = 5 var/info //What's actually written on the paper. var/info_links //A different version of the paper which includes html links at fields and EOF @@ -38,7 +40,7 @@ /obj/item/weapon/paper/update_icon() - if(burning) + if(burn_state == 1) icon_state = "paper_onfire" return if(info) @@ -271,7 +273,7 @@ /obj/item/weapon/paper/attackby(obj/item/weapon/P, mob/living/carbon/human/user, params) ..() - if(burning) + if(burn_state == 1) return if(is_blind(user)) @@ -318,33 +320,21 @@ user.unEquip(src) user.visible_message("[user] lights [src] ablaze with [P]!", "You light [src] on fire!") - paper_burn(0, 100) + fire_act() add_fingerprint(user) /obj/item/weapon/paper/fire_act() - paper_burn(1, 50) - -/obj/item/weapon/paper/proc/paper_burn(var/showmsg, var/burntime) - if (burning) - return - if(showmsg) - src.visible_message("[src] catches on fire.") - burning = 1 + ..(0) icon_state = "paper_onfire" info = "[stars(info)]" - spawn(burntime) //7 seconds - if(burning) - src.visible_message("[src] burns away, leaving behind a pile of ashes.") - new /obj/effect/decal/cleanable/ash(src.loc) - qdel(src) + /obj/item/weapon/paper/extinguish() - burning = 0 + ..() update_icon() - return /* * Premade paper diff --git a/code/modules/paperwork/paperbin.dm b/code/modules/paperwork/paperbin.dm index dd672a6d11c..568680b5d45 100644 --- a/code/modules/paperwork/paperbin.dm +++ b/code/modules/paperwork/paperbin.dm @@ -8,9 +8,20 @@ throw_speed = 3 throw_range = 7 pressure_resistance = 8 + burn_state = 0 //Burnable var/amount = 30 //How much paper is in the bin. var/list/papers = new/list() //List of papers put in the bin for reference. +/obj/item/weapon/paper_bin/fire_act() + if(!amount) + return + ..() + +/obj/item/weapon/paper_bin/burn() + amount = 0 + extinguish() + update_icon() + return /obj/item/weapon/paper_bin/MouseDrop(atom/over_object) var/mob/M = usr diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm index 0832ab226f3..d8312036260 100644 --- a/code/modules/paperwork/photography.dm +++ b/code/modules/paperwork/photography.dm @@ -17,7 +17,7 @@ icon_state = "film" item_state = "electropack" w_class = 1.0 - + burn_state = 0 //Burnable /* * Photo @@ -28,6 +28,8 @@ icon_state = "photo" item_state = "paper" w_class = 1.0 + burn_state = 0 //Burnable + burntime = 5 var/icon/img //Big photo image var/scribble //Scribble on the back. var/blueprints = 0 //Does it include the blueprints? @@ -92,7 +94,7 @@ icon_state = "album" item_state = "briefcase" can_hold = list(/obj/item/weapon/photo) - + burn_state = 0 //Burnable /* * Camera diff --git a/code/modules/recycling/sortingmachinery.dm b/code/modules/recycling/sortingmachinery.dm index eda94a40f33..5225e5a4d48 100644 --- a/code/modules/recycling/sortingmachinery.dm +++ b/code/modules/recycling/sortingmachinery.dm @@ -117,6 +117,7 @@ flags = NOBLUDGEON amount = 25 max_amount = 25 + burn_state = 0 //burnable /obj/item/stack/packageWrap/afterattack(var/obj/target as obj, mob/user as mob, proximity) diff --git a/html/changelogs/ikarrus-shredme.yml b/html/changelogs/ikarrus-shredme.yml new file mode 100644 index 00000000000..8e01db13def --- /dev/null +++ b/html/changelogs/ikarrus-shredme.yml @@ -0,0 +1,37 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# spellcheck (typo fixes) +# experiment +# tgs (TG-ported fixes?) +################################# + +# Your name. +author: Ikarrus + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, this gets changed to [] after reading. Just remove the brackets when you add new shit. +# Please surround your changes in double quotes ("). It works without them, but if you use certain characters it screws up compiling. The quotes will not show up in the changelog. +changes: + - rscadd: "Some objects can be burned now." + - rscadd: "Bombs will shred your clothes, with respect to their layering and armor values. Exterior clothing will shield clothing underneath. Storage items will drop their contents when bombed this way." \ No newline at end of file diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 62170e230e6ae4d432da5e15aa9ea931f00bb209..5102b40d59e40238718af6f984c0312a944f37a0 100644 GIT binary patch delta 15802 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%0D99Ys0%-aIPLHicH2^Nguu{?ek&b@j= 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 Q5rF>WrIn;gBu(D^e=~oUh5!Hn delta 15547 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 CrAr0? From 59ca40f03d1c9be6bd73090ce274ccc5af8b079a Mon Sep 17 00:00:00 2001 From: Ikarrus Date: Sat, 27 Jun 2015 09:22:14 -0600 Subject: [PATCH 3/3] Burning objects are processed every tick now instead of using a spawn() check --- code/controllers/subsystem/objects.dm | 9 +++++++-- code/game/objects/objs.dm | 15 +++++++-------- code/modules/clothing/clothing.dm | 8 ++++++-- code/modules/mob/living/carbon/human/inventory.dm | 2 +- 4 files changed, 21 insertions(+), 13 deletions(-) diff --git a/code/controllers/subsystem/objects.dm b/code/controllers/subsystem/objects.dm index ccd49428120..35236b38fb6 100644 --- a/code/controllers/subsystem/objects.dm +++ b/code/controllers/subsystem/objects.dm @@ -9,6 +9,7 @@ var/datum/subsystem/objects/SSobj priority = 12 var/list/processing = list() + var/list/burning = list() /datum/subsystem/objects/New() NEW_SS_GLOBAL(SSobj) @@ -37,5 +38,9 @@ var/datum/subsystem/objects/SSobj ++i continue SSobj.processing.Cut(i, i+1) - - + for(var/obj/burningobj in SSobj.burning) + if(burningobj && (burningobj.burn_state == 1)) + if(burningobj.burn_world_time < world.time) + burningobj.burn() + else + SSobj.burning -= burningobj \ No newline at end of file diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 9eb1d4258ac..51df368a08f 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -11,6 +11,7 @@ var/burn_state = -1 // -1=fireproof | 0=will burn in fires | 1=currently 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 /obj/Destroy() if(!istype(src, /obj/machinery)) @@ -163,23 +164,21 @@ /obj/fire_act(var/global_overlay=1) if(!burn_state) burn_state = 1 + SSobj.burning += src + burn_world_time = world.time + burntime*10 if(global_overlay) overlays += fire_overlay - spawn(burntime*10) - if(burn_state == 1) - burn() + return 1 -/obj/proc/burn(var/visible=1) +/obj/proc/burn() for(var/obj/item/Item in contents) //Empty out the contents Item.loc = src.loc Item.fire_act() //Set them on fire, too - - if(visible) - src.visible_message("[src] burns away, leaving behind a pile of ashes.") new /obj/effect/decal/cleanable/ash(src.loc) qdel(src) /obj/proc/extinguish() if(burn_state == 1) burn_state = 0 - overlays -= fire_overlay \ No newline at end of file + overlays -= fire_overlay + SSobj.burning -= src \ No newline at end of file diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index c655ee34d45..e410f6dde59 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -1,5 +1,6 @@ /obj/item/clothing name = "clothing" + burn_state = 0 //Burnable var/flash_protect = 0 //Malk: What level of bright light protection item has. 1 = Flashers, Flashes, & Flashbangs | 2 = Welding | -1 = OH GOD WELDING BURNT OUT MY RETINAS var/tint = 0 //Malk: Sets the item's level of visual impairment tint, normally set to the same as flash_protect var/up = 0 // but seperated to allow items to protect but not impair vision, like space helmets @@ -23,6 +24,7 @@ w_class = 1.0 throwforce = 0 slot_flags = SLOT_EARS + burn_state = -1 //Not Burnable /obj/item/clothing/ears/earmuffs name = "earmuffs" @@ -32,7 +34,7 @@ flags = EARBANGPROTECT strip_delay = 15 put_on_delay = 25 - + burn_state = 0 //Burnable //Glasses /obj/item/clothing/glasses @@ -48,7 +50,7 @@ var/list/icon/current = list() //the current hud icons strip_delay = 20 put_on_delay = 25 - + burn_state = -1 //Not Burnable /* SEE_SELF // can see self, no matter what SEE_MOBS // can see all mobs, no matter what @@ -180,6 +182,7 @@ BLIND // can't see anything strip_delay = 50 put_on_delay = 50 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH + burn_state = -1 //Not Burnable /obj/item/clothing/suit/space name = "space suit" @@ -201,6 +204,7 @@ BLIND // can't see anything max_heat_protection_temperature = SPACE_SUIT_MAX_TEMP_PROTECT strip_delay = 80 put_on_delay = 80 + burn_state = -1 //Not Burnable //Under clothing /obj/item/clothing/under diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm index 525242cfb2d..a4c1a29a2aa 100644 --- a/code/modules/mob/living/carbon/human/inventory.dm +++ b/code/modules/mob/living/carbon/human/inventory.dm @@ -467,6 +467,6 @@ Shreds.desc = "The sad remains of what used to be a glorious [src.name]." qdel(src) else - burn(0) + burn() return shredded \ No newline at end of file