diff --git a/archive/maps/gateway_archive_vr/labyrinth.dm b/archive/maps/gateway_archive_vr/labyrinth.dm
index 26b4e92108..4bec1d66c5 100644
--- a/archive/maps/gateway_archive_vr/labyrinth.dm
+++ b/archive/maps/gateway_archive_vr/labyrinth.dm
@@ -151,7 +151,7 @@
icon_state = "mecha_honker"
energy_drain = 200
equip_cooldown = 150
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
can_attach(obj/mecha/combat/honker/M as obj)
if(!istype(M))
diff --git a/archive/maps/gateway_archive_vr/wildwest.dm b/archive/maps/gateway_archive_vr/wildwest.dm
index d16e6080c9..8b8e3e0f24 100644
--- a/archive/maps/gateway_archive_vr/wildwest.dm
+++ b/archive/maps/gateway_archive_vr/wildwest.dm
@@ -44,8 +44,8 @@
if("Power")
to_chat(user, span_boldwarning("Your wish is granted, but at a terrible cost..."))
to_chat(user, span_warning("The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."))
- if (!(LASER in user.mutations))
- user.mutations.Add(LASER)
+ if (!(LASER_EYES in user.mutations))
+ user.mutations.Add(LASER_EYES)
to_chat(user, span_notice("You feel pressure building behind your eyes."))
if (!(COLD_RESISTANCE in user.mutations))
user.mutations.Add(COLD_RESISTANCE)
diff --git a/code/ATMOSPHERICS/atmospherics.dm b/code/ATMOSPHERICS/atmospherics.dm
index aba125e7b8..584b5b6a99 100644
--- a/code/ATMOSPHERICS/atmospherics.dm
+++ b/code/ATMOSPHERICS/atmospherics.dm
@@ -157,7 +157,7 @@ Pipelines + Other Objects -> Pipe network
return TRUE
// Deconstruct into a pipe item.
-/obj/machinery/atmospherics/proc/deconstruct()
+/obj/machinery/atmospherics/atom_deconstruct()
if(QDELETED(src))
return
if(construction_type)
@@ -258,7 +258,7 @@ Pipelines + Other Objects -> Pipe network
var/datum/gas_mixture/int_air = return_air()
var/datum/gas_mixture/env_air = our_turf.return_air()
var/internal_pressure = int_air.return_pressure()-env_air.return_pressure()
- deconstruct()
+ atom_deconstruct()
// Release pressure
playsound(our_turf, 'sound/effects/bang.ogg', 70, 0, 0)
playsound(our_turf, 'sound/effects/clang2.ogg', 70, 0, 0)
diff --git a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
index ec2debcc1e..309f7612b0 100644
--- a/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/passive_gate.dm
@@ -292,7 +292,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear ratchet.")
- deconstruct()
+ atom_deconstruct()
#undef REGULATE_NONE
#undef REGULATE_INPUT
diff --git a/code/ATMOSPHERICS/components/binary_devices/pump.dm b/code/ATMOSPHERICS/components/binary_devices/pump.dm
index 3b1a28e2dc..6566b31dc8 100644
--- a/code/ATMOSPHERICS/components/binary_devices/pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/pump.dm
@@ -253,7 +253,7 @@ Thus, the two variables affect pump operation are set in New():
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/binary/pump/click_alt(mob/user)
user.setClickCooldown(DEFAULT_ATTACK_COOLDOWN)
diff --git a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
index c138cfcdbc..4aadbbc178 100644
--- a/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
+++ b/code/ATMOSPHERICS/components/binary_devices/volume_pump.dm
@@ -292,7 +292,7 @@ Thus, the two variables affect pump operation are set in New():
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/binary/volume_pump/proc/multitool_act(var/obj/item/W as obj, var/mob/user as mob)
if(!overclocked)
diff --git a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
index e767140ff2..8ac1cc5916 100644
--- a/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
+++ b/code/ATMOSPHERICS/components/omni_devices/omni_base.dm
@@ -95,7 +95,7 @@
span_infoplain(span_bold("\The [user]") + "unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/omni/attack_hand(user as mob)
if(..())
diff --git a/code/ATMOSPHERICS/components/portables_connector.dm b/code/ATMOSPHERICS/components/portables_connector.dm
index 8f163cd670..b4310a32f1 100644
--- a/code/ATMOSPHERICS/components/portables_connector.dm
+++ b/code/ATMOSPHERICS/components/portables_connector.dm
@@ -165,4 +165,4 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
diff --git a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
index 60421bdbae..1ab257d871 100644
--- a/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
+++ b/code/ATMOSPHERICS/components/trinary_devices/trinary_base.dm
@@ -65,7 +65,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
// Housekeeping and pipe network stuff below
/obj/machinery/atmospherics/trinary/get_neighbor_nodes_for_init()
diff --git a/code/ATMOSPHERICS/components/tvalve.dm b/code/ATMOSPHERICS/components/tvalve.dm
index 548127f502..dd7aefd914 100644
--- a/code/ATMOSPHERICS/components/tvalve.dm
+++ b/code/ATMOSPHERICS/components/tvalve.dm
@@ -340,7 +340,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/tvalve/mirrored
icon_state = "map_tvalvem0"
diff --git a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
index c12bd6a6fb..b80f8c6c50 100644
--- a/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
+++ b/code/ATMOSPHERICS/components/unary/heat_exchanger.dm
@@ -88,4 +88,4 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
diff --git a/code/ATMOSPHERICS/components/unary/outlet_injector.dm b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
index c53456d657..c3cb1f6898 100644
--- a/code/ATMOSPHERICS/components/unary/outlet_injector.dm
+++ b/code/ATMOSPHERICS/components/unary/outlet_injector.dm
@@ -198,7 +198,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/unary/outlet_injector/click_ctrl(mob/user)
if (volume_rate == ATMOS_DEFAULT_VOLUME_PUMP + 500 || use_power == USE_POWER_OFF)
diff --git a/code/ATMOSPHERICS/components/unary/vent_pump.dm b/code/ATMOSPHERICS/components/unary/vent_pump.dm
index ef4b80e154..5e5480fa81 100644
--- a/code/ATMOSPHERICS/components/unary/vent_pump.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_pump.dm
@@ -442,7 +442,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/unary/vent_pump/proc/multitool_act(obj/item/W, mob/user)
var/list/options = list(
diff --git a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
index 98b7c1489f..7c84656da6 100644
--- a/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
+++ b/code/ATMOSPHERICS/components/unary/vent_scrubber.dm
@@ -315,7 +315,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/unary/vent_scrubber/examine(mob/user)
. = ..()
diff --git a/code/ATMOSPHERICS/components/valve.dm b/code/ATMOSPHERICS/components/valve.dm
index 3c26d21cb4..dd69c91cb4 100644
--- a/code/ATMOSPHERICS/components/valve.dm
+++ b/code/ATMOSPHERICS/components/valve.dm
@@ -304,7 +304,7 @@
span_infoplain(span_bold("\The [user]") + " unfastens \the [src]."), \
span_notice("You have unfastened \the [src]."), \
"You hear a ratchet.")
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/valve/examine(mob/user)
. = ..()
diff --git a/code/ATMOSPHERICS/pipes/pipe_base.dm b/code/ATMOSPHERICS/pipes/pipe_base.dm
index 32bb9f0262..506e91c8c7 100644
--- a/code/ATMOSPHERICS/pipes/pipe_base.dm
+++ b/code/ATMOSPHERICS/pipes/pipe_base.dm
@@ -161,7 +161,7 @@
span_hear("You hear a ratchet."))
if(unsafe_wrenching)
unsafe_pressure_release(user, internal_pressure)
- deconstruct()
+ atom_deconstruct()
/obj/machinery/atmospherics/pipe/proc/change_color(var/new_color)
//only pass valid pipe colors please ~otherwise your pipe will turn invisible
diff --git a/code/__defines/_flags.dm b/code/__defines/_flags.dm
index 8ee22fdfc6..9372421e09 100644
--- a/code/__defines/_flags.dm
+++ b/code/__defines/_flags.dm
@@ -1,6 +1,26 @@
/// 33554431 (2^24 - 1) is the maximum value our bitflags can reach.
#define MAX_BITFLAG_DIGITS 8
+//Fire and Acid stuff, for resistance_flags
+#define LAVA_PROOF (1<<0)
+/// 100% immune to fire damage (but not necessarily to lava or heat)
+#define FIRE_PROOF (1<<1)
+/// atom is flammable and can have the burning component
+#define FLAMMABLE (1<<2)
+/// currently burning
+#define ON_FIRE (1<<3)
+/// acid can't even appear on it, let alone melt it.
+#define UNACIDABLE (1<<4)
+/// acid stuck on it doesn't melt it.
+#define ACID_PROOF (1<<5)
+/// doesn't take damage
+#define INDESTRUCTIBLE (1<<6)
+/// can't be frozen
+#define FREEZE_PROOF (1<<7)
+/// can't be shuttle crushed.
+#define SHUTTLE_CRUSH_PROOF (1<<8)
+/// can't be destroyed by bombs
+#define BOMB_PROOF (1<<9)
///Object will protect itself.
#define EMP_PROTECT_SELF (1<<0)
///Object will protect its contents from being EMPed.
diff --git a/code/__defines/atmos.dm b/code/__defines/atmos.dm
index 7a7b22d4aa..efdfebad54 100644
--- a/code/__defines/atmos.dm
+++ b/code/__defines/atmos.dm
@@ -100,3 +100,6 @@
#define TANK_MAX_RELEASE_PRESSURE (3*ONE_ATMOSPHERE)
#define TANK_DEFAULT_RELEASE_PRESSURE ONE_ATMOSPHERE
#define MAX_ATMOS_TEMPERATURE 1e30 //Without having a max temp, you can get .inf temps
+
+///Minimum temperature for items on fire
+#define BURNING_ITEM_MINIMUM_TEMPERATURE (150+T0C)
diff --git a/code/__defines/combat.dm b/code/__defines/combat.dm
new file mode 100644
index 0000000000..566ae635ca
--- /dev/null
+++ b/code/__defines/combat.dm
@@ -0,0 +1,28 @@
+//We will round to this value in damage calculations.
+#define DAMAGE_PRECISION 0.1
+
+//Damage flag defines //
+
+/// Involves corrosive substances.
+#define ACID "acid"
+/// Involved in checking whether a disease can infect or spread. Also involved in xeno neurotoxin.
+#define BIO "bio"
+/// Involves a shockwave, usually from an explosion.
+#define BOMB "bomb"
+/// Involves a solid projectile.
+#define BULLET "bullet"
+/// Involves being eaten
+#define CONSUME "consume"
+/// Involves an EMP or energy-based projectile.
+#define ENERGY "energy"
+/// Involves fire or temperature extremes.
+#define FIRE "fire"
+/// Involves a laser.
+#define LASER "laser"
+/// Involves a melee attack or a thrown object.
+#define MELEE "melee"
+/// Involved in checking the likelihood of applying a wound to a mob.
+#define WOUND "wound"
+
+/// Calculates the new armour value after armour penetration. Can return negative values, and those must be caught.
+#define PENETRATE_ARMOUR(armour, penetration) (penetration >= 100 ? 0 : 100 * (armour - penetration) / (100 - penetration))
diff --git a/code/__defines/dna.dm b/code/__defines/dna.dm
index 2ea27cb14d..1ada12848f 100644
--- a/code/__defines/dna.dm
+++ b/code/__defines/dna.dm
@@ -11,7 +11,7 @@
#define FAT 6
#define HUSK 7
#define NOCLONE 8
-#define LASER 9 // Harm intent - click anywhere to shoot lasers from eyes.
+#define LASER_EYES 9 // Harm intent - click anywhere to shoot lasers from eyes.
#define HEAL 10 // Healing people with hands.
#define FLASHPROOF 11 // Flashproof eyes.
diff --git a/code/__defines/flags.dm b/code/__defines/flags.dm
index 3f630bbecf..a02417893a 100644
--- a/code/__defines/flags.dm
+++ b/code/__defines/flags.dm
@@ -50,6 +50,13 @@ GLOBAL_LIST_INIT(bitflags, list(1, 2, 4, 8, 16, 32, 64, 128, 256, 512, 1024, 204
#define INFINITE_AIR (1<<6) // Provides an infinite air supply.
#define NOSTRIP (1<<7) // Items that should never get stripped
#define DROPDEL (1<<8) // Items that delete upon being dropped
+/**
+ * for all things that are technically items but don't want to be treated as such, given on a case-by-case basis
+ * examples of use are hand items, omni-toolsets, non-limb limbs (hand eater, mounted chainsaw, many null rods), borg modules, bodyparts, organs, etc.
+ * This is used for general exclusion, such as preventing insertions into other items
+ * Basically, these aren't "real" items. <= wow thanks for the fucking insight sherlock
+*/
+#define ABSTRACT (1<<9)
// Flags for pass_flags. - Used in /atom/var/pass_flags
#define PASSTABLE (1<<0)
diff --git a/code/__defines/mecha.dm b/code/__defines/mecha.dm
index 5441794f5c..bc4c137275 100644
--- a/code/__defines/mecha.dm
+++ b/code/__defines/mecha.dm
@@ -8,7 +8,7 @@
#define MECHA_PROC_DAMAGE 2
#define MECHA_PROC_INT_TEMP 4
-#define MELEE 1
+#define MECH_MELEE 1
#define RANGED 2
#define MECH_FACTION_NT "nano"
diff --git a/code/__defines/obj_flags.dm b/code/__defines/obj_flags.dm
index 0f6f1127e0..8f5627ad86 100644
--- a/code/__defines/obj_flags.dm
+++ b/code/__defines/obj_flags.dm
@@ -1,3 +1,35 @@
+// Flags for the obj_flags var on /obj
+/// Object has been affected by a cryptographic sequencer (EMAG) disabling it or causing other malicious effects
+#define EMAGGED (1<<0)
+/// Can this be bludgeoned by items
+#define CAN_BE_HIT (1<<1)
+/// Admin possession yes/no
+#define DANGEROUS_POSSESSION (1<<2)
+/// Can you customize the description/name of the thing
+#define UNIQUE_RENAME (1<<3)
+/// If it can be renamed, is its description excluded
+#define RENAME_NO_DESC (1<<4)
+/// Should this object block z falling from loc
+#define BLOCK_Z_OUT_DOWN (1<<5)
+/// Should this object block z uprise from loc
+#define BLOCK_Z_OUT_UP (1<<6)
+/// Should this object block z falling from above
+#define BLOCK_Z_IN_DOWN (1<<7)
+/// Should this object block z uprise from below
+#define BLOCK_Z_IN_UP (1<<8)
+/// Does this object prevent things from being built on it
+#define BLOCKS_CONSTRUCTION (1<<9)
+/// Does this object prevent same-direction things from being built on it
+#define BLOCKS_CONSTRUCTION_DIR (1<<10)
+/// Can we ignore density when building on this object (for example, directional windows and grilles)
+#define IGNORE_DENSITY (1<<11)
+/// Can this object conduct electricity
+#define CONDUCTS_ELECTRICITY (1<<12)
+/// Atoms don't spawn anything when deconstructed (they just vanish)
+#define NO_DEBRIS_AFTER_DECONSTRUCTION (1<<13)
+/// Flag which tells an object to hang onto an support atom on late initialize. Usefull only during mapload and supported by some atoms only
+#define MOUNT_ON_LATE_INITIALIZE (1<<14)
+
/// Flags for specifically what kind of items to get in get_equipped_items
#define INCLUDE_POCKETS (1<<0)
#define INCLUDE_ACCESSORIES (1<<1)
diff --git a/code/__defines/span.dm b/code/__defines/span.dm
index 1b41f3ca4d..446731c70e 100644
--- a/code/__defines/span.dm
+++ b/code/__defines/span.dm
@@ -163,6 +163,8 @@
#define span_lightpurple(str) ("" + str + "")
#define span_darkpink(str) ("" + str + "")
#define span_rose(str) ("" + str + "")
+#define span_hypnophrase(str) ("" + str + "")
+
/* System and Debug */
// System filter
diff --git a/code/__defines/subsystems.dm b/code/__defines/subsystems.dm
index 5fe7d4a2c3..966d9c5862 100644
--- a/code/__defines/subsystems.dm
+++ b/code/__defines/subsystems.dm
@@ -131,6 +131,7 @@
#define FIRE_PRIORITY_CHARSETUP 25
#define FIRE_PRIORITY_AIRFLOW 30
#define FIRE_PRIORITY_AIR 35
+#define FIRE_PRIORITY_BURNING 40
#define FIRE_PRIORITY_OBJ 40
#define FIRE_PRIORITY_PROCESS 45
#define FIRE_PRIORITY_THROWING 45
diff --git a/code/__defines/traits/declarations.dm b/code/__defines/traits/declarations.dm
index b305044f2a..02abee557c 100644
--- a/code/__defines/traits/declarations.dm
+++ b/code/__defines/traits/declarations.dm
@@ -57,6 +57,11 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai
#define TRAIT_ELECTROVORE_OBLIGATE "electrovore_obligate"
// adds wet stacks when licking someone
#define TRAIT_SLOBBER "slobber"
+/// Trait from being under the floor in some manner
+#define TRAIT_UNDERFLOOR "underfloor"
+#define TRAIT_RESISTHEAT "resist_heat"
+/// For when you want to be able to touch hot things, but still want fire to be an issue.
+#define TRAIT_RESISTHEATHANDS "resist_heat_handsonly"
// Owner will be considered a tiny mob for some interactions, such as airlocks not opening unless they have a client, or being vacuumed up by the vacpack
#define TRAIT_AMBIENT_PEST_MOB "ambient_pest_mob"
///Trait given by /datum/component/germ_sensitive
diff --git a/code/_onclick/click.dm b/code/_onclick/click.dm
index 5ce4dff908..0a22f5b87b 100644
--- a/code/_onclick/click.dm
+++ b/code/_onclick/click.dm
@@ -246,7 +246,7 @@
*/
/mob/proc/RangedAttack(var/atom/A, var/params)
if(!mutations.len) return
- if((LASER in mutations) && a_intent == I_HURT)
+ if((LASER_EYES in mutations) && a_intent == I_HURT)
LaserEyes(A) // moved into a proc below
else if(has_telegrip())
if(get_dist(src, A) > TK_MAXRANGE)
diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm
index d510b2a9f4..91dbd24b18 100644
--- a/code/_onclick/other_mobs.dm
+++ b/code/_onclick/other_mobs.dm
@@ -2,9 +2,6 @@
/atom/proc/attack_generic(mob/user as mob)
return 0
-/atom/proc/take_damage(var/damage)
- return 0
-
/*
Humans:
Adds an exception for gloves, to allow special glove types like the ninja ones.
@@ -47,7 +44,7 @@
if(!gloves && !mutations.len && !spitting)
return
var/obj/item/clothing/gloves/G = gloves
- if((LASER in mutations) && a_intent == I_HURT)
+ if((LASER_EYES in mutations) && a_intent == I_HURT)
LaserEyes(A) // moved into a proc below
else if(istype(G) && G.Touch(A,0)) // for magic gloves
diff --git a/code/controllers/subsystems/processing/fire_burning.dm b/code/controllers/subsystems/processing/fire_burning.dm
new file mode 100644
index 0000000000..6cde5e3c34
--- /dev/null
+++ b/code/controllers/subsystems/processing/fire_burning.dm
@@ -0,0 +1,6 @@
+/// The subsystem used to tick [/datum/component/burning] instances.
+PROCESSING_SUBSYSTEM_DEF(burning)
+ name = "Burning"
+ priority = FIRE_PRIORITY_BURNING
+ flags = SS_NO_INIT|SS_BACKGROUND
+ runlevels = RUNLEVEL_GAME | RUNLEVEL_POSTGAME
diff --git a/code/datums/components/burning.dm b/code/datums/components/burning.dm
new file mode 100644
index 0000000000..2875554d7f
--- /dev/null
+++ b/code/datums/components/burning.dm
@@ -0,0 +1,115 @@
+GLOBAL_DATUM_INIT(fire_overlay, /mutable_appearance, mutable_appearance('icons/effects/fire.dmi', "fire", appearance_flags = RESET_COLOR|KEEP_APART))
+
+/**
+ * Component representing an atom being on fire.
+ * Should not be used on mobs, they use the fire stacks status effects.
+ * Can only be used on atoms that use the integrity system.
+ */
+/datum/component/burning
+ /// Fire overlay appearance we apply
+ var/fire_overlay
+ /// Particle holder for fire particles, if any. Still utilized over shared holders because they're movable-only
+ var/obj/effect/abstract/particle_holder/particle_effect
+ /// Particle type we're using for cleaning up our shared holder
+ var/particle_type
+
+/datum/component/burning/Initialize(fire_overlay = GLOB.fire_overlay, fire_particles = /particles/smoke/burning)
+ if(!isatom(parent))
+ return COMPONENT_INCOMPATIBLE
+ var/atom/atom_parent = parent
+ if(!atom_parent.uses_integrity)
+ stack_trace("Tried to add /datum/component/burning to an atom ([atom_parent.type]) that does not use atom_integrity!")
+ return COMPONENT_INCOMPATIBLE
+
+ // only flammable atoms should have this component, but it's not really an error if we try to apply this to a non flammable one
+ if(!(atom_parent.resistance_flags & FLAMMABLE) || (atom_parent.resistance_flags & FIRE_PROOF))
+ qdel(src)
+ return
+
+ src.fire_overlay = fire_overlay
+ if (fire_particles)
+ if(ismovable(parent))
+ var/atom/movable/movable_parent = parent
+ // burning particles look pretty bad when they stack on mobs, so that behavior is not wanted for items
+ movable_parent.add_shared_particles(fire_particles, "[fire_particles]_[isitem(parent)]", isitem(parent) ? NONE : PARTICLE_ATTACH_MOB)
+ particle_type = fire_particles
+ else
+ particle_effect = new(atom_parent, fire_particles)
+ START_PROCESSING(SSburning, src)
+
+/datum/component/burning/Destroy(force)
+ STOP_PROCESSING(SSburning, src)
+ fire_overlay = null
+ if(particle_effect)
+ QDEL_NULL(particle_effect)
+ if (ismovable(parent) && particle_type)
+ var/atom/movable/movable_parent = parent
+ movable_parent.remove_shared_particles("[particle_type]_[isitem(parent)]")
+ return ..()
+
+/datum/component/burning/RegisterWithParent()
+ RegisterSignal(parent, COMSIG_ATOM_ATTACK_HAND, PROC_REF(on_attack_hand))
+ RegisterSignal(parent, COMSIG_ATOM_UPDATE_OVERLAYS, PROC_REF(on_update_overlays))
+ RegisterSignal(parent, COMSIG_ATOM_EXAMINE, PROC_REF(on_examine))
+ RegisterSignal(parent, COMSIG_ATOM_EXTINGUISH, PROC_REF(on_extinguish))
+ var/atom/atom_parent = parent
+ atom_parent.resistance_flags |= ON_FIRE
+ atom_parent.update_icon()
+
+/datum/component/burning/UnregisterFromParent()
+ UnregisterSignal(parent, list(
+ COMSIG_ATOM_ATTACK_HAND,
+ COMSIG_ATOM_UPDATE_OVERLAYS,
+ COMSIG_ATOM_EXAMINE,
+ COMSIG_ATOM_EXTINGUISH,
+ ))
+ var/atom/atom_parent = parent
+ if(!QDELETED(atom_parent))
+ atom_parent.resistance_flags &= ~ON_FIRE
+ atom_parent.update_icon()
+
+/datum/component/burning/process(seconds_per_tick)
+ var/atom/atom_parent = parent
+ // Check if the parent somehow became fireproof, remove component if so
+ if(atom_parent.resistance_flags & FIRE_PROOF)
+ atom_parent.extinguish()
+ return
+ atom_parent.take_damage(10 * seconds_per_tick, BURN, FIRE, FALSE)
+
+/// Alerts any examiners that the parent is on fire (even though it should be rather obvious)
+/datum/component/burning/proc/on_examine(atom/source, mob/user, list/examine_list)
+ SIGNAL_HANDLER
+
+ examine_list += span_danger("[source.p_Theyre()] burning!")
+
+/// Handles searing the hand of anyone who tries to touch parent without protection.
+/datum/component/burning/proc/on_attack_hand(atom/source, mob/living/carbon/user)
+ SIGNAL_HANDLER
+
+ if(!iscarbon(user) || user.can_touch_burning(source))
+ to_chat(user, span_notice("You put out the fire on [source]."))
+ source.extinguish()
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+ user.apply_damage(5, BURN, user.get_active_hand())
+ to_chat(user, span_userdanger("You burn your hand on [source]!"))
+ user.emote("scream")
+ playsound(source, 'sound/items/weapons/sear.ogg', 50, TRUE)
+ return COMPONENT_CANCEL_ATTACK_CHAIN
+
+/// Maintains the burning overlay on the parent atom
+/datum/component/burning/proc/on_update_overlays(atom/source, list/overlays)
+ SIGNAL_HANDLER
+
+ //most likely means the component is being removed
+ if(!(source.resistance_flags & ON_FIRE))
+ return
+
+ if(fire_overlay)
+ overlays += fire_overlay
+
+/// Deletes the component when the atom gets extinguished
+/datum/component/burning/proc/on_extinguish(atom/source, list/overlays)
+ SIGNAL_HANDLER
+
+ qdel(src)
diff --git a/code/defines/obj/weapon.dm b/code/defines/obj/weapon.dm
index ffe3274ee7..7565438fc2 100644
--- a/code/defines/obj/weapon.dm
+++ b/code/defines/obj/weapon.dm
@@ -73,6 +73,7 @@
w_class = ITEMSIZE_SMALL
throw_speed = 4
throw_range = 5
+ resistance_flags = FLAMMABLE
/obj/item/disk
name = "disk"
@@ -86,6 +87,7 @@
icon_state = "nucleardisk"
item_state = "card-id"
w_class = ITEMSIZE_SMALL
+ resistance_flags = INDESTRUCTIBLE | FIRE_PROOF
/*
/obj/item/game_kit
@@ -109,6 +111,7 @@
var/obj/item/gift = null
item_state = "gift"
w_class = ITEMSIZE_LARGE
+ resistance_flags = FLAMMABLE
/*/obj/item/syndicate_uplink
name = "station bounced radio"
diff --git a/code/game/atom/atom_defense.dm b/code/game/atom/atom_defense.dm
new file mode 100644
index 0000000000..8aa4a6b668
--- /dev/null
+++ b/code/game/atom/atom_defense.dm
@@ -0,0 +1,109 @@
+/atom
+ ///any atom that uses integrity and can be damaged must set this to true, otherwise the integrity procs will throw an error
+ var/uses_integrity = FALSE
+
+ VAR_PRIVATE/atom_integrity //defaults to max_integrity
+ var/max_integrity = 500
+ var/integrity_failure = 0 //0 if we have no special broken behavior, otherwise is a percentage of at what point the atom breaks. 0.5 being 50%
+ ///Damage under this value will be completely ignored
+ var/damage_deflection = 0
+
+ var/resistance_flags = NONE // INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ON_FIRE | UNACIDABLE | ACID_PROOF
+
+/// The essential proc to call when an atom must receive damage of any kind.
+/atom/proc/take_damage(damage_amount, damage_type = BRUTE, damage_flag = "", sound_effect = TRUE, attack_dir, armour_penetration = 0)
+ if(!uses_integrity)
+ CRASH("[src] had /atom/proc/take_damage() called on it without it being a type that has uses_integrity = TRUE!")
+ if(QDELETED(src))
+ CRASH("[src] taking damage after deletion")
+ if(atom_integrity <= 0)
+ CRASH("[src] taking damage while having <= 0 integrity")
+ if(sound_effect)
+ play_attack_sound(damage_amount, damage_type, damage_flag)
+ if(resistance_flags & INDESTRUCTIBLE)
+ return
+ damage_amount = run_atom_armor(damage_amount, damage_type, damage_flag, attack_dir, armour_penetration)
+ if(damage_amount < DAMAGE_PRECISION)
+ return
+ if(SEND_SIGNAL(src, COMSIG_ATOM_TAKE_DAMAGE, damage_amount, damage_type, damage_flag, sound_effect, attack_dir, armour_penetration) & COMPONENT_NO_TAKE_DAMAGE)
+ return
+
+ . = damage_amount
+
+ var/previous_atom_integrity = atom_integrity
+
+ update_integrity(atom_integrity - damage_amount)
+
+ var/integrity_failure_amount = integrity_failure * max_integrity
+
+ //BREAKING FIRST
+ if(integrity_failure && previous_atom_integrity > integrity_failure_amount && atom_integrity <= integrity_failure_amount)
+ atom_break(damage_flag)
+
+ //DESTROYING SECOND
+ if(atom_integrity <= 0 && previous_atom_integrity > 0)
+ atom_destruction(damage_flag)
+
+///the sound played when the atom is damaged.
+/atom/proc/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0)
+ switch(damage_type)
+ if(BRUTE)
+ if(damage_amount)
+ playsound(src, 'sound/items/weapons/smash.ogg', 50, TRUE)
+ else
+ playsound(src, 'sound/items/weapons/tap.ogg', 50, TRUE)
+ if(BURN)
+ playsound(src.loc, 'sound/items/tools/welder.ogg', 100, TRUE)
+
+/// Handles the integrity of an atom changing. This must be called instead of changing integrity directly.
+/atom/proc/update_integrity(new_value)
+ SHOULD_NOT_OVERRIDE(TRUE)
+ if(!uses_integrity)
+ CRASH("/atom/proc/update_integrity() was called on [src] when it doesn't use integrity!")
+ var/old_value = atom_integrity
+ new_value = max(0, new_value)
+ if(atom_integrity == new_value)
+ return
+ atom_integrity = new_value
+ on_update_integrity(old_value, new_value)
+ return new_value
+
+/// Handle updates to your atom's integrity
+/atom/proc/on_update_integrity(old_value, new_value)
+ SHOULD_NOT_SLEEP(TRUE)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_ATOM_INTEGRITY_CHANGED, old_value, new_value)
+
+/// Called after the atom takes damage and integrity is below integrity_failure level
+/atom/proc/atom_break(damage_flag)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_ATOM_BREAK, damage_flag)
+
+/// Called when integrity is repaired above the breaking point having been broken before
+/atom/proc/atom_fix()
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_ATOM_FIX)
+
+///what happens when the atom's integrity reaches zero.
+/atom/proc/atom_destruction(damage_flag)
+ SHOULD_CALL_PARENT(TRUE)
+ SEND_SIGNAL(src, COMSIG_ATOM_DESTRUCTION, damage_flag)
+
+///returns the damage value of the attack after processing the atom's various armor protections
+///Damage_flag can be any of the following: "melee" = 0, "bullet" = 0, "laser" = 0,"energy" = 0, "bomb" = 0, "bio" = 0, "rad" = 0
+///MELEE, BULLET, LASER, ENERGY, BOMB, BIO, and "rad"
+/atom/proc/run_atom_armor(damage_amount, damage_type, damage_flag = 0, attack_dir, armour_penetration = 0)
+ if(!uses_integrity)
+ CRASH("/atom/proc/run_atom_armor was called on [src] without being implemented as a type that uses integrity!")
+ if(damage_flag == MELEE && damage_amount < damage_deflection)
+ return 0
+ if(damage_type != BRUTE && damage_type != BURN)
+ return 0
+ var/armor_protection = 0
+ if(isitem(src)) //Only items have armor until we get armor datums.
+ var/obj/item/item_to_check = src
+ if(damage_flag)
+ armor_protection = item_to_check.armor[damage_flag]
+ if(armor_protection) //Only apply weak-against-armor/hollowpoint effects if there actually IS armor.
+ armor_protection = clamp(PENETRATE_ARMOUR(armor_protection, armour_penetration), min(armor_protection, 0), 100)
+ return round(damage_amount * (100 - armor_protection) * 0.01, DAMAGE_PRECISION)
diff --git a/code/game/atom/atoms_initializing_EXPENSIVE.dm b/code/game/atom/atoms_initializing_EXPENSIVE.dm
index fd5d4961a0..d94889d3bc 100644
--- a/code/game/atom/atoms_initializing_EXPENSIVE.dm
+++ b/code/game/atom/atoms_initializing_EXPENSIVE.dm
@@ -130,6 +130,9 @@
if(color)
add_atom_colour(color, FIXED_COLOUR_PRIORITY)
+ if(uses_integrity)
+ atom_integrity = max_integrity
+
/*
if (light_system == COMPLEX_LIGHT && light_power && light_range)
update_light()
diff --git a/code/game/gamemodes/cult/cultify/obj.dm b/code/game/gamemodes/cult/cultify/obj.dm
index c80aa41e37..c8860ab75c 100644
--- a/code/game/gamemodes/cult/cultify/obj.dm
+++ b/code/game/gamemodes/cult/cultify/obj.dm
@@ -109,6 +109,9 @@
new /obj/structure/simple_door/wood(loc)
..()
+/obj/structure/simple_door/wood
+ resistance_flags = FLAMMABLE
+
/obj/structure/simple_door/wood/cultify()
return
diff --git a/code/game/machinery/deployable_vr.dm b/code/game/machinery/deployable_vr.dm
index bb9fc07ed4..f772bd0c95 100644
--- a/code/game/machinery/deployable_vr.dm
+++ b/code/game/machinery/deployable_vr.dm
@@ -16,6 +16,7 @@
var/static/list/cutout_types
var/static/list/painters = list(/obj/item/reagent_containers/glass/paint, /obj/item/floor_painter)//, /obj/item/closet_painter)
+ resistance_flags = FLAMMABLE
/obj/structure/barricade/cutout/Initialize(mapload)
. = ..()
diff --git a/code/game/machinery/machinery.dm b/code/game/machinery/machinery.dm
index 1042e4b562..80512c7ec9 100644
--- a/code/game/machinery/machinery.dm
+++ b/code/game/machinery/machinery.dm
@@ -473,7 +473,7 @@ Class Procs:
A.update_desc()
A.update_icon()
M.loc = null
- M.deconstruct(src)
+ M.atom_deconstruct(TRUE, src)
qdel(src)
return 1
diff --git a/code/game/machinery/wishgranter.dm b/code/game/machinery/wishgranter.dm
index 71b9041ee5..2972b36964 100644
--- a/code/game/machinery/wishgranter.dm
+++ b/code/game/machinery/wishgranter.dm
@@ -35,7 +35,7 @@
if("Power")
to_chat(user, span_boldwarning("Your wish is granted, but at a terrible cost..."))
to_chat(user, span_warning("The Wish Granter punishes you for your selfishness, claiming your soul."))
- if (!(LASER in user.mutations))
+ if (!(LASER_EYES in user.mutations))
user.mutations.Add(LASER)
to_chat(user, span_notice("You feel pressure building behind your eyes."))
if (!(COLD_RESISTANCE in user.mutations))
diff --git a/code/game/mecha/components/_component.dm b/code/game/mecha/components/_component.dm
index e4693a62cc..3f4e694f9e 100644
--- a/code/game/mecha/components/_component.dm
+++ b/code/game/mecha/components/_component.dm
@@ -17,7 +17,7 @@
var/integrity
var/integrity_danger_mod = 0.5 // Multiplier for comparison to max_integrity before problems start.
- var/max_integrity = 100
+ max_integrity = 100
var/step_delay = 0
diff --git a/code/game/mecha/equipment/mecha_equipment.dm b/code/game/mecha/equipment/mecha_equipment.dm
index deccee9b04..e05cd04aa2 100644
--- a/code/game/mecha/equipment/mecha_equipment.dm
+++ b/code/game/mecha/equipment/mecha_equipment.dm
@@ -12,7 +12,7 @@
var/equip_ready = TRUE
var/energy_drain = 0
var/obj/mecha/chassis = null
- var/range = MELEE //bitflags
+ var/range = MECH_MELEE //bitflags
/// Bitflag. Used by exosuit fabricator to assign sub-categories based on which exosuits can equip this.
var/mech_flags = NONE
var/salvageable = TRUE
@@ -117,7 +117,7 @@
return range&RANGED
/obj/item/mecha_parts/mecha_equipment/proc/is_melee()
- return range&MELEE
+ return range&MECH_MELEE
/obj/item/mecha_parts/mecha_equipment/proc/enable_special_checks(atom/target)
if(ispath(required_type))
diff --git a/code/game/mecha/equipment/tools/catapult.dm b/code/game/mecha/equipment/tools/catapult.dm
index 7241b10daa..f4457551ae 100644
--- a/code/game/mecha/equipment/tools/catapult.dm
+++ b/code/game/mecha/equipment/tools/catapult.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_BLUESPACE = 2, TECH_MAGNET = 3)
equip_cooldown = 10
energy_drain = 100
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
var/atom/movable/locked
var/mode = 1 //1 - gravsling 2 - gravpush
diff --git a/code/game/mecha/equipment/tools/extinguisher.dm b/code/game/mecha/equipment/tools/extinguisher.dm
index 19821337de..8debd7bb6b 100644
--- a/code/game/mecha/equipment/tools/extinguisher.dm
+++ b/code/game/mecha/equipment/tools/extinguisher.dm
@@ -5,7 +5,7 @@
icon_state = "mecha_exting"
equip_cooldown = 5
energy_drain = 0
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
required_type = list(/obj/mecha/working)
var/spray_particles = 5
var/spray_amount = 5 //units of liquid per particle. 5 is enough to wet the floor - it's a big fire extinguisher, so should be fine
diff --git a/code/game/mecha/equipment/tools/generator.dm b/code/game/mecha/equipment/tools/generator.dm
index 3b8323984c..af1f77ee49 100644
--- a/code/game/mecha/equipment/tools/generator.dm
+++ b/code/game/mecha/equipment/tools/generator.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_PHORON = 2, TECH_POWER = 2, TECH_ENGINEERING = 1)
equip_cooldown = 10
energy_drain = 0
- range = MELEE
+ range = MECH_MELEE
var/coeff = 100
var/obj/item/stack/material/fuel
var/fuel_type = /obj/item/stack/material/phoron
diff --git a/code/game/mecha/equipment/tools/inflatables.dm b/code/game/mecha/equipment/tools/inflatables.dm
index 271df20146..a8b4b056ef 100644
--- a/code/game/mecha/equipment/tools/inflatables.dm
+++ b/code/game/mecha/equipment/tools/inflatables.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 3)
equip_cooldown = 3
energy_drain = 30
- range = MELEE
+ range = MECH_MELEE
equip_type = EQUIP_UTILITY
ready_sound = 'sound/effects/spray.ogg'
required_type = list(/obj/mecha/working/ripley)
diff --git a/code/game/mecha/equipment/tools/orescanner.dm b/code/game/mecha/equipment/tools/orescanner.dm
index 02018347a2..83612e1104 100644
--- a/code/game/mecha/equipment/tools/orescanner.dm
+++ b/code/game/mecha/equipment/tools/orescanner.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2)
equip_cooldown = 5
energy_drain = 30
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
equip_type = EQUIP_SPECIAL
ready_sound = 'sound/items/goggles_charge.ogg'
required_type = list(/obj/mecha/working/ripley)
diff --git a/code/game/mecha/equipment/tools/passenger.dm b/code/game/mecha/equipment/tools/passenger.dm
index d81c736a74..cb556ed390 100644
--- a/code/game/mecha/equipment/tools/passenger.dm
+++ b/code/game/mecha/equipment/tools/passenger.dm
@@ -4,7 +4,7 @@
icon_state = "mecha_passenger"
origin_tech = list(TECH_ENGINEERING = 1, TECH_BIO = 1)
energy_drain = 10
- range = MELEE
+ range = MECH_MELEE
equip_cooldown = 20
var/mob/living/carbon/occupant = null
var/door_locked = 1
diff --git a/code/game/mecha/equipment/tools/powertool.dm b/code/game/mecha/equipment/tools/powertool.dm
index 75133c798f..c1f6a95953 100644
--- a/code/game/mecha/equipment/tools/powertool.dm
+++ b/code/game/mecha/equipment/tools/powertool.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_MATERIAL = 2, TECH_MAGNET = 2, TECH_POWER = 2)
equip_cooldown = 3
energy_drain = 15
- range = MELEE
+ range = MECH_MELEE
equip_type = EQUIP_UTILITY
ready_sound = 'sound/items/Ratchet.ogg'
required_type = list(/obj/mecha/working/ripley)
diff --git a/code/game/mecha/equipment/tools/rcd.dm b/code/game/mecha/equipment/tools/rcd.dm
index f1980e079d..71e2a3a668 100644
--- a/code/game/mecha/equipment/tools/rcd.dm
+++ b/code/game/mecha/equipment/tools/rcd.dm
@@ -6,7 +6,7 @@
origin_tech = list(TECH_MATERIAL = 4, TECH_BLUESPACE = 3, TECH_MAGNET = 4, TECH_POWER = 4)
equip_cooldown = 10
energy_drain = 250
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
equip_type = EQUIP_SPECIAL
var/obj/item/rcd/electric/mounted/mecha/my_rcd = null
diff --git a/code/game/mecha/equipment/tools/sleeper.dm b/code/game/mecha/equipment/tools/sleeper.dm
index e25a834be6..06a2085343 100644
--- a/code/game/mecha/equipment/tools/sleeper.dm
+++ b/code/game/mecha/equipment/tools/sleeper.dm
@@ -5,7 +5,7 @@
icon_state = "sleeper_0"
origin_tech = list(TECH_DATA = 2, TECH_BIO = 3)
energy_drain = 20
- range = MELEE
+ range = MECH_MELEE
equip_cooldown = 30
mech_flags = EXOSUIT_MODULE_MEDICAL
var/mob/living/carbon/human/occupant = null
diff --git a/code/game/mecha/equipment/tools/syringe_gun.dm b/code/game/mecha/equipment/tools/syringe_gun.dm
index 5395401be3..10ee161b4b 100644
--- a/code/game/mecha/equipment/tools/syringe_gun.dm
+++ b/code/game/mecha/equipment/tools/syringe_gun.dm
@@ -13,7 +13,7 @@
energy_drain = 10
var/mode = 0 //0 - fire syringe, 1 - analyze reagents.
var/datum/global_iterator/mech_synth/synth
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
equip_cooldown = 10
origin_tech = list(TECH_MATERIAL = 3, TECH_BIO = 4, TECH_MAGNET = 4, TECH_DATA = 3)
required_type = list(/obj/mecha/medical)
@@ -280,7 +280,7 @@
desc = "A small shoulder-mounted dronebay containing a rapid response drone capable of moderately stabilizing a patient near the exosuit."
icon_state = "mecha_dronebay"
origin_tech = list(TECH_PHORON = 3, TECH_MAGNET = 6, TECH_BIO = 5, TECH_DATA = 4)
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
equip_cooldown = 3 SECONDS
required_type = list(/obj/mecha/medical)
@@ -496,7 +496,7 @@
origin_tech = list(TECH_MATERIAL = 5, TECH_MAGNET = 5, TECH_BIO = 5)
equip_cooldown = 5 SECONDS
energy_drain = 100
- range = MELEE
+ range = MECH_MELEE
equip_type = EQUIP_UTILITY
ready_sound = 'sound/weapons/flash.ogg'
required_type = list(/obj/mecha/medical)
diff --git a/code/game/mecha/equipment/tools/weldinglaser.dm b/code/game/mecha/equipment/tools/weldinglaser.dm
index bd30119657..58a43fc47c 100644
--- a/code/game/mecha/equipment/tools/weldinglaser.dm
+++ b/code/game/mecha/equipment/tools/weldinglaser.dm
@@ -5,7 +5,7 @@
origin_tech = list(TECH_MATERIAL = 4, TECH_MAGNET = 3, TECH_POWER = 4, TECH_PHORON = 2)
equip_cooldown = 3
energy_drain = 15
- range = MELEE
+ range = MECH_MELEE
equip_type = EQUIP_UTILITY
ready_sound = 'sound/items/Ratchet.ogg'
required_type = list(/obj/mecha/working/ripley)
@@ -27,8 +27,8 @@
..()
if(enable_special)
- range = MELEE|RANGED
+ range = MECH_MELEE|RANGED
my_tool.reach = 7
else
- range = MELEE
+ range = MECH_MELEE
my_tool.reach = 1
diff --git a/code/game/objects/effects/effect_system.dm b/code/game/objects/effects/effect_system.dm
index 9228ead42d..ab53dae46a 100644
--- a/code/game/objects/effects/effect_system.dm
+++ b/code/game/objects/effects/effect_system.dm
@@ -6,6 +6,7 @@ would spawn and follow the beaker, even if it is carried or thrown.
*/
/obj/effect
light_on = TRUE
+ uses_integrity = FALSE
/obj/effect/effect
name = "effect"
diff --git a/code/game/objects/items/devices/radio/intercom.dm b/code/game/objects/items/devices/radio/intercom.dm
index be5aec3d29..e1cd41d0db 100644
--- a/code/game/objects/items/devices/radio/intercom.dm
+++ b/code/game/objects/items/devices/radio/intercom.dm
@@ -160,7 +160,7 @@
A.anchored = TRUE
A.state = 2
A.update_icon()
- M.deconstruct(src)
+ M.atom_deconstruct(TRUE, src)
qdel(src)
else
src.attack_hand(user)
diff --git a/code/game/objects/items/stacks/tiles/tile_types.dm b/code/game/objects/items/stacks/tiles/tile_types.dm
index cba0398f89..60c3ad46ff 100644
--- a/code/game/objects/items/stacks/tiles/tile_types.dm
+++ b/code/game/objects/items/stacks/tiles/tile_types.dm
@@ -85,6 +85,7 @@
drop_sound = 'sound/items/drop/herb.ogg'
pickup_sound = 'sound/items/pickup/herb.ogg'
craftable = TRUE
+ resistance_flags = FLAMMABLE
/*
* Wood
@@ -102,6 +103,7 @@
no_variants = FALSE
drop_sound = 'sound/items/drop/wooden.ogg'
pickup_sound = 'sound/items/pickup/wooden.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/stack/tile/wood/alt
name = "wood floor tile"
@@ -396,6 +398,7 @@
no_variants = FALSE
drop_sound = 'sound/items/drop/cloth.ogg'
pickup_sound = 'sound/items/pickup/cloth.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/stack/tile/carpet/teal
desc = "A piece of teal carpet. It is the same size as a normal floor tile!"
diff --git a/code/game/objects/items/weapons/circuitboards/circuitboard.dm b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
index 8e2ea7d44d..25c0510f58 100644
--- a/code/game/objects/items/weapons/circuitboards/circuitboard.dm
+++ b/code/game/objects/items/weapons/circuitboards/circuitboard.dm
@@ -34,7 +34,7 @@
//Called when a computer is deconstructed to produce a circuitboard.
//Only used by computers, as other machines store their circuitboard instance.
-/obj/item/circuitboard/proc/deconstruct(var/obj/machinery/M)
+/obj/item/circuitboard/atom_deconstruct(disassembled = TRUE, var/obj/machinery/M)
if(istype(M, build_path))
return 1
return 0
diff --git a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
index 55b4b8f712..d50a6adb55 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/air_management.dm
@@ -25,6 +25,6 @@
if (..(C))
C.frequency = frequency
-/obj/item/circuitboard/air_management/deconstruct(var/obj/machinery/computer/general_air_control/C)
+/obj/item/circuitboard/air_management/atom_deconstruct(disassembled = TRUE, var/obj/machinery/computer/general_air_control/C)
if (..(C))
frequency = C.frequency
diff --git a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
index 04d56c9745..50441b2071 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/camera_monitor.dm
@@ -48,7 +48,7 @@
if (..(C))
C.set_network(network.Copy())
-/obj/item/circuitboard/security/deconstruct(var/obj/machinery/computer/security/C)
+/obj/item/circuitboard/security/atom_deconstruct(disassembled = TRUE, var/obj/machinery/computer/security/C)
if (..(C))
network = C.network.Copy()
diff --git a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm
index 40221f995d..48359b53e8 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/shuttle.dm
@@ -11,7 +11,7 @@
var/shuttle_tag = null // If set, link constructed console to this shuttle. If null, auto-detect.
hidden = TRUE // todo - Make properly constructable in round
-/obj/item/circuitboard/shuttle_console/deconstruct(obj/machinery/computer/shuttle_control/M)
+/obj/item/circuitboard/shuttle_console/atom_deconstruct(disassembled = TRUE, obj/machinery/computer/shuttle_control/M)
shuttle_tag = M.shuttle_tag
if(shuttle_tag)
name = T_BOARD("[shuttle_tag] control console")
diff --git a/code/game/objects/items/weapons/circuitboards/computer/supply.dm b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
index 30168a939c..7e044a3abc 100644
--- a/code/game/objects/items/weapons/circuitboards/computer/supply.dm
+++ b/code/game/objects/items/weapons/circuitboards/computer/supply.dm
@@ -17,7 +17,7 @@
if (..(SC))
SC.can_order_contraband = contraband_enabled
-/obj/item/circuitboard/supplycomp/deconstruct(var/obj/machinery/computer/supplycomp/SC)
+/obj/item/circuitboard/supplycomp/atom_deconstruct(disassembled = TRUE, var/obj/machinery/computer/supplycomp/SC)
if (..(SC))
contraband_enabled = SC.can_order_contraband
diff --git a/code/game/objects/items/weapons/gift_wrappaper.dm b/code/game/objects/items/weapons/gift_wrappaper.dm
index fcbfe2be69..5d501c65e8 100644
--- a/code/game/objects/items/weapons/gift_wrappaper.dm
+++ b/code/game/objects/items/weapons/gift_wrappaper.dm
@@ -17,6 +17,7 @@
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
///Var used for attack_hand chain.
var/special_handling = FALSE
+ resistance_flags = FLAMMABLE
/obj/item/a_gift/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/weapons/storage/bags.dm b/code/game/objects/items/weapons/storage/bags.dm
index 30de779f36..a9b72d452c 100644
--- a/code/game/objects/items/weapons/storage/bags.dm
+++ b/code/game/objects/items/weapons/storage/bags.dm
@@ -51,6 +51,7 @@
max_storage_space = ITEMSIZE_SMALL * 21
can_hold = list() // any
cant_hold = list(/obj/item/disk/nuclear)
+ resistance_flags = FLAMMABLE
/obj/item/storage/bag/trash/update_icon()
if(contents.len == 0)
@@ -68,6 +69,7 @@
origin_tech = list(TECH_BLUESPACE = 3)
max_w_class = ITEMSIZE_NORMAL
max_storage_space = ITEMSIZE_COST_NORMAL * 10 // Slightly less than BoH
+ resistance_flags = FIRE_PROOF
/obj/item/storage/bag/trash/holding/update_icon()
return
@@ -87,6 +89,7 @@
max_w_class = ITEMSIZE_SMALL
can_hold = list() // any
cant_hold = list(/obj/item/disk/nuclear)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Plant bag
@@ -100,6 +103,7 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown)
+ resistance_flags = FLAMMABLE
/obj/item/storage/bag/plants/large
name = "large plant bag"
@@ -124,6 +128,7 @@
storage_slots = 7
allow_quick_empty = 1 // this function is superceded
+ resistance_flags = FIRE_PROOF
/obj/item/storage/bag/sheetsnatcher/can_be_inserted(obj/item/W as obj, stop_messages = 0)
if(!istype(W,/obj/item/stack/material))
@@ -281,6 +286,7 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/coin,/obj/item/spacecash,/obj/item/spacecasinocash)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Chemistry Bag
@@ -294,6 +300,7 @@
w_class = ITEMSIZE_LARGE
slowdown = 1 //you probably shouldn't be running with chemicals
can_hold = list(/obj/item/reagent_containers/pill,/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/hypospray/autoinjector)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Xeno Bag
@@ -307,6 +314,7 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/slime_extract,/obj/item/slimepotion, /obj/item/reagent_containers/food/snacks/monkeycube)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Virology Bag
@@ -319,7 +327,8 @@
max_storage_space = ITEMSIZE_COST_SMALL * 12
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
- can_hold = list(/obj/item/reagent_containers/glass/beaker/vial/)
+ can_hold = list(/obj/item/reagent_containers/glass/beaker/vial)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Food Bag
@@ -333,6 +342,7 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/reagent_containers/food/snacks,/obj/item/reagent_containers/food/condiment)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Food Bag (Service Hound)
@@ -348,6 +358,7 @@
can_hold = list(/obj/item/reagent_containers/food/snacks,/obj/item/reagent_containers/food/condiment,
/obj/item/reagent_containers/glass/beaker,/obj/item/reagent_containers/glass/bottle,/obj/item/coin,/obj/item/spacecash,
/obj/item/reagent_containers/food/snacks/grown,/obj/item/seeds,/obj/item/grown,/obj/item/reagent_containers/pill)
+ resistance_flags = FIRE_PROOF
// -----------------------------
// Evidence Bag
@@ -361,6 +372,7 @@
max_w_class = ITEMSIZE_NORMAL
w_class = ITEMSIZE_SMALL
can_hold = list(/obj/item/forensics/swab,/obj/item/sample/print,/obj/item/sample/fibers,/obj/item/evidencebag)
+ resistance_flags = FLAMMABLE
// -----------------------------
// Santa bag
@@ -377,6 +389,7 @@
max_storage_space = ITEMSIZE_COST_NORMAL * 100 // can store a ton of shit!
can_hold = list() // any
cant_hold = list(/obj/item/disk/nuclear)
+ resistance_flags = FIRE_PROOF //ho ho ho
/obj/item/storage/bag/santabag/update_icon()
if(contents.len < 10)
diff --git a/code/game/objects/items/weapons/storage/boxes.dm b/code/game/objects/items/weapons/storage/boxes.dm
index 25793869b2..2713fa66a5 100644
--- a/code/game/objects/items/weapons/storage/boxes.dm
+++ b/code/game/objects/items/weapons/storage/boxes.dm
@@ -34,6 +34,7 @@
use_sound = 'sound/items/storage/box.ogg'
drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
+ resistance_flags = FLAMMABLE
// BubbleWrap - A box can be folded up to make card
/obj/item/storage/box/attack_self(mob/user)
diff --git a/code/game/objects/items/weapons/storage/internal.dm b/code/game/objects/items/weapons/storage/internal.dm
index 9d139a91c8..ded7773644 100644
--- a/code/game/objects/items/weapons/storage/internal.dm
+++ b/code/game/objects/items/weapons/storage/internal.dm
@@ -3,6 +3,7 @@
/obj/item/storage/internal
preserve_item = 1
var/obj/item/master_item
+ item_flags = ABSTRACT
/obj/item/storage/internal/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/items/weapons/storage/laundry_basket.dm b/code/game/objects/items/weapons/storage/laundry_basket.dm
index 340fb24684..b2a82ac9e9 100644
--- a/code/game/objects/items/weapons/storage/laundry_basket.dm
+++ b/code/game/objects/items/weapons/storage/laundry_basket.dm
@@ -19,6 +19,7 @@
allow_quick_gather = 1
collection_mode = 1
var/linked
+ resistance_flags = FLAMMABLE
/obj/item/storage/laundry_basket/attack_hand(mob/living/user as mob)
diff --git a/code/game/objects/items/weapons/storage/ore_bag.dm b/code/game/objects/items/weapons/storage/ore_bag.dm
index e6bf6cd975..6fef5bfbfc 100644
--- a/code/game/objects/items/weapons/storage/ore_bag.dm
+++ b/code/game/objects/items/weapons/storage/ore_bag.dm
@@ -43,19 +43,21 @@
var/last_update = 0
drop_sound = 'sound/items/drop/backpack.ogg'
pickup_sound = 'sound/items/pickup/backpack.ogg'
+ item_flags = FLAMMABLE
/obj/item/ore_bag/holding
name = "mining satchel of holding"
desc = "Like a mining satchel, but when you put your hand in, you're pretty sure you can feel time itself."
icon_state = "satchel_bspace"
max_storage_space = ITEMSIZE_COST_NORMAL * 15000 // This should never, ever, ever be reached.
+ item_flags = FIRE_PROOF
/obj/item/ore_bag/sleeper
name = "processing chamber"
desc = "A mining satchel built into a sleeper. VORE!!!"
icon_state = "satchel_bspace"
max_storage_space = 500
- //item_flags = ABSTRACT //Enable once we have abstract PR merged.
+ item_flags = INDESTRUCTIBLE | ABSTRACT
/obj/item/ore_bag/attackby(obj/item/W, mob/user)
if(current_capacity >= max_storage_space)
diff --git a/code/game/objects/items/weapons/tanks/tanks.dm b/code/game/objects/items/weapons/tanks/tanks.dm
index e97e5320b4..b807b82ec6 100644
--- a/code/game/objects/items/weapons/tanks/tanks.dm
+++ b/code/game/objects/items/weapons/tanks/tanks.dm
@@ -596,6 +596,7 @@ GLOBAL_LIST_EMPTY(tank_gauge_cache)
desc = "Used as a stand in to trigger single tank assemblies... but you shouldn't see this."
var/obj/item/tank/tank = null
var/obj/item/assembly_holder/assembly = null
+ item_flags = ABSTRACT
/obj/item/tankassemblyproxy/receive_signal() //This is mainly called by the sensor through sense() to the holder, and from the holder to here.
diff --git a/code/game/objects/mail.dm b/code/game/objects/mail.dm
index 79c769a162..2b8312e183 100644
--- a/code/game/objects/mail.dm
+++ b/code/game/objects/mail.dm
@@ -51,6 +51,7 @@
///Var for attack_self chainn
var/special_handling = FALSE
+ resistance_flags = FLAMMABLE
/obj/item/mail/container_resist(mob/living/M)
if(istype(M, /mob/living/voice)) return
diff --git a/code/game/objects/obj_defense.dm b/code/game/objects/obj_defense.dm
new file mode 100644
index 0000000000..e86384a9be
--- /dev/null
+++ b/code/game/objects/obj_defense.dm
@@ -0,0 +1,79 @@
+///Called when the obj is exposed to fire.
+/obj/fire_act(exposed_temperature, exposed_volume)
+ if(HAS_TRAIT(src, TRAIT_UNDERFLOOR))
+ return
+ var/potential_damage = 0.02 * exposed_temperature
+ if(exposed_temperature && !(resistance_flags & FIRE_PROOF) && (potential_damage > damage_deflection))
+ take_damage(clamp(potential_damage, 0, 20), BURN, FIRE, 0)
+ if(QDELETED(src)) // take_damage() can send our obj to an early grave, let's stop here if that happens
+ return
+ if(!(resistance_flags & ON_FIRE) && (resistance_flags & FLAMMABLE) && !(resistance_flags & FIRE_PROOF))
+ AddComponent(/datum/component/burning, custom_fire_overlay() || GLOB.fire_overlay, burning_particles)
+ SEND_SIGNAL(src, COMSIG_ATOM_FIRE_ACT, exposed_temperature, exposed_volume)
+ return TRUE
+ return ..()
+
+/// Returns a custom fire overlay, if any
+/obj/proc/custom_fire_overlay()
+ return custom_fire_overlay
+
+///called when the obj is destroyed by acid.
+/obj/proc/acid_melt()
+ deconstruct(FALSE)
+
+/// Should be called when the atom is destroyed by fire, comparable to acid_melt() proc
+/obj/proc/burn()
+ deconstruct(FALSE)
+
+/**
+ * Custom behaviour per atom subtype on how they should deconstruct themselves
+ * Arguments
+ *
+ * * disassembled - TRUE means we cleanly took this atom apart using tools. FALSE means this was destroyed in a violent way
+ */
+/obj/proc/atom_deconstruct(disassembled = TRUE)
+ PROTECTED_PROC(TRUE)
+
+ return
+
+/**
+ * The interminate proc between deconstruct() & atom_deconstruct(). By default this delegates deconstruction to
+ * atom_deconstruct if NO_DEBRIS_AFTER_DECONSTRUCTION is absent but subtypes can override this to handle NO_DEBRIS_AFTER_DECONSTRUCTION in their
+ * own unique way. Override this if for example you want to dump out important content like mobs from the
+ * atom before deconstruction regardless if NO_DEBRIS_AFTER_DECONSTRUCTION is present or not
+ * Arguments
+ *
+ * * disassembled - TRUE means we cleanly took this atom apart using tools. FALSE means this was destroyed in a violent way
+ */
+/obj/proc/handle_deconstruct(disassembled = TRUE)
+ SHOULD_CALL_PARENT(FALSE)
+
+ if(!(obj_flags & NO_DEBRIS_AFTER_DECONSTRUCTION))
+ atom_deconstruct(disassembled)
+
+/obj/proc/deconstruct(disassembled = TRUE)
+ SHOULD_NOT_OVERRIDE(TRUE)
+
+ //allow objects to deconstruct themselves
+ handle_deconstruct(disassembled)
+
+ //inform objects we were deconstructed
+ SEND_SIGNAL(src, COMSIG_OBJ_DECONSTRUCT, disassembled)
+
+ for(var/obj/item/item in contents)
+ if(item.item_flags & ABSTRACT)
+ continue
+ item.forceMove(get_turf(src))
+
+ //delete our self
+ qdel(src)
+
+///what happens when the obj's integrity reaches zero.
+/obj/atom_destruction(damage_flag)
+ . = ..()
+ if(damage_flag == ACID)
+ acid_melt()
+ else if(damage_flag == FIRE)
+ burn()
+ else
+ deconstruct(FALSE)
diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm
index 6dcfb46196..94be45148a 100644
--- a/code/game/objects/objs.dm
+++ b/code/game/objects/objs.dm
@@ -18,6 +18,15 @@
var/micro_target = FALSE
var/explosion_resistance
+ /// Cached custom fire overlay
+ var/custom_fire_overlay
+ /// Particles this obj uses when burning, if any
+ var/burning_particles
+
+ var/obj_flags = CAN_BE_HIT
+
+ uses_integrity = TRUE
+
/obj/Destroy()
STOP_PROCESSING(SSobj, src)
diff --git a/code/game/objects/structures/bedsheet_bin.dm b/code/game/objects/structures/bedsheet_bin.dm
index acd13bbd6c..990dda2293 100644
--- a/code/game/objects/structures/bedsheet_bin.dm
+++ b/code/game/objects/structures/bedsheet_bin.dm
@@ -20,6 +20,7 @@ LINEN BINS
pickup_sound = 'sound/items/pickup/clothing.ogg'
///var used for attack_self chain
var/special_handling = FALSE
+ resistance_flags = FLAMMABLE
/obj/item/bedsheet/Initialize(mapload)
. = ..()
diff --git a/code/game/objects/structures/bonfire.dm b/code/game/objects/structures/bonfire.dm
index 8e0ad9f162..9b8f2207e8 100644
--- a/code/game/objects/structures/bonfire.dm
+++ b/code/game/objects/structures/bonfire.dm
@@ -12,6 +12,7 @@
var/datum/material/material
var/set_temperature = T0C + 30 //K
var/heating_power = 80000
+ resistance_flags = FIRE_PROOF
/obj/structure/bonfire/Initialize(mapload, material_name)
. = ..()
@@ -170,7 +171,7 @@
START_PROCESSING(SSobj, src)
visible_message(span_warning("\The [src] starts burning!"))
-/obj/structure/bonfire/proc/burn()
+/obj/structure/bonfire/proc/burn_bonfire()
var/turf/current_location = get_turf(src)
current_location.hotspot_expose(1000, 500)
for(var/A in current_location)
@@ -225,7 +226,7 @@
extinguish()
return
if(!grill)
- burn()
+ burn_bonfire()
if(burning)
var/W = get_fuel_amount()
@@ -279,6 +280,7 @@
var/next_fuel_consumption = 0
var/set_temperature = T0C + 20 //K
var/heating_power = 40000
+ resistance_flags = FIRE_PROOF
/obj/structure/fireplace/attackby(obj/item/W, mob/user)
if(istype(W, /obj/item/stack/material/wood) || istype(W, /obj/item/stack/material/log) )
@@ -365,7 +367,7 @@
START_PROCESSING(SSobj, src)
visible_message(span_warning("\The [src] starts burning!"))
-/obj/structure/fireplace/proc/burn()
+/obj/structure/fireplace/proc/burn_bonfire()
var/turf/current_location = get_turf(src)
current_location.hotspot_expose(1000, 500)
for(var/A in current_location)
diff --git a/code/game/objects/structures/catwalk.dm b/code/game/objects/structures/catwalk.dm
index 98dff9edb3..7526b3a75b 100644
--- a/code/game/objects/structures/catwalk.dm
+++ b/code/game/objects/structures/catwalk.dm
@@ -80,7 +80,7 @@
if(Adjacent(user))
attack_hand(user)
-/obj/structure/catwalk/proc/deconstruct(mob/user)
+/obj/structure/catwalk/atom_deconstruct(disassembled = TRUE, mob/user)
playsound(src, 'sound/items/Welder.ogg', 100, 1)
to_chat(user, span_notice("Slicing \the [src] joints ..."))
//Lattice would delete itself, but let's save ourselves a new obj
@@ -97,7 +97,7 @@
if(C.has_tool_quality(TOOL_WELDER))
var/obj/item/weldingtool/WT = C.get_welder()
if(WT.isOn() && WT.remove_fuel(0, user))
- deconstruct(user)
+ atom_deconstruct(TRUE, user)
return
if(C.has_tool_quality(TOOL_CROWBAR) && plated_tile)
hatch_open = !hatch_open
diff --git a/code/game/objects/structures/gargoyle.dm b/code/game/objects/structures/gargoyle.dm
index 1ad6080fbb..4d422f9407 100644
--- a/code/game/objects/structures/gargoyle.dm
+++ b/code/game/objects/structures/gargoyle.dm
@@ -13,7 +13,7 @@
var/flapping
var/obj_integrity = 100
var/original_int = 100
- var/max_integrity = 100
+ max_integrity = 100
var/stored_examine
var/identifier = "statue"
var/material = "stone"
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 bcd6366510..3203f38651 100644
--- a/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
+++ b/code/game/objects/structures/stool_bed_chair_nest/chairs.dm
@@ -261,6 +261,7 @@
applies_material_colour = 1
var/sofa_material = MAT_CARPET
var/corner_piece = FALSE
+ resistance_flags = FLAMMABLE
/obj/structure/bed/chair/sofa/update_icon()
if(applies_material_colour && sofa_material)
diff --git a/code/game/turfs/turf.dm b/code/game/turfs/turf.dm
index b81d5683ec..9f8ef61ccd 100644
--- a/code/game/turfs/turf.dm
+++ b/code/game/turfs/turf.dm
@@ -111,6 +111,9 @@
if(Be)
Be.multiz_turf_new(src, UP)
+ if(uses_integrity)
+ atom_integrity = max_integrity
+
/turf/Destroy()
if (!changing_turf)
stack_trace("Improper turf qdel. Do not qdel turfs directly.")
diff --git a/code/modules/blob2/blobs/base_blob.dm b/code/modules/blob2/blobs/base_blob.dm
index 8ab26dd06d..6ca7f7e0f2 100644
--- a/code/modules/blob2/blobs/base_blob.dm
+++ b/code/modules/blob2/blobs/base_blob.dm
@@ -11,7 +11,7 @@ GLOBAL_LIST_EMPTY(all_blobs)
layer = MOB_LAYER + 0.1
var/integrity = 0
var/point_return = 0 //How many points the blob gets back when it removes a blob of that type. If less than 0, blob cannot be removed.
- var/max_integrity = 30
+ max_integrity = 30
var/health_regen = 2 //how much health this blob regens when pulsed
var/pulse_timestamp = 0 //we got pulsed when?
var/heal_timestamp = 0 //we got healed when?
diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm
index 8f05b052bc..e3d96ac75b 100644
--- a/code/modules/clothing/clothing.dm
+++ b/code/modules/clothing/clothing.dm
@@ -3,6 +3,7 @@
siemens_coefficient = 0.9
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
+ resistance_flags = FLAMMABLE
var/list/species_restricted = null //Only these species can wear this kit.
var/list/accessories
diff --git a/code/modules/clothing/ears/earrings.dm b/code/modules/clothing/ears/earrings.dm
index 34cadc8e0a..d870e6d171 100644
--- a/code/modules/clothing/ears/earrings.dm
+++ b/code/modules/clothing/ears/earrings.dm
@@ -3,6 +3,7 @@
name = DEVELOPER_WARNING_NAME
desc = "An earring of some kind."
icon = 'icons/inventory/ears/item.dmi'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/ears/earring/stud
name = "pearl stud earrings"
@@ -17,6 +18,7 @@
/obj/item/clothing/ears/earring/stud/wood
name = "wood stud earrings"
color = "#824b28"
+ resistance_flags = FLAMMABLE
/obj/item/clothing/ears/earring/stud/iron
name = "iron stud earrings"
diff --git a/code/modules/clothing/ears/ears.dm b/code/modules/clothing/ears/ears.dm
index cf93be8e28..eb92180f09 100644
--- a/code/modules/clothing/ears/ears.dm
+++ b/code/modules/clothing/ears/ears.dm
@@ -9,6 +9,7 @@
item_state_slots = list(slot_r_hand_str = "earmuffs", slot_l_hand_str = "earmuffs")
slot_flags = SLOT_EARS | SLOT_TWOEARS
ear_protection = 2
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/ears/earmuffs/headphones
name = "headphones"
@@ -48,6 +49,7 @@
w_class = ITEMSIZE_TINY
slot_flags = SLOT_EARS
species_restricted = list(SPECIES_SKRELL)
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/ears/skrell/chain
name = "Gold headtail chains"
diff --git a/code/modules/clothing/glasses/glasses.dm b/code/modules/clothing/glasses/glasses.dm
index c7042d7ca5..97b932fbae 100644
--- a/code/modules/clothing/glasses/glasses.dm
+++ b/code/modules/clothing/glasses/glasses.dm
@@ -29,6 +29,7 @@ BLIND // can't see anything
var/list/away_planes //Holder for disabled planes
drop_sound = 'sound/items/drop/accessory.ogg'
pickup_sound = 'sound/items/pickup/accessory.ogg'
+ resistance_flags = FIRE_PROOF
sprite_sheets = list(
SPECIES_TESHARI = 'icons/inventory/eyes/mob_teshari.dmi',
diff --git a/code/modules/clothing/gloves/arm_guards.dm b/code/modules/clothing/gloves/arm_guards.dm
index 54491de295..138943980e 100644
--- a/code/modules/clothing/gloves/arm_guards.dm
+++ b/code/modules/clothing/gloves/arm_guards.dm
@@ -7,6 +7,7 @@
w_class = ITEMSIZE_NORMAL
drop_sound = 'sound/items/drop/metalshield.ogg'
pickup_sound = 'sound/items/pickup/axe.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/arm_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE)
if(..()) //This will only run if no other problems occured when equiping.
diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm
index d69aaa853c..c2986ae002 100644
--- a/code/modules/clothing/gloves/color.dm
+++ b/code/modules/clothing/gloves/color.dm
@@ -31,6 +31,7 @@
permeability_coefficient = 0.05
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/orange
name = "orange gloves"
diff --git a/code/modules/clothing/gloves/gauntlets.dm b/code/modules/clothing/gloves/gauntlets.dm
index 7fe039ee49..3ee8a85fa7 100644
--- a/code/modules/clothing/gloves/gauntlets.dm
+++ b/code/modules/clothing/gloves/gauntlets.dm
@@ -12,6 +12,7 @@
glove_level = 3
overgloves = 1
punch_force = 5
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/gauntlets/mob_can_equip(mob/user, slot, disable_warning = FALSE)
var/mob/living/carbon/human/H = user
diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm
index 89ee70d0bd..6b165e59ca 100644
--- a/code/modules/clothing/gloves/miscellaneous.dm
+++ b/code/modules/clothing/gloves/miscellaneous.dm
@@ -20,6 +20,7 @@
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/swat
desc = "These tactical gloves are somewhat fire and impact-resistant."
@@ -30,6 +31,7 @@
permeability_coefficient = 0.05
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/combat //Combined effect of SWAT gloves and insulated gloves
desc = "These tactical gloves are somewhat fire and impact resistant."
@@ -40,6 +42,7 @@
permeability_coefficient = 0.05
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/sterile
name = "sterile gloves"
@@ -112,6 +115,7 @@
min_cold_protection_temperature = GLOVES_MIN_COLD_PROTECTION_TEMPERATURE
max_heat_protection_temperature = GLOVES_MAX_HEAT_PROTECTION_TEMPERATURE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/gloves/ranger
var/glovecolor = "white"
diff --git a/code/modules/clothing/head/collectable.dm b/code/modules/clothing/head/collectable.dm
index b171d66795..f26c000524 100644
--- a/code/modules/clothing/head/collectable.dm
+++ b/code/modules/clothing/head/collectable.dm
@@ -69,6 +69,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"
body_parts_covered = HEAD|FACE|EYES
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/collectable/slime
name = "collectable slime hat"
diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm
index 5dd877f04e..ccdda3a843 100644
--- a/code/modules/clothing/head/hardhat.dm
+++ b/code/modules/clothing/head/hardhat.dm
@@ -24,6 +24,7 @@
ear_protection = 1
drop_sound = 'sound/items/drop/helm.ogg'
pickup_sound = 'sound/items/pickup/helm.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/hardhat/orange
icon_state = "hardhat0_orange"
diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm
index 69feb2c9dc..867d41034d 100644
--- a/code/modules/clothing/head/helmet.dm
+++ b/code/modules/clothing/head/helmet.dm
@@ -14,6 +14,7 @@
ear_protection = 1
drop_sound = 'sound/items/drop/helm.ogg'
pickup_sound = 'sound/items/pickup/helm.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/helmet/solgov
name = "\improper Solar Confederate Government helmet"
diff --git a/code/modules/clothing/head/misc_special.dm b/code/modules/clothing/head/misc_special.dm
index a6d07319e4..78f759b9f3 100644
--- a/code/modules/clothing/head/misc_special.dm
+++ b/code/modules/clothing/head/misc_special.dm
@@ -32,6 +32,7 @@
drop_sound = 'sound/items/drop/helm.ogg'
pickup_sound = 'sound/items/pickup/helm.ogg'
special_handling = TRUE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/welding/attack_self(mob/user)
. = ..(user)
diff --git a/code/modules/clothing/head/pilot_helmet.dm b/code/modules/clothing/head/pilot_helmet.dm
index e658c80ad5..bdfcdf60d3 100644
--- a/code/modules/clothing/head/pilot_helmet.dm
+++ b/code/modules/clothing/head/pilot_helmet.dm
@@ -20,6 +20,7 @@
var/list/images
var/list/raw_images
var/last_status
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/pilot/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/head/pilot_helmet_vr.dm b/code/modules/clothing/head/pilot_helmet_vr.dm
index 0e5e5597b3..7305c54fe0 100644
--- a/code/modules/clothing/head/pilot_helmet_vr.dm
+++ b/code/modules/clothing/head/pilot_helmet_vr.dm
@@ -10,6 +10,7 @@
w_class = ITEMSIZE_NORMAL
actions_types = list(/datum/action/item_action/toggle_visor)
special_handling = TRUE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/head/pilot_vr/attack_self(mob/user)
. = ..(user)
diff --git a/code/modules/clothing/masks/breath.dm b/code/modules/clothing/masks/breath.dm
index 5d06eb3c49..5a1874126c 100644
--- a/code/modules/clothing/masks/breath.dm
+++ b/code/modules/clothing/masks/breath.dm
@@ -13,6 +13,7 @@
pickup_sound = 'sound/items/pickup/component.ogg'
drop_sound = 'sound/items/drop/component.ogg'
special_handling = TRUE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/breath/proc/adjust_mask(mob/user)
diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm
index 121b1485c9..b0c22eaeb6 100644
--- a/code/modules/clothing/masks/gasmask.dm
+++ b/code/modules/clothing/masks/gasmask.dm
@@ -14,6 +14,7 @@
var/list/filtered_gases = list(GAS_PHORON, GAS_N2O)
armor = list(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 75, rad = 0)
pickup_sound = 'sound/items/pickup/rubber.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/gas/filter_air(datum/gas_mixture/air)
var/datum/gas_mixture/gas_filtered = new
diff --git a/code/modules/clothing/masks/monitor.dm b/code/modules/clothing/masks/monitor.dm
index ef1656e34a..7e578ce608 100644
--- a/code/modules/clothing/masks/monitor.dm
+++ b/code/modules/clothing/masks/monitor.dm
@@ -11,6 +11,7 @@
icon_state = "monitor"
var/monitor_state_index = "blank"
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/mask/monitor/set_dir()
diff --git a/code/modules/clothing/masks/tesh_synth_facemask.dm b/code/modules/clothing/masks/tesh_synth_facemask.dm
index c28f918b6c..6e51bcc171 100644
--- a/code/modules/clothing/masks/tesh_synth_facemask.dm
+++ b/code/modules/clothing/masks/tesh_synth_facemask.dm
@@ -11,6 +11,7 @@
var/lstat
var/visor_state = "Neutral" //Separating this from lstat so that it could potentially be used for an override system or something
var/mob/living/carbon/maskmaster
+ resistance_flags = FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE | BOMB_PROOF |FREEZE_PROOF
/obj/item/clothing/mask/synthfacemask/equipped()
..()
diff --git a/code/modules/clothing/shoes/boots.dm b/code/modules/clothing/shoes/boots.dm
index dc1e57d541..81895b4bb3 100644
--- a/code/modules/clothing/shoes/boots.dm
+++ b/code/modules/clothing/shoes/boots.dm
@@ -132,6 +132,7 @@
max_heat_protection_temperature = SHOE_MAX_HEAT_PROTECTION_TEMPERATURE
snow_speed = -1
step_volume_mod = 0.8
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/boots/winter/security
name = "security winter boots"
diff --git a/code/modules/clothing/shoes/leg_guards.dm b/code/modules/clothing/shoes/leg_guards.dm
index 0b90c91654..4f713db32f 100644
--- a/code/modules/clothing/shoes/leg_guards.dm
+++ b/code/modules/clothing/shoes/leg_guards.dm
@@ -9,6 +9,7 @@
can_hold_knife = TRUE
drop_sound = 'sound/items/drop/boots.ogg'
pickup_sound = 'sound/items/pickup/boots.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/leg_guard/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE)
if(..()) //This will only run if no other problems occured when equiping.
diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm
index de0ae49d54..954ee26738 100644
--- a/code/modules/clothing/shoes/magboots.dm
+++ b/code/modules/clothing/shoes/magboots.dm
@@ -23,6 +23,7 @@
step_volume_mod = 1.3
drop_sound = 'sound/items/drop/metalboots.ogg'
pickup_sound = 'sound/items/pickup/toolbox.ogg'
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/magboots/proc/set_slowdown()
slowdown = shoes? max(SHOES_SLOWDOWN, shoes.slowdown): SHOES_SLOWDOWN //So you can't put on magboots to make you walk faster.
diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm
index f51742b6c7..05a35439cc 100644
--- a/code/modules/clothing/shoes/miscellaneous.dm
+++ b/code/modules/clothing/shoes/miscellaneous.dm
@@ -11,6 +11,7 @@
step_volume_mod = 0.5
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/shoes/mime
name = "mime shoes"
@@ -28,6 +29,7 @@
species_restricted = null
drop_sound = 'sound/items/drop/rubber.ogg'
pickup_sound = 'sound/items/pickup/rubber.ogg'
+ resistance_flags = ACID_PROOF
/obj/item/clothing/shoes/dress
name = "dress shoes"
diff --git a/code/modules/clothing/shoes/miscellaneous_vr.dm b/code/modules/clothing/shoes/miscellaneous_vr.dm
index e6a9df77f0..5ce2576482 100644
--- a/code/modules/clothing/shoes/miscellaneous_vr.dm
+++ b/code/modules/clothing/shoes/miscellaneous_vr.dm
@@ -17,6 +17,7 @@
var/recharging_rate = 60 //default 6 seconds between each dash
var/recharging_time = 0 //time until next dash
// var/jumping = FALSE //are we mid-jump? We have no throw_at callback, so we have to check user.throwing.
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/shoes/bhop/ui_action_click(mob/unused_user, actiontype)
var/mob/living/user = loc
diff --git a/code/modules/clothing/spacesuits/breaches.dm b/code/modules/clothing/spacesuits/breaches.dm
index 0aff5ee814..40089d44a9 100644
--- a/code/modules/clothing/spacesuits/breaches.dm
+++ b/code/modules/clothing/spacesuits/breaches.dm
@@ -18,6 +18,7 @@
var/brute_damage = 0 // Specifically brute damage.
var/burn_damage = 0 // Specifically burn damage.
var/base_name // Used to keep the original name safe while we apply modifiers.
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/suit/space/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/spacesuits/rig/rig.dm b/code/modules/clothing/spacesuits/rig/rig.dm
index 39ed270aaf..d8aabb6ef0 100644
--- a/code/modules/clothing/spacesuits/rig/rig.dm
+++ b/code/modules/clothing/spacesuits/rig/rig.dm
@@ -104,6 +104,7 @@
var/protean = 0
var/obj/item/storage/backpack/rig_storage
permeability_coefficient = 0 //Protect the squishies, after all this shit should be waterproof.
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/rig/Initialize(mapload)
. = ..()
diff --git a/code/modules/clothing/spacesuits/rig/rig_pieces.dm b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
index 87f68ef32a..d9150fafaa 100644
--- a/code/modules/clothing/spacesuits/rig/rig_pieces.dm
+++ b/code/modules/clothing/spacesuits/rig/rig_pieces.dm
@@ -26,6 +26,7 @@
species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJARAN, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN, SPECIES_SHADEKIN)
max_pressure_protection = null
min_pressure_protection = null
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/gloves/gauntlets/rig
name = "gauntlets"
@@ -33,10 +34,12 @@
flags = PHORONGUARD
item_flags = THICKMATERIAL
species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJARAN, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN, SPECIES_SHADEKIN)
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/shoes/magboots/rig
name = "boots"
species_restricted = list(SPECIES_HUMAN, SPECIES_SKRELL, SPECIES_TAJARAN, SPECIES_UNATHI, SPECIES_NEVREAN, SPECIES_AKULA, SPECIES_SERGAL, SPECIES_ZORREN_HIGH, SPECIES_VULPKANIN, SPECIES_PROMETHEAN, SPECIES_VOX, SPECIES_TESHARI, SPECIES_VASILISSAN, SPECIES_RAPALA, SPECIES_ALRAUNE, SPECIES_FENNEC, SPECIES_XENOHYBRID, SPECIES_ALTEVIAN, SPECIES_SHADEKIN)
icon_base = null
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/suit/space/rig
name = "chestpiece"
@@ -72,6 +75,7 @@
var/obj/item/material/knife/tacknife
max_pressure_protection = null
min_pressure_protection = null
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/suit/space/rig/attack_hand(var/mob/living/M)
if(tacknife)
@@ -126,15 +130,19 @@
name = DEVELOPER_WARNING_NAME // "mask"
body_parts_covered = HEAD|FACE|EYES
flags = THICKMATERIAL|AIRTIGHT
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/suit/lightrig
name = DEVELOPER_WARNING_NAME // "suit"
allowed = list(POCKET_GENERIC, POCKET_EMERGENCY)
flags_inv = HIDEJUMPSUIT
flags = THICKMATERIAL
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/shoes/lightrig
name = DEVELOPER_WARNING_NAME // "boots"
+ resistance_flags = FIRE_PROOF | ACID_PROOF
/obj/item/clothing/gloves/gauntlets/lightrig
flags = THICKMATERIAL
+ resistance_flags = FIRE_PROOF | ACID_PROOF
diff --git a/code/modules/clothing/spacesuits/spacesuits.dm b/code/modules/clothing/spacesuits/spacesuits.dm
index 3983caee39..cd35fd18ab 100644
--- a/code/modules/clothing/spacesuits/spacesuits.dm
+++ b/code/modules/clothing/spacesuits/spacesuits.dm
@@ -23,6 +23,7 @@
preserve_item = 1
flash_protection = FLASH_PROTECTION_MAJOR
valid_accessory_slots = null
+ resistance_flags = FIRE_PROOF | ACID_PROOF
var/obj/machinery/camera/camera
var/list/camera_networks
@@ -90,6 +91,7 @@
preserve_item = 1
valid_accessory_slots = (ACCESSORY_SLOT_OVER | ACCESSORY_SLOT_ARMBAND | ACCESSORY_SLOT_DECOR)
var/list/supporting_limbs //If not-null, automatically splints breaks. Checked when removing the suit.
+ resistance_flags = FIRE_PROOF | ACID_PROOF
//VOREStation edit start - use the specially refitted sprites by KBraid. Done this way to avoid breaking subtypes.
/obj/item/clothing/suit/space/Initialize(mapload)
diff --git a/code/modules/clothing/suits/aliens/vox.dm b/code/modules/clothing/suits/aliens/vox.dm
index 59b41a6993..cc53b4cbd6 100644
--- a/code/modules/clothing/suits/aliens/vox.dm
+++ b/code/modules/clothing/suits/aliens/vox.dm
@@ -8,3 +8,4 @@
body_parts_covered = CHEST|ARMS|LEGS
species_restricted = list(SPECIES_VOX)
siemens_coefficient = 1 //Its literally metal
+ resistance_flags = FIRE_PROOF
diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm
index d561eaa1f7..4ff2ff5c87 100644
--- a/code/modules/clothing/suits/armor.dm
+++ b/code/modules/clothing/suits/armor.dm
@@ -9,6 +9,7 @@
heat_protection = CHEST
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0.6
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/mob_can_equip(var/mob/living/carbon/human/H, slot, disable_warning = FALSE)
if(..()) //This will only run if no other problems occured when equiping.
diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm
index 45d68807d8..5ef36ce227 100644
--- a/code/modules/clothing/suits/bio.dm
+++ b/code/modules/clothing/suits/bio.dm
@@ -13,6 +13,7 @@
siemens_coefficient = 0.9
flags = PHORONGUARD
item_flags = THICKMATERIAL | ALLOW_SURVIVALFOOD
+ resistance_flags = UNACIDABLE
/obj/item/clothing/suit/bio_suit
name = "bio suit"
@@ -29,6 +30,7 @@
siemens_coefficient = 0.9
flags = PHORONGUARD
item_flags = THICKMATERIAL
+ resistance_flags = UNACIDABLE
//Standard biosuit, orange stripe
/obj/item/clothing/head/bio_hood/general
diff --git a/code/modules/clothing/suits/bio_vr.dm b/code/modules/clothing/suits/bio_vr.dm
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/code/modules/clothing/suits/hooded_vr.dm b/code/modules/clothing/suits/hooded_vr.dm
index 5735af76ea..35298a276b 100644
--- a/code/modules/clothing/suits/hooded_vr.dm
+++ b/code/modules/clothing/suits/hooded_vr.dm
@@ -21,6 +21,7 @@
armor = list(melee = 80, bullet = 50, laser = 10, energy = 0, bomb = 0, bio = 0, rad = 0)
siemens_coefficient = 2
actions_types = list(/datum/action/item_action/toggle_knight_headgear)
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/storage/hooded/knight/galahad
name = "crusader's armor"
diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm
index 830a5562cf..360dada40f 100644
--- a/code/modules/clothing/suits/reactive_armour.dm
+++ b/code/modules/clothing/suits/reactive_armour.dm
@@ -3,6 +3,7 @@
desc = "An experimental suit of armor, awaiting installation of an anomaly core."
icon_state = "reactiveoff"
w_class = ITEMSIZE_COST_LARGE
+ resistance_flags = FIRE_PROOF | UNACIDABLE
/obj/item/clothing/suit/armor/reactive_armor_shell/attackby(obj/item/I, mob/user)
. = ..()
diff --git a/code/modules/clothing/suits/shiny.dm b/code/modules/clothing/suits/shiny.dm
deleted file mode 100644
index e69de29bb2..0000000000
diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm
index d52fbcbeef..8c0a1ec48b 100644
--- a/code/modules/clothing/suits/utility.dm
+++ b/code/modules/clothing/suits/utility.dm
@@ -27,6 +27,7 @@
cold_protection = CHEST|LEGS|FEET|ARMS|HANDS
min_pressure_protection = 0.2 * ONE_ATMOSPHERE
max_pressure_protection = 20 * ONE_ATMOSPHERE
+ resistance_flags = FIRE_PROOF
/obj/item/clothing/suit/fire/firefighter
name = "firesuit"
@@ -51,6 +52,7 @@
flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|BLOCKHAIR
body_parts_covered = HEAD|FACE|EYES
siemens_coefficient = 0
+ resistance_flags = BOMB_PROOF
/obj/item/clothing/suit/bomb_suit
name = "bomb suit"
@@ -66,6 +68,7 @@
cold_protection = CHEST|LEGS|FEET|ARMS|HANDS
max_heat_protection_temperature = ARMOR_MAX_HEAT_PROTECTION_TEMPERATURE
siemens_coefficient = 0
+ resistance_flags = BOMB_PROOF
/obj/item/clothing/head/bomb_hood/security
icon_state = "bombsuitsec"
diff --git a/code/modules/examine/descriptions/items.dm b/code/modules/examine/descriptions/items.dm
index ba4410af1f..7499853b07 100644
--- a/code/modules/examine/descriptions/items.dm
+++ b/code/modules/examine/descriptions/items.dm
@@ -75,6 +75,35 @@
else
return "an average attack speed"
+/atom/proc/examine_tags()
+ var/list/info_stats = list()
+ if(abstract_type == type)
+ info_stats += span_hypnophrase("This is an abstract concept, you should report this to a strange entity called GITHUB!")
+
+ if(resistance_flags & INDESTRUCTIBLE)
+ info_stats += "It is extremely robust! It'll probably withstand anything that could happen to it!"
+ else
+ if(resistance_flags & LAVA_PROOF)
+ info_stats += span_info("It is made of an extremely heat-resistant material, it'd probably be able to withstand lava!
")
+ if(resistance_flags & (ACID_PROOF | UNACIDABLE))
+ info_stats += span_info("It looks pretty robust! It'd probably be able to withstand acid!
")
+ if(resistance_flags & FREEZE_PROOF)
+ info_stats += span_info("It is made of cold-resistant materials.
")
+ if(resistance_flags & FIRE_PROOF)
+ info_stats += span_info("It is made of fire-retardant materials.
")
+ if(resistance_flags & SHUTTLE_CRUSH_PROOF)
+ info_stats += span_info("It is extremely solid. It should be able to withstand being run over by a shuttle!
")
+ if(resistance_flags & BOMB_PROOF)
+ info_stats += span_info("It looks like it could survive an explosion!
")
+ if(resistance_flags & FLAMMABLE)
+ info_stats += span_info("It looks like it could easily catch on fire.")
+ return info_stats
+
+// if(flags_1 & HOLOGRAM_1)
+// .["holographic"] = "It looks like a hologram."
+
+ //SEND_SIGNAL(src, COMSIG_ATOM_EXAMINE_TAGS, user, .)
+
/obj/item/get_description_info(list/additional_information)
var/list/weapon_stats = list()
@@ -93,6 +122,8 @@
if(reach > 1)
weapon_stats += "It can attack targets up to [reach] tiles away, and can attack over certain objects."
+ weapon_stats += examine_tags()
+
if(weapon_stats.len < 1)
return ""
diff --git a/code/modules/food/food.dm b/code/modules/food/food.dm
index cdc1c9a0f6..90cf56f54e 100644
--- a/code/modules/food/food.dm
+++ b/code/modules/food/food.dm
@@ -14,6 +14,7 @@
var/food_can_insert_micro = FALSE
var/list/food_inserted_micros
+ resistance_flags = FLAMMABLE
/obj/item/reagent_containers/food/verb/change_name()
set name = "Rename Food"
diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm
index 9008a7521d..35c1540995 100644
--- a/code/modules/library/lib_items.dm
+++ b/code/modules/library/lib_items.dm
@@ -187,6 +187,7 @@ Book Cart End
var/special_handling = FALSE
drop_sound = 'sound/items/drop/book.ogg'
pickup_sound = 'sound/items/pickup/book.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/book/attack_self(mob/user)
. = ..(user)
diff --git a/code/modules/materials/sheets/gems.dm b/code/modules/materials/sheets/gems.dm
index 73458b44f9..ee2a06b97b 100644
--- a/code/modules/materials/sheets/gems.dm
+++ b/code/modules/materials/sheets/gems.dm
@@ -6,6 +6,7 @@
drop_sound = 'sound/items/drop/glass.ogg'
pickup_sound = 'sound/items/pickup/glass.ogg'
coin_type = /obj/item/coin/phoron
+ resistance_flags = FLAMMABLE
/obj/item/stack/material/diamond
name = MAT_DIAMOND
diff --git a/code/modules/materials/sheets/organic/textiles.dm b/code/modules/materials/sheets/organic/textiles.dm
index 090ad70123..cb41cdad15 100644
--- a/code/modules/materials/sheets/organic/textiles.dm
+++ b/code/modules/materials/sheets/organic/textiles.dm
@@ -8,6 +8,7 @@
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/leather.ogg'
pickup_sound = 'sound/items/pickup/leather.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/stack/material/cloth
name = MAT_CLOTH
@@ -19,6 +20,7 @@
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/stack/material/cloth/diyaab
color = "#c6ccf0"
@@ -34,6 +36,7 @@
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/stack/material/fiber
name = "plant fiber"
@@ -44,3 +47,4 @@
apply_colour = TRUE
drop_sound = 'sound/items/drop/clothing.ogg'
pickup_sound = 'sound/items/pickup/clothing.ogg'
+ resistance_flags = FLAMMABLE
diff --git a/code/modules/materials/sheets/plastic.dm b/code/modules/materials/sheets/plastic.dm
index 396eb7522d..d03e69bd3b 100644
--- a/code/modules/materials/sheets/plastic.dm
+++ b/code/modules/materials/sheets/plastic.dm
@@ -13,3 +13,4 @@
strict_color_stacking = TRUE
drop_sound = 'sound/items/drop/cardboardbox.ogg'
pickup_sound = 'sound/items/pickup/cardboardbox.ogg'
+ resistance_flags = FLAMMABLE
diff --git a/code/modules/mining/mine_items.dm b/code/modules/mining/mine_items.dm
index b5605143b1..e15904a0fe 100644
--- a/code/modules/mining/mine_items.dm
+++ b/code/modules/mining/mine_items.dm
@@ -162,6 +162,7 @@
icon_state = "whiteshovel"
item_state = "whiteshovel"
var/datum/material/material
+ resistance_flags = FLAMMABLE
/obj/item/shovel/wood/Initialize(mapload, var/_mat)
. = ..()
diff --git a/code/modules/mining/shelter_atoms_vr.dm b/code/modules/mining/shelter_atoms_vr.dm
index 9f9ac9126d..8e11031d9a 100644
--- a/code/modules/mining/shelter_atoms_vr.dm
+++ b/code/modules/mining/shelter_atoms_vr.dm
@@ -595,7 +595,7 @@ GLOBAL_LIST_EMPTY(unique_deployable)
var/buildstacktype = /obj/item/stack/material/steel
var/buildstackamount = 5
-/obj/structure/fans/proc/deconstruct()
+/obj/structure/fans/atom_deconstruct()
new buildstacktype(loc,buildstackamount)
qdel(src)
@@ -604,7 +604,7 @@ GLOBAL_LIST_EMPTY(unique_deployable)
user.visible_message(span_warning("[user] disassembles [src]."),
span_notice("You start to disassemble [src]..."), "You hear clanking and banging noises.")
if(do_after(user, 4 SECONDS, target = src))
- deconstruct()
+ atom_deconstruct(TRUE)
return TRUE
return TRUE
diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm
index f6137f9973..b9fc172682 100644
--- a/code/modules/mob/living/carbon/carbon.dm
+++ b/code/modules/mob/living/carbon/carbon.dm
@@ -670,3 +670,19 @@
log_admin("[key_name(usr)] has cured all traumas from [key_name(src)].")
message_admins(span_notice("[key_name_admin(usr)] has cured all traumas from [key_name_admin(src)]."))
*/
+
+/**
+ * This proc is used to determine whether or not the mob can handle touching a burning object.
+ */
+/mob/living/carbon/proc/can_touch_burning(atom/burning_atom, acid_power, acid_volume)
+ // So people can take their own clothes off
+ if((burning_atom == src) || (burning_atom.loc == src))
+ return TRUE
+ if(HAS_TRAIT(src, TRAIT_RESISTHEAT) || HAS_TRAIT(src, TRAIT_RESISTHEATHANDS))
+ return TRUE
+ if(gloves?.max_heat_protection_temperature >= BURNING_ITEM_MINIMUM_TEMPERATURE)
+ return TRUE
+ for(var/obj/item/clothing/clothing in worn_clothing)
+ if(clothing.max_heat_protection_temperature >= BURNING_ITEM_MINIMUM_TEMPERATURE && (clothing.heat_protection & HANDS) && (clothing.body_parts_covered & HANDS))
+ return TRUE
+ return FALSE
diff --git a/code/modules/mob/living/carbon/carbon_defines.dm b/code/modules/mob/living/carbon/carbon_defines.dm
index f4c229acc5..81536e60c1 100644
--- a/code/modules/mob/living/carbon/carbon_defines.dm
+++ b/code/modules/mob/living/carbon/carbon_defines.dm
@@ -32,3 +32,15 @@
//the second is the message in question.
var/last_taste_time = 0
var/last_taste_text = ""
+
+ ///only used by humans
+ var/obj/item/gloves = null
+ ///only used by humans.
+ var/obj/item/shoes = null
+ ///only used by humans.
+ var/obj/item/glasses = null
+ ///only used by humans.
+ var/obj/item/l_ear = null
+ var/obj/item/r_ear = null
+ ///Only used by humans.
+ var/list/worn_clothing = list() //Contains all CLOTHING items worn
diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm
index 47306d673f..c1fdd40da2 100644
--- a/code/modules/mob/living/carbon/human/human_defines.dm
+++ b/code/modules/mob/living/carbon/human/human_defines.dm
@@ -67,13 +67,8 @@
//Equipment slots
var/obj/item/wear_suit = null
var/obj/item/w_uniform = null
- var/obj/item/shoes = null
var/obj/item/belt = null
- var/obj/item/gloves = null
- var/obj/item/glasses = null
var/obj/item/head = null
- var/obj/item/l_ear = null
- var/obj/item/r_ear = null
var/obj/item/wear_id = null
var/obj/item/r_store = null
var/obj/item/l_store = null
diff --git a/code/modules/mob/living/carbon/human/inventory.dm b/code/modules/mob/living/carbon/human/inventory.dm
index f21aaaa077..5783a46714 100644
--- a/code/modules/mob/living/carbon/human/inventory.dm
+++ b/code/modules/mob/living/carbon/human/inventory.dm
@@ -3,9 +3,6 @@ Add fingerprints to items when we put them in our hands.
This saves us from having to call add_fingerprint() any time something is put in a human's hands programmatically.
*/
-/mob/living/carbon/human
- var/list/worn_clothing = list() //Contains all CLOTHING items worn
-
/mob/living/carbon/human/verb/quick_equip()
set name = "quick-equip"
set hidden = 1
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey.dm b/code/modules/mob/living/carbon/human/species/station/monkey.dm
index 3fe83c4974..c901dd5dd5 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey.dm
@@ -77,7 +77,7 @@
H.emote(pick("scratch","jump","roll","tail"))
// More... intense, expressions...
if(prob(5) && H.mutations.len)
- if((LASER in H.mutations))
+ if((LASER_EYES in H.mutations))
// zappy monkeys
var/list/targs = list()
for(var/atom/X in orange(7, H))
diff --git a/code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm b/code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm
index d06e73ba0b..b8fc82985d 100644
--- a/code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm
+++ b/code/modules/mob/living/carbon/human/species/station/traits/positive_genes.dm
@@ -138,7 +138,7 @@
activity_bounds = DNA_HARD_BOUNDS
hidden = TRUE // Cannot start with superpowers
- mutation = LASER
+ mutation = LASER_EYES
activation_message="Your eyes feel strange..."
/datum/trait/positive/superpower_hulk
diff --git a/code/modules/mob/living/carbon/human/update_icons.dm b/code/modules/mob/living/carbon/human/update_icons.dm
index db5b0faf85..c17e5ff373 100644
--- a/code/modules/mob/living/carbon/human/update_icons.dm
+++ b/code/modules/mob/living/carbon/human/update_icons.dm
@@ -578,7 +578,7 @@ GLOBAL_LIST_EMPTY(damage_icon_parts) //see UpdateDamageIcon()
var/image/standing = image(icon = 'icons/effects/genetics.dmi', layer = BODY_LAYER+MUTATIONS_LAYER)
for(var/mut in mutations)
- if(mut == LASER)
+ if(mut == LASER_EYES)
standing.overlays += "lasereyes_s" // Leaving this as overlays +=
overlays_standing[MUTATIONS_LAYER] = standing
diff --git a/code/modules/news/newspaper.dm b/code/modules/news/newspaper.dm
index 13b1130e15..b6fd2fdca4 100644
--- a/code/modules/news/newspaper.dm
+++ b/code/modules/news/newspaper.dm
@@ -18,6 +18,7 @@
var/scribble_page = null
drop_sound = 'sound/items/drop/wrapper.ogg'
pickup_sound = 'sound/items/pickup/wrapper.ogg'
+ resistance_flags = FLAMMABLE
/obj/item/newspaper/attack_self(mob/user)
. = ..(user)
diff --git a/code/modules/overmap/ships/engines/gas_thruster.dm b/code/modules/overmap/ships/engines/gas_thruster.dm
index 8804b70001..00e1f7d7d0 100644
--- a/code/modules/overmap/ships/engines/gas_thruster.dm
+++ b/code/modules/overmap/ships/engines/gas_thruster.dm
@@ -18,7 +18,7 @@
return nozzle.get_thrust()
/datum/ship_engine/gas_thruster/burn()
- return nozzle.burn()
+ return nozzle.thrust_burn()
/datum/ship_engine/gas_thruster/set_thrust_limit(var/new_limit)
nozzle.thrust_limit = new_limit
@@ -145,7 +145,7 @@
A = get_step(A, exhaust_dir)
return blockage
-/obj/machinery/atmospherics/unary/engine/proc/burn()
+/obj/machinery/atmospherics/unary/engine/proc/thrust_burn()
if(!is_on())
return 0
if(!check_fuel() || (use_power_oneoff(charge_per_burn) < charge_per_burn) || check_blockage())
diff --git a/code/modules/overmap/ships/engines/ion_thruster.dm b/code/modules/overmap/ships/engines/ion_thruster.dm
index 12b3aec548..39f428046c 100644
--- a/code/modules/overmap/ships/engines/ion_thruster.dm
+++ b/code/modules/overmap/ships/engines/ion_thruster.dm
@@ -17,7 +17,7 @@
return thruster.get_thrust()
/datum/ship_engine/ion/burn()
- return thruster.burn()
+ return thruster.thrust_burn()
/datum/ship_engine/ion/set_thrust_limit(var/new_limit)
thruster.thrust_limit = new_limit
@@ -69,7 +69,7 @@
if(!powered())
.+= list(list("Insufficient power to operate.", "bad"))
-/obj/machinery/ion_engine/proc/burn()
+/obj/machinery/ion_engine/proc/thrust_burn()
if(!on && !powered())
return 0
use_power_oneoff(burn_cost)
diff --git a/code/modules/overmap/ships/ship.dm b/code/modules/overmap/ships/ship.dm
index 4ce511c58f..642dd5af79 100644
--- a/code/modules/overmap/ships/ship.dm
+++ b/code/modules/overmap/ships/ship.dm
@@ -91,7 +91,7 @@
//Does actual burn and returns the resulting acceleration
/obj/effect/overmap/visitable/ship/proc/get_burn_acceleration()
- return round(burn() / get_vessel_mass(), SHIP_MOVE_RESOLUTION)
+ return round(thrust_burn() / get_vessel_mass(), SHIP_MOVE_RESOLUTION)
/obj/effect/overmap/visitable/ship/proc/get_vessel_mass()
. = vessel_mass
@@ -245,7 +245,7 @@
/obj/effect/overmap/visitable/ship/set_dir(new_dir)
return ..(NORTH) // NO! We always face north.
-/obj/effect/overmap/visitable/ship/proc/burn()
+/obj/effect/overmap/visitable/ship/proc/thrust_burn()
for(var/datum/ship_engine/E in engines)
. += E.burn()
diff --git a/code/modules/paperwork/paper.dm b/code/modules/paperwork/paper.dm
index 9bcdf2cf65..fa97592884 100644
--- a/code/modules/paperwork/paper.dm
+++ b/code/modules/paperwork/paper.dm
@@ -44,6 +44,7 @@
var/const/deffont = "Verdana"
var/const/signfont = "Times New Roman"
var/const/crayonfont = "Comic Sans MS"
+ resistance_flags = FLAMMABLE
/obj/item/paper/card
name = "blank card"
diff --git a/code/modules/paperwork/photography.dm b/code/modules/paperwork/photography.dm
index e72dab954d..4a6c4c5126 100644
--- a/code/modules/paperwork/photography.dm
+++ b/code/modules/paperwork/photography.dm
@@ -36,6 +36,7 @@ GLOBAL_VAR_INIT(photo_count, 0)
var/scribble //Scribble on the back.
var/icon/tiny
var/photo_size = 3
+ resistance_flags = FLAMMABLE
/obj/item/photo/Initialize(mapload)
. = ..()
diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm
index 4125862ffb..c9f0d677ca 100644
--- a/code/modules/reagents/reagent_containers/glass.dm
+++ b/code/modules/reagents/reagent_containers/glass.dm
@@ -20,6 +20,7 @@
drop_sound = 'sound/items/drop/bottle.ogg'
pickup_sound = 'sound/items/pickup/bottle.ogg'
description_info = "Clicking on a venomous animal (or person) with the lid closed will express their venom into the beaker!"
+ resistance_flags = ACID_PROOF
var/label_text = ""
diff --git a/code/modules/recycling/disposal_machines.dm b/code/modules/recycling/disposal_machines.dm
index 56e70b5148..9916a1c927 100644
--- a/code/modules/recycling/disposal_machines.dm
+++ b/code/modules/recycling/disposal_machines.dm
@@ -64,7 +64,7 @@
/obj/machinery/disposal/singularity_pull(S, current_size)
..()
if(current_size >= STAGE_FIVE)
- deconstruct()
+ atom_deconstruct(TRUE)
// attack by item places it in to disposal
/obj/machinery/disposal/attackby(obj/item/I, mob/user)
@@ -102,7 +102,7 @@
if(do_after(user, 2 SECONDS * W.toolspeed, target = src))
if(!src || !W.isOn()) return
to_chat(user, "You sliced the floorweld off the disposal unit.")
- deconstruct()
+ atom_deconstruct(TRUE)
return
else
to_chat(user, "You need more welding fuel to complete this task.")
@@ -584,7 +584,7 @@
// Ideally, deconstruct would be a proc on /machinery, but you cant have nice things with polaris.
// AKA: FUKKIN CHANGE THIS WHEN THAT HAPPENS!!!!!1!! pls. -Reo
-/obj/machinery/disposal/proc/deconstruct(disassembled = TRUE)
+/obj/machinery/disposal/atom_deconstruct(disassembled = TRUE)
var/turf/T = loc
/* // More nice things... Someday we'll have flags_1 and then have proper support for anything being a hologram.
if(!(flags_1 & NODECONSTRUCT_1))
diff --git a/code/modules/research/tg/machinery/destructive_analyzer.dm b/code/modules/research/tg/machinery/destructive_analyzer.dm
index 9d6372740d..8837deff5c 100644
--- a/code/modules/research/tg/machinery/destructive_analyzer.dm
+++ b/code/modules/research/tg/machinery/destructive_analyzer.dm
@@ -87,8 +87,15 @@ It is used to destroy hand-held objects and advance technological research. Used
to_chat(user, span_notice("The machine rejects \the [O]!"))
return
if(LAZYLEN(O.contents))
- to_chat(user, span_notice("The machine rejects \the [O]! You need to clear it of all items first!"))
- return
+ var/bad_item = FALSE
+ for(var/obj/item/thing in O.contents)
+ if(thing.item_flags & ABSTRACT)
+ continue
+ bad_item = TRUE
+ break
+ if(bad_item)
+ to_chat(user, span_notice("The machine rejects \the [O]! You need to clear it of all items first!"))
+ return
busy = TRUE
loaded_item = WEAKREF(O)
user.drop_item()
diff --git a/interface/stylesheet.dm b/interface/stylesheet.dm
index 5f0efdaf8c..fa8917ced5 100644
--- a/interface/stylesheet.dm
+++ b/interface/stylesheet.dm
@@ -88,6 +88,14 @@ em {font-style: normal;font-weight: bold;}
h1.alert, h2.alert {color: #000000;}
.ghostalert {color: #5c00e6; font-style: italic; font-weight: bold;}
.wingdings {font-family: Wingdings, Webdings}
+.hypnophrase {color: #3bb5d3; font-weight: bold; animation: hypnocolor 1500ms infinite; animation-direction: alternate;}
+ @keyframes hypnocolor {
+ 0% {color: #0d0d0d;}
+ 25% {color: #410194;}
+ 50% {color: #7f17d8;}
+ 75% {color: #410194;}
+ 100% {color: #3bb5d3;}
+}
/* VOREStation Edit Start */
.emote {}
diff --git a/maps/gateway_vr/wildwest.dm b/maps/gateway_vr/wildwest.dm
index 757f0939eb..88b3cb9929 100644
--- a/maps/gateway_vr/wildwest.dm
+++ b/maps/gateway_vr/wildwest.dm
@@ -50,8 +50,8 @@
if("Power")
to_chat(user, span_boldwarning("Your wish is granted, but at a terrible cost..."))
to_chat(user, span_warning("The Wish Granter punishes you for your selfishness, claiming your soul and warping your body to match the darkness in your heart."))
- if (!(LASER in user.mutations))
- user.mutations.Add(LASER)
+ if (!(LASER_EYES in user.mutations))
+ user.mutations.Add(LASER_EYES)
to_chat(user, span_notice("You feel pressure building behind your eyes."))
if (!(COLD_RESISTANCE in user.mutations))
user.mutations.Add(COLD_RESISTANCE)
diff --git a/sound/items/tools/welder.ogg b/sound/items/tools/welder.ogg
new file mode 100644
index 0000000000..3e3d4afec1
Binary files /dev/null and b/sound/items/tools/welder.ogg differ
diff --git a/sound/items/weapons/sear.ogg b/sound/items/weapons/sear.ogg
new file mode 100644
index 0000000000..da4c20abae
Binary files /dev/null and b/sound/items/weapons/sear.ogg differ
diff --git a/sound/items/weapons/smash.ogg b/sound/items/weapons/smash.ogg
new file mode 100644
index 0000000000..6bc419a1b4
Binary files /dev/null and b/sound/items/weapons/smash.ogg differ
diff --git a/sound/items/weapons/tap.ogg b/sound/items/weapons/tap.ogg
new file mode 100644
index 0000000000..f20cc0b0fa
Binary files /dev/null and b/sound/items/weapons/tap.ogg differ
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
index eda4573747..109ebebaff 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-dark.scss
@@ -982,35 +982,6 @@ img.icon.bigicon {
font-style: italic;
}
-.hypnophrase {
- color: hsl(0, 0%, 13%);
- font-weight: bold;
- animation: hypnocolor 1500ms infinite;
- animation-direction: alternate;
-}
-
-@keyframes hypnocolor {
- 0% {
- color: hsl(0, 0%, 13%);
- }
-
- 25% {
- color: hsl(266, 98%, 34%);
- }
-
- 50% {
- color: hsl(272, 86%, 60%);
- }
-
- 75% {
- color: hsl(266, 70%, 36%);
- }
-
- 100% {
- color: hsl(192, 83%, 72%);
- }
-}
-
.phobia {
color: hsl(0, 100%, 43%);
font-weight: bold;
@@ -1525,6 +1496,35 @@ $border-width-px: $border-width * 1px;
font-family: Wingdings, Webdings;
}
+.hypnophrase {
+ color: hsl(0, 0%, 12.5%);
+ font-weight: bold;
+ animation: hypnocolor 1500ms infinite;
+ animation-direction: alternate;
+}
+
+@keyframes hypnocolor {
+ 0% {
+ color: hsl(0, 0%, 12.5%);
+ }
+
+ 25% {
+ color: hsl(265.8, 97.7%, 34.1%);
+ }
+
+ 50% {
+ color: hsl(272, 86.3%, 60%);
+ }
+
+ 75% {
+ color: hsl(266.2, 69.6%, 36.1%);
+ }
+
+ 100% {
+ color: hsl(191.9, 83.4%, 71.6%);
+ }
+}
+
.rainbow {
font-family: monospace;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
index 5bc0892fe9..d54d6d1487 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-light.scss
@@ -1004,35 +1004,6 @@ h2.alert {
font-style: italic;
}
-.hypnophrase {
- color: hsl(0, 0%, 5%);
- font-weight: bold;
- animation: hypnocolor 1500ms infinite;
- animation-direction: alternate;
-}
-
-@keyframes hypnocolor {
- 0% {
- color: hsl(0, 0%, 5%);
- }
-
- 25% {
- color: hsl(266, 99%, 29%);
- }
-
- 50% {
- color: hsl(272, 81%, 47%);
- }
-
- 75% {
- color: hsl(266, 99%, 29%);
- }
-
- 100% {
- color: hsl(192, 63%, 53%);
- }
-}
-
.phobia {
color: hsl(0, 100%, 43%);
font-weight: bold;
@@ -1524,6 +1495,35 @@ $border-width-px: $border-width * 1px;
font-family: Wingdings, Webdings;
}
+.hypnophrase {
+ color: hsl(0, 0%, 5.1%);
+ font-weight: bold;
+ animation: hypnocolor 1500ms infinite;
+ animation-direction: alternate;
+}
+
+@keyframes hypnocolor {
+ 0% {
+ color: hsl(0, 0%, 5.1%);
+ }
+
+ 25% {
+ color: hsl(266.1, 98.7%, 29.2%);
+ }
+
+ 50% {
+ color: hsl(272.3, 80.8%, 46.9%);
+ }
+
+ 75% {
+ color: hsl(266.1, 98.7%, 29.2%);
+ }
+
+ 100% {
+ color: hsl(191.8, 63.3%, 52.9%);
+ }
+}
+
.rainbow {
font-family: monospace;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
index 48f1855f45..21dc3383c3 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatdark.scss
@@ -983,35 +983,6 @@ img.icon.bigicon {
font-style: italic;
}
-.hypnophrase {
- color: hsl(0, 0%, 13%);
- font-weight: bold;
- animation: hypnocolor 1500ms infinite;
- animation-direction: alternate;
-}
-
-@keyframes hypnocolor {
- 0% {
- color: hsl(0, 0%, 13%);
- }
-
- 25% {
- color: hsl(266, 98%, 34%);
- }
-
- 50% {
- color: hsl(272, 86%, 60%);
- }
-
- 75% {
- color: hsl(266, 70%, 36%);
- }
-
- 100% {
- color: hsl(192, 83%, 72%);
- }
-}
-
.phobia {
color: hsl(0, 100%, 43%);
font-weight: bold;
@@ -1526,6 +1497,35 @@ $border-width-px: $border-width * 1px;
font-family: Wingdings, Webdings;
}
+.hypnophrase {
+ color: hsl(0, 0%, 12.5%);
+ font-weight: bold;
+ animation: hypnocolor 1500ms infinite;
+ animation-direction: alternate;
+}
+
+@keyframes hypnocolor {
+ 0% {
+ color: hsl(0, 0%, 12.5%);
+ }
+
+ 25% {
+ color: hsl(265.8, 97.7%, 34.1%);
+ }
+
+ 50% {
+ color: hsl(272, 86.3%, 60%);
+ }
+
+ 75% {
+ color: hsl(266.2, 69.6%, 36.1%);
+ }
+
+ 100% {
+ color: hsl(191.9, 83.4%, 71.6%);
+ }
+}
+
.rainbow {
font-family: monospace;
font-weight: bold;
diff --git a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
index 2a69124ab6..4a3a1df438 100644
--- a/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
+++ b/tgui/packages/tgui-panel/styles/tgchat/chat-vchatlight.scss
@@ -1002,35 +1002,6 @@ h2.alert {
font-style: italic;
}
-.hypnophrase {
- color: hsl(0, 0%, 5%);
- font-weight: bold;
- animation: hypnocolor 1500ms infinite;
- animation-direction: alternate;
-}
-
-@keyframes hypnocolor {
- 0% {
- color: hsl(0, 0%, 5%);
- }
-
- 25% {
- color: hsl(266, 99%, 29%);
- }
-
- 50% {
- color: hsl(272, 81%, 47%);
- }
-
- 75% {
- color: hsl(266, 99%, 29%);
- }
-
- 100% {
- color: hsl(192, 63%, 53%);
- }
-}
-
.phobia {
color: hsl(0, 100%, 43%);
font-weight: bold;
@@ -1522,6 +1493,35 @@ $border-width-px: $border-width * 1px;
font-family: Wingdings, Webdings;
}
+.hypnophrase {
+ color: hsl(0, 0%, 5.1%);
+ font-weight: bold;
+ animation: hypnocolor 1500ms infinite;
+ animation-direction: alternate;
+}
+
+@keyframes hypnocolor {
+ 0% {
+ color: hsl(0, 0%, 5.1%);
+ }
+
+ 25% {
+ color: hsl(266.1, 98.7%, 29.2%);
+ }
+
+ 50% {
+ color: hsl(272.3, 80.8%, 46.9%);
+ }
+
+ 75% {
+ color: hsl(266.1, 98.7%, 29.2%);
+ }
+
+ 100% {
+ color: hsl(191.8, 63.3%, 52.9%);
+ }
+}
+
.rainbow {
font-family: monospace;
font-weight: bold;
diff --git a/vorestation.dme b/vorestation.dme
index 8838607a3b..48f5bc9dee 100644
--- a/vorestation.dme
+++ b/vorestation.dme
@@ -77,6 +77,7 @@
#include "code\__defines\color.dm"
#include "code\__defines\color_priority.dm"
#include "code\__defines\colorgrading.dm"
+#include "code\__defines\combat.dm"
#include "code\__defines\configuration.dm"
#include "code\__defines\construction.dm"
#include "code\__defines\construction_datum.dm"
@@ -637,6 +638,7 @@
#include "code\controllers\subsystems\xenoarch.dm"
#include "code\controllers\subsystems\processing\bellies_vr.dm"
#include "code\controllers\subsystems\processing\fastprocess.dm"
+#include "code\controllers\subsystems\processing\fire_burning.dm"
#include "code\controllers\subsystems\processing\instruments.dm"
#include "code\controllers\subsystems\processing\obj.dm"
#include "code\controllers\subsystems\processing\obj_tab_items.dm"
@@ -690,6 +692,7 @@
#include "code\datums\cinematics\malf_doomsday.dm"
#include "code\datums\cinematics\nuke_cinematics.dm"
#include "code\datums\components\_component.dm"
+#include "code\datums\components\burning.dm"
#include "code\datums\components\connect_containers.dm"
#include "code\datums\components\connect_loc_behalf.dm"
#include "code\datums\components\connect_mob_behalf.dm"
@@ -1091,6 +1094,7 @@
#include "code\game\area\Space Station 13 areas_vr.dm"
#include "code\game\area\ss13_deprecated_areas.dm"
#include "code\game\atom\_atom.dm"
+#include "code\game\atom\atom_defense.dm"
#include "code\game\atom\atom_vv.dm"
#include "code\game\atom\atoms_initializing_EXPENSIVE.dm"
#include "code\game\dna\dna2.dm"
@@ -1539,6 +1543,7 @@
#include "code\game\objects\micro_event.dm"
#include "code\game\objects\micro_structures.dm"
#include "code\game\objects\mob_spawner_vr.dm"
+#include "code\game\objects\obj_defense.dm"
#include "code\game\objects\objs.dm"
#include "code\game\objects\structures.dm"
#include "code\game\objects\stumble_into_vr.dm"
@@ -2684,7 +2689,6 @@
#include "code\modules\clothing\suits\armor.dm"
#include "code\modules\clothing\suits\armor_vr.dm"
#include "code\modules\clothing\suits\bio.dm"
-#include "code\modules\clothing\suits\bio_vr.dm"
#include "code\modules\clothing\suits\explorer.dm"
#include "code\modules\clothing\suits\hooded.dm"
#include "code\modules\clothing\suits\hooded_vr.dm"