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"