From 13a323006726d411a3fd9ff1b49c43dfb944c52b Mon Sep 17 00:00:00 2001 From: PowerfulBacon <26465327+PowerfulBacon@users.noreply.github.com> Date: Tue, 16 Jul 2024 12:56:13 +0100 Subject: [PATCH] Updates bleeding (#10372) * Bleeding Update * Changes bleeding effects * Fixes some bleeding issues * Fixes blood calculation * Polishes the hold wounds button * Adds an indicator to how deadly it is * Moves the examine message * Adds cauterisation surgery * Fixes the examine message * Removes the screaming and updates the icons * Update code/controllers/subsystem/early_assets.dm * Fixes de-sword keeping bleed damage when unwielded * Adds in bleeding to the armour readouts * Fixes the examine message * Blood update * Adds some bleed armour to some things that really should have it * Fixes compilation * Uses maths to decrease the bleed rate as your blood pressure lowers, and when your heart stops beating * Merge conflict resolution * Bleeding stuff * Fixes cauterising wounds * Fixes * Bandages disappear when you stop bleeding * Removes bleeding from toy de-sword, adds minor bleeding to toy katana Co-Authored-By: BlueHNT <79374236+BlueHNT@users.noreply.github.com> * Updates how bandaging works, makes bleeding status effect reactive * Nerfs heparin * Fixes mime gun causing bleeding * Reduces the amount of bleed damage caused by cult * Adds a maximum bleed rate * Medical scanners report bleed rate * Restorative nanites now restore blood * Changes how death works * Nukie stims prevent bleeding * Fixes compilation * Syndicate reagents now regenerate blood * Shotgun pellets deal less bleed damage * Fixes blooD calculation * Changes the equation * Updates cauterisation, adds overhead messages to healing items * Update carbon_defense.dm * Fixes blood damage doing nothing * Fixes the player not dying when they have no blood * Fixes some minor bugs with medical items * Unholy water now provides bleed immunity * Update code/__DEFINES/mobs.dm Co-authored-by: EvilDragonfiend <87972842+EvilDragonfiend@users.noreply.github.com> * Update code/modules/mob/living/blood.dm Co-authored-by: EvilDragonfiend <87972842+EvilDragonfiend@users.noreply.github.com> * Adds IPC bleeding and cleans some code up * Fixes IPCs taking infinite damage from no coolant * Status effect merging * Bleed merging and reduces bleed rate of rubbershot * Fixes bleeding status effect having invalid status type * Update blood.dm * Abductor teleporter now heals all wounds * Arglist change that was lost during merge deconflict * Doubles the capacity of bloodbags * Shows compatible blood types on the analyser * Update scanners.dm * Adds compatible to the analyser * Update code/modules/clothing/under/_under.dm * Simplemobs can now cause bleeding with melee attacks * Makes big amounts of blood appear more frequently * Bleed anomaly * Fixes blood anomaly * Blood anomaly properly deletes itself * Reactive armour and bleed anomaly fixes * Ashwalkers will now heal bleeding naturally * fixes golems bleeding for a single tick * Review updates * Stops bleeding while you are lying on operating tables * Fixes people cheesing the anomaly * Fixes erronous bleeding on projectiles * Fixes surgery not always fixing bleeding * Lowers bleeding on glass shards * Reduces bleed damage on non lethal rounds * Update blood.dm * Update code/game/objects/effects/anomalies/anomaly_bleed.dm * Shuffles the player list --------- Co-authored-by: BlueHNT <79374236+BlueHNT@users.noreply.github.com> Co-authored-by: EvilDragonfiend <87972842+EvilDragonfiend@users.noreply.github.com> --- beestation.dme | 3 + code/__DEFINES/combat.dm | 2 + .../dcs/signals/signals_mob/signals_living.dm | 2 + code/__DEFINES/mobs.dm | 19 + code/__DEFINES/status_effects.dm | 3 + code/__DEFINES/traits.dm | 6 + code/_onclick/other_mobs.dm | 4 - code/datums/armor.dm | 27 +- code/datums/components/butchering.dm | 2 +- code/datums/components/caltrop.dm | 1 + code/datums/components/cult_ritual_item.dm | 3 + code/datums/components/pellet_cloud.dm | 6 +- code/datums/components/twohanded.dm | 2 +- .../diseases/advance/symptoms/flesh_eating.dm | 3 +- code/datums/diseases/advance/symptoms/heal.dm | 20 +- code/datums/helper_datums/teleport.dm | 1 + code/datums/martial/krav_maga.dm | 2 +- code/datums/martial/tribal_claw.dm | 2 +- code/datums/status_effects/debuffs.dm | 4 +- code/datums/status_effects/status_effect.dm | 7 + code/datums/traits/negative_quirk.dm | 2 +- .../game/gamemodes/clown_ops/clown_weapons.dm | 6 +- code/game/gamemodes/gangs/dominator.dm | 2 +- code/game/machinery/_machinery.dm | 2 +- code/game/machinery/ai_slipper.dm | 2 +- code/game/machinery/airlock_cycle_control.dm | 2 +- code/game/machinery/buttons.dm | 2 +- code/game/machinery/camera/camera.dm | 2 +- code/game/machinery/computer/_computer.dm | 2 +- code/game/machinery/doors/airlock_types.dm | 4 +- code/game/machinery/doors/door.dm | 2 +- code/game/machinery/doors/firedoor.dm | 2 +- code/game/machinery/doors/poddoor.dm | 2 +- code/game/machinery/doors/windowdoor.dm | 4 +- code/game/machinery/firealarm.dm | 2 +- code/game/machinery/hologram.dm | 2 +- code/game/machinery/igniter.dm | 2 +- code/game/machinery/navbeacon.dm | 2 +- .../machinery/porta_turret/portable_turret.dm | 4 +- code/game/machinery/requests_console.dm | 2 +- code/game/machinery/shuttle/shuttle_heater.dm | 2 +- code/game/machinery/spaceheater.dm | 2 +- .../telecomms/machines/message_server.dm | 2 +- .../effects/anomalies/anomaly_bleed.dm | 61 +++ code/game/objects/items/RCD.dm | 2 +- code/game/objects/items/RPD.dm | 2 +- code/game/objects/items/RSF.dm | 2 +- code/game/objects/items/cards_ids.dm | 4 +- code/game/objects/items/chainsaw.dm | 1 + code/game/objects/items/cosmetics.dm | 11 +- code/game/objects/items/crab17.dm | 2 +- code/game/objects/items/debug_items.dm | 2 +- code/game/objects/items/defib.dm | 2 +- .../objects/items/deployable/barricade.dm | 2 +- .../items/devices/forcefieldprojector.dm | 2 +- code/game/objects/items/devices/scanners.dm | 13 +- code/game/objects/items/dualsaber.dm | 4 +- code/game/objects/items/fireaxe.dm | 3 +- code/game/objects/items/handcuffs.dm | 2 +- code/game/objects/items/holy_weapons.dm | 9 + code/game/objects/items/kitchen.dm | 2 +- code/game/objects/items/knives.dm | 3 +- code/game/objects/items/manuals.dm | 2 +- code/game/objects/items/melee/energy.dm | 6 +- code/game/objects/items/melee/misc.dm | 2 + code/game/objects/items/melee/transforming.dm | 4 + code/game/objects/items/mop.dm | 1 + code/game/objects/items/pitchfork.dm | 3 +- code/game/objects/items/pneumaticCannon.dm | 2 +- code/game/objects/items/powerfist.dm | 2 +- code/game/objects/items/religion.dm | 43 +-- code/game/objects/items/robot/robot_items.dm | 2 + code/game/objects/items/sharpener.dm | 1 + code/game/objects/items/shrapnel.dm | 2 + code/game/objects/items/singularityhammer.dm | 2 +- code/game/objects/items/spear.dm | 4 +- code/game/objects/items/stacks/medical.dm | 64 ++- .../items/stacks/sheets/mineral/glass.dm | 15 +- .../items/stacks/sheets/mineral/metals.dm | 2 +- .../items/stacks/sheets/organic/wood.dm | 4 +- code/game/objects/items/storage/backpack.dm | 4 +- code/game/objects/items/stunbaton.dm | 2 +- code/game/objects/items/tanks/tanks.dm | 4 +- code/game/objects/items/tanks/watertank.dm | 2 +- code/game/objects/items/teleportation.dm | 2 +- code/game/objects/items/tools/crowbar.dm | 2 +- code/game/objects/items/tools/powertools.dm | 2 +- code/game/objects/items/tools/screwdriver.dm | 2 +- code/game/objects/items/tools/weldingtool.dm | 2 +- code/game/objects/items/tools/wirecutters.dm | 2 +- code/game/objects/items/tools/wrench.dm | 2 +- code/game/objects/items/toys.dm | 8 + code/game/objects/items/vending_items.dm | 2 +- code/game/objects/items/weaponry.dm | 18 +- code/game/objects/objs.dm | 2 + code/game/objects/structures.dm | 2 +- code/game/objects/structures/barsigns.dm | 2 +- .../structures/crates_lockers/closets.dm | 3 +- .../closets/secure/secure_closets.dm | 2 +- .../crates_lockers/crates/secure.dm | 2 +- code/game/objects/structures/displaycase.dm | 2 +- code/game/objects/structures/fireaxe.dm | 2 +- code/game/objects/structures/grille.dm | 2 +- code/game/objects/structures/holosign.dm | 2 +- code/game/objects/structures/lattice.dm | 2 +- code/game/objects/structures/mineral_doors.dm | 2 +- .../objects/structures/petrified_statue.dm | 3 +- code/game/objects/structures/plasticflaps.dm | 2 +- code/game/objects/structures/signs/_signs.dm | 2 +- code/game/objects/structures/tables_racks.dm | 44 ++- code/game/objects/structures/window.dm | 16 +- code/game/shuttle_engines.dm | 2 +- code/game/turfs/closed/wall/reinf_walls.dm | 2 +- .../abductor/equipment/abduction_gear.dm | 8 +- .../abductor/machinery/experiment.dm | 1 + .../antagonists/blob/structures/_blob.dm | 2 +- .../antagonists/blob/structures/core.dm | 2 +- .../antagonists/blob/structures/node.dm | 2 +- .../antagonists/blob/structures/shield.dm | 2 +- .../changeling/powers/mutations.dm | 9 +- .../antagonists/clock_cult/clockwork_turfs.dm | 2 +- .../clock_cult/items/brass_clothing.dm | 10 +- .../clock_cult/items/clockwork_weapon.dm | 1 + .../scriptures/abstraction_crystal.dm | 2 +- .../clock_cult/scriptures/ocular_warden.dm | 2 +- .../clock_cult/traps/receivers/skewer.dm | 5 +- code/modules/antagonists/cult/blood_magic.dm | 3 +- code/modules/antagonists/cult/cult_items.dm | 18 +- .../antagonists/cult/cult_structures.dm | 4 +- .../heretic/items/heretic_armor.dm | 6 +- .../heretic/items/heretic_blades.dm | 1 + .../heretic/knowledge/flesh_lore.dm | 2 +- .../antagonists/heretic/magic/blood_cleave.dm | 2 +- .../heretic/structures/carving_knife.dm | 1 + .../nukeop/equipment/nuclearbomb.dm | 2 +- .../antagonists/space_dragon/carp_rift.dm | 2 +- code/modules/assembly/signaler.dm | 6 + .../atmospherics/machinery/airalarm.dm | 2 +- .../atmospherics/machinery/atmosmachinery.dm | 2 +- .../components/unary_devices/cryo.dm | 2 +- .../components/unary_devices/thermomachine.dm | 2 +- .../atmospherics/machinery/other/meter.dm | 2 +- .../machinery/portable/canister.dm | 2 +- .../portable/portable_atmospherics.dm | 2 +- .../awaymissions/mission_code/snowdin.dm | 2 +- code/modules/cargo/supplypod.dm | 2 +- code/modules/clothing/chameleon.dm | 22 +- code/modules/clothing/clothing.dm | 4 +- code/modules/clothing/glasses/_glasses.dm | 8 +- code/modules/clothing/glasses/hud.dm | 1 + code/modules/clothing/gloves/color.dm | 2 +- code/modules/clothing/gloves/miscellaneous.dm | 6 +- code/modules/clothing/head/beanie.dm | 2 +- code/modules/clothing/head/hardhat.dm | 2 +- code/modules/clothing/head/helmet.dm | 34 +- code/modules/clothing/head/jobs.dm | 50 +-- code/modules/clothing/head/soft_caps.dm | 2 +- code/modules/clothing/masks/gasmask.dm | 4 +- code/modules/clothing/masks/hailer.dm | 2 +- code/modules/clothing/masks/miscellaneous.dm | 2 +- code/modules/clothing/shoes/magboots.dm | 2 +- code/modules/clothing/shoes/miscellaneous.dm | 6 +- .../clothing/spacesuits/_spacesuits.dm | 4 +- .../modules/clothing/spacesuits/chronosuit.dm | 4 +- code/modules/clothing/spacesuits/hardsuit.dm | 86 ++--- .../clothing/spacesuits/miscellaneous.dm | 36 +- code/modules/clothing/spacesuits/plasmamen.dm | 14 +- code/modules/clothing/spacesuits/syndi.dm | 4 +- code/modules/clothing/suits/_suits.dm | 2 +- code/modules/clothing/suits/armor.dm | 33 +- code/modules/clothing/suits/bio.dm | 8 +- code/modules/clothing/suits/chaplainsuits.dm | 38 ++ code/modules/clothing/suits/cloaks.dm | 12 +- code/modules/clothing/suits/jobs.dm | 6 +- code/modules/clothing/suits/labcoat.dm | 4 +- .../modules/clothing/suits/reactive_armour.dm | 34 +- code/modules/clothing/suits/utility.dm | 10 +- code/modules/clothing/suits/wiz_robe.dm | 16 +- code/modules/clothing/under/_under.dm | 2 +- code/modules/clothing/under/accessories.dm | 6 +- code/modules/clothing/under/color.dm | 4 +- code/modules/clothing/under/costume.dm | 2 +- .../under/jobs/Plasmaman/engineering.dm | 2 +- .../clothing/under/jobs/Plasmaman/security.dm | 4 +- .../clothing/under/jobs/civilian/civilian.dm | 2 +- code/modules/clothing/under/jobs/command.dm | 2 +- .../clothing/under/jobs/engineering.dm | 6 +- code/modules/clothing/under/jobs/medical.dm | 14 +- code/modules/clothing/under/jobs/rnd.dm | 8 +- code/modules/clothing/under/jobs/security.dm | 7 +- code/modules/clothing/under/miscellaneous.dm | 2 +- code/modules/clothing/under/syndicate.dm | 8 +- code/modules/clothing/under/trek.dm | 2 +- code/modules/events/anomaly_blood.dm | 14 + code/modules/events/holiday/xmas.dm | 6 +- .../food_and_drinks/drinks/drinks/bottle.dm | 1 + .../holoparasite/abilities/major/healing.dm | 2 +- .../holoparasite/abilities/weapon/stab.dm | 12 +- code/modules/hydroponics/hydroitemdefines.dm | 1 + code/modules/library/lib_items.dm | 2 +- .../modules/mining/equipment/explorer_gear.dm | 10 +- .../mining/equipment/kinetic_crusher.dm | 1 + .../mining/equipment/marker_beacons.dm | 2 +- .../mining/lavaland/necropolis_chests.dm | 3 + code/modules/mob/living/blood.dm | 364 +++++++++++++++--- .../mob/living/carbon/carbon_defense.dm | 61 +++ .../mob/living/carbon/human/examine.dm | 19 +- .../mob/living/carbon/human/human_defense.dm | 45 +-- .../mob/living/carbon/human/human_defines.dm | 1 - .../mob/living/carbon/human/species.dm | 80 ++-- .../living/carbon/human/species_types/IPC.dm | 42 +- .../carbon/human/species_types/golems.dm | 2 +- .../human/species_types/lizardpeople.dm | 6 + .../human/species_types/shadowpeople.dm | 1 + .../carbon/human/species_types/snail.dm | 2 +- code/modules/mob/living/living.dm | 3 +- .../simple_animal/hostile/cat_butcher.dm | 4 +- .../hostile/mining_mobs/elites/elite.dm | 2 +- .../simple_animal/hostile/space_dragon.dm | 2 +- code/modules/mob/mob_helpers.dm | 10 +- .../computers/item/computer.dm | 2 +- code/modules/ninja/energy_katana.dm | 1 + code/modules/ninja/suit/head.dm | 2 +- code/modules/ninja/suit/shoes.dm | 2 +- code/modules/ninja/suit/suit.dm | 2 +- code/modules/paperwork/pen.dm | 3 + code/modules/power/apc/apc_main.dm | 2 +- .../modules/power/lighting/light_construct.dm | 2 +- .../power/singularity/field_generator.dm | 2 +- .../particle_accelerator.dm | 2 +- code/modules/projectiles/guns/magic/staff.dm | 1 + .../modules/projectiles/projectile/bullets.dm | 1 + .../projectile/bullets/dart_syringe.dm | 1 + .../projectile/bullets/dnainjector.dm | 1 + .../projectiles/projectile/bullets/grenade.dm | 1 + .../projectile/bullets/revolver.dm | 2 + .../projectiles/projectile/bullets/shotgun.dm | 5 + .../projectiles/projectile/bullets/smg.dm | 1 + .../projectiles/projectile/bullets/special.dm | 2 + .../projectile/reusable/foam_dart.dm | 1 + .../chemistry/reagents/medicine_reagents.dm | 21 +- .../chemistry/reagents/other_reagents.dm | 6 + .../chemistry/reagents/toxin_reagents.dm | 3 +- .../reagents/reagent_containers/blood_pack.dm | 6 +- .../reagents/reagent_containers/glass.dm | 2 +- code/modules/recycling/disposal/bin.dm | 2 +- code/modules/recycling/disposal/pipe.dm | 2 +- .../xenobiology/crossbreeding/_misc.dm | 2 +- .../xenobiology/crossbreeding/_weapons.dm | 2 +- .../xenobiology/crossbreeding/warping.dm | 2 +- .../modules/ruins/lavalandruin_code/puzzle.dm | 2 +- .../shuttle_creation/shuttle_creator.dm | 2 +- code/modules/surgery/amputation.dm | 2 +- .../surgery/bodyparts/dismemberment.dm | 6 +- code/modules/surgery/cauterize.dm | 15 + code/modules/surgery/coronary_bypass.dm | 8 +- code/modules/surgery/dental_implant.dm | 1 + code/modules/surgery/mechanic_steps.dm | 4 + code/modules/surgery/organic_steps.dm | 5 +- code/modules/surgery/organs/vocal_cords.dm | 2 +- .../modules/surgery/prosthetic_replacement.dm | 5 + .../modules/surgery/remove_embedded_object.dm | 1 + code/modules/surgery/tools.dm | 7 +- code/modules/vehicles/_vehicle.dm | 2 +- code/modules/vehicles/atv.dm | 2 +- code/modules/vehicles/cars/clowncar.dm | 2 +- code/modules/vehicles/mecha/combat/combat.dm | 2 +- code/modules/vehicles/mecha/combat/durand.dm | 2 +- code/modules/vehicles/mecha/combat/gygax.dm | 4 +- code/modules/vehicles/mecha/combat/honker.dm | 2 +- .../modules/vehicles/mecha/combat/marauder.dm | 2 +- code/modules/vehicles/mecha/combat/phazon.dm | 2 +- .../vehicles/mecha/combat/reticence.dm | 2 +- code/modules/vehicles/mecha/working/ripley.dm | 6 +- code/modules/vehicles/secway.dm | 2 +- code/modules/vehicles/wheelchair.dm | 2 +- code/modules/vending/_vending.dm | 2 +- code/modules/vending/liberation.dm | 2 +- code/modules/vending/liberation_toy.dm | 2 +- code/modules/vending/magivend.dm | 2 +- code/modules/vending/medical.dm | 2 +- code/modules/vending/medical_wall.dm | 2 +- code/modules/vending/toys.dm | 2 +- code/modules/vending/youtool.dm | 2 +- .../traits/xenoartifact_minors.dm | 1 + icons/effects/effects.dmi | Bin 849722 -> 851810 bytes icons/mob/screen_alert.dmi | Bin 123162 -> 126146 bytes icons/obj/items_and_weapons.dmi | Bin 112786 -> 113340 bytes sound/surgery/blood_wound.ogg | Bin 0 -> 18390 bytes sound/weapons/shrapnel.ogg | Bin 0 -> 8027 bytes 290 files changed, 1424 insertions(+), 726 deletions(-) create mode 100644 code/game/objects/effects/anomalies/anomaly_bleed.dm create mode 100644 code/modules/events/anomaly_blood.dm create mode 100644 code/modules/surgery/cauterize.dm create mode 100644 sound/surgery/blood_wound.ogg create mode 100644 sound/weapons/shrapnel.ogg diff --git a/beestation.dme b/beestation.dme index e0ceebbffefd6..09de9e7ffac6c 100644 --- a/beestation.dme +++ b/beestation.dme @@ -1229,6 +1229,7 @@ #include "code\game\objects\effects\step_triggers.dm" #include "code\game\objects\effects\wanted_poster.dm" #include "code\game\objects\effects\anomalies\_anomalies.dm" +#include "code\game\objects\effects\anomalies\anomaly_bleed.dm" #include "code\game\objects\effects\anomalies\anomaly_bluespace.dm" #include "code\game\objects\effects\anomalies\anomaly_delimber.dm" #include "code\game\objects\effects\anomalies\anomaly_flux.dm" @@ -2542,6 +2543,7 @@ #include "code\modules\events\alien_infestation.dm" #include "code\modules\events\anomaly.dm" #include "code\modules\events\anomaly_bioscrambler.dm" +#include "code\modules\events\anomaly_blood.dm" #include "code\modules\events\anomaly_bluespace.dm" #include "code\modules\events\anomaly_flux.dm" #include "code\modules\events\anomaly_grav.dm" @@ -3960,6 +3962,7 @@ #include "code\modules\surgery\anesthetic_machine.dm" #include "code\modules\surgery\blood_filter.dm" #include "code\modules\surgery\brain_recalibration.dm" +#include "code\modules\surgery\cauterize.dm" #include "code\modules\surgery\cavity_implant.dm" #include "code\modules\surgery\core_removal.dm" #include "code\modules\surgery\coronary_bypass.dm" diff --git a/code/__DEFINES/combat.dm b/code/__DEFINES/combat.dm index dabb8ba8f6337..115a2cf52f294 100644 --- a/code/__DEFINES/combat.dm +++ b/code/__DEFINES/combat.dm @@ -42,6 +42,8 @@ #define MELEE "melee" /// Involves magic. #define MAGIC "magic" +/// Bleed prevention +#define BLEED "bleed" /* /// Involved in checking the likelihood of applying a wound to a mob. diff --git a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm index b9c1e57d83d5a..6cf54105127f3 100644 --- a/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm +++ b/code/__DEFINES/dcs/signals/signals_mob/signals_living.dm @@ -25,6 +25,8 @@ #define COMSIG_LIVING_DEATH "living_death" /// from base of mob/living/updatehealth(): () #define COMSIG_LIVING_UPDATE_HEALTH "living_update_health" +/// Called when a living mob has its resting updated: (resting_state) +#define COMSIG_LIVING_RESTING_UPDATED "resting_updated" /// from /datum/component/singularity/proc/can_move(), as well as /obj/anomaly/energy_ball/proc/can_move() /// if a callback returns `SINGULARITY_TRY_MOVE_BLOCK`, then the singularity will not move to that turf diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 651d5cbf9e3b7..d76313c7d350f 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -17,6 +17,23 @@ #define MOVE_INTENT_WALK "walk" #define MOVE_INTENT_RUN "run" +// Bleed rates +// See blood.dm for calculations +#define BLEED_RATE_MINOR 2.4 /// Point at which bleeding is considered minor and will eventually self-heal +#define BLEED_HEAL_RATE_MINOR 0.02 /// How quickly minor bleeds will stop bleeding (0.05/sec) +#define MAX_BLEED_RATE 3 /// Mobs can get more bleed than this, but won't actually bleed faster than this value + +// Bleed damage values +#define BLEED_TINY 0.1 +#define BLEED_SCRATCH 0.8 +#define BLEED_SURFACE 1.5 // 560 > 506 blood in 75 seconds +#define BLEED_CUT 2.3 // 560 > 442 blood ni 115 seconds +#define BLEED_DEEP_WOUND 2.4 // Crit in 285 seconds, Death in 356 seconds +#define BLEED_CRITICAL 3.6 // Crit in 190 seconds, Death in 238 seconds + +#define BLEED_RATE_MULTIPLIER 1 /// How quickly do we bleed out? A value of 1 means that if we have a bleed rate of 10, then we lose 5 blood per second. +#define BLEED_RATE_MULTIPLIER_NO_HEART 0.4 /// If we have no heart, then we will bleed slower. This multiplies by our bleeding rate if that is the case. + //Blood levels #define BLOOD_VOLUME_MAXIMUM 2000 #define BLOOD_VOLUME_SLIME_SPLIT 1120 @@ -26,6 +43,8 @@ #define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_SURVIVE 122 +#define AMOUNT_TO_BLEED_INTENSITY(x) ((x) ** 0.3333) + //Sizes of mobs, used by mob/living/var/mob_size #define MOB_SIZE_TINY 0 #define MOB_SIZE_SMALL 1 diff --git a/code/__DEFINES/status_effects.dm b/code/__DEFINES/status_effects.dm index e56e7c03f3a19..192faf6690af2 100644 --- a/code/__DEFINES/status_effects.dm +++ b/code/__DEFINES/status_effects.dm @@ -9,6 +9,8 @@ #define STATUS_EFFECT_REPLACE 2 /// if it only allows one, and new instances just instead refresh the timer #define STATUS_EFFECT_REFRESH 3 +/// call a merge proc to combine 2 status effects +#define STATUS_EFFECT_MERGE 4 //-------// // BUFFS // @@ -117,6 +119,7 @@ #define STATUS_EFFECT_LING_TRANSFORMATION /datum/status_effect/ling_transformation // transform stung by a changeling +#define STATUS_EFFECT_BLEED /datum/status_effect/bleeding //---------// // NEUTRAL // diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 013482e9d1af6..6e994b1668858 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -272,6 +272,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HYPERSPACED "hyperspaced" // Sanity trait to keep track of when we're in hyperspace and add the appropriate element if we werent #define TRAIT_FREE_HYPERSPACE_MOVEMENT "free_hyperspace_movement" // Gives the movable free hyperspace movement without being pulled during shuttle transit #define TRAIT_FAST_CUFF_REMOVAL "fast_cuff_removal" // Faster cuff removal +#define TRAIT_BLEED_HELD "bleed_held" // For when a mob is holding their wounds, preventing them from bleeding further +#define TRAIT_NO_BLOOD "no_blood" // Bleeding heals itself and bleeding is impossible +#define TRAIT_NO_BLEEDING "no_bleed" // The user can acquire the bleeding status effect, but will no lose blood +#define TRAIT_BLOOD_COOLANT "blood_coolant" // Replaces blood with coolant, meaning we overheat instead of losing air // You can stare into the abyss, but it does not stare back. // You're immune to the hallucination effect of the supermatter, either @@ -396,6 +400,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define CURSE_TRAIT "eldritch" #define STATION_TRAIT "station-trait" #define TRAIT_RUSTY "rust_trait" +#define ACTION_TRAIT "action_trait" #define TURF_TRAIT "turf" // unique trait sources, still defines @@ -464,6 +469,7 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_PRESERVE_UI_WITHOUT_CLIENT "preserve_ui_without_client" //this mob should never close ui even if it doesn't have a client #define EXPERIMENTAL_SURGERY_TRAIT "experimental_surgery" #define NINJA_KIDNAPPED_TRAIT "ninja_kidnapped" +#define TABLE_TRAIT "table_trait" ///Traits given by station traits #define STATION_TRAIT_BANANIUM_SHIPMENTS "station_trait_bananium_shipments" diff --git a/code/_onclick/other_mobs.dm b/code/_onclick/other_mobs.dm index 2412b865008fe..cd7b82c039e5a 100644 --- a/code/_onclick/other_mobs.dm +++ b/code/_onclick/other_mobs.dm @@ -154,10 +154,6 @@ return TRUE return FALSE -/* - Aliens - Defaults to same as monkey in most places -*/ /mob/living/carbon/alien/UnarmedAttack(atom/A) if(HAS_TRAIT(src, TRAIT_HANDS_BLOCKED)) return diff --git a/code/datums/armor.dm b/code/datums/armor.dm index 3a11186a292e9..218c8d1cdefec 100644 --- a/code/datums/armor.dm +++ b/code/datums/armor.dm @@ -1,9 +1,9 @@ -#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[stamina]-[consume]" +#define ARMORID "armor-[melee]-[bullet]-[laser]-[energy]-[bomb]-[bio]-[rad]-[fire]-[acid]-[magic]-[stamina]-[consume]-[bleed]" -/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0) +/proc/getArmor(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0, bleed = 0) . = locate(ARMORID) if (!.) - . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, stamina, consume) + . = new /datum/armor(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, stamina, consume, bleed) /datum/armor datum_flags = DF_USE_TAG @@ -19,8 +19,9 @@ var/magic var/stamina var/consume + var/bleed -/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0) +/datum/armor/New(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0, bleed = 0) src.melee = melee src.bullet = bullet src.laser = laser @@ -33,15 +34,16 @@ src.magic = magic src.stamina = stamina src.consume = consume + src.bleed = bleed tag = ARMORID -/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0) - return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.stamina+stamina, src.consume+consume) +/datum/armor/proc/modifyRating(melee = 0, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 0, rad = 0, fire = 0, acid = 0, magic = 0, stamina = 0, consume = 0, bleed = 0) + return getArmor(src.melee+melee, src.bullet+bullet, src.laser+laser, src.energy+energy, src.bomb+bomb, src.bio+bio, src.rad+rad, src.fire+fire, src.acid+acid, src.magic+magic, src.stamina+stamina, src.consume+consume, src.bleed+bleed) /datum/armor/proc/modifyAllRatings(modifier = 0) - return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier, stamina+modifier, consume+modifier) + return getArmor(melee+modifier, bullet+modifier, laser+modifier, energy+modifier, bomb+modifier, bio+modifier, rad+modifier, fire+modifier, acid+modifier, magic+modifier, stamina+modifier, consume+modifier, bleed+modifier) -/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, consume) +/datum/armor/proc/setRating(melee, bullet, laser, energy, bomb, bio, rad, fire, acid, magic, consume, bleed) return getArmor((isnull(melee) ? src.melee : melee),\ (isnull(bullet) ? src.bullet : bullet),\ (isnull(laser) ? src.laser : laser),\ @@ -53,19 +55,20 @@ (isnull(acid) ? src.acid : acid),\ (isnull(magic) ? src.magic : magic),\ (isnull(stamina) ? src.stamina : stamina),\ - (isnull(consume) ? src.consume : consume)) + (isnull(consume) ? src.consume : consume),\ + (isnull(bleed) ? src.bleed : bleed)) /datum/armor/proc/getRating(rating) return vars[rating] /datum/armor/proc/getList() - return list(MELEE = melee, BULLET = bullet, LASER = laser, ENERGY = energy, BOMB = bomb, BIO = bio, RAD = rad, FIRE = fire, ACID = acid, MAGIC = magic, STAMINA = stamina, CONSUME = consume) + return list(MELEE = melee, BULLET = bullet, LASER = laser, ENERGY = energy, BOMB = bomb, BIO = bio, RAD = rad, FIRE = fire, ACID = acid, MAGIC = magic, STAMINA = stamina, CONSUME = consume, BLEED = bleed) /datum/armor/proc/attachArmor(datum/armor/AA) - return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, stamina+AA.stamina, consume+AA.consume) + return getArmor(melee+AA.melee, bullet+AA.bullet, laser+AA.laser, energy+AA.energy, bomb+AA.bomb, bio+AA.bio, rad+AA.rad, fire+AA.fire, acid+AA.acid, magic+AA.magic, stamina+AA.stamina, consume+AA.consume, bleed+AA.bleed) /datum/armor/proc/detachArmor(datum/armor/AA) - return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic, stamina-AA.stamina, consume+AA.consume) + return getArmor(melee-AA.melee, bullet-AA.bullet, laser-AA.laser, energy-AA.energy, bomb-AA.bomb, bio-AA.bio, rad-AA.rad, fire-AA.fire, acid-AA.acid, magic-AA.magic, stamina-AA.stamina, consume+AA.consume, bleed+AA.bleed) /datum/armor/vv_edit_var(var_name, var_value) if (var_name == NAMEOF(src, tag)) diff --git a/code/datums/components/butchering.dm b/code/datums/components/butchering.dm index d281865081aa4..d11800a38565a 100644 --- a/code/datums/components/butchering.dm +++ b/code/datums/components/butchering.dm @@ -71,7 +71,7 @@ H.visible_message("[user] slits [H]'s throat!", \ "[user] slits your throat...") H.apply_damage(item_force, BRUTE, BODY_ZONE_HEAD) - H.bleed_rate = clamp(H.bleed_rate + 20, 0, 30) + H.add_bleeding(BLEED_CRITICAL) H.apply_status_effect(/datum/status_effect/neck_slice) /datum/component/butchering/proc/Butcher(mob/living/butcher, mob/living/meat) diff --git a/code/datums/components/caltrop.dm b/code/datums/components/caltrop.dm index ade35521ebe6f..107fe33b95dc7 100644 --- a/code/datums/components/caltrop.dm +++ b/code/datums/components/caltrop.dm @@ -63,6 +63,7 @@ damage *= 0.5 H.apply_damage(damage, BRUTE, picked_def_zone) + H.add_bleeding(BLEED_SCRATCH) if(COOLDOWN_FINISHED(src, caltrop_cooldown)) COOLDOWN_START(src, caltrop_cooldown, 1 SECONDS) //cooldown to avoid message spam. diff --git a/code/datums/components/cult_ritual_item.dm b/code/datums/components/cult_ritual_item.dm index ad06c2d3c98a4..8b785485c6f11 100644 --- a/code/datums/components/cult_ritual_item.dm +++ b/code/datums/components/cult_ritual_item.dm @@ -304,6 +304,9 @@ if(cultist.blood_volume) cultist.apply_damage(initial(rune_to_scribe.scribe_damage), BRUTE, pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM)) // *cuts arm* *bone explodes* ever have one of those days? + if (iscarbon(cultist)) + var/mob/living/carbon/carbon_cultist = cultist + carbon_cultist.add_bleeding(BLEED_TINY) var/scribe_mod = initial(rune_to_scribe.scribe_delay) if(!initial(rune_to_scribe.no_scribe_boost) && (our_turf.type in turfs_that_boost_us)) diff --git a/code/datums/components/pellet_cloud.dm b/code/datums/components/pellet_cloud.dm index 1141a23ba11c2..e06ec64192601 100644 --- a/code/datums/components/pellet_cloud.dm +++ b/code/datums/components/pellet_cloud.dm @@ -46,9 +46,6 @@ /datum/component/pellet_cloud/Initialize(projectile_type=/obj/item/shrapnel, magnitude=5) - if(!isammocasing(parent) && !isgrenade(parent) && !islandmine(parent)) - return COMPONENT_INCOMPATIBLE - if(magnitude < 1) stack_trace("Invalid magnitude [magnitude] < 1 on pellet_cloud, parent: [parent]") magnitude = 1 @@ -59,6 +56,9 @@ num_pellets = magnitude else if(isgrenade(parent) || islandmine(parent)) radius = magnitude + else + radius = magnitude + create_blast_pellets(null, null) /datum/component/pellet_cloud/Destroy(force, silent) pellets = null diff --git a/code/datums/components/twohanded.dm b/code/datums/components/twohanded.dm index 04ee7e3682a62..373244c56fbbc 100644 --- a/code/datums/components/twohanded.dm +++ b/code/datums/components/twohanded.dm @@ -390,7 +390,7 @@ name = "offhand" icon_state = "offhand" w_class = WEIGHT_CLASS_HUGE - item_flags = ABSTRACT | DROPDEL + item_flags = ABSTRACT | DROPDEL | NOBLUDGEON resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF /// Off Hand tracking of wielded status var/wielded = FALSE diff --git a/code/datums/diseases/advance/symptoms/flesh_eating.dm b/code/datums/diseases/advance/symptoms/flesh_eating.dm index 0d181e1228976..cad4fdcf192cc 100644 --- a/code/datums/diseases/advance/symptoms/flesh_eating.dm +++ b/code/datums/diseases/advance/symptoms/flesh_eating.dm @@ -63,8 +63,7 @@ Bonus if(!ishuman(M)) return var/mob/living/carbon/human/H = M - H.bleed_rate += 2 * power //bleeding is quite strong. this is more than enough - H.bleed(max(10*power, H.bleed_rate))//having power actually up the bleed rate on this puts it into a pretty dangerous territory. this should be more managable + H.add_bleeding(BLEED_SURFACE) H.add_splatter_floor(H.loc) if(bleed) // this is really, really messy var/geysers = rand(2, 6) diff --git a/code/datums/diseases/advance/symptoms/heal.dm b/code/datums/diseases/advance/symptoms/heal.dm index d3081a124e5a9..99a6eac4d65e6 100644 --- a/code/datums/diseases/advance/symptoms/heal.dm +++ b/code/datums/diseases/advance/symptoms/heal.dm @@ -671,9 +671,9 @@ im not even gonna bother with these for the following symptoms. typed em out, co if(bloodpoints > 0) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(H.bleed_rate >= 2 && bruteheal && bloodpoints) + if(bruteheal && bloodpoints) bloodpoints -= 1 - H.bleed_rate = max(0, (H.bleed_rate - 2)) + H.cauterise_wounds(0.1) if(M.blood_volume < BLOOD_VOLUME_NORMAL && M.get_blood_id() == /datum/reagent/blood) //bloodloss is prioritized over healing brute bloodpoints -= 1 M.blood_volume = max((M.blood_volume + 3 * power), BLOOD_VOLUME_NORMAL) //bloodpoints are valued at 4 units of blood volume per point, so this is diminished @@ -704,14 +704,14 @@ im not even gonna bother with these for the following symptoms. typed em out, co var/possibledist = power + 1 if(M.get_blood_id() != /datum/reagent/blood) possibledist = 1 - if(!(NOBLOOD in H.dna.species.species_traits)) //if you dont have blood, well... sucks to be you + if(!((NOBLOOD in H.dna.species.species_traits) || HAS_TRAIT(H, TRAIT_NO_BLOOD))) //if you dont have blood, well... sucks to be you H.setOxyLoss(0,0) //this is so a crit person still revives if suffocated if(bloodpoints >= 200 && H.health > 0 && H.blood_volume >= BLOOD_VOLUME_NORMAL) //note that you need to actually need to heal, so a maxed out virus won't be bringing you back instantly in most cases. *even so*, if this needs to be nerfed ill do it in a heartbeat H.revive(0) H.visible_message("[H.name]'s skin takes on a rosy hue as they begin moving. They live again!", "As your body fills with fresh blood, you feel your limbs once more, accompanied by an insatiable thirst for blood.") bloodpoints = 0 return 0 - else if(bloodbag && bloodbag.blood_volume && (bloodbag.stat || bloodbag.bleed_rate)) + else if(bloodbag && bloodbag.blood_volume && (bloodbag.stat || bloodbag.is_bleeding())) if(get_dist(bloodbag, H) <= 1 && bloodbag.z == H.z) var/amt = ((bloodbag.stat * 2) + 2) * power var/excess = max(((min(amt, bloodbag.blood_volume) - (BLOOD_VOLUME_NORMAL - H.blood_volume)) / 2), 0) @@ -753,7 +753,7 @@ im not even gonna bother with these for the following symptoms. typed em out, co else var/list/candidates = list() for(var/mob/living/carbon/human/C in ohearers(min(bloodpoints/4, possibledist), H)) - if(NOBLOOD in C.dna.species.species_traits) + if((NOBLOOD in C.dna.species.species_traits) || HAS_TRAIT(C, TRAIT_NO_BLOOD)) continue if(C.stat && C.blood_volume && C.get_blood_id() == H.get_blood_id()) candidates += C @@ -772,10 +772,10 @@ im not even gonna bother with these for the following symptoms. typed em out, co var/mob/living/carbon/human/H = M if(H.pulling && ishuman(H.pulling)) //grabbing is handled with the disease instead of the component, so the component doesn't have to be processed var/mob/living/carbon/human/C = H.pulling - if(!C.bleed_rate && vampire && C.can_inject() && H.grab_state && C.get_blood_id() == H.get_blood_id() && !(NOBLOOD in C.dna.species.species_traits))//aggressive grab as a "vampire" starts the target bleeding - C.bleed_rate += 1 + if(!C.is_bleeding() && vampire && C.can_inject() && H.grab_state && C.get_blood_id() == H.get_blood_id() && !((NOBLOOD in C.dna.species.species_traits)|| HAS_TRAIT(C, TRAIT_NO_BLOOD)))//aggressive grab as a "vampire" starts the target bleeding + C.add_bleeding(BLEED_SURFACE) C.visible_message("Wounds open on [C.name]'s skin as [H.name] grips them tightly!", "You begin bleeding at [H.name]'s touch!") - if(C.blood_volume && C.can_inject() &&(C.bleed_rate && (!C.bleedsuppress || vampire )) && C.get_blood_id() == H.get_blood_id() && !(NOBLOOD in C.dna.species.species_traits)) + if(C.blood_volume && C.can_inject() && (C.is_bleeding() && vampire) && C.get_blood_id() == H.get_blood_id() && !((NOBLOOD in C.dna.species.species_traits)|| HAS_TRAIT(C, TRAIT_NO_BLOOD))) var/amt = (H.grab_state + C.stat + 2) * power if(C.blood_volume) var/excess = max(((min(amt, C.blood_volume) - (BLOOD_VOLUME_NORMAL - H.blood_volume)) / 4), 0) @@ -819,9 +819,9 @@ im not even gonna bother with these for the following symptoms. typed em out, co if(ishuman(M) && aggression)//finally, attack mobs touching the host. var/mob/living/carbon/human/H = M for(var/mob/living/carbon/human/C in ohearers(1, H)) - if(NOBLOOD in C.dna.species.species_traits) + if((NOBLOOD in C.dna.species.species_traits) || HAS_TRAIT(C, TRAIT_NO_BLOOD)) continue - if((C.pulling && C.pulling == H) || (C.loc == H.loc) && C.bleed_rate && C.get_blood_id() == H.get_blood_id()) + if((C.pulling && C.pulling == H) || (C.loc == H.loc) && C.is_bleeding() && C.get_blood_id() == H.get_blood_id()) var/amt = (2 * power) if(C.blood_volume) var/excess = max(((min(amt, C.blood_volume) - (BLOOD_VOLUME_NORMAL - H.blood_volume)) / 4 * power), 0) diff --git a/code/datums/helper_datums/teleport.dm b/code/datums/helper_datums/teleport.dm index aa6c48d419eeb..44c73d4263386 100644 --- a/code/datums/helper_datums/teleport.dm +++ b/code/datums/helper_datums/teleport.dm @@ -17,6 +17,7 @@ /obj/effect/mob_spawn, /obj/effect/warp_cube, /obj/effect/extraction_holder, + /obj/effect/anomaly, )) if(delete_atoms[teleatom.type]) qdel(teleatom) diff --git a/code/datums/martial/krav_maga.dm b/code/datums/martial/krav_maga.dm index e0f7f1e98f298..56aa658965cdd 100644 --- a/code/datums/martial/krav_maga.dm +++ b/code/datums/martial/krav_maga.dm @@ -214,4 +214,4 @@ siemens_coefficient = 0 permeability_coefficient = 0.05 strip_delay = 80 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0) diff --git a/code/datums/martial/tribal_claw.dm b/code/datums/martial/tribal_claw.dm index 1517a9948bcd5..f802024292e66 100644 --- a/code/datums/martial/tribal_claw.dm +++ b/code/datums/martial/tribal_claw.dm @@ -61,7 +61,7 @@ Deals 15 brute to head(reduced by armor) and causes a rapid bleeding effect simi D.visible_message("[A] cuts [D]'s jugular vein with their claws!", \ "[A] cuts your jugular vein!") D.apply_damage(15, BRUTE, BODY_ZONE_HEAD, def_check) - D.bleed_rate = clamp(D.bleed_rate + 20, 0, 30) + D.add_bleeding(BLEED_SURFACE) D.apply_status_effect(/datum/status_effect/neck_slice) A.do_attack_animation(D, ATTACK_EFFECT_CLAW) playsound(get_turf(D), 'sound/weapons/slash.ogg', 50, 1, -1) diff --git a/code/datums/status_effects/debuffs.dm b/code/datums/status_effects/debuffs.dm index da1ff04864ba2..c80ea67bd707d 100644 --- a/code/datums/status_effects/debuffs.dm +++ b/code/datums/status_effects/debuffs.dm @@ -498,7 +498,7 @@ /datum/status_effect/neck_slice/tick() var/mob/living/carbon/human/H = owner - if(H.stat == DEAD || H.bleed_rate <= 8) + if(H.stat == DEAD || H.get_bleed_rate() < BLEED_CUT) H.remove_status_effect(/datum/status_effect/neck_slice) if(prob(10)) H.emote(pick("gasp", "gag", "choke")) @@ -924,7 +924,7 @@ if(!ishuman(owner)) return var/mob/living/carbon/human/H = owner - H.bleed_rate += 5 + H.add_bleeding(BLEED_CUT) return ..() /datum/status_effect/heretic_mark/ash diff --git a/code/datums/status_effects/status_effect.dm b/code/datums/status_effects/status_effect.dm index 22d77d15c0a3a..6bc5aa13a18e8 100644 --- a/code/datums/status_effects/status_effect.dm +++ b/code/datums/status_effects/status_effect.dm @@ -74,6 +74,10 @@ return duration = world.time + original_duration +/// Merge this status effect by applying new arguments +/datum/status_effect/proc/merge(...) + return + /datum/status_effect/proc/get_examine_text() //Called when the owner is examined return examine_text @@ -112,6 +116,9 @@ else if(S.status_type == STATUS_EFFECT_REFRESH) S.refresh() return + else if (S.status_type == STATUS_EFFECT_MERGE) + S.merge(arglist(args.Copy(2))) + return else return var/list/arguments = args.Copy() diff --git a/code/datums/traits/negative_quirk.dm b/code/datums/traits/negative_quirk.dm index 6bd895eefc40f..c723a21729c04 100644 --- a/code/datums/traits/negative_quirk.dm +++ b/code/datums/traits/negative_quirk.dm @@ -29,7 +29,7 @@ /datum/quirk/blooddeficiency/on_process(delta_time) var/mob/living/carbon/human/H = quirk_target - if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any + if((NOBLOOD in H.dna.species.species_traits) || HAS_TRAIT(H, TRAIT_NO_BLOOD)) //can't lose blood if your species doesn't have any return else if(H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment H.blood_volume -= 0.275 * delta_time diff --git a/code/game/gamemodes/clown_ops/clown_weapons.dm b/code/game/gamemodes/clown_ops/clown_weapons.dm index 02a878b9cd6b4..72526066bef41 100644 --- a/code/game/gamemodes/clown_ops/clown_weapons.dm +++ b/code/game/gamemodes/clown_ops/clown_weapons.dm @@ -17,7 +17,7 @@ desc = "advanced clown shoes that protect the wearer and render them nearly immune to slipping on their own peels. They also squeak at 100% capacity." clothing_flags = NOSLIP slowdown = SHOES_SLOWDOWN - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25, BLEED = 40) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 @@ -32,7 +32,7 @@ name = "mk-honk combat shoes" desc = "The culmination of years of clown combat research, these shoes leave a trail of chaos in their wake. They will slowly recharge themselves over time, or can be manually charged with bananium." slowdown = SHOES_SLOWDOWN - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 25, BLEED = 40) strip_delay = 70 resistance_flags = NONE permeability_coefficient = 0.05 @@ -292,7 +292,7 @@ base_icon_state = "darkhonker" max_integrity = 300 deflect_chance = 15 - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 35000 operation_req_access = list(ACCESS_SYNDICATE) internals_req_access = list(ACCESS_SYNDICATE) diff --git a/code/game/gamemodes/gangs/dominator.dm b/code/game/gamemodes/gangs/dominator.dm index 11d3ecbc1bf80..4af2519204b88 100644 --- a/code/game/gamemodes/gangs/dominator.dm +++ b/code/game/gamemodes/gangs/dominator.dm @@ -13,7 +13,7 @@ max_integrity = 300 integrity_failure = 0.33 move_resist = INFINITY - armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 70, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 70, STAMINA = 0, BLEED = 0) var/datum/team/gang/gang var/operating = FALSE //false=standby or broken, true=takeover var/warned = FALSE //if this device has set off the warning at <3 minutes yet diff --git a/code/game/machinery/_machinery.dm b/code/game/machinery/_machinery.dm index ca03a01466159..2efbe213726c1 100644 --- a/code/game/machinery/_machinery.dm +++ b/code/game/machinery/_machinery.dm @@ -147,7 +147,7 @@ Class Procs: /obj/machinery/Initialize(mapload) if(!armor) - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) . = ..() GLOB.machines += src diff --git a/code/game/machinery/ai_slipper.dm b/code/game/machinery/ai_slipper.dm index 90d6646286f16..5de006e590189 100644 --- a/code/game/machinery/ai_slipper.dm +++ b/code/game/machinery/ai_slipper.dm @@ -6,7 +6,7 @@ layer = PROJECTILE_HIT_THRESHOLD_LAYER plane = FLOOR_PLANE max_integrity = 200 - armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) var/uses = 20 var/cooldown = 0 diff --git a/code/game/machinery/airlock_cycle_control.dm b/code/game/machinery/airlock_cycle_control.dm index 133e90b2e88ef..ecb65e728e377 100644 --- a/code/game/machinery/airlock_cycle_control.dm +++ b/code/game/machinery/airlock_cycle_control.dm @@ -53,7 +53,7 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 0.2 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF layer = ABOVE_WINDOW_LAYER diff --git a/code/game/machinery/buttons.dm b/code/game/machinery/buttons.dm index b59c2aa8780c5..66c13f7bc1af5 100644 --- a/code/game/machinery/buttons.dm +++ b/code/game/machinery/buttons.dm @@ -11,7 +11,7 @@ var/device_type = null var/id = null var/initialized_button = 0 - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 70, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 70, STAMINA = 0, BLEED = 0) use_power = IDLE_POWER_USE idle_power_usage = 2 resistance_flags = LAVA_PROOF | FIRE_PROOF diff --git a/code/game/machinery/camera/camera.dm b/code/game/machinery/camera/camera.dm index 10ae07254eea1..9cc634419721f 100644 --- a/code/game/machinery/camera/camera.dm +++ b/code/game/machinery/camera/camera.dm @@ -13,7 +13,7 @@ layer = WALL_OBJ_LAYER resistance_flags = FIRE_PROOF - armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0) max_integrity = 100 integrity_failure = 0.5 var/default_camera_icon = "camera" //the camera's base icon used by update_icon - icon_state is primarily used for mapping display purposes. diff --git a/code/game/machinery/computer/_computer.dm b/code/game/machinery/computer/_computer.dm index 2d35dad4b2ce2..ebaa93ed3ada6 100644 --- a/code/game/machinery/computer/_computer.dm +++ b/code/game/machinery/computer/_computer.dm @@ -12,7 +12,7 @@ active_power_usage = 300 max_integrity = 200 integrity_failure = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 20, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 20, STAMINA = 0, BLEED = 0) clicksound = "keyboard" light_system = STATIC_LIGHT light_range = 1 diff --git a/code/game/machinery/doors/airlock_types.dm b/code/game/machinery/doors/airlock_types.dm index 2d4620a826758..b19a591943781 100644 --- a/code/game/machinery/doors/airlock_types.dm +++ b/code/game/machinery/doors/airlock_types.dm @@ -304,7 +304,7 @@ anim_parts = "left=-13,0;right=13,0" normal_integrity = 150 damage_deflection = 5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) /obj/machinery/door/airlock/bronze/seethru assemblytype = /obj/structure/door_assembly/door_assembly_bronze/seethru @@ -582,7 +582,7 @@ desc = "An airlock hastily corrupted by blood magic, it is unusually brittle in this state." normal_integrity = 150 damage_deflection = 5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) ////////////////////////////////// /* diff --git a/code/game/machinery/doors/door.dm b/code/game/machinery/doors/door.dm index ff5e6d0cc7792..624edd84c1168 100644 --- a/code/game/machinery/doors/door.dm +++ b/code/game/machinery/doors/door.dm @@ -12,7 +12,7 @@ pass_flags_self = PASSDOORS z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP max_integrity = 350 - armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) CanAtmosPass = ATMOS_PASS_DENSITY flags_1 = PREVENT_CLICK_UNDER_1 ricochet_chance_mod = 0.8 diff --git a/code/game/machinery/doors/firedoor.dm b/code/game/machinery/doors/firedoor.dm index edf14ba9f4a3c..792ccd29664c5 100644 --- a/code/game/machinery/doors/firedoor.dm +++ b/code/game/machinery/doors/firedoor.dm @@ -24,7 +24,7 @@ layer = BELOW_OPEN_DOOR_LAYER closingLayer = CLOSED_FIREDOOR_LAYER assemblytype = /obj/structure/firelock_frame - armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 95, ACID = 70, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 95, ACID = 70, STAMINA = 0, BLEED = 0) interaction_flags_machine = INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON | INTERACT_MACHINE_REQUIRES_SILICON | INTERACT_MACHINE_OPEN air_tight = TRUE open_speed = 2 diff --git a/code/game/machinery/doors/poddoor.dm b/code/game/machinery/doors/poddoor.dm index 0ca6d2b091573..f19e832377097 100644 --- a/code/game/machinery/doors/poddoor.dm +++ b/code/game/machinery/doors/poddoor.dm @@ -11,7 +11,7 @@ heat_proof = TRUE safe = FALSE max_integrity = 600 - armor = list(MELEE = 50, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF damage_deflection = 70 var/datum/crafting_recipe/recipe_type = /datum/crafting_recipe/blast_doors diff --git a/code/game/machinery/doors/windowdoor.dm b/code/game/machinery/doors/windowdoor.dm index 0e6c49eb31d23..c531f9d1fe7e6 100644 --- a/code/game/machinery/doors/windowdoor.dm +++ b/code/game/machinery/doors/windowdoor.dm @@ -9,7 +9,7 @@ var/base_state = "left" max_integrity = 150 //If you change this, consider changing ../door/window/brigdoor/ max_integrity at the bottom of this .dm file integrity_failure = 0 - armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0) visible = FALSE flags_1 = ON_BORDER_1 opacity = FALSE @@ -437,7 +437,7 @@ shards = 0 rods = 0 max_integrity = 50 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 100, RAD = 100, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF | ACID_PROOF operationdelay = 10 var/made_glow = FALSE diff --git a/code/game/machinery/firealarm.dm b/code/game/machinery/firealarm.dm index eb720b05a6439..736a18dc9371b 100644 --- a/code/game/machinery/firealarm.dm +++ b/code/game/machinery/firealarm.dm @@ -19,7 +19,7 @@ icon_state = "fire0" max_integrity = 250 integrity_failure = 0.4 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0) use_power = IDLE_POWER_USE idle_power_usage = 2 active_power_usage = 6 diff --git a/code/game/machinery/hologram.dm b/code/game/machinery/hologram.dm index 1816e51b1d651..2dbe5da051b91 100644 --- a/code/game/machinery/hologram.dm +++ b/code/game/machinery/hologram.dm @@ -37,7 +37,7 @@ Possible to do for anyone motivated enough: idle_power_usage = 5 active_power_usage = 100 max_integrity = 300 - armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0) circuit = /obj/item/circuitboard/machine/holopad var/list/masters //List of living mobs that use the holopad var/list/holorays //Holoray-mob link. diff --git a/code/game/machinery/igniter.dm b/code/game/machinery/igniter.dm index 0a36e83f6e813..363fa5d0a1aba 100644 --- a/code/game/machinery/igniter.dm +++ b/code/game/machinery/igniter.dm @@ -10,7 +10,7 @@ active_power_usage = 4 max_integrity = 300 circuit = /obj/item/circuitboard/machine/igniter - armor = list(MELEE = 50, BULLET = 30, LASER = 70, ENERGY = 50, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 30, LASER = 70, ENERGY = 50, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/id = null var/on = FALSE diff --git a/code/game/machinery/navbeacon.dm b/code/game/machinery/navbeacon.dm index f20855fb0103a..35e77322e7adc 100644 --- a/code/game/machinery/navbeacon.dm +++ b/code/game/machinery/navbeacon.dm @@ -9,7 +9,7 @@ desc = "A radio beacon used for bot navigation." layer = UNDER_CATWALK max_integrity = 500 - armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0) + armor = list(MELEE = 70, BULLET = 70, LASER = 70, ENERGY = 70, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0) var/open = FALSE // true if cover is open var/locked = TRUE // true if controls are locked diff --git a/code/game/machinery/porta_turret/portable_turret.dm b/code/game/machinery/porta_turret/portable_turret.dm index 25a6cb501a561..668435ea077ed 100644 --- a/code/game/machinery/porta_turret/portable_turret.dm +++ b/code/game/machinery/porta_turret/portable_turret.dm @@ -39,7 +39,7 @@ //the turret's health max_integrity = 160 integrity_failure = 0.5 - armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) //if the turret's behaviour control access is locked var/locked = TRUE @@ -762,7 +762,7 @@ DEFINE_BUFFER_HANDLER(/obj/machinery/porta_turret) lethal_projectile = /obj/projectile/bullet/p50/penetrator/shuttle lethal_projectile_sound = 'sound/weapons/gunshot_smg.ogg' stun_projectile_sound = 'sound/weapons/gunshot_smg.ogg' - armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 80, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 80, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) /obj/machinery/porta_turret/syndicate/shuttle/target(atom/movable/target) if(target) diff --git a/code/game/machinery/requests_console.dm b/code/game/machinery/requests_console.dm index 2b323f3dcaf75..829a1d883f27b 100644 --- a/code/game/machinery/requests_console.dm +++ b/code/game/machinery/requests_console.dm @@ -70,7 +70,7 @@ GLOBAL_LIST_EMPTY(req_console_ckey_departments) var/receive_ore_updates = FALSE //If ore redemption machines will send an update when it receives new ores. var/auth_id = "Unknown" //Will contain the name and and job of the person who verified it max_integrity = 300 - armor = list(MELEE = 70, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 70, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) /obj/machinery/requests_console/update_appearance(updates=ALL) . = ..() diff --git a/code/game/machinery/shuttle/shuttle_heater.dm b/code/game/machinery/shuttle/shuttle_heater.dm index 1420165f4e4d7..1c1a9330a5d21 100644 --- a/code/game/machinery/shuttle/shuttle_heater.dm +++ b/code/game/machinery/shuttle/shuttle_heater.dm @@ -23,7 +23,7 @@ density = TRUE z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP max_integrity = 400 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) layer = OBJ_LAYER showpipe = TRUE diff --git a/code/game/machinery/spaceheater.dm b/code/game/machinery/spaceheater.dm index 8a3e6229a0300..3ccb52f832fff 100644 --- a/code/game/machinery/spaceheater.dm +++ b/code/game/machinery/spaceheater.dm @@ -13,7 +13,7 @@ name = "space heater" desc = "Made by Space Amish using traditional space techniques, this heater/cooler is guaranteed not to set the station on fire. Warranty void if used in engines." max_integrity = 250 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 10, STAMINA = 0, BLEED = 0) circuit = /obj/item/circuitboard/machine/space_heater //We don't use area power, we always use the cell use_power = NO_POWER_USE diff --git a/code/game/machinery/telecomms/machines/message_server.dm b/code/game/machinery/telecomms/machines/message_server.dm index 5f7003e346d4d..3f093e9ab9b60 100644 --- a/code/game/machinery/telecomms/machines/message_server.dm +++ b/code/game/machinery/telecomms/machines/message_server.dm @@ -14,7 +14,7 @@ use_power = IDLE_POWER_USE idle_power_usage = 10 active_power_usage = 100 - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) var/obj/item/stored investigate_flags = ADMIN_INVESTIGATE_TARGET diff --git a/code/game/objects/effects/anomalies/anomaly_bleed.dm b/code/game/objects/effects/anomalies/anomaly_bleed.dm new file mode 100644 index 0000000000000..81cab90bc4972 --- /dev/null +++ b/code/game/objects/effects/anomalies/anomaly_bleed.dm @@ -0,0 +1,61 @@ +/obj/effect/anomaly/blood + name = "blood anomaly" + icon_state = "blood_anomaly" + density = TRUE + aSignal = /obj/item/assembly/signaler/anomaly/blood + var/sucking = FALSE + +/obj/effect/anomaly/blood/anomalyEffect(delta_time) + if (sucking) + return + ..() + if (DT_PROB(20, delta_time)) + AddComponent(/datum/component/pellet_cloud, projectile_type=/obj/projectile/bullet/shrapnel/bleed, magnitude=3) + playsound(src, 'sound/weapons/shrapnel.ogg', 70, TRUE) + if (DT_PROB(10, delta_time)) + for (var/mob/living/carbon/bleed_target in view(6, src)) + if (!bleed_target.resting) + continue + if (do_teleport(src, get_turf(bleed_target), channel = TELEPORT_CHANNEL_BLUESPACE)) + bleed_target.Stun(3 SECONDS) + INVOKE_ASYNC(src, PROC_REF(suck_blood)) + break + +/obj/effect/anomaly/blood/detonate() + // Stop processing here since we don't want to keep moving while doing the detonation action + STOP_PROCESSING(SSobj, src) + // Needs to sleep since this gets instantly deleted as soon as the proc ends + for (var/mob/living/carbon/human/player in shuffle(GLOB.player_list)) + if (!is_station_level(player.z)) + continue + var/turf/player_loc = get_turf(player) + var/list/nearby_turfs = RANGE_TURFS(4, player_loc) + shuffle_inplace(nearby_turfs) + var/turf/target = locate(/turf/open) in nearby_turfs + if (!target) + continue + // Blocked by the bluespace anchor + if (!do_teleport(src, target, channel = TELEPORT_CHANNEL_BLUESPACE)) + return + sleep(40) + if (QDELETED(src)) + return + AddComponent(/datum/component/pellet_cloud, projectile_type=/obj/projectile/bullet/shrapnel/bleed, magnitude=3) + playsound(src, 'sound/weapons/shrapnel.ogg', 70, TRUE) + sleep(20) + if (QDELETED(src)) + return + +/obj/effect/anomaly/blood/proc/suck_blood() + sucking = FALSE + for (var/mob/living/carbon/bleed_target in loc) + bleed_target.add_bleeding(BLEED_SURFACE) + bleed_target.emote("scream") + sucking = TRUE + if (sucking) + new /obj/effect/temp_visual/cult/sparks(loc) + addtimer(CALLBACK(src, PROC_REF(suck_blood)), 0.5 SECONDS) + +/obj/projectile/bullet/shrapnel/bleed + damage = 4 + bleed_force = BLEED_DEEP_WOUND diff --git a/code/game/objects/items/RCD.dm b/code/game/objects/items/RCD.dm index 06be746ccd785..5cdb3cc27e75a 100644 --- a/code/game/objects/items/RCD.dm +++ b/code/game/objects/items/RCD.dm @@ -24,7 +24,7 @@ RLD w_class = WEIGHT_CLASS_LARGE custom_materials = list(/datum/material/iron=100000) req_access_txt = "11" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/matter = 0 diff --git a/code/game/objects/items/RPD.dm b/code/game/objects/items/RPD.dm index b701a0509ba5d..96be0b40ffc06 100644 --- a/code/game/objects/items/RPD.dm +++ b/code/game/objects/items/RPD.dm @@ -213,7 +213,7 @@ GLOBAL_LIST_INIT(fluid_duct_recipes, list( w_class = WEIGHT_CLASS_LARGE slot_flags = ITEM_SLOT_BELT custom_materials = list(/datum/material/iron=75000, /datum/material/glass=37500) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/datum/effect_system/spark_spread/spark_system var/working = 0 diff --git a/code/game/objects/items/RSF.dm b/code/game/objects/items/RSF.dm index 3f676294af26c..b29a67d9a7b2b 100644 --- a/code/game/objects/items/RSF.dm +++ b/code/game/objects/items/RSF.dm @@ -14,7 +14,7 @@ RSF density = FALSE anchored = FALSE item_flags = NOBLUDGEON - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) var/matter = 0 var/mode = 1 w_class = WEIGHT_CLASS_NORMAL diff --git a/code/game/objects/items/cards_ids.dm b/code/game/objects/items/cards_ids.dm index 87115edd19379..a743677e5141e 100644 --- a/code/game/objects/items/cards_ids.dm +++ b/code/game/objects/items/cards_ids.dm @@ -164,7 +164,7 @@ lefthand_file = 'icons/mob/inhands/equipment/idcards_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/idcards_righthand.dmi' slot_flags = ITEM_SLOT_ID - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/access = list() var/registered_name// The name registered_name on the card @@ -849,7 +849,7 @@ update_label("John Doe", "Clowny") name = "paper nametag" desc = "Some spare papers taped into a vague card shape, with a name scribbled on it. Seems trustworthy." icon_state = "paper" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = null // removes all resistance because its a piece of paper access = list() assignment = "Unknown" diff --git a/code/game/objects/items/chainsaw.dm b/code/game/objects/items/chainsaw.dm index 913e7337f6889..5d84cdcfcccb6 100644 --- a/code/game/objects/items/chainsaw.dm +++ b/code/game/objects/items/chainsaw.dm @@ -20,6 +20,7 @@ attack_verb = list("sawed", "tore", "cut", "chopped", "diced") hitsound = "swing_hit" sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND actions_types = list(/datum/action/item_action/startchainsaw) var/on = FALSE tool_behaviour = TOOL_SAW diff --git a/code/game/objects/items/cosmetics.dm b/code/game/objects/items/cosmetics.dm index 69d133edb6a44..d53776dd14bd3 100644 --- a/code/game/objects/items/cosmetics.dm +++ b/code/game/objects/items/cosmetics.dm @@ -265,15 +265,6 @@ user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") return BRUTELOSS -/obj/item/razor/attack(mob/M, mob/user) - . = ..() - if(ishuman(M) && extended == 1 && (user.a_intent == INTENT_HARM)) - var/mob/living/carbon/human/H = M - var/def_check = H.getarmor(MELEE) - H.bleed_rate += ((force * 10) - def_check)/30 //sharp blade causes a shitload of blood loss if on harm intent - if(H.bleed_rate >= 10) - to_chat(M, "You're losing blood fast!") - /obj/item/razor/straightrazor/attack_self(mob/user) extended = !extended playsound(src.loc, 'sound/weapons/batonextend.ogg', 50, 1) @@ -285,6 +276,7 @@ attack_verb = list("slashed", "stabbed", "sliced", "slit", "shaved", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE tool_behaviour = TOOL_SCALPEL else force = initial(force) @@ -294,6 +286,7 @@ attack_verb = list("stubbed", "poked") hitsound = 'sound/weapons/genhit.ogg' sharpness = IS_BLUNT + bleed_force = 0 tool_behaviour = null /obj/item/handmirror diff --git a/code/game/objects/items/crab17.dm b/code/game/objects/items/crab17.dm index 659b808765829..5b4b0946fea3e 100644 --- a/code/game/objects/items/crab17.dm +++ b/code/game/objects/items/crab17.dm @@ -33,7 +33,7 @@ icon = 'icons/obj/money_machine.dmi' icon_state = "bogdanoff" layer = TABLE_LAYER //So that the crate inside doesn't appear underneath - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0) density = TRUE pixel_z = -8 layer = LARGE_MOB_LAYER diff --git a/code/game/objects/items/debug_items.dm b/code/game/objects/items/debug_items.dm index 14032b526c10b..97377bd2b1a87 100644 --- a/code/game/objects/items/debug_items.dm +++ b/code/game/objects/items/debug_items.dm @@ -235,7 +235,7 @@ item_state = "holdingpack" resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF item_flags = NO_MAT_REDEMPTION - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) /obj/item/storage/backpack/debug/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/defib.dm b/code/game/objects/items/defib.dm index 4675d451aa906..ad4d2dccb00e1 100644 --- a/code/game/objects/items/defib.dm +++ b/code/game/objects/items/defib.dm @@ -14,7 +14,7 @@ throwforce = 6 w_class = WEIGHT_CLASS_BULKY actions_types = list(/datum/action/item_action/toggle_paddles) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) var/obj/item/shockpaddles/paddle_type = /obj/item/shockpaddles var/on = FALSE //if the paddles are equipped (1) or on the defib (0) diff --git a/code/game/objects/items/deployable/barricade.dm b/code/game/objects/items/deployable/barricade.dm index ee8c46727a671..38688c4cc8eed 100644 --- a/code/game/objects/items/deployable/barricade.dm +++ b/code/game/objects/items/deployable/barricade.dm @@ -194,7 +194,7 @@ icon_state = "barrier1" max_integrity = 180 proj_pass_rate = 20 - armor = list(MELEE = 10, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 0, STAMINA = 0) + armor = list(MELEE = 10, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 10, BIO = 100, RAD = 100, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0) req_access = list(ACCESS_SECURITY) pickup_damaged = FALSE locked_down = TRUE diff --git a/code/game/objects/items/devices/forcefieldprojector.dm b/code/game/objects/items/devices/forcefieldprojector.dm index 68a47eb19db09..7c6d8c1798069 100644 --- a/code/game/objects/items/devices/forcefieldprojector.dm +++ b/code/game/objects/items/devices/forcefieldprojector.dm @@ -87,7 +87,7 @@ mouse_opacity = MOUSE_OPACITY_OPAQUE resistance_flags = INDESTRUCTIBLE CanAtmosPass = ATMOS_PASS_DENSITY - armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 25, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) var/obj/item/forcefield_projector/generator /obj/structure/projected_forcefield/Initialize(mapload, obj/item/forcefield_projector/origin) diff --git a/code/game/objects/items/devices/scanners.dm b/code/game/objects/items/devices/scanners.dm index 2178dcf5be457..11358743e677e 100644 --- a/code/game/objects/items/devices/scanners.dm +++ b/code/game/objects/items/devices/scanners.dm @@ -456,8 +456,10 @@ GENE SCANNER if(blood_id) if(ishuman(C)) var/mob/living/carbon/human/H = C - if(H.bleed_rate) - message += "Subject is bleeding!" + if(H.is_bleeding()) + message += "Subject is bleeding at a rate of [round(H.get_bleed_rate(), 0.1)]/s!" + else if (H.is_bandaged()) + message += "Subject is bleeding (Bandaged)!" var/blood_percent = round((C.blood_volume / BLOOD_VOLUME_NORMAL)*100) var/blood_type = C.dna.blood_type if(blood_id != /datum/reagent/blood)//special blood substance @@ -466,12 +468,13 @@ GENE SCANNER blood_type = R.name else blood_type = blood_id + var/blood_info = "[blood_type] (Compatible: [jointext(get_safe_blood(blood_type), ", ")])" if(C.blood_volume <= BLOOD_VOLUME_SAFE && C.blood_volume > BLOOD_VOLUME_OKAY) - message += "Blood level: LOW [blood_percent] %, [C.blood_volume] cl, type: [blood_type]" + message += "Blood level: LOW [blood_percent] %, [C.blood_volume] cl, type: [blood_info]" else if(C.blood_volume <= BLOOD_VOLUME_OKAY) - message += "Blood level: CRITICAL [blood_percent] %, [C.blood_volume] cl, type: [blood_type]" + message += "Blood level: CRITICAL [blood_percent] %, [C.blood_volume] cl, type: [blood_info]" else - message += "Blood level: [blood_percent] %, [C.blood_volume] cl, type: [blood_type]" + message += "Blood level: [blood_percent] %, [C.blood_volume] cl, type: [blood_info]" var/list/cyberimp_detect = list() for(var/obj/item/organ/cyberimp/CI in C.internal_organs) diff --git a/code/game/objects/items/dualsaber.dm b/code/game/objects/items/dualsaber.dm index 56f62fb6feb75..6b575424b02c8 100644 --- a/code/game/objects/items/dualsaber.dm +++ b/code/game/objects/items/dualsaber.dm @@ -26,7 +26,7 @@ block_sound = 'sound/weapons/egloves.ogg' block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF light_system = MOVABLE_LIGHT light_range = 6 @@ -71,6 +71,7 @@ to_chat(user, "You lack the grace to wield this!") return COMPONENT_TWOHANDED_BLOCK_WIELD sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND w_class = w_class_on hitsound = 'sound/weapons/blade1.ogg' START_PROCESSING(SSobj, src) @@ -83,6 +84,7 @@ sharpness = initial(sharpness) w_class = initial(w_class) + bleed_force = initial(bleed_force) hitsound = "swing_hit" STOP_PROCESSING(SSobj, src) set_light_on(FALSE) diff --git a/code/game/objects/items/fireaxe.dm b/code/game/objects/items/fireaxe.dm index 2023b63f773f3..d5e4186e02a14 100644 --- a/code/game/objects/items/fireaxe.dm +++ b/code/game/objects/items/fireaxe.dm @@ -15,8 +15,9 @@ attack_verb = list("attacked", "chopped", "cleaved", "torn", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF item_flags = ISWEAPON var/icon_prefix = "fireaxe" diff --git a/code/game/objects/items/handcuffs.dm b/code/game/objects/items/handcuffs.dm index 521194548b7d3..0c5249ca9aa32 100644 --- a/code/game/objects/items/handcuffs.dm +++ b/code/game/objects/items/handcuffs.dm @@ -39,7 +39,7 @@ throw_range = 5 custom_materials = list(/datum/material/iron=500) breakouttime = 1 MINUTES - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) var/cuffsound = 'sound/weapons/handcuffs.ogg' var/trashtype = null //for disposable cuffs diff --git a/code/game/objects/items/holy_weapons.dm b/code/game/objects/items/holy_weapons.dm index 01b6d227c4b43..201f7bb1d21ef 100644 --- a/code/game/objects/items/holy_weapons.dm +++ b/code/game/objects/items/holy_weapons.dm @@ -329,6 +329,7 @@ block_level = 1 block_power = 30 sharpness = IS_SHARP + bleed_force = BLEED_CUT hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") @@ -448,6 +449,7 @@ block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY slot_flags = ITEM_SLOT_BACK sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("chopped", "sliced", "cut", "reaped") /obj/item/nullrod/scythe/Initialize(mapload) @@ -565,6 +567,7 @@ w_class = WEIGHT_CLASS_HUGE item_flags = ABSTRACT | ISWEAPON sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("sawed", "tore", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' tool_behaviour = TOOL_SAW @@ -589,6 +592,7 @@ worn_icon_state = "render" hitsound = 'sound/items/bikehorn.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") /obj/item/nullrod/pride_hammer @@ -639,6 +643,7 @@ throw_range = 7 throwforce = 30 sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("enlightened", "redpilled") /obj/item/nullrod/armblade @@ -653,6 +658,7 @@ item_flags = ABSTRACT | ISWEAPON w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + bleed_force = BLEED_CUT /obj/item/nullrod/armblade/Initialize(mapload) . = ..() @@ -712,6 +718,7 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + bleed_force = BLEED_CUT slot_flags = null hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") @@ -745,6 +752,7 @@ attack_verb = list("poked", "impaled", "pierced", "jabbed") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT /obj/item/nullrod/egyptian name = "egyptian staff" @@ -785,6 +793,7 @@ slot_flags = ITEM_SLOT_BELT armour_penetration = 10 sharpness = IS_SHARP_ACCURATE + bleed_force = BLEED_CUT w_class = WEIGHT_CLASS_BULKY attack_verb = list("stabbed", "poked", "slashed", "clocked") hitsound = 'sound/weapons/bladeslice.ogg' diff --git a/code/game/objects/items/kitchen.dm b/code/game/objects/items/kitchen.dm index 55047742d7d46..04bcfbc2fee83 100644 --- a/code/game/objects/items/kitchen.dm +++ b/code/game/objects/items/kitchen.dm @@ -28,7 +28,7 @@ flags_1 = CONDUCT_1 attack_verb = list("attacked", "stabbed", "poked") hitsound = 'sound/weapons/bladeslice.ogg' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) var/datum/reagent/forkload //used to eat omelette /obj/item/kitchen/fork/suicide_act(mob/living/carbon/user) diff --git a/code/game/objects/items/knives.dm b/code/game/objects/items/knives.dm index 7b67055fce7b9..c5ddeed82da17 100644 --- a/code/game/objects/items/knives.dm +++ b/code/game/objects/items/knives.dm @@ -19,6 +19,7 @@ attack_verb = list("slashes", "stabs", "slices", "tears", "lacerates", "rips", "dices", "cuts") //attack_verb_simple = list("slash", "stab", "slice", "tear", "lacerate", "rip", "dice", "cut") sharpness = IS_SHARP_ACCURATE + bleed_force = BLEED_CUT armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50) var/bayonet = FALSE //Can this be attached to a gun? //wound_bonus = 5 @@ -156,7 +157,7 @@ throwforce = 12//fuck git custom_materials = list() attack_verb = list("shanked", "shivved") - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) // Shank - Makeshift weapon that can embed on throw /obj/item/knife/shank diff --git a/code/game/objects/items/manuals.dm b/code/game/objects/items/manuals.dm index e101af436b401..db47e9aa38ca2 100644 --- a/code/game/objects/items/manuals.dm +++ b/code/game/objects/items/manuals.dm @@ -464,7 +464,7 @@ if(prob(50)) step(W, pick(GLOB.alldirs)) ADD_TRAIT(H, TRAIT_DISFIGURED, TRAIT_GENERIC) - H.bleed_rate = 5 + H.add_bleeding(BLEED_CRITICAL) H.gib_animation() sleep(3) H.adjustBruteLoss(1000) //to make the body super-bloody diff --git a/code/game/objects/items/melee/energy.dm b/code/game/objects/items/melee/energy.dm index 5a3ab991f2a87..4dbf1a193df9b 100644 --- a/code/game/objects/items/melee/energy.dm +++ b/code/game/objects/items/melee/energy.dm @@ -3,7 +3,7 @@ hitsound_on = 'sound/weapons/blade1.ogg' heat = 3500 max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF light_system = MOVABLE_LIGHT light_range = 3 @@ -102,6 +102,7 @@ throw_speed = 3 throw_range = 5 sharpness = IS_SHARP + bleed_force_on = BLEED_DEEP_WOUND embedding = list("embed_chance" = 200, "armour_block" = 60, "max_pain_mult" = 15) armour_penetration = 35 block_level = 1 @@ -134,6 +135,7 @@ sword_color = null //stops icon from breaking when turned on. w_class = WEIGHT_CLASS_NORMAL sharpness = IS_SHARP + bleed_force_on = BLEED_DEEP_WOUND light_color = "#40ceff" tool_behaviour = TOOL_SAW toolspeed = 0.7 //faster as a saw @@ -164,6 +166,7 @@ hitcost = 75 //Costs more than a standard cyborg esword w_class = WEIGHT_CLASS_NORMAL sharpness = IS_SHARP + bleed_force_on = BLEED_DEEP_WOUND light_color = "#40ceff" tool_behaviour = TOOL_SAW toolspeed = 0.7 //faster as a saw @@ -261,6 +264,7 @@ w_class = WEIGHT_CLASS_BULKY//So you can't hide it in your pocket or some such. var/datum/effect_system/spark_spread/spark_system sharpness = IS_SHARP + bleed_force_on = BLEED_DEEP_WOUND //Most of the other special functions are handled in their own files. aka special snowflake code so kewl /obj/item/melee/transforming/energy/blade/Initialize(mapload) diff --git a/code/game/objects/items/melee/misc.dm b/code/game/objects/items/melee/misc.dm index 7ffedc07349a7..b0e6ea72f9f53 100644 --- a/code/game/objects/items/melee/misc.dm +++ b/code/game/objects/items/melee/misc.dm @@ -45,6 +45,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") sharpness = IS_SHARP + bleed_force = BLEED_CUT /obj/item/melee/synthetic_arm_blade/Initialize(mapload) . = ..() @@ -68,6 +69,7 @@ w_class = WEIGHT_CLASS_BULKY armour_penetration = 75 sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("slashed", "cut") hitsound = 'sound/weapons/rapierhit.ogg' custom_materials = list(/datum/material/iron = 1000) diff --git a/code/game/objects/items/melee/transforming.dm b/code/game/objects/items/melee/transforming.dm index 8d0b3c587120e..be7012a8694ee 100644 --- a/code/game/objects/items/melee/transforming.dm +++ b/code/game/objects/items/melee/transforming.dm @@ -1,9 +1,11 @@ /obj/item/melee/transforming sharpness = IS_SHARP + bleed_force = 0 var/active = FALSE var/force_on = 30 //force when active var/faction_bonus_force = 0 //Bonus force dealt against certain factions var/throwforce_on = 20 + var/bleed_force_on = BLEED_CUT var/icon_state_on = "axe1" var/hitsound_on = 'sound/weapons/blade1.ogg' var/list/attack_verb_on = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") @@ -61,6 +63,7 @@ attack_verb = attack_verb_on icon_state = icon_state_on w_class = w_class_on + bleed_force = bleed_force_on if(embedding) updateEmbedding() else @@ -72,6 +75,7 @@ attack_verb = attack_verb_off icon_state = initial(icon_state) w_class = initial(w_class) + bleed_force = initial(bleed_force) if(embedding) disableEmbedding() if(is_sharp()) diff --git a/code/game/objects/items/mop.dm b/code/game/objects/items/mop.dm index 1156b9c8c5485..99035dc38fca4 100644 --- a/code/game/objects/items/mop.dm +++ b/code/game/objects/items/mop.dm @@ -124,4 +124,5 @@ throw_speed = 4 attack_verb = list("mopped", "stabbed", "shanked", "jousted") sharpness = IS_SHARP + bleed_force = BLEED_SURFACE embedding = list("armour_block" = 40) diff --git a/code/game/objects/items/pitchfork.dm b/code/game/objects/items/pitchfork.dm index 41f97943791cb..4bf6ed8cda10e 100644 --- a/code/game/objects/items/pitchfork.dm +++ b/code/game/objects/items/pitchfork.dm @@ -13,8 +13,9 @@ attack_verb = list("attacked", "impaled", "pierced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF /obj/item/pitchfork/ComponentInitialize() diff --git a/code/game/objects/items/pneumaticCannon.dm b/code/game/objects/items/pneumaticCannon.dm index bf8a8eb6691ac..62301d1d3afc3 100644 --- a/code/game/objects/items/pneumaticCannon.dm +++ b/code/game/objects/items/pneumaticCannon.dm @@ -14,7 +14,7 @@ item_state = "bulldog" lefthand_file = 'icons/mob/inhands/weapons/guns_lefthand.dmi' righthand_file = 'icons/mob/inhands/weapons/guns_righthand.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0, BLEED = 0) var/maxWeightClass = 20 //The max weight of items that can fit into the cannon var/loadedWeightClass = 0 //The weight of items currently in the cannon var/obj/item/tank/internals/tank = null //The gas tank that is drawn from to fire things diff --git a/code/game/objects/items/powerfist.dm b/code/game/objects/items/powerfist.dm index 7d4ef3e5fd4b6..c730ba8171fdf 100644 --- a/code/game/objects/items/powerfist.dm +++ b/code/game/objects/items/powerfist.dm @@ -13,7 +13,7 @@ throw_range = 7 w_class = WEIGHT_CLASS_NORMAL item_flags = ISWEAPON - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 40, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 40, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/click_delay = 1.5 var/fisto_setting = 1 diff --git a/code/game/objects/items/religion.dm b/code/game/objects/items/religion.dm index 64fbbf3a7676f..1f30d22dd2618 100644 --- a/code/game/objects/items/religion.dm +++ b/code/game/objects/items/religion.dm @@ -246,47 +246,6 @@ desc = "It's a backpack with lots of extra room. A blue banner is attached, that can't be removed." icon_state = "bannerpack-blue" -//this is all part of one item set - - -/obj/item/clothing/head/helmet/plate/crusader - name = "Crusader's Hood" - desc = "A brownish hood." - icon = 'icons/obj/clothing/head/chaplain.dmi' - worn_icon = 'icons/mob/clothing/head/chaplain.dmi' - icon_state = "crusader" - w_class = WEIGHT_CLASS_NORMAL - flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 50) - -/obj/item/clothing/head/helmet/plate/crusader/blue - icon_state = "crusader-blue" - item_state = null - -/obj/item/clothing/head/helmet/plate/crusader/red - icon_state = "crusader-red" - item_state = null - -//Prophet helmet -/obj/item/clothing/head/helmet/plate/crusader/prophet - name = "Prophet's Hat" - desc = "A religious-looking hat." - icon_state = null - worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' - item_state = null - flags_1 = 0 - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60, STAMINA = 60) //religion protects you from disease and radiation, honk. - worn_x_dimension = 64 - worn_y_dimension = 64 - -/obj/item/clothing/head/helmet/plate/crusader/prophet/red - icon_state = "prophet-red" - item_state = null - -/obj/item/clothing/head/helmet/plate/crusader/prophet/blue - icon_state = "prophet-blue" - item_state = null - //Structure conversion staff /obj/item/godstaff name = "godstaff" @@ -338,7 +297,7 @@ desc = "Metal boots, they look heavy." icon_state = "crusader" w_class = WEIGHT_CLASS_NORMAL - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30) //does this even do anything on boots? + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 60) //does this even do anything on boots? clothing_flags = NOSLIP cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT diff --git a/code/game/objects/items/robot/robot_items.dm b/code/game/objects/items/robot/robot_items.dm index 66765f90657db..97be530b0e914 100644 --- a/code/game/objects/items/robot/robot_items.dm +++ b/code/game/objects/items/robot/robot_items.dm @@ -592,6 +592,7 @@ icon_state = "gumball" ammo_type = /obj/item/food/gumball/cyborg nodamage = TRUE + bleed_force = 0 /obj/projectile/bullet/reusable/gumball/handle_drop() if(!dropped) @@ -612,6 +613,7 @@ ammo_type = /obj/item/food/lollipop/cyborg var/color2 = rgb(0, 0, 0) nodamage = TRUE + bleed_force = 0 /obj/projectile/bullet/reusable/lollipop/Initialize(mapload) . = ..() diff --git a/code/game/objects/items/sharpener.dm b/code/game/objects/items/sharpener.dm index daed28fd27ce5..d8df3e69ec8c4 100644 --- a/code/game/objects/items/sharpener.dm +++ b/code/game/objects/items/sharpener.dm @@ -40,6 +40,7 @@ user.visible_message("[user] sharpens [I] with [src]!", "You sharpen [I], making it much more deadly than before.") playsound(src, 'sound/items/unsheath.ogg', 25, 1) I.sharpness = IS_SHARP_ACCURATE + I.bleed_force *= 1.1 I.throwforce = clamp(I.throwforce + increment, 0, max) I.name = "[prefix] [I.name]" name = "worn out [name]" diff --git a/code/game/objects/items/shrapnel.dm b/code/game/objects/items/shrapnel.dm index 5ef59060bd9a1..103e8d676ea32 100644 --- a/code/game/objects/items/shrapnel.dm +++ b/code/game/objects/items/shrapnel.dm @@ -51,6 +51,7 @@ shrapnel_type = /obj/item/shrapnel ricochet_incidence_leeway = 60 hit_stunned_targets = TRUE + bleed_force = BLEED_SURFACE /obj/projectile/bullet/shrapnel/mega name = "flying shrapnel hunk" @@ -59,6 +60,7 @@ ricochets_max = 4 ricochet_chance = 90 ricochet_decay_chance = 0.9 + bleed_force = BLEED_CUT /obj/projectile/bullet/pellet/stingball name = "stingball pellet" diff --git a/code/game/objects/items/singularityhammer.dm b/code/game/objects/items/singularityhammer.dm index e3a1f9f6a95cc..ad2ae95a1219a 100644 --- a/code/game/objects/items/singularityhammer.dm +++ b/code/game/objects/items/singularityhammer.dm @@ -14,7 +14,7 @@ throw_range = 1 w_class = WEIGHT_CLASS_HUGE item_flags = ISWEAPON - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF | ACID_PROOF force_string = "LORD SINGULOTH HIMSELF" var/charged = 5 diff --git a/code/game/objects/items/spear.dm b/code/game/objects/items/spear.dm index fbf1bb14eea94..fbf2f8b1ee2b5 100644 --- a/code/game/objects/items/spear.dm +++ b/code/game/objects/items/spear.dm @@ -18,8 +18,9 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharpness = IS_SHARP + bleed_force = BLEED_CUT max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) var/war_cry = "AAAAARGH!!!" var/icon_prefix = "spearglass" @@ -191,6 +192,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "tore", "gored") sharpness = IS_SHARP + bleed_force = BLEED_CUT /obj/item/spear/bamboospear/ComponentInitialize() . = ..() diff --git a/code/game/objects/items/stacks/medical.dm b/code/game/objects/items/stacks/medical.dm index 08ad341ece0bd..91fd05087eeda 100644 --- a/code/game/objects/items/stacks/medical.dm +++ b/code/game/objects/items/stacks/medical.dm @@ -19,6 +19,8 @@ ///What reagent does it apply? var/list/reagent ///Is this for bruises? + var/heal_creatures = FALSE + ///Is this for bruises? var/heal_brute = FALSE ///Is this for burns? var/heal_burn = FALSE @@ -56,7 +58,7 @@ if(critter.health == critter.maxHealth) to_chat(user, "[M] is at full health.") return - if(!heal_brute) //simplemobs can only take brute damage, and can only benefit from items intended to heal it + if(!heal_creatures) //simplemobs can only take brute damage, and can only benefit from items intended to heal it to_chat(user, "[src] won't help [M] at all.") return M.heal_bodypart_damage(REAGENT_AMOUNT_PER_ITEM) @@ -72,15 +74,19 @@ return if (!user.can_interact_with(M, TRUE)) to_chat(user, "You cannot reach [M]!") + M.balloon_alert(user, "You cannot reach that.") return if (!user.can_interact_with(src, TRUE)) to_chat(user, "You cannot reach [src]!") + M.balloon_alert(user, "You cannot reach that.") return if(M.stat == DEAD && !stop_bleeding) to_chat(user, "\The [M] is dead, you cannot help [M.p_them()]!") + M.balloon_alert(user, "[M] is dead.") return if(!iscarbon(M)) to_chat(user, "You don't know how to apply \the [src] to [M]!") + M.balloon_alert(user, "You cannot use that.") return var/obj/item/bodypart/affecting var/mob/living/carbon/C = M @@ -91,29 +97,38 @@ if(!affecting) //Missing limb? to_chat(user, "[C] doesn't have \a [parse_zone(zone_selected)]!") + C.balloon_alert(user, "[C] has no [parse_zone(zone_selected)]!") return - if(ishuman(C)) //apparently only humans bleed? funky. - var/mob/living/carbon/human/H = C - if(stop_bleeding) - if(!H.bleed_rate) - to_chat(user, "[H] isn't bleeding!") - return - if(H.bleedsuppress) //so you can't stack bleed suppression - to_chat(user, "[H]'s bleeding is already bandaged!") - return - H.suppress_bloodloss(stop_bleeding) + var/valid = FALSE + var/message = null + + if(stop_bleeding) + if (C.is_bleeding()) + valid = TRUE + else if (C.is_bandaged()) + message = "[C]'s bleeding is already bandaged!" + else + message = "[C] isn't bleeding!" if(!IS_ORGANIC_LIMB(affecting)) to_chat(user, "Medicine won't work on a robotic limb!") + C.balloon_alert(user, "Cannot use on robotic limb!") return if(!(affecting.brute_dam || affecting.burn_dam)) - to_chat(user, "[M]'s [parse_zone(zone_selected)] isn't hurt!") - return + message = "[M]'s [parse_zone(zone_selected)] isn't hurt!" + else + valid = TRUE if((affecting.brute_dam && !affecting.burn_dam && !heal_brute) || (affecting.burn_dam && !affecting.brute_dam && !heal_burn)) //suffer - to_chat(user, "This type of medicine isn't appropriate for this type of wound.") + message = "This type of medicine isn't appropriate for this type of wound." + else + valid = TRUE + + if (!valid) + to_chat("[message]") + C.balloon_alert(user, message) return if(C == user) @@ -123,9 +138,19 @@ //After the do_mob to ensure metabolites have had time to process at least one tick. if(reagent && (C.reagents.get_reagent_amount(/datum/reagent/metabolite/medicine/styptic_powder) || C.reagents.get_reagent_amount(/datum/reagent/metabolite/medicine/silver_sulfadiazine))) to_chat(user, "That stuff really hurt! You'll need to wait for the pain to go away before you can apply [src] to your wounds again, maybe someone else can help put it on for you.") + C.balloon_alert(user, "You fail to apply [src] to yourself!") return - user.visible_message("[user] applies [src] on [M].", "You apply [src] on [M].") + if(stop_bleeding) + C.suppress_bloodloss(stop_bleeding) + if (C.is_bleeding()) + C.balloon_alert(user, "You reduce [M == user ? "your" : M.p_their()] bleeding to [C.get_bleed_rate_string()]") + else + C.balloon_alert(user, "You stop [M == user ? "your" : M.p_their()] bleeding!") + else + C.balloon_alert(user, "You apply [src] to [M == user ? "yourself" : M].") + + user.visible_message("[user] applies [src] to [M].", "You apply [src] to [M].") if(reagent) reagents.reaction(M, PATCH, affecting = affecting) M.reagents.add_reagent_list(reagent) //Stack size is reduced by one instead of actually removing reagents from the stack. @@ -144,6 +169,7 @@ lefthand_file = 'icons/mob/inhands/equipment/medical_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/medical_righthand.dmi' heal_brute = TRUE + heal_creatures = TRUE reagent = list(/datum/reagent/medicine/styptic_powder = REAGENT_AMOUNT_PER_ITEM) grind_results = list(/datum/reagent/medicine/styptic_powder = REAGENT_AMOUNT_PER_ITEM) merge_type = /obj/item/stack/medical/bruise_pack @@ -177,8 +203,8 @@ name = "medical gauze" desc = "A roll of elastic cloth that is extremely effective at stopping bleeding, heals minor bruising." icon_state = "gauze" - stop_bleeding = 1800 - heal_brute = TRUE //Enables gauze to be used on simplemobs for healing + stop_bleeding = BLEED_CRITICAL + heal_creatures = TRUE //Enables gauze to be used on simplemobs for healing max_amount = 12 merge_type = /obj/item/stack/medical/gauze @@ -203,8 +229,8 @@ name = "improvised gauze" singular_name = "improvised gauze" desc = "A roll of cloth roughly cut from something that can stop bleeding, but does not heal wounds." - stop_bleeding = 900 - heal_brute = 0 + stop_bleeding = BLEED_SURFACE + heal_creatures = FALSE merge_type = /obj/item/stack/medical/gauze/improvised /obj/item/stack/medical/gauze/adv diff --git a/code/game/objects/items/stacks/sheets/mineral/glass.dm b/code/game/objects/items/stacks/sheets/mineral/glass.dm index 5050f94b7aa0f..ac138bab86486 100644 --- a/code/game/objects/items/stacks/sheets/mineral/glass.dm +++ b/code/game/objects/items/stacks/sheets/mineral/glass.dm @@ -17,7 +17,7 @@ icon_state = "sheet-glass" item_state = "sheet-glass" mats_per_unit = list(/datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/glass grind_results = list(/datum/reagent/silicon = 20) @@ -70,7 +70,7 @@ icon_state = "sheet-rglass" item_state = "sheet-rglass" custom_materials = list(/datum/material/iron=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/rglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/iron = 10) @@ -115,7 +115,7 @@ item_state = "sheet-pglass" mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT) material_type = /datum/material/alloy/plasmaglass - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/plasmaglass grind_results = list(/datum/reagent/silicon = 20, /datum/reagent/toxin/plasma = 10) @@ -152,7 +152,7 @@ icon_state = "sheet-prglass" item_state = "sheet-prglass" mats_per_unit = list(/datum/material/alloy/plasmaglass=MINERAL_MATERIAL_AMOUNT, /datum/material/iron = MINERAL_MATERIAL_AMOUNT * 0.5) - armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF material_flags = NONE merge_type = /obj/item/stack/sheet/plasmarglass @@ -173,7 +173,7 @@ item_state = "sheet-titaniumglass" mats_per_unit = list(/datum/material/alloy/titaniumglass=MINERAL_MATERIAL_AMOUNT) material_type = /datum/material/alloy/titaniumglass - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF merge_type = /obj/item/stack/sheet/titaniumglass @@ -189,7 +189,7 @@ icon_state = "sheet-plastitaniumglass" item_state = "sheet-plastitaniumglass" mats_per_unit = list(/datum/material/titanium=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/plasma=MINERAL_MATERIAL_AMOUNT * 0.5, /datum/material/glass=MINERAL_MATERIAL_AMOUNT) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = ACID_PROOF material_flags = NONE merge_type = /obj/item/stack/sheet/plastitaniumglass @@ -214,9 +214,10 @@ attack_verb = list("stabbed", "slashed", "sliced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' resistance_flags = ACID_PROOF - armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 40 sharpness = IS_SHARP + bleed_force = BLEED_SURFACE var/icon_prefix embedding = list("embed_chance" = 65) diff --git a/code/game/objects/items/stacks/sheets/mineral/metals.dm b/code/game/objects/items/stacks/sheets/mineral/metals.dm index 5ae56ed1f8d4f..cdcb2c53bd51d 100644 --- a/code/game/objects/items/stacks/sheets/mineral/metals.dm +++ b/code/game/objects/items/stacks/sheets/mineral/metals.dm @@ -60,7 +60,7 @@ Metals Sheets material_type = /datum/material/alloy/plasteel throwforce = 10 flags_1 = CONDUCT_1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF merge_type = /obj/item/stack/sheet/plasteel grind_results = list(/datum/reagent/iron = 20, /datum/reagent/toxin/plasma = 20) diff --git a/code/game/objects/items/stacks/sheets/organic/wood.dm b/code/game/objects/items/stacks/sheets/organic/wood.dm index 4f214afd20bc5..9219242ab69fe 100644 --- a/code/game/objects/items/stacks/sheets/organic/wood.dm +++ b/code/game/objects/items/stacks/sheets/organic/wood.dm @@ -18,7 +18,7 @@ Woods Sheets icon = 'icons/obj/stacks/organic.dmi' mats_per_unit = list(/datum/material/wood=MINERAL_MATERIAL_AMOUNT) sheettype = "wood" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/wood material_type = /datum/material/wood @@ -39,7 +39,7 @@ Woods Sheets icon = 'icons/obj/stacks/organic.dmi' force = 10 throwforce = 10 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, BLEED = 0) resistance_flags = FLAMMABLE merge_type = /obj/item/stack/sheet/bamboo grind_results = list("carbon" = 5) diff --git a/code/game/objects/items/storage/backpack.dm b/code/game/objects/items/storage/backpack.dm index add2689859b82..413f29af2861d 100644 --- a/code/game/objects/items/storage/backpack.dm +++ b/code/game/objects/items/storage/backpack.dm @@ -45,7 +45,7 @@ item_state = "holdingpack" resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 60, ACID = 50, STAMINA = 0, BLEED = 0) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding /obj/item/storage/backpack/holding/clown @@ -81,7 +81,7 @@ worn_icon_state = "baguette" resistance_flags = FIRE_PROOF item_flags = NO_MAT_REDEMPTION - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) component_type = /datum/component/storage/concrete/bluespace/bag_of_holding /obj/item/storage/backpack/hammerspace/ComponentInitialize() diff --git a/code/game/objects/items/stunbaton.dm b/code/game/objects/items/stunbaton.dm index fa6fe4e7cdfe7..c4a190de8e587 100644 --- a/code/game/objects/items/stunbaton.dm +++ b/code/game/objects/items/stunbaton.dm @@ -12,7 +12,7 @@ w_class = WEIGHT_CLASS_LARGE item_flags = ISWEAPON attack_verb = list("enforced the law upon") - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0) var/stunforce = 40 var/turned_on = FALSE diff --git a/code/game/objects/items/tanks/tanks.dm b/code/game/objects/items/tanks/tanks.dm index b4413a5206869..6405e4b22a110 100644 --- a/code/game/objects/items/tanks/tanks.dm +++ b/code/game/objects/items/tanks/tanks.dm @@ -17,7 +17,7 @@ throw_range = 4 custom_materials = list(/datum/material/iron = 500) actions_types = list(/datum/action/item_action/set_internals) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 80, ACID = 30, STAMINA = 0, BLEED = 0) var/datum/gas_mixture/air_contents = null var/distribute_pressure = ONE_ATMOSPHERE var/integrity = 3 @@ -139,7 +139,7 @@ if(prob(50)) step(W, pick(GLOB.alldirs)) ADD_TRAIT(human_user, TRAIT_DISFIGURED, TRAIT_GENERIC) - human_user.bleed_rate = 5 + human_user.add_bleeding(BLEED_CRITICAL) human_user.gib_animation() sleep(3) human_user.adjustBruteLoss(1000) //to make the body super-bloody diff --git a/code/game/objects/items/tanks/watertank.dm b/code/game/objects/items/tanks/watertank.dm index a54c962fba487..7c7c944d047eb 100644 --- a/code/game/objects/items/tanks/watertank.dm +++ b/code/game/objects/items/tanks/watertank.dm @@ -12,7 +12,7 @@ slowdown = 1 actions_types = list(/datum/action/item_action/toggle_mister) max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/obj/item/noz diff --git a/code/game/objects/items/teleportation.dm b/code/game/objects/items/teleportation.dm index d62d696dd7bcb..17d16df206f1e 100644 --- a/code/game/objects/items/teleportation.dm +++ b/code/game/objects/items/teleportation.dm @@ -110,7 +110,7 @@ throw_speed = 3 throw_range = 5 custom_materials = list(/datum/material/iron=10000) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/list/active_portal_pairs var/max_portal_pairs = 3 diff --git a/code/game/objects/items/tools/crowbar.dm b/code/game/objects/items/tools/crowbar.dm index 63a6938164573..98e0ecc407fe4 100644 --- a/code/game/objects/items/tools/crowbar.dm +++ b/code/game/objects/items/tools/crowbar.dm @@ -16,7 +16,7 @@ attack_verb = list("attacked", "bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_CROWBAR toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) drop_sound = 'sound/items/handling/crowbar_drop.ogg' pickup_sound = 'sound/items/handling/crowbar_pickup.ogg' diff --git a/code/game/objects/items/tools/powertools.dm b/code/game/objects/items/tools/powertools.dm index 0b39452a64aae..935a5e82cc887 100644 --- a/code/game/objects/items/tools/powertools.dm +++ b/code/game/objects/items/tools/powertools.dm @@ -6,7 +6,7 @@ righthand_file = 'icons/mob/inhands/equipment/tools_righthand.dmi' w_class = WEIGHT_CLASS_SMALL custom_materials = list(/datum/material/iron=150,/datum/material/silver=50,/datum/material/titanium=25) //done for balance reasons, making them high value for research, but harder to get - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) flags_1 = CONDUCT_1 slot_flags = ITEM_SLOT_BELT toolspeed = 0.7 diff --git a/code/game/objects/items/tools/screwdriver.dm b/code/game/objects/items/tools/screwdriver.dm index 98d2e689b0a74..3db95599ce19f 100644 --- a/code/game/objects/items/tools/screwdriver.dm +++ b/code/game/objects/items/tools/screwdriver.dm @@ -25,7 +25,7 @@ greyscale_config_inhand_left = /datum/greyscale_config/screwdriver_inhand_left greyscale_config_inhand_right = /datum/greyscale_config/screwdriver_inhand_right greyscale_config_belt = /datum/greyscale_config/screwdriver_belt - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) drop_sound = 'sound/items/handling/screwdriver_drop.ogg' pickup_sound = 'sound/items/handling/screwdriver_pickup.ogg' /// If the item should be assigned a random color diff --git a/code/game/objects/items/tools/weldingtool.dm b/code/game/objects/items/tools/weldingtool.dm index 3e2df866fd0fd..5f78cff0474f6 100644 --- a/code/game/objects/items/tools/weldingtool.dm +++ b/code/game/objects/items/tools/weldingtool.dm @@ -26,7 +26,7 @@ throw_speed = 3 throw_range = 5 w_class = WEIGHT_CLASS_SMALL - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF custom_materials = list(/datum/material/iron=70, /datum/material/glass=30) diff --git a/code/game/objects/items/tools/wirecutters.dm b/code/game/objects/items/tools/wirecutters.dm index 0478da413700c..076d2ae251d9e 100644 --- a/code/game/objects/items/tools/wirecutters.dm +++ b/code/game/objects/items/tools/wirecutters.dm @@ -21,7 +21,7 @@ pickup_sound = 'sound/items/handling/wirecutter_pickup.ogg' tool_behaviour = TOOL_WIRECUTTER toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) var/random_color = TRUE var/static/list/wirecutter_colors = list( "blue" = "#1861d5", diff --git a/code/game/objects/items/tools/wrench.dm b/code/game/objects/items/tools/wrench.dm index 77c846b1fcb0c..2008a03831b1c 100644 --- a/code/game/objects/items/tools/wrench.dm +++ b/code/game/objects/items/tools/wrench.dm @@ -19,7 +19,7 @@ attack_verb = list("bashed", "battered", "bludgeoned", "whacked") tool_behaviour = TOOL_WRENCH toolspeed = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 30, STAMINA = 0, BLEED = 0) /obj/item/wrench/suicide_act(mob/living/user) user.visible_message("[user] is beating [user.p_them()]self to death with [src]! It looks like [user.p_theyre()] trying to commit suicide!") diff --git a/code/game/objects/items/toys.dm b/code/game/objects/items/toys.dm index 82734d742cf5c..3639f4e3314ce 100644 --- a/code/game/objects/items/toys.dm +++ b/code/game/objects/items/toys.dm @@ -419,6 +419,11 @@ block_level = 0 item_flags = ISWEAPON +/obj/item/dualsaber/toy/on_wield(obj/item/source, mob/living/carbon/user) + . = ..() + sharpness = IS_BLUNT + bleed_force = 0 + /obj/item/dualsaber/toy/hit_reaction(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) return 0 @@ -447,6 +452,8 @@ hitsound = 'sound/weapons/bladeslice.ogg' block_flags = BLOCKING_ACTIVE | BLOCKING_PROJECTILE //if it some how gets block level, katanas block projectiles for the meme item_flags = ISWEAPON + sharpness = IS_SHARP + bleed_force = BLEED_SURFACE /* * Snap pops @@ -1060,6 +1067,7 @@ card_throw_speed = 6 embedding = list("pain_mult" = 1, "embed_chance" = 80, "max_damage_mult" = 8, "fall_chance" = 0, "embed_chance_turf_mod" = 15, "armour_block" = 60) //less painful than throwing stars card_sharpness = IS_SHARP + bleed_force = BLEED_SURFACE card_throw_range = 7 card_attack_verb = list("attacked", "sliced", "diced", "slashed", "cut") resistance_flags = NONE diff --git a/code/game/objects/items/vending_items.dm b/code/game/objects/items/vending_items.dm index 28e2eef2001fd..a740e0baad725 100644 --- a/code/game/objects/items/vending_items.dm +++ b/code/game/objects/items/vending_items.dm @@ -17,7 +17,7 @@ throw_speed = 1 throw_range = 7 w_class = WEIGHT_CLASS_BULKY - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0, BLEED = 0) // Built automatically from the corresponding vending machine. // If null, considered to be full. Otherwise, is list(/typepath = amount). diff --git a/code/game/objects/items/weaponry.dm b/code/game/objects/items/weaponry.dm index 0fdc07a4bc782..195c3adacb1c4 100644 --- a/code/game/objects/items/weaponry.dm +++ b/code/game/objects/items/weaponry.dm @@ -12,7 +12,7 @@ throw_range = 7 attack_verb = list("banned") max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF /obj/item/banhammer/suicide_act(mob/living/user) @@ -82,8 +82,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_level = 1 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF /obj/item/claymore/Initialize(mapload) @@ -121,7 +122,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 if(ishuman(loc)) var/mob/living/carbon/human/H = loc loc.layer = LARGE_MOB_LAYER //NO HIDING BEHIND PLANTS FOR YOU, DICKWEED (HA GET IT, BECAUSE WEEDS ARE PLANTS) - H.bleedsuppress = TRUE //AND WE WON'T BLEED OUT LIKE COWARDS + H.cauterise_wounds(0.1) else if(!(flags_1 & ADMIN_SPAWNED_1)) qdel(src) @@ -236,7 +237,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") block_level = 0 block_power = 30 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) /obj/item/katana name = "katana" @@ -259,8 +260,9 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_upgrade_walk = 1 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF /obj/item/katana/cursed @@ -329,6 +331,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 item_flags = ISWEAPON hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT custom_materials = list(/datum/material/iron=500, /datum/material/glass=500) resistance_flags = FIRE_PROOF @@ -392,6 +395,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT else force = initial(force) w_class = WEIGHT_CLASS_SMALL @@ -400,6 +404,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 attack_verb = list("stubbed", "poked") hitsound = 'sound/weapons/genhit.ogg' sharpness = IS_BLUNT + bleed_force = 0 /obj/item/switchblade/suicide_act(mob/living/user) user.visible_message("[user] is slitting [user.p_their()] own throat with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -536,6 +541,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throw_range = 0 throw_speed = 0 sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND attack_verb = list("sawed", "tore", "cut", "chopped", "diced") hitsound = 'sound/weapons/chainsawhit.ogg' tool_behaviour = TOOL_SAW @@ -980,6 +986,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 block_upgrade_walk = 1 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("attacked", "slashed", "stabbed", "sliced", "torn", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' @@ -999,6 +1006,7 @@ for further reading, please see: https://github.com/tgstation/tgstation/pull/301 throwforce = 20 throw_speed = 4 sharpness = IS_SHARP + bleed_force = BLEED_CUT attack_verb = list("cut", "sliced", "diced") w_class = WEIGHT_CLASS_BULKY item_flags = ISWEAPON diff --git a/code/game/objects/objs.dm b/code/game/objects/objs.dm index 0aad652574df6..11785b80c298d 100644 --- a/code/game/objects/objs.dm +++ b/code/game/objects/objs.dm @@ -8,6 +8,8 @@ var/damtype = BRUTE var/force = 0 + /// How much bleeding damage do we cause, see __DEFINES/mobs.dm + var/bleed_force = 0 var/datum/armor/armor /// The integrity the object starts at. Defaults to max_integrity. diff --git a/code/game/objects/structures.dm b/code/game/objects/structures.dm index 529696e591274..3f97e790cae44 100644 --- a/code/game/objects/structures.dm +++ b/code/game/objects/structures.dm @@ -11,7 +11,7 @@ /obj/structure/Initialize(mapload) if (!armor) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) . = ..() if(smoothing_flags & (SMOOTH_CORNERS|SMOOTH_BITMASK)) QUEUE_SMOOTH(src) diff --git a/code/game/objects/structures/barsigns.dm b/code/game/objects/structures/barsigns.dm index 84842d31570c8..66f5a204c1ffc 100644 --- a/code/game/objects/structures/barsigns.dm +++ b/code/game/objects/structures/barsigns.dm @@ -6,7 +6,7 @@ req_access = list(ACCESS_BAR) max_integrity = 500 integrity_failure = 0.5 - armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) buildable_sign = 0 var/panel_open = FALSE diff --git a/code/game/objects/structures/crates_lockers/closets.dm b/code/game/objects/structures/crates_lockers/closets.dm index 55fb4fdb4881d..948c0ae1062b3 100644 --- a/code/game/objects/structures/crates_lockers/closets.dm +++ b/code/game/objects/structures/crates_lockers/closets.dm @@ -7,10 +7,9 @@ drag_slowdown = 1.5 // Same as a prone mob max_integrity = 200 integrity_failure = 0.25 - armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 60, STAMINA = 0, BLEED = 0) blocks_emissive = EMISSIVE_BLOCK_GENERIC pass_flags_self = LETPASSCLICKS | PASSSTRUCTURE - var/contents_initialised = FALSE var/enable_door_overlay = TRUE var/has_opened_overlay = TRUE diff --git a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm index 93e5011c30fe5..f459dda04fb4a 100644 --- a/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm +++ b/code/game/objects/structures/crates_lockers/closets/secure/secure_closets.dm @@ -4,7 +4,7 @@ locked = TRUE icon_state = "secure" max_integrity = 250 - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0) secure = TRUE /obj/structure/closet/secure_closet/run_obj_armor(damage_amount, damage_type, damage_flag = 0, attack_dir) diff --git a/code/game/objects/structures/crates_lockers/crates/secure.dm b/code/game/objects/structures/crates_lockers/crates/secure.dm index 0d173dcd57002..a3b28f10edaf0 100644 --- a/code/game/objects/structures/crates_lockers/crates/secure.dm +++ b/code/game/objects/structures/crates_lockers/crates/secure.dm @@ -5,7 +5,7 @@ secure = TRUE locked = TRUE max_integrity = 500 - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0) var/tamperproof = 0 icon_door = "crate" diff --git a/code/game/objects/structures/displaycase.dm b/code/game/objects/structures/displaycase.dm index 7c39e33e92dce..bcad7aebed77f 100644 --- a/code/game/objects/structures/displaycase.dm +++ b/code/game/objects/structures/displaycase.dm @@ -6,7 +6,7 @@ density = TRUE anchored = TRUE resistance_flags = ACID_PROOF - armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 70, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 200 integrity_failure = 0.25 var/obj/item/showpiece = null diff --git a/code/game/objects/structures/fireaxe.dm b/code/game/objects/structures/fireaxe.dm index a70c4e34d14ba..3c7b9073508b4 100644 --- a/code/game/objects/structures/fireaxe.dm +++ b/code/game/objects/structures/fireaxe.dm @@ -5,7 +5,7 @@ icon_state = "fireaxe" anchored = TRUE density = FALSE - armor = list(MELEE = 50, BULLET = 20, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 20, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0) max_integrity = 150 integrity_failure = 0.33 layer = ABOVE_WINDOW_LAYER diff --git a/code/game/objects/structures/grille.dm b/code/game/objects/structures/grille.dm index c0d495519e7f5..269dd4b96ba77 100644 --- a/code/game/objects/structures/grille.dm +++ b/code/game/objects/structures/grille.dm @@ -10,7 +10,7 @@ z_flags = Z_BLOCK_IN_DOWN | Z_BLOCK_IN_UP pressure_resistance = 5*ONE_ATMOSPHERE layer = BELOW_OBJ_LAYER - armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 70, LASER = 70, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) max_integrity = 50 integrity_failure = 0.4 var/rods_type = /obj/item/stack/rods diff --git a/code/game/objects/structures/holosign.dm b/code/game/objects/structures/holosign.dm index d5639986f9dd6..e4704b0e9e266 100644 --- a/code/game/objects/structures/holosign.dm +++ b/code/game/objects/structures/holosign.dm @@ -6,7 +6,7 @@ icon = 'icons/effects/effects.dmi' anchored = TRUE max_integrity = 1 - armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 20, STAMINA = 0, BLEED = 0) layer = BELOW_OBJ_LAYER var/obj/item/holosign_creator/projector diff --git a/code/game/objects/structures/lattice.dm b/code/game/objects/structures/lattice.dm index 4f2ece534f413..8efc68e382e4f 100644 --- a/code/game/objects/structures/lattice.dm +++ b/code/game/objects/structures/lattice.dm @@ -9,7 +9,7 @@ canSmoothWith = list(SMOOTH_GROUP_OPEN_FLOOR, SMOOTH_GROUP_WALLS, SMOOTH_GROUP_WINDOW_FULLTILE, SMOOTH_GROUP_LATTICE) density = FALSE anchored = TRUE - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0) max_integrity = 50 layer = LATTICE_LAYER //under pipes plane = FLOOR_PLANE diff --git a/code/game/objects/structures/mineral_doors.dm b/code/game/objects/structures/mineral_doors.dm index 4f07ad17c9067..4a9790843926e 100644 --- a/code/game/objects/structures/mineral_doors.dm +++ b/code/game/objects/structures/mineral_doors.dm @@ -11,7 +11,7 @@ icon = 'icons/obj/doors/mineral_doors.dmi' icon_state = "metal" max_integrity = 200 - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) CanAtmosPass = ATMOS_PASS_DENSITY rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE rad_insulation = RAD_MEDIUM_INSULATION diff --git a/code/game/objects/structures/petrified_statue.dm b/code/game/objects/structures/petrified_statue.dm index b54adca7ecda7..a2a5becf77e27 100644 --- a/code/game/objects/structures/petrified_statue.dm +++ b/code/game/objects/structures/petrified_statue.dm @@ -19,6 +19,7 @@ L.visible_message("[L]'s skin rapidly turns to marble!", "Your body freezes up! Can't... move... can't... think...") L.forceMove(src) ADD_TRAIT(L, TRAIT_MUTE, STATUE_MUTE) + ADD_TRAIT(L, TRAIT_NO_BLOOD, STATUE_MUTE) L.faction += "mimic" //Stops mimics from instaqdeling people in statues L.status_flags |= GODMODE obj_integrity = L.health + 100 //stoning damaged mobs will result in easier to shatter statues @@ -60,6 +61,7 @@ petrified_mob.status_flags &= ~GODMODE petrified_mob.forceMove(loc) REMOVE_TRAIT(petrified_mob, TRAIT_MUTE, STATUE_MUTE) + REMOVE_TRAIT(petrified_mob, TRAIT_NO_BLOOD, STATUE_MUTE) petrified_mob.take_overall_damage((petrified_mob.health - obj_integrity + 100)) //any new damage the statue incurred is transfered to the mob petrified_mob.faction -= "mimic" petrified_mob = null @@ -81,7 +83,6 @@ return 0 var/obj/structure/statue/petrified/S = new(loc, src, statue_timer) S.name = "statue of [name]" - bleedsuppress = 1 S.copy_overlays(src) var/newcolor = list(rgb(77,77,77), rgb(150,150,150), rgb(28,28,28), rgb(0,0,0)) S.add_atom_colour(newcolor, FIXED_COLOUR_PRIORITY) diff --git a/code/game/objects/structures/plasticflaps.dm b/code/game/objects/structures/plasticflaps.dm index 899b0ea8597fc..664d98167aaa2 100644 --- a/code/game/objects/structures/plasticflaps.dm +++ b/code/game/objects/structures/plasticflaps.dm @@ -3,7 +3,7 @@ desc = "Heavy duty, airtight, plastic flaps. Definitely can't get past those. No way." icon = 'icons/obj/stationobjs.dmi' icon_state = "plasticflaps" - armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 80, LASER = 80, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) density = FALSE anchored = TRUE layer = BELOW_OBJ_LAYER diff --git a/code/game/objects/structures/signs/_signs.dm b/code/game/objects/structures/signs/_signs.dm index 5c126938a2691..64077859247e6 100644 --- a/code/game/objects/structures/signs/_signs.dm +++ b/code/game/objects/structures/signs/_signs.dm @@ -5,7 +5,7 @@ density = FALSE layer = SIGN_LAYER max_integrity = 100 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) var/buildable_sign = 1 //unwrenchable and modifiable rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE diff --git a/code/game/objects/structures/tables_racks.dm b/code/game/objects/structures/tables_racks.dm index bd9d2f65d4918..59ba933331159 100644 --- a/code/game/objects/structures/tables_racks.dm +++ b/code/game/objects/structures/tables_racks.dm @@ -287,7 +287,7 @@ canSmoothWith = null max_integrity = 70 resistance_flags = ACID_PROOF - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) var/list/debris = list() /obj/structure/table/glass/Initialize(mapload) @@ -476,7 +476,7 @@ buildstack = /obj/item/stack/sheet/plasteel max_integrity = 200 integrity_failure = 0.25 - armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0) + armor = list(MELEE = 10, BULLET = 30, LASER = 30, ENERGY = 100, BOMB = 20, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) /obj/structure/table/reinforced/deconstruction_hints(mob/user) if(deconstruction_ready) @@ -570,6 +570,18 @@ . = ..() initial_link() +/obj/structure/table/optable/ComponentInitialize() + . = ..() + var/static/list/loc_connections = list( + COMSIG_ATOM_ENTERED = PROC_REF(table_entered), + ) + AddElement(/datum/element/connect_loc, loc_connections) + +/obj/structure/table/optable/Destroy() + . = ..() + if(computer?.table == src) + computer.table = null + /obj/structure/table/optable/examine(mob/user) . = ..() if(computer) @@ -591,12 +603,6 @@ computer = found_computer break - -/obj/structure/table/optable/Destroy() - . = ..() - if(computer?.table == src) - computer.table = null - /obj/structure/table/optable/tablepush(mob/living/user, mob/living/pushed_mob) pushed_mob.forceMove(loc) if(!isanimal(pushed_mob) || iscat(pushed_mob)) @@ -604,20 +610,36 @@ visible_message("[user] has laid [pushed_mob] on [src].") get_patient() +/obj/structure/table/optable/proc/table_entered() + SIGNAL_HANDLER + get_patient() + /obj/structure/table/optable/proc/get_patient() var/mob/living/carbon/M = locate(/mob/living/carbon) in loc if(M) - if(M.resting) - set_patient(M) + set_patient(M) else set_patient(null) /obj/structure/table/optable/proc/set_patient(new_patient) if(patient) UnregisterSignal(patient, COMSIG_PARENT_QDELETING) + UnregisterSignal(patient, COMSIG_LIVING_RESTING_UPDATED) + REMOVE_TRAIT(patient, TRAIT_NO_BLEEDING, TABLE_TRAIT) patient = new_patient if(patient) RegisterSignal(patient, COMSIG_PARENT_QDELETING, PROC_REF(patient_deleted)) + RegisterSignal(patient, COMSIG_LIVING_RESTING_UPDATED, PROC_REF(check_bleed_trait)) + check_bleed_trait() + +/obj/structure/table/optable/proc/check_bleed_trait() + SIGNAL_HANDLER + if (!patient) + return + if (patient.resting) + ADD_TRAIT(patient, TRAIT_NO_BLEEDING, TABLE_TRAIT) + else + REMOVE_TRAIT(patient, TRAIT_NO_BLEEDING, TABLE_TRAIT) /obj/structure/table/optable/proc/patient_deleted(datum/source) SIGNAL_HANDLER @@ -627,6 +649,8 @@ get_patient() if(!patient) return FALSE + if (!patient.resting) + return FALSE if(ishuman(patient) || ismonkey(patient)) return TRUE return FALSE diff --git a/code/game/objects/structures/window.dm b/code/game/objects/structures/window.dm index 61f81c584cc39..d4e0708538617 100644 --- a/code/game/objects/structures/window.dm +++ b/code/game/objects/structures/window.dm @@ -10,7 +10,7 @@ max_integrity = 50 can_be_unanchored = TRUE resistance_flags = ACID_PROOF - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) CanAtmosPass = ATMOS_PASS_PROC rad_insulation = RAD_VERY_LIGHT_INSULATION rad_flags = RAD_PROTECT_CONTENTS @@ -399,7 +399,7 @@ icon_state = "rwindow" reinf = TRUE heat_resistance = 1600 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 100 explosion_block = 1 glass_type = /obj/item/stack/sheet/rglass @@ -424,7 +424,7 @@ icon_state = "plasmawindow" reinf = FALSE heat_resistance = 25000 - armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0) + armor = list(MELEE = 75, BULLET = 5, LASER = 0, ENERGY = 0, BOMB = 45, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 300 glass_type = /obj/item/stack/sheet/plasmaglass rad_insulation = RAD_NO_INSULATION @@ -456,7 +456,7 @@ icon_state = "plasmarwindow" reinf = TRUE heat_resistance = 50000 - armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0) + armor = list(MELEE = 85, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 99, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 500 explosion_block = 2 glass_type = /obj/item/stack/sheet/plasmarglass @@ -487,7 +487,7 @@ icon_state = "duwindow" reinf = TRUE heat_resistance = 50000 - armor = list(MELEE = 45, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 45, BULLET = 20, LASER = 0, ENERGY = 0, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 500 explosion_block = 2 glass_type = /obj/item/stack/sheet/mineral/uranium @@ -619,7 +619,7 @@ flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) explosion_block = 3 glass_type = /obj/item/stack/sheet/titaniumglass glass_amount = 2 @@ -649,7 +649,7 @@ flags_1 = PREVENT_CLICK_UNDER_1 reinf = TRUE heat_resistance = 1600 - armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) explosion_block = 3 glass_type = /obj/item/stack/sheet/plastitaniumglass glass_amount = 2 @@ -676,7 +676,7 @@ decon_speed = 10 CanAtmosPass = ATMOS_PASS_YES resistance_flags = FLAMMABLE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) breaksound = 'sound/items/poster_ripped.ogg' hitsound = 'sound/weapons/slashmiss.ogg' var/static/mutable_appearance/torn = mutable_appearance('icons/obj/smooth_structures/windows/paperframes.dmi',icon_state = "torn", layer = ABOVE_OBJ_LAYER - 0.1) diff --git a/code/game/shuttle_engines.dm b/code/game/shuttle_engines.dm index 7fc2d2d0b5eba..3e75c43a45649 100644 --- a/code/game/shuttle_engines.dm +++ b/code/game/shuttle_engines.dm @@ -8,7 +8,7 @@ icon = 'icons/turf/shuttle.dmi' resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF max_integrity = 500 - armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0) //default + ignores melee + armor = list(MELEE = 100, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) //default + ignores melee /obj/structure/shuttle/engine name = "engine" diff --git a/code/game/turfs/closed/wall/reinf_walls.dm b/code/game/turfs/closed/wall/reinf_walls.dm index aab143bcf0564..6369006e63474 100644 --- a/code/game/turfs/closed/wall/reinf_walls.dm +++ b/code/game/turfs/closed/wall/reinf_walls.dm @@ -22,7 +22,7 @@ ) /turf/closed/wall/r_wall/get_armour_list() - return list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0) + return list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) /turf/closed/wall/r_wall/deconstruction_hints(mob/user) switch(d_state) diff --git a/code/modules/antagonists/abductor/equipment/abduction_gear.dm b/code/modules/antagonists/abductor/equipment/abduction_gear.dm index ef500c0332626..7705511521ae9 100644 --- a/code/modules/antagonists/abductor/equipment/abduction_gear.dm +++ b/code/modules/antagonists/abductor/equipment/abduction_gear.dm @@ -13,7 +13,7 @@ icon_state = "vest_stealth" item_state = "armor" blood_overlay_type = "armor" - armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30) + armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30, BLEED = 40) actions_types = list(/datum/action/item_action/hands_free/activate) allowed = list( /obj/item/abductor, @@ -28,8 +28,8 @@ /// Cooldown in seconds var/combat_cooldown = 20 var/datum/icon_snapshot/disguise - var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30) - var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90, STAMINA = 60) + var/stealth_armor = list(MELEE = 15, BULLET = 15, LASER = 15, ENERGY = 15, BOMB = 15, BIO = 15, RAD = 15, FIRE = 70, ACID = 70, STAMINA = 30, BLEED = 40) + var/combat_armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 90, ACID = 90, STAMINA = 60, BLEED = 80) /obj/item/clothing/suit/armor/abductor/vest/Initialize(mapload) . = ..() @@ -876,5 +876,5 @@ Congratulations! You are now trained for invasive xenobiology research!"} icon_state = "abductor-suit" item_state = "bl_suit" worn_icon = 'icons/mob/clothing/under/syndicate.dmi' - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) can_adjust = FALSE diff --git a/code/modules/antagonists/abductor/machinery/experiment.dm b/code/modules/antagonists/abductor/machinery/experiment.dm index 42ca6bea048be..0da1bab7e2a6a 100644 --- a/code/modules/antagonists/abductor/machinery/experiment.dm +++ b/code/modules/antagonists/abductor/machinery/experiment.dm @@ -177,6 +177,7 @@ /obj/machinery/abductor/experiment/proc/send_back(mob/living/carbon/human/H) H.Sleeping(160) H.uncuff() + H.cauterise_wounds() if(console && console.pad && console.pad.teleport_target) do_teleport(H, console.pad.teleport_target, channel = TELEPORT_CHANNEL_BLINK, no_effects = TRUE, teleport_mode = TELEPORT_MODE_ABDUCTORS) return diff --git a/code/modules/antagonists/blob/structures/_blob.dm b/code/modules/antagonists/blob/structures/_blob.dm index 3c84ee7235c92..b08aa5276472d 100644 --- a/code/modules/antagonists/blob/structures/_blob.dm +++ b/code/modules/antagonists/blob/structures/_blob.dm @@ -12,7 +12,7 @@ CanAtmosPass = ATMOS_PASS_PROC 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. max_integrity = 30 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 0, BLEED = 0) 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/antagonists/blob/structures/core.dm b/code/modules/antagonists/blob/structures/core.dm index a586d5d877d0d..1840b272ed2c7 100644 --- a/code/modules/antagonists/blob/structures/core.dm +++ b/code/modules/antagonists/blob/structures/core.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A huge, pulsating yellow mass." max_integrity = 400 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 90, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 90, STAMINA = 0, BLEED = 0) explosion_block = 6 point_return = -1 health_regen = 0 //we regen in Life() instead of when pulsed diff --git a/code/modules/antagonists/blob/structures/node.dm b/code/modules/antagonists/blob/structures/node.dm index dae14efb9ba47..7657d896696e4 100644 --- a/code/modules/antagonists/blob/structures/node.dm +++ b/code/modules/antagonists/blob/structures/node.dm @@ -4,7 +4,7 @@ icon_state = "blank_blob" desc = "A large, pulsating yellow mass." max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 65, ACID = 90, STAMINA = 0, BLEED = 0) health_regen = 3 point_return = 25 resistance_flags = LAVA_PROOF diff --git a/code/modules/antagonists/blob/structures/shield.dm b/code/modules/antagonists/blob/structures/shield.dm index 1d809d4fe104c..f39f8613c25e7 100644 --- a/code/modules/antagonists/blob/structures/shield.dm +++ b/code/modules/antagonists/blob/structures/shield.dm @@ -9,7 +9,7 @@ explosion_block = 3 point_return = 4 atmosblock = TRUE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) /obj/structure/blob/shield/scannerreport() if(atmosblock) diff --git a/code/modules/antagonists/changeling/powers/mutations.dm b/code/modules/antagonists/changeling/powers/mutations.dm index bb06f2f7fd0a5..34353516d251a 100644 --- a/code/modules/antagonists/changeling/powers/mutations.dm +++ b/code/modules/antagonists/changeling/powers/mutations.dm @@ -160,6 +160,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") sharpness = IS_SHARP + bleed_force = BLEED_CUT var/can_drop = FALSE var/fake = FALSE @@ -401,7 +402,7 @@ item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE | HEADINTERNALS //Not THICKMATERIAL because it's organic tissue, so if somebody tries to inject something into it, it still ends up in your blood. (also balance but muh fluff) allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/oxygen) - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10)//Bit less armoured than the Syndicate space suit + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10, BLEED = 80)//Bit less armoured than the Syndicate space suit slowdown = 0.2 var/datum/reagent/salbutamol = /datum/reagent/medicine/salbutamol @@ -426,7 +427,7 @@ desc = "A covering of armored pressure and temperature-resistant organic tissue with a glass-like chitin front." item_flags = DROPDEL clothing_flags = STOPSPRESSUREDAMAGE - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10) + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 30, BIO = 20, RAD = 20, FIRE = 90, ACID = 90, STAMINA = 10, BLEED = 80) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/head/helmet/space/changeling/Initialize(mapload) @@ -459,7 +460,7 @@ item_state = null item_flags = DROPDEL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30, BLEED = 90) flags_inv = HIDEJUMPSUIT cold_protection = 0 heat_protection = 0 @@ -478,7 +479,7 @@ icon_state = "lingarmorhelmet" item_state = null item_flags = DROPDEL - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 50, BOMB = 25, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30, BLEED = 90) flags_inv = HIDEEARS|HIDEHAIR|HIDEEYES|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT /obj/item/clothing/head/helmet/changeling/Initialize(mapload) diff --git a/code/modules/antagonists/clock_cult/clockwork_turfs.dm b/code/modules/antagonists/clock_cult/clockwork_turfs.dm index 5c84fd4915323..ad2d939e21422 100644 --- a/code/modules/antagonists/clock_cult/clockwork_turfs.dm +++ b/code/modules/antagonists/clock_cult/clockwork_turfs.dm @@ -519,7 +519,7 @@ icon_state = "clockwork_window_single" resistance_flags = FIRE_PROOF | ACID_PROOF max_integrity = 80 - armor = list(MELEE = 40, BULLET = -20, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = -20, LASER = 0, ENERGY = 0, BOMB = 25, BIO = 100, RAD = 100, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) explosion_block = 2 //fancy AND hard to destroy. the most useful combination. decon_speed = 40 glass_type = /obj/item/stack/sheet/brass diff --git a/code/modules/antagonists/clock_cult/items/brass_clothing.dm b/code/modules/antagonists/clock_cult/items/brass_clothing.dm index 7da92890c6589..28ef84e13a5ca 100644 --- a/code/modules/antagonists/clock_cult/items/brass_clothing.dm +++ b/code/modules/antagonists/clock_cult/items/brass_clothing.dm @@ -5,7 +5,7 @@ icon_state = "clockwork_cuirass" worn_icon = 'icons/mob/clothing/suits/armor.dmi' worn_icon_state = "clockwork_cuirass" - armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60) slowdown = 0.6 resistance_flags = FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_BULKY @@ -39,14 +39,14 @@ worn_icon_state = "clockwork_cuirass_speed" slowdown = -0.3 resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list(MELEE = 40, BULLET = 40, LASER = 10, ENERGY = -20, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 40, LASER = 10, ENERGY = -20, BOMB = 60, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 40) /obj/item/clothing/suit/clockwork/cloak name = "shrouding cloak" desc = "A faltering cloak that bends light around it, distorting the user's appearance, making it hard to see them with the naked eye. However, it provides very little protection." icon_state = "clockwork_cloak" worn_icon_state = "clockwork_cloak" - armor = list(MELEE = 10, BULLET = 60, LASER = 40, ENERGY = 20, BOMB = 40, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 20) + armor = list(MELEE = 10, BULLET = 60, LASER = 40, ENERGY = 20, BOMB = 40, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 20, BLEED = 20) slowdown = 0.4 resistance_flags = FIRE_PROOF | ACID_PROOF var/shroud_active = FALSE @@ -143,7 +143,7 @@ desc = "A strong, brass helmet worn by the soldiers of the Ratvarian armies. Includes an integrated light-dimmer for flash protection, as well as occult-grade muffling for factory based environments." icon = 'icons/obj/clothing/clockwork_garb.dmi' icon_state = "clockwork_helmet" - armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 50, BULLET = 60, LASER = 30, ENERGY = 80, BOMB = 80, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60) resistance_flags = FIRE_PROOF | ACID_PROOF w_class = WEIGHT_CLASS_BULKY flash_protect = 1 @@ -168,4 +168,4 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0, BLEED = 20) diff --git a/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm b/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm index 0e145c143a17f..85d88b5dc51ca 100644 --- a/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm +++ b/code/modules/antagonists/clock_cult/items/clockwork_weapon.dm @@ -19,6 +19,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("attacked", "poked", "jabbed", "torn", "gored") sharpness = IS_SHARP_ACCURATE + bleed_force = BLEED_CUT max_integrity = 200 var/clockwork_hint = "" var/obj/effect/proc_holder/spell/targeted/summon_spear/SS diff --git a/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm b/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm index 3ca85d0b900ad..9879bc03fa191 100644 --- a/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm +++ b/code/modules/antagonists/clock_cult/scriptures/abstraction_crystal.dm @@ -61,7 +61,7 @@ GLOBAL_LIST_INIT(abstraction_crystals, list()) . = ..() ADD_TRAIT(src, TRAIT_IGNOREDAMAGESLOWDOWN, ABSTRACTION_HOLOGRAM_TRAIT) ADD_TRAIT(src, TRAIT_NODISMEMBER, ABSTRACTION_HOLOGRAM_TRAIT) - dna.species.species_traits |= NOBLOOD + ADD_TRAIT(src, TRAIT_NO_BLOOD, ABSTRACTION_HOLOGRAM_TRAIT) /mob/living/carbon/human/abstraction_hologram/death(gibbed) //Put the person back in their body diff --git a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm index 9494d3a34d3a9..9197614fe896b 100644 --- a/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm +++ b/code/modules/antagonists/clock_cult/scriptures/ocular_warden.dm @@ -32,7 +32,7 @@ break_message = "A black ooze leaks from the ocular warden as it slowly sinks to the ground." icon_state = "ocular_warden" max_integrity = 60 - armor = list(MELEE = -80, BULLET = -50, LASER = 40, ENERGY = 40, BOMB = 20, BIO = 0, RAD = 0, STAMINA = 0) + armor = list(MELEE = -80, BULLET = -50, LASER = 40, ENERGY = 40, BOMB = 20, BIO = 0, RAD = 0, STAMINA = 0, BLEED = 0) var/cooldown /obj/structure/destructible/clockwork/ocular_warden/process(delta_time) diff --git a/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm b/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm index 377d63f93a9c5..4f331d7abd43d 100644 --- a/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm +++ b/code/modules/antagonists/clock_cult/traps/receivers/skewer.dm @@ -37,8 +37,9 @@ M.apply_damage(5, BRUTE, BODY_ZONE_CHEST) if(ishuman(M)) var/mob/living/carbon/human/H = M - if(!H.bleed_rate) - H.bleed(30) + var/armour_block = H.run_armor_check(BODY_ZONE_CHEST, BLEED) + var/hit_amount = (100 - armour_block) / 100 + H.add_bleeding(BLEED_CRITICAL * hit_amount) if(target_stabbed) if(!stab_overlay) stab_overlay = mutable_appearance('icons/obj/clockwork_objects.dmi', "brass_skewer_pokeybit", layer=ABOVE_MOB_LAYER) diff --git a/code/modules/antagonists/cult/blood_magic.dm b/code/modules/antagonists/cult/blood_magic.dm index c28d4f4d26fae..11024cdb515d4 100644 --- a/code/modules/antagonists/cult/blood_magic.dm +++ b/code/modules/antagonists/cult/blood_magic.dm @@ -356,6 +356,7 @@ var/uses = 1 var/health_cost = 0 //The amount of health taken from the user when invoking the spell var/datum/action/innate/cult/blood_spell/source + /obj/item/melee/blood_magic/Initialize(mapload, var/spell) . = ..() if(!istype(spell, /datum/action/innate/cult/blood_spell)) @@ -690,7 +691,7 @@ if(proximity) if(ishuman(target)) var/mob/living/carbon/human/H = target - if(NOBLOOD in H.dna.species.species_traits) + if((NOBLOOD in H.dna.species.species_traits) || HAS_TRAIT(H, TRAIT_NO_BLOOD)) to_chat(user,"Blood rites do not work on species with no blood!") return if(iscultist(H)) diff --git a/code/modules/antagonists/cult/cult_items.dm b/code/modules/antagonists/cult/cult_items.dm index 800a3a2d1a02b..7547343839ea3 100644 --- a/code/modules/antagonists/cult/cult_items.dm +++ b/code/modules/antagonists/cult/cult_items.dm @@ -48,6 +48,7 @@ Striking a noncultist, however, will tear their flesh."} righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 sharpness = IS_SHARP + bleed_force = BLEED_CUT w_class = WEIGHT_CLASS_BULKY block_level = 1 block_upgrade_walk = 1 @@ -138,7 +139,7 @@ Striking a noncultist, however, will tear their flesh."} desc = "A torn, dust-caked hood. Strange letters line the inside." flags_inv = HIDEFACE|HIDEHAIR|HIDEEARS flags_cover = HEADCOVERSEYES - armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40, BLEED = 20) cold_protection = HEAD min_cold_protection_temperature = HELMET_MIN_TEMP_PROTECT heat_protection = HEAD @@ -153,7 +154,7 @@ Striking a noncultist, however, will tear their flesh."} item_state = "cultrobes" body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40) + armor = list(MELEE = 30, BULLET = 30, LASER = 20, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 40, BLEED = 20) flags_inv = HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|ARMS min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT @@ -187,7 +188,7 @@ Striking a noncultist, however, will tear their flesh."} item_state = null desc = "A helm worn by the followers of Nar'Sie." flags_inv = HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDEEARS|HIDEEYES|HIDESNOUT - armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50, BLEED = 50) flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH /obj/item/clothing/suit/magusred @@ -199,7 +200,7 @@ Striking a noncultist, however, will tear their flesh."} item_state = null body_parts_covered = CHEST|GROIN|LEGS|ARMS allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 30, LASER = 50, ENERGY = 20, BOMB = 25, BIO = 10, RAD = 0, FIRE = 10, ACID = 10, STAMINA = 50, BLEED = 20) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT /obj/item/sharpener/cult @@ -220,7 +221,7 @@ Striking a noncultist, however, will tear their flesh."} icon_state = "cult_armor" item_state = null w_class = WEIGHT_CLASS_BULKY - armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40) + armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40, BLEED = 20) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie /// if anyone can equip this. used by the prefs menu var/allow_any = FALSE @@ -244,7 +245,7 @@ Striking a noncultist, however, will tear their flesh."} name = "empowered cultist helmet" desc = "Empowered helmet which creates a powerful shield around the user." icon_state = "cult_hoodalt" - armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40) + armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 30, BOMB = 50, BIO = 30, RAD = 30, FIRE = 50, ACID = 60, STAMINA = 40, BLEED = 20) /obj/item/clothing/suit/hooded/cultrobes/cult_shield/equipped(mob/living/user, slot) ..() @@ -259,14 +260,14 @@ Striking a noncultist, however, will tear their flesh."} name = "flagellant's robes" desc = "Blood-soaked robes infused with dark magic; allows the user to move at inhuman speeds, but at the cost of reduced protection." allowed = list(/obj/item/tome, /obj/item/melee/cultblade) - armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40) + armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40, BLEED = 20) slowdown = -0.4 hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood /obj/item/clothing/head/hooded/cult_hoodie/berserkerhood name = "flagellant's hood" desc = "Blood-soaked hood infused with dark magic." - armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40) + armor = list(MELEE = 10, BULLET = 20, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 40, BLEED = 20) /obj/item/clothing/suit/hooded/cultrobes/berserker/equipped(mob/living/user, slot) ..() @@ -479,6 +480,7 @@ Striking a noncultist, however, will tear their flesh."} block_upgrade_walk = 1 attack_verb = list("attacked", "impaled", "stabbed", "tore", "gored") sharpness = IS_SHARP + bleed_force = BLEED_CUT hitsound = 'sound/weapons/bladeslice.ogg' var/datum/action/innate/cult/spear/spear_act diff --git a/code/modules/antagonists/cult/cult_structures.dm b/code/modules/antagonists/cult/cult_structures.dm index e2e4d257e83ea..33a8af9597a99 100644 --- a/code/modules/antagonists/cult/cult_structures.dm +++ b/code/modules/antagonists/cult/cult_structures.dm @@ -188,11 +188,13 @@ continue new /obj/effect/temp_visual/heal(get_turf(src), "#960000") if(ishuman(L)) + var/mob/living/carbon/C = L L.adjustBruteLoss(-5*delta_time, 0) L.adjustFireLoss(-5*delta_time, 0) L.updatehealth() if(L.blood_volume < BLOOD_VOLUME_NORMAL) - L.blood_volume += 1.0 + L.blood_volume += 20 + C.cauterise_wounds(1.4) else if(isshade(L) || isconstruct(L)) var/mob/living/simple_animal/M = L M.adjustHealth(-15*delta_time) diff --git a/code/modules/antagonists/heretic/items/heretic_armor.dm b/code/modules/antagonists/heretic/items/heretic_armor.dm index 717e474a3e934..35815ff66ae45 100644 --- a/code/modules/antagonists/heretic/items/heretic_armor.dm +++ b/code/modules/antagonists/heretic/items/heretic_armor.dm @@ -31,7 +31,7 @@ allowed = list(/obj/item/melee/sickly_blade) hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/eldritch // Slightly better than normal cult robes - armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 50, LASER = 50,ENERGY = 50, BOMB = 35, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 50, BLEED = 40) /obj/item/clothing/suit/hooded/cultrobes/eldritch/examine(mob/user) . = ..() @@ -51,7 +51,7 @@ flags_cover = NONE desc = "Black like tar and doesn't reflect any light. Runic symbols line the outside, with each flash you lose comprehension of what you are seeing." item_flags = EXAMINE_SKIP - armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30, BLEED = 40) /obj/item/clothing/head/hooded/cult_hoodie/void/Initialize(mapload) . = ..() @@ -66,7 +66,7 @@ hoodtype = /obj/item/clothing/head/hooded/cult_hoodie/void flags_inv = NONE // slightly worse than normal cult robes - armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 30, LASER = 30,ENERGY = 30, BOMB = 15, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 30, BLEED = 40) body_parts_covered = CHEST|GROIN|ARMS pocket_storage_component_path = /datum/component/storage/concrete/pockets/void_cloak qdel_hood = TRUE diff --git a/code/modules/antagonists/heretic/items/heretic_blades.dm b/code/modules/antagonists/heretic/items/heretic_blades.dm index 660da9582d9b3..0c908df48b41b 100644 --- a/code/modules/antagonists/heretic/items/heretic_blades.dm +++ b/code/modules/antagonists/heretic/items/heretic_blades.dm @@ -10,6 +10,7 @@ inhand_y_dimension = 64 flags_1 = CONDUCT_1 sharpness = IS_SHARP + bleed_force = BLEED_CUT w_class = WEIGHT_CLASS_LARGE force = 24 throwforce = 10 diff --git a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm index e9f0fd6eb0255..32c5ebb716b1a 100644 --- a/code/modules/antagonists/heretic/knowledge/flesh_lore.dm +++ b/code/modules/antagonists/heretic/knowledge/flesh_lore.dm @@ -306,7 +306,7 @@ return var/mob/living/carbon/human/human_target = target - human_target.bleed_rate += 5 + human_target.add_bleeding(BLEED_DEEP_WOUND) /datum/heretic_knowledge/summon/stalker name = "Lonely Ritual" diff --git a/code/modules/antagonists/heretic/magic/blood_cleave.dm b/code/modules/antagonists/heretic/magic/blood_cleave.dm index 5d2550fe21f9f..c9597c5841c05 100644 --- a/code/modules/antagonists/heretic/magic/blood_cleave.dm +++ b/code/modules/antagonists/heretic/magic/blood_cleave.dm @@ -41,7 +41,7 @@ "Your veins burst from within and unholy flame erupts from your blood!" ) - victim.bleed_rate += 5 + victim.add_bleeding(BLEED_DEEP_WOUND) victim.adjustFireLoss(20) new /obj/effect/temp_visual/cleave(victim.drop_location()) diff --git a/code/modules/antagonists/heretic/structures/carving_knife.dm b/code/modules/antagonists/heretic/structures/carving_knife.dm index e22f2d34eee68..070b1370df972 100644 --- a/code/modules/antagonists/heretic/structures/carving_knife.dm +++ b/code/modules/antagonists/heretic/structures/carving_knife.dm @@ -7,6 +7,7 @@ icon_state = "rune_carver" flags_1 = CONDUCT_1 sharpness = IS_SHARP + bleed_force = BLEED_CUT w_class = WEIGHT_CLASS_SMALL force = 10 throwforce = 20 diff --git a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm index 9f79aaf5d78c7..4f65c750f2b65 100644 --- a/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm +++ b/code/modules/antagonists/nukeop/equipment/nuclearbomb.dm @@ -654,7 +654,7 @@ This is here to make the tiles around the station mininuke change when it's arme icon_state = "nucleardisk" persistence_replacement = /obj/item/disk/nuclear/fake max_integrity = 250 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/fake = FALSE var/turf/lastlocation diff --git a/code/modules/antagonists/space_dragon/carp_rift.dm b/code/modules/antagonists/space_dragon/carp_rift.dm index 2b661ae86a07a..c16d71bd6d90f 100644 --- a/code/modules/antagonists/space_dragon/carp_rift.dm +++ b/code/modules/antagonists/space_dragon/carp_rift.dm @@ -60,7 +60,7 @@ /obj/structure/carp_rift name = "carp rift" desc = "A rift akin to the ones space carp use to travel long distances." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_integrity = 300 icon = 'icons/obj/carp_rift.dmi' icon_state = "carp_rift_carpspawn" diff --git a/code/modules/assembly/signaler.dm b/code/modules/assembly/signaler.dm index 4471fbe27ba25..ceb6c37234717 100644 --- a/code/modules/assembly/signaler.dm +++ b/code/modules/assembly/signaler.dm @@ -252,6 +252,12 @@ icon_state = "hallucination_core" anomaly_type = /obj/effect/anomaly/hallucination +/obj/item/assembly/signaler/anomaly/blood + name = "\improper blood anomaly core" + desc = "The neutralized core of a blood anomaly. You feel your blood running through your veins when you are around it. It'd probably be valuable for research." + icon_state = "hallucination_core" + anomaly_type = /obj/effect/anomaly/blood + /obj/item/assembly/signaler/anomaly/attack_self() return diff --git a/code/modules/atmospherics/machinery/airalarm.dm b/code/modules/atmospherics/machinery/airalarm.dm index c72272eea7584..6939927dbc918 100644 --- a/code/modules/atmospherics/machinery/airalarm.dm +++ b/code/modules/atmospherics/machinery/airalarm.dm @@ -69,7 +69,7 @@ req_access = list(ACCESS_ATMOSPHERICS) max_integrity = 250 integrity_failure = 0.33 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF clicksound = 'sound/machines/terminal_select.ogg' layer = ABOVE_WINDOW_LAYER diff --git a/code/modules/atmospherics/machinery/atmosmachinery.dm b/code/modules/atmospherics/machinery/atmosmachinery.dm index cd78254e10bc8..4078955b94e27 100644 --- a/code/modules/atmospherics/machinery/atmosmachinery.dm +++ b/code/modules/atmospherics/machinery/atmosmachinery.dm @@ -57,7 +57,7 @@ normalize_cardinal_directions() nodes = new(device_type) if (!armor) - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) ..() if(process) SSair.start_processing_machine(src) diff --git a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm index 5c20e4d4fe45a..4728101cdb604 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/cryo.dm @@ -8,7 +8,7 @@ icon_state = "pod-off" density = TRUE max_integrity = 350 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 0, BLEED = 0) layer = ABOVE_WINDOW_LAYER state_open = FALSE circuit = /obj/item/circuitboard/machine/cryo_tube diff --git a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm index 41e2ce70afe5e..e7e7c4650972b 100644 --- a/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm +++ b/code/modules/atmospherics/machinery/components/unary_devices/thermomachine.dm @@ -7,7 +7,7 @@ density = TRUE max_integrity = 300 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 80, ACID = 30, STAMINA = 0, BLEED = 0) layer = OBJ_LAYER circuit = /obj/item/circuitboard/machine/thermomachine diff --git a/code/modules/atmospherics/machinery/other/meter.dm b/code/modules/atmospherics/machinery/other/meter.dm index 9781ad4a96a64..24d3e44239728 100644 --- a/code/modules/atmospherics/machinery/other/meter.dm +++ b/code/modules/atmospherics/machinery/other/meter.dm @@ -9,7 +9,7 @@ idle_power_usage = 2 active_power_usage = 4 max_integrity = 150 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 40, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 40, ACID = 0, STAMINA = 0, BLEED = 0) var/frequency = 0 var/atom/target var/target_layer = PIPING_LAYER_DEFAULT diff --git a/code/modules/atmospherics/machinery/portable/canister.dm b/code/modules/atmospherics/machinery/portable/canister.dm index 463ef5df40d75..d828301a6a128 100644 --- a/code/modules/atmospherics/machinery/portable/canister.dm +++ b/code/modules/atmospherics/machinery/portable/canister.dm @@ -9,7 +9,7 @@ greyscale_colors = "#ffff00#000000" density = TRUE volume = 1000 - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 10, BIO = 100, RAD = 100, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0) max_integrity = 250 integrity_failure = 0.4 pressure_resistance = 7 * ONE_ATMOSPHERE diff --git a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm index 0e9d101d8b382..36f8f066a4066 100644 --- a/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm +++ b/code/modules/atmospherics/machinery/portable/portable_atmospherics.dm @@ -3,7 +3,7 @@ icon = 'icons/obj/atmos.dmi' use_power = NO_POWER_USE max_integrity = 250 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 60, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 60, ACID = 30, STAMINA = 0, BLEED = 0) anchored = FALSE interacts_with_air = TRUE diff --git a/code/modules/awaymissions/mission_code/snowdin.dm b/code/modules/awaymissions/mission_code/snowdin.dm index df8eade196a78..065eb1c286158 100644 --- a/code/modules/awaymissions/mission_code/snowdin.dm +++ b/code/modules/awaymissions/mission_code/snowdin.dm @@ -545,7 +545,7 @@ /obj/item/clothing/under/syndicate/coldres name = "insulated tactical turtleneck" desc = "A nondescript and slightly suspicious-looking turtleneck with digital camouflage cargo pants. The interior has been padded with special insulation for both warmth and protection." - armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 5, BOMB = 0, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30) + armor = list(MELEE = 20, BULLET = 10, LASER = 0, ENERGY = 5, BOMB = 0, BIO = 0, RAD = 0, FIRE = 25, ACID = 25, STAMINA = 30, BLEED = 10) cold_protection = CHEST|GROIN|ARMS|LEGS min_cold_protection_temperature = FIRE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/cargo/supplypod.dm b/code/modules/cargo/supplypod.dm index afed380c46ad8..c18f42cd9b678 100644 --- a/code/modules/cargo/supplypod.dm +++ b/code/modules/cargo/supplypod.dm @@ -11,7 +11,7 @@ allow_dense = TRUE delivery_icon = null can_weld_shut = FALSE - armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 50, LASER = 50, ENERGY = 100, BOMB = 100, BIO = 0, RAD = 0, FIRE = 100, ACID = 80, STAMINA = 0, BLEED = 0) anchored = TRUE //So it cant slide around after landing anchorable = FALSE flags_1 = PREVENT_CONTENTS_EXPLOSION_1 diff --git a/code/modules/clothing/chameleon.dm b/code/modules/clothing/chameleon.dm index fa1e9ccd02f85..90bec770bbb80 100644 --- a/code/modules/clothing/chameleon.dm +++ b/code/modules/clothing/chameleon.dm @@ -356,7 +356,7 @@ random_sensor = FALSE resistance_flags = NONE can_adjust = FALSE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -433,7 +433,7 @@ item_state = "armor" blood_overlay_type = "armor" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -477,7 +477,7 @@ icon_state = "meson" item_state = "meson" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -530,7 +530,7 @@ worn_icon_state = "ygloves" resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -581,7 +581,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) /obj/item/clothing/head/chameleon name = "grey cap" @@ -591,7 +591,7 @@ clothing_flags = SNUG_FIT icon_state = "greysoft" resistance_flags = NONE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) var/datum/action/item_action/chameleon/change/chameleon_action @@ -655,7 +655,7 @@ // The camohat, I mean, holographic hat projection, is part of the // drone itself. clothing_flags = SNUG_FIT - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) // which means it offers no protection, it's just air and light /obj/item/clothing/head/chameleon/drone/Initialize(mapload) @@ -709,7 +709,7 @@ icon_state = "gas_alt" item_state = "gas_alt" resistance_flags = NONE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) clothing_flags = BLOCK_GAS_SMOKE_EFFECT | MASKINTERNALS flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEFACIALHAIR|HIDESNOUT gas_transfer_coefficient = 0.01 @@ -778,7 +778,7 @@ /obj/item/clothing/mask/chameleon/drone //Same as the drone chameleon hat, undroppable and no protection - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10) // Can drones use the voice changer part? Let's not find out. voice_change = FALSE @@ -803,7 +803,7 @@ desc = "A pair of black shoes." permeability_coefficient = 0.05 resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) pocket_storage_component_path = /datum/component/storage/concrete/pockets/shoes var/datum/action/item_action/chameleon/change/chameleon_action @@ -1043,7 +1043,7 @@ desc = "A neosilk clip-on tie." icon_state = "blacktie" resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) /obj/item/clothing/neck/chameleon var/datum/action/item_action/chameleon/change/chameleon_action diff --git a/code/modules/clothing/clothing.dm b/code/modules/clothing/clothing.dm index 47a218632d5c8..44d399d74d434 100644 --- a/code/modules/clothing/clothing.dm +++ b/code/modules/clothing/clothing.dm @@ -218,7 +218,7 @@ compare_to = thing break var/list/readout = list("PROTECTION CLASSES") - if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.magic || armor.melee || armor.rad || armor.stamina) + if(armor.bio || armor.bomb || armor.bullet || armor.energy || armor.laser || armor.magic || armor.melee || armor.rad || armor.stamina || armor.bleed) readout += "
ARMOR (I-X)" if(armor.bio || compare_to?.armor?.bio) readout += "
TOXIN [armor_to_protection_class(armor.bio, compare_to?.armor?.bio)]" @@ -238,6 +238,8 @@ readout += "
RADIATION [armor_to_protection_class(armor.rad, compare_to?.armor?.rad)]" if(armor.stamina || compare_to?.armor?.stamina) readout += "
STAMINA [armor_to_protection_class(armor.stamina, compare_to?.armor?.stamina)]" + if(armor.bleed || compare_to?.armor?.bleed) + readout += "
BLEEDING [armor_to_protection_class(armor.bleed, compare_to?.armor?.bleed)]" if(armor.fire || armor.acid) readout += "
DURABILITY (I-X)" if(armor.fire || compare_to?.armor?.fire) diff --git a/code/modules/clothing/glasses/_glasses.dm b/code/modules/clothing/glasses/_glasses.dm index 3deaa56984fc7..2b2d663dc7bcb 100644 --- a/code/modules/clothing/glasses/_glasses.dm +++ b/code/modules/clothing/glasses/_glasses.dm @@ -123,6 +123,7 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE /obj/item/clothing/glasses/meson/prescription name = "prescription meson scanner" @@ -142,7 +143,7 @@ actions_types = list(/datum/action/item_action/toggle_research_scanner) glass_colour_type = /datum/client_colour/glass_colour/purple resistance_flags = ACID_PROOF - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 100, STAMINA = 0, BLEED = 0) /obj/item/clothing/glasses/science/item_action_slot_check(slot) if(slot == ITEM_SLOT_EYES) @@ -154,7 +155,7 @@ icon_state = "prescscihud" emissive_state = "prehud_emissive" resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 0, BLEED = 0) vision_correction = 1 /obj/item/clothing/glasses/science/sciencesun @@ -223,6 +224,7 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE glass_colour_type = /datum/client_colour/glass_colour/lightgreen /obj/item/clothing/glasses/regular @@ -306,6 +308,7 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE /obj/item/clothing/glasses/sunglasses/advanced/garb/supergarb name = "black giga gar glasses" @@ -326,6 +329,7 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE glass_colour_type = /datum/client_colour/glass_colour/orange /obj/item/clothing/glasses/sunglasses/advanced/gar/supergar diff --git a/code/modules/clothing/glasses/hud.dm b/code/modules/clothing/glasses/hud.dm index fc8fde641339d..7750907ad3cdb 100644 --- a/code/modules/clothing/glasses/hud.dm +++ b/code/modules/clothing/glasses/hud.dm @@ -292,6 +292,7 @@ attack_verb = list("sliced") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_SURFACE /obj/item/clothing/glasses/hud/security/sunglasses/gars/supergars name = "giga HUD gar glasses" diff --git a/code/modules/clothing/gloves/color.dm b/code/modules/clothing/gloves/color.dm index 7043a304d7cfd..7b6e4a9108017 100644 --- a/code/modules/clothing/gloves/color.dm +++ b/code/modules/clothing/gloves/color.dm @@ -178,7 +178,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT strip_delay = 60 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 0, BLEED = 0) /obj/item/clothing/gloves/color/latex name = "latex gloves" diff --git a/code/modules/clothing/gloves/miscellaneous.dm b/code/modules/clothing/gloves/miscellaneous.dm index acd01cd5bb2fe..e993df33d96ca 100644 --- a/code/modules/clothing/gloves/miscellaneous.dm +++ b/code/modules/clothing/gloves/miscellaneous.dm @@ -25,7 +25,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 70, ACID = 30, STAMINA = 0, BLEED = 0) /obj/item/clothing/gloves/combat name = "combat gloves" @@ -41,7 +41,7 @@ heat_protection = HANDS max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 20) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 20, BLEED = 10) /obj/item/clothing/gloves/bracer name = "bone bracers" @@ -57,7 +57,7 @@ min_cold_protection_temperature = GLOVES_MIN_TEMP_PROTECT max_heat_protection_temperature = GLOVES_MAX_TEMP_PROTECT resistance_flags = NONE - armor = list(MELEE = 15, BULLET = 35, LASER = 35, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0, STAMINA = 20) + armor = list(MELEE = 15, BULLET = 35, LASER = 35, ENERGY = 20, BOMB = 35, BIO = 35, RAD = 35, FIRE = 0, ACID = 0, STAMINA = 20, BLEED = 20) /obj/item/clothing/gloves/rapid name = "Gloves of the North Star" diff --git a/code/modules/clothing/head/beanie.dm b/code/modules/clothing/head/beanie.dm index 3317d4f3a1fba..5e2360d757310 100644 --- a/code/modules/clothing/head/beanie.dm +++ b/code/modules/clothing/head/beanie.dm @@ -89,7 +89,7 @@ name = "durathread beanie" desc = "A beanie made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beaniedurathread" - armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 5, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20) + armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 5, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20, BLEED = 40) /obj/item/clothing/head/beanie/waldo name = "red striped bobble hat" diff --git a/code/modules/clothing/head/hardhat.dm b/code/modules/clothing/head/hardhat.dm index aac6425962fac..3d56556c11896 100644 --- a/code/modules/clothing/head/hardhat.dm +++ b/code/modules/clothing/head/hardhat.dm @@ -7,7 +7,7 @@ desc = "A piece of headgear used in dangerous working conditions to protect the head. Comes with a built-in flashlight." icon_state = "hardhat0_yellow" item_state = null - armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 20) + armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 20, BLEED = 60) flags_inv = NONE actions_types = list(/datum/action/item_action/toggle_helmet_light) resistance_flags = FIRE_PROOF diff --git a/code/modules/clothing/head/helmet.dm b/code/modules/clothing/head/helmet.dm index 549653969a5f6..457e800ba29f6 100644 --- a/code/modules/clothing/head/helmet.dm +++ b/code/modules/clothing/head/helmet.dm @@ -5,7 +5,7 @@ worn_icon = 'icons/mob/clothing/head/helmet.dmi' icon_state = "helmet" item_state = "helmet" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50) flags_inv = HIDEEARS cold_protection = HEAD heat_protection = HEAD @@ -57,7 +57,7 @@ desc = "A bulletproof combat helmet that excels in protecting the wearer against traditional projectile weaponry and explosives to a minor extent." icon_state = "helmetalt" item_state = "helmetalt" - armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 15, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 15, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50) /obj/item/clothing/head/helmet/alt/Initialize(mapload) . = ..() @@ -116,7 +116,7 @@ item_state = "helmet" toggle_message = "You pull the visor down on" alt_toggle_message = "You push the visor up on" - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 70) flags_inv = HIDEEARS|HIDEFACE|HIDESNOUT strip_delay = 80 actions_types = list(/datum/action/item_action/toggle) @@ -172,7 +172,7 @@ desc = "An extremely robust, space-worthy helmet in a nefarious red and black stripe pattern." icon_state = "swatsyndie" item_state = "swatsyndie" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 90, RAD = 20, FIRE = 50, ACID = 50, STAMINA = 50) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 90, RAD = 20, FIRE = 50, ACID = 50, STAMINA = 50, BLEED = 70) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -198,7 +198,7 @@ flags_inv = HIDEEARS|HIDEHAIR icon_state = "thunderdome" item_state = "thunderdome" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) cold_protection = HEAD min_cold_protection_temperature = SPACE_HELM_MIN_TEMP_PROTECT heat_protection = HEAD @@ -208,14 +208,14 @@ /obj/item/clothing/head/helmet/thunderdome/holosuit cold_protection = null heat_protection = null - armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) /obj/item/clothing/head/helmet/roman name = "\improper Roman helmet" desc = "An ancient helmet made of bronze and leather." flags_inv = HIDEEARS|HIDEHAIR flags_cover = HEADCOVERSEYES - armor = list(MELEE = 25, BULLET = 0, LASER = 25, ENERGY = 30, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 40) + armor = list(MELEE = 25, BULLET = 0, LASER = 25, ENERGY = 30, BOMB = 10, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 40, BLEED = 50) resistance_flags = FIRE_PROOF icon_state = "roman" item_state = "roman" @@ -223,7 +223,7 @@ /obj/item/clothing/head/helmet/roman/fake desc = "An ancient helmet made of plastic and leather." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10) /obj/item/clothing/head/helmet/roman/legionnaire name = "\improper Roman legionnaire helmet" @@ -233,7 +233,7 @@ /obj/item/clothing/head/helmet/roman/legionnaire/fake desc = "An ancient helmet made of plastic and leather. Has a red crest on top of it." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 10) /obj/item/clothing/head/helmet/gladiator name = "gladiator helmet" @@ -249,7 +249,7 @@ icon_state = "redtaghelm" flags_cover = HEADCOVERSEYES item_state = "redtaghelm" - armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10) + armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10, BLEED = 10) /obj/item/clothing/head/helmet/bluetaghelm name = "blue laser tag helmet" @@ -257,14 +257,14 @@ icon_state = "bluetaghelm" flags_cover = HEADCOVERSEYES item_state = "bluetaghelm" - armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10) + armor = list(MELEE = 15, BULLET = 10, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 0, RAD = 0, FIRE = 0, ACID = 50, STAMINA = 10, BLEED = 10) /obj/item/clothing/head/helmet/knight name = "medieval helmet" desc = "A classic metal helmet." icon_state = "knight_green" item_state = "knight_green" - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 10) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH strip_delay = 80 @@ -287,7 +287,7 @@ desc = "An intimidating tribal helmet, it doesn't look very comfortable." flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT flags_cover = HEADCOVERSEYES - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 40) icon_state = "skull" item_state = "skull" strip_delay = 100 @@ -298,7 +298,7 @@ icon_state = "durathread" item_state = "durathread" resistance_flags = FLAMMABLE - armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 5, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30) + armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 5, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30, BLEED = 60) strip_delay = 60 /obj/item/clothing/head/helmet/rus_helmet @@ -306,7 +306,7 @@ desc = "It can hold a bottle of vodka." icon_state = "rus_helmet" item_state = "rus_helmet" - armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 20) + armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 20, BLEED = 15) pocket_storage_component_path = /datum/component/storage/concrete/pockets/helmet /obj/item/clothing/head/helmet/rus_ushanka @@ -317,7 +317,7 @@ body_parts_covered = HEAD cold_protection = HEAD min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 20) + armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 20, BLEED = 15) /obj/item/clothing/head/helmet/outlaw name = "outlaw's hat" @@ -328,4 +328,4 @@ item_state = "cowboy" worn_icon_state = "cowboy_outlaw" body_parts_covered = HEAD - armor = list(MELEE = 25, BULLET = 25, LASER = 20, ENERGY = 10, BOMB = 30, BIO = 30, RAD = 20, FIRE = 0, ACID = 40, STAMINA = 25) + armor = list(MELEE = 25, BULLET = 25, LASER = 20, ENERGY = 10, BOMB = 30, BIO = 30, RAD = 20, FIRE = 0, ACID = 40, STAMINA = 25, BLEED = 15) diff --git a/code/modules/clothing/head/jobs.dm b/code/modules/clothing/head/jobs.dm index 68f6e149d4418..debc8f0c7bc1d 100644 --- a/code/modules/clothing/head/jobs.dm +++ b/code/modules/clothing/head/jobs.dm @@ -32,7 +32,7 @@ icon_state = "captain" item_state = "that" flags_inv = 0 - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 30) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/captain dying_key = DYE_REGISTRY_CAP @@ -50,7 +50,7 @@ name = "head of personnel's cap" icon_state = "hopcap" desc = "The symbol of true bureaucratic micromanagement." - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 15) dog_fashion = /datum/dog_fashion/head/hop dying_key = DYE_REGISTRY_CAP @@ -74,7 +74,7 @@ /obj/item/clothing/head/fedora/det_hat name = "detective's fedora" desc = "There's only one man who can sniff out the dirty stench of crime, and he's likely wearing this hat." - armor = list(MELEE = 25, BULLET = 5, LASER = 25, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 25) + armor = list(MELEE = 25, BULLET = 5, LASER = 25, ENERGY = 30, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 25, BLEED = 20) icon_state = "detective" item_state = "det_hat" var/candy_cooldown = 0 @@ -171,7 +171,7 @@ name = "durathread beret" desc = "A beret made from durathread, its resilient fibres provide some protection to the wearer." icon_state = "beretdurathread" - armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 20, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20) + armor = list(MELEE = 15, BULLET = 25, LASER = 15, ENERGY = 20, BOMB = 10, BIO = 0, RAD = 0, FIRE = 30, ACID = 5, STAMINA = 20, BLEED = 45) //Security @@ -179,7 +179,7 @@ name = "head of security cap" desc = "The robust standard-issue cap of the Head of Security. For showing the officers who's in charge." icon_state = "hoscap" - armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 10, RAD = 0, FIRE = 50, ACID = 60, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 10, RAD = 0, FIRE = 50, ACID = 60, STAMINA = 30, BLEED = 30) strip_delay = 80 dynamic_hair_suffix = "" dying_key = DYE_REGISTRY_CAP @@ -205,7 +205,7 @@ name = "warden's police hat" desc = "It's a special armored hat issued to the Warden of a security force. Protects the head from impacts." icon_state = "policehelm" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30, BLEED = 25) strip_delay = 60 dog_fashion = /datum/dog_fashion/head/warden @@ -282,14 +282,14 @@ name = "corporate warden beret" desc = "A special black beret with the Warden's insignia in the middle. This one is commonly worn by wardens of the corporation." icon_state = "beret_corporate_warden" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 60, STAMINA = 30, BLEED = 25) strip_delay = 60 /obj/item/clothing/head/beret/sec name = "security beret" desc = "A robust beret with the security insignia emblazoned on it. Uses reinforced fabric to offer sufficient protection." icon_state = "beret_badge" - armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 35, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 25) strip_delay = 60 dog_fashion = null @@ -297,14 +297,14 @@ name = "corporate security beret" desc = "A special black beret for the mundane life of a corporate security officer." icon_state = "beret_corporate_officer" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 25) strip_delay = 60 /obj/item/clothing/head/beret/spacepol name = "spacepol officer beret" desc = "A special black beret for the mundane life of a SpacePol officer." icon_state = "beret_corporate_officer" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 25) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyhos @@ -316,7 +316,7 @@ name = "warden's beret" desc = "A special beret with the Warden's insignia emblazoned on it. For wardens with class." icon_state = "wardenberet" - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 30, ACID = 50, STAMINA = 30, BLEED = 25) strip_delay = 60 /obj/item/clothing/head/beret/sec/navyofficer @@ -333,35 +333,35 @@ name = "engineering beret" desc = "A beret with the engineering insignia emblazoned on it. For engineers that are more inclined towards style than safety." icon_state = "beret_engineering" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0) strip_delay = 60 /obj/item/clothing/head/beret/atmos name = "atmospherics beret" desc = "A beret for those who have shown immaculate proficienty in piping. Or plumbing." icon_state = "beret_atmospherics" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0) strip_delay = 60 /obj/item/clothing/head/beret/ce name = "chief engineer beret" desc = "A white beret with the engineering insignia emblazoned on it. Its owner knows what they're doing. Probably." icon_state = "beret_ce" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 20, FIRE = 30, ACID = 0, STAMINA = 0, BLEED = 0) strip_delay = 60 /obj/item/clothing/head/beret/sci name = "science beret" desc = "A purple beret with the science insignia emblazoned on it. It has that authentic burning plasma smell." icon_state = "beret_sci" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 5, RAD = 0, FIRE = 5, ACID = 10, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 5, BIO = 5, RAD = 0, FIRE = 5, ACID = 10, STAMINA = 0, BLEED = 0) strip_delay = 60 /obj/item/clothing/head/beret/supply name = "supply beret" desc = "A brown beret with the supply insignia emblazoned on it. You can't help but wonder how much it'd sell for." icon_state = "beret_supply" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 10, ACID = 0, STAMINA = 0, BLEED = 0) strip_delay = 60 //Medical @@ -369,14 +369,14 @@ name = "medical beret" desc = "A white beret with a blue cross finely threaded into it. It has that sterile smell about it." icon_state = "beret_med" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) strip_delay = 60 /obj/item/clothing/head/beret/cmo name = "chief medical officer beret" desc = "A baby blue beret with the insignia of Medistan. It smells very sterile." icon_state = "beret_cmo" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, RAD = 10, FIRE = 0, ACID = 20, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 30, RAD = 10, FIRE = 0, ACID = 20, STAMINA = 0, BLEED = 0) strip_delay = 60 //CentCom @@ -384,21 +384,21 @@ name = "central command captain beret" desc = "A pure white beret with a Captain insignia of Central Command." icon_state = "beret_centcom_captain" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80) strip_delay = 120 /obj/item/clothing/head/beret/ccofficer name = "central command officer beret" desc = "A black Central Command Officer beret with matching insignia." icon_state = "beret_centcom_officer" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80) strip_delay = 120 /obj/item/clothing/head/beret/ccofficernavy name = "central command naval officer beret" desc = "A Navy beret commonly worn by Central Command Naval Officers." icon_state = "beret_centcom_officer_navy" - armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80) + armor = list(melee = 80, bullet = 80, laser = 80, energy = 80, bomb = 80, bio = 80, rad = 80, fire = 80, acid = 80, stamina = 80, BLEED = 80) strip_delay = 120 //For blueshields, but those aren't in so I renamed them to centcom guards @@ -406,28 +406,28 @@ name = "officer beret" desc = "A black CentCom guard's beret." icon_state = "beret_centcom_officer" - armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30) + armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20) strip_delay = 60 /obj/item/clothing/head/beret/ccguardnavy name = "navy officer beret" desc = "A navy CentCom guard's beret." icon_state = "beret_centcom_officer_navy" - armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30) + armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20) strip_delay = 60 /obj/item/clothing/head/beret/sergeant name = "spacepol sergeant beret" desc = "A navy SpacePol sergeant's beret." icon_state = "beret_centcom_officer_navy" - armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30) + armor = list(melee = 40, bullet = 20, laser = 10, energy = 10, bomb = 10, bio = 5, rad = 5, fire = 5, acid = 30, stamina = 30, BLEED = 20) strip_delay = 60 /obj/item/clothing/head/beret/captain name = "captain beret" desc = "A lovely blue Captain beret with a gold and white insignia." icon_state = "beret_captain" - armor = list(melee = 50, bullet = 30, laser = 20, energy = 30, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60, stamina = 40) + armor = list(melee = 50, bullet = 30, laser = 20, energy = 30, bomb = 15, bio = 10, rad = 10, fire = 10, acid = 60, stamina = 40, BLEED = 20) strip_delay = 90 diff --git a/code/modules/clothing/head/soft_caps.dm b/code/modules/clothing/head/soft_caps.dm index 626be7660e166..ffeb296e16c42 100644 --- a/code/modules/clothing/head/soft_caps.dm +++ b/code/modules/clothing/head/soft_caps.dm @@ -100,7 +100,7 @@ desc = "It's a robust baseball hat in tasteful red colour." icon_state = "secsoft" soft_color = "sec" - armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 20, ACID = 50, STAMINA = 30, BLEED = 10) strip_delay = 60 /obj/item/clothing/head/soft/sec/brig_physician diff --git a/code/modules/clothing/masks/gasmask.dm b/code/modules/clothing/masks/gasmask.dm index 078794d068270..0b11d95207a2c 100644 --- a/code/modules/clothing/masks/gasmask.dm +++ b/code/modules/clothing/masks/gasmask.dm @@ -28,7 +28,7 @@ custom_materials = list(/datum/material/iron=4000, /datum/material/glass=2000) flash_protect = 2 tint = 2 - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 55, STAMINA = 15) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 55, STAMINA = 15, BLEED = 5) actions_types = list(/datum/action/item_action/toggle) flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDESNOUT flags_cover = MASKCOVERSEYES @@ -53,7 +53,7 @@ desc = "A modernised version of the classic design, this mask will not only filter out toxins but it can also be connected to an air supply." icon_state = "plaguedoctor" item_state = "gas_mask" - armor = list(MELEE = 0, BULLET = 0, LASER = 2, ENERGY = 2, BOMB = 0, BIO = 75, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 2, ENERGY = 2, BOMB = 0, BIO = 75, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) /obj/item/clothing/mask/gas/syndicate name = "syndicate mask" diff --git a/code/modules/clothing/masks/hailer.dm b/code/modules/clothing/masks/hailer.dm index e57031859a5ec..7dd01b5036195 100644 --- a/code/modules/clothing/masks/hailer.dm +++ b/code/modules/clothing/masks/hailer.dm @@ -33,7 +33,7 @@ aggressiveness = 3 flags_inv = HIDEFACIALHAIR | HIDEFACE | HIDEEYES | HIDEEARS | HIDEHAIR | HIDESNOUT visor_flags_inv = 0 - armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 30) + armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 30, BLEED = 30) /obj/item/clothing/mask/gas/sechailer/swat/spacepol name = "spacepol mask" diff --git a/code/modules/clothing/masks/miscellaneous.dm b/code/modules/clothing/masks/miscellaneous.dm index 820e797ab04ad..36de595d0c701 100644 --- a/code/modules/clothing/masks/miscellaneous.dm +++ b/code/modules/clothing/masks/miscellaneous.dm @@ -28,7 +28,7 @@ visor_flags_cover = MASKCOVERSMOUTH gas_transfer_coefficient = 0.9 permeability_coefficient = 0.01 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 25, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 25, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) actions_types = list(/datum/action/item_action/adjust) /obj/item/clothing/mask/surgical/attack_self(mob/user) diff --git a/code/modules/clothing/shoes/magboots.dm b/code/modules/clothing/shoes/magboots.dm index f8866bb182728..2b67cb1555e3f 100644 --- a/code/modules/clothing/shoes/magboots.dm +++ b/code/modules/clothing/shoes/magboots.dm @@ -65,7 +65,7 @@ icon_state = "advmag0" magboot_state = "advmag" slowdown_active = SHOES_SLOWDOWN - armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30, BLEED = 40) clothing_flags = NOSLIP /obj/item/clothing/shoes/magboots/commando/attack_self(mob/user) //Code for the passive no-slip of the commando magboots to always apply, kind of a shit code solution though. diff --git a/code/modules/clothing/shoes/miscellaneous.dm b/code/modules/clothing/shoes/miscellaneous.dm index 68eb7b389753b..5264e741c872e 100644 --- a/code/modules/clothing/shoes/miscellaneous.dm +++ b/code/modules/clothing/shoes/miscellaneous.dm @@ -6,7 +6,7 @@ item_state = "jackboots" lefthand_file = 'icons/mob/inhands/equipment/security_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/security_righthand.dmi' - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 10, RAD = 0, FIRE = 70, ACID = 50, STAMINA = 30, BLEED = 20) strip_delay = 40 resistance_flags = NONE permeability_coefficient = 0.05 //Thick soles, and covers the ankle @@ -17,7 +17,7 @@ desc = "High speed, no drag combat boots." permeability_coefficient = 0.01 clothing_flags = NOSLIP - armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 30, LASER = 25, ENERGY = 25, BOMB = 50, BIO = 30, RAD = 30, FIRE = 90, ACID = 50, STAMINA = 30, BLEED = 20) /obj/item/clothing/shoes/sandal desc = "A pair of rather plain wooden sandals." @@ -44,7 +44,7 @@ strip_delay = 30 equip_delay_other = 50 resistance_flags = NONE - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 40, ACID = 75, STAMINA = 0, BLEED = 0) can_be_bloody = FALSE custom_price = 100 diff --git a/code/modules/clothing/spacesuits/_spacesuits.dm b/code/modules/clothing/spacesuits/_spacesuits.dm index 890e117ce4d66..5ea087070c7c4 100644 --- a/code/modules/clothing/spacesuits/_spacesuits.dm +++ b/code/modules/clothing/spacesuits/_spacesuits.dm @@ -9,7 +9,7 @@ desc = "A special helmet with solar UV shielding to protect your eyes from harmful rays." clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | HEADINTERNALS permeability_coefficient = 0.01 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10, BLEED = 50) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -38,7 +38,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals) slowdown = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 50, FIRE = 80, ACID = 70, STAMINA = 10, BLEED = 50) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT diff --git a/code/modules/clothing/spacesuits/chronosuit.dm b/code/modules/clothing/spacesuits/chronosuit.dm index 1d2a6df1be4db..e15ddf4ad1a74 100644 --- a/code/modules/clothing/spacesuits/chronosuit.dm +++ b/code/modules/clothing/spacesuits/chronosuit.dm @@ -4,7 +4,7 @@ icon_state = "chronohelmet" item_state = "chronohelmet" slowdown = 1 - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 100, STAMINA = 70) + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 80) resistance_flags = FIRE_PROOF | ACID_PROOF var/obj/item/clothing/suit/space/chronos/suit @@ -24,7 +24,7 @@ icon_state = "chronosuit" item_state = "chronosuit" actions_types = list(/datum/action/item_action/toggle) - armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 1000, STAMINA = 70) + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 60, BOMB = 30, BIO = 90, RAD = 90, FIRE = 100, ACID = 1000, STAMINA = 70, BLEED = 80) resistance_flags = FIRE_PROOF | ACID_PROOF var/list/chronosafe_items = list(/obj/item/chrono_eraser, /obj/item/gun/energy/chrono_gun) var/obj/item/clothing/head/helmet/space/chronos/helmet diff --git a/code/modules/clothing/spacesuits/hardsuit.dm b/code/modules/clothing/spacesuits/hardsuit.dm index 100f5a28e4450..0b5843e948e0b 100644 --- a/code/modules/clothing/spacesuits/hardsuit.dm +++ b/code/modules/clothing/spacesuits/hardsuit.dm @@ -7,7 +7,7 @@ icon_state = "hardsuit0-engineering" item_state = "eng_helm" max_integrity = 300 - armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20) + armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70) light_system = MOVABLE_LIGHT light_range = 4 light_power = 1 @@ -133,7 +133,7 @@ icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" max_integrity = 300 - armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20) + armor = list(MELEE = 10, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/t_scanner, /obj/item/construction/rcd, /obj/item/pipe_dispenser) siemens_coefficient = 0 var/obj/item/clothing/head/helmet/space/hardsuit/helmet @@ -242,7 +242,7 @@ desc = "A special helmet designed for work in a hazardous, low-pressure environment. Has radiation shielding." icon_state = "hardsuit0-engineering" item_state = "eng_helm" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 12, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 12, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70) hardsuit_type = "engineering" resistance_flags = FIRE_PROOF @@ -251,7 +251,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has radiation shielding." icon_state = "hardsuit-engineering" item_state = "eng_hardsuit" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 75, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine resistance_flags = FIRE_PROOF @@ -262,7 +262,7 @@ icon_state = "hardsuit0-atmospherics" item_state = "atmo_helm" hardsuit_type = "atmospherics" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -271,7 +271,7 @@ desc = "A special suit that protects against hazardous, low pressure environments. Has thermal shielding." icon_state = "hardsuit-atmospherics" item_state = "atmo_hardsuit" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 25, FIRE = 100, ACID = 75, STAMINA = 20, BLEED = 70) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/atmos @@ -284,7 +284,7 @@ icon_state = "hardsuit0-white" item_state = "ce_helm" hardsuit_type = "white" - armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30, BLEED = 70) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -293,7 +293,7 @@ name = "advanced hardsuit" desc = "An advanced suit that protects against hazardous, low pressure environments. Shines with a high polish." item_state = "ce_hardsuit" - armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30) + armor = list(MELEE = 40, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 90, STAMINA = 30, BLEED = 70) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/engine/elite @@ -309,7 +309,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF heat_protection = HEAD - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40, BLEED = 70) light_range = 7 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) high_pressure_multiplier = 0.6 @@ -326,7 +326,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF supports_variations = DIGITIGRADE_VARIATION - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 40, BLEED = 70) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/mining heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -344,7 +344,7 @@ item_state = "death_commando_mask" hardsuit_type = "exploration" heat_protection = HEAD - armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20) + armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70) light_range = 6 allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator) actions_types = list( @@ -369,7 +369,7 @@ desc = "An advanced space-proof hardsuit designed to protect against off-station threats. Despite looking remarkably similar to the mining hardsuit \ Nanotrasen officials note that it is unique in every way and the design has not been copied in any way." item_state = "exploration_hardsuit" - armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20) + armor = list(MELEE = 35, BULLET = 15, LASER = 20, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 75, STAMINA = 20, BLEED = 70) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/exploration heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -386,7 +386,7 @@ icon_state = "hardsuit0-cybersun" item_state = "death_commando_mask" hardsuit_type = "cybersun" - armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15) + armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70) strip_delay = 600 /obj/item/clothing/suit/space/hardsuit/cybersun @@ -395,7 +395,7 @@ desc = "A bulky, protective suit designed to protect against the perils facing Cybersun Employed Engineers, Researchers, and more as they head from the safety of \ more stable employment to the dangers of Nanotrasen Controlled Deep Space. Designed to get the job done despite on-site hazards in derelicts, laser armor was \ sacrificed in favor of more effective blunt armor plates and radiation shielding." - armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15) + armor = list(MELEE = 30, BULLET = 35, LASER = 15, ENERGY = 15, BOMB = 60, BIO = 100, RAD = 55, FIRE = 30, ACID = 60, STAMINA = 15, BLEED = 70) hardsuit_type = "cybersun" item_state = "death_commando_mask" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/cybersun @@ -409,7 +409,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, STAMINA = 60, BLEED = 70) on = TRUE var/obj/item/clothing/suit/space/hardsuit/syndi/linkedsuit = null actions_types = list(/datum/action/item_action/toggle_helmet_mode,\ @@ -498,7 +498,7 @@ hardsuit_type = "syndi" w_class = WEIGHT_CLASS_NORMAL supports_variations = DIGITIGRADE_VARIATION - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 55, BOMB = 35, BIO = 100, RAD = 50, FIRE = 50, ACID = 90, STAMINA = 60, BLEED = 70) allowed = list(/obj/item/gun, /obj/item/ammo_box,/obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi jetpack = /obj/item/tank/jetpack/suit @@ -562,7 +562,7 @@ alt_desc = "An elite version of the syndicate helmet, with improved armour and fireproofing. It is in combat mode. Property of Gorlex Marauders." icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" - armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80, BLEED = 70) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -574,7 +574,7 @@ icon_state = "hardsuit0-syndielite" hardsuit_type = "syndielite" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/syndi/elite - armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80) + armor = list(MELEE = 60, BULLET = 60, LASER = 50, ENERGY = 80, BOMB = 55, BIO = 100, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 80, BLEED = 70) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -609,7 +609,7 @@ item_state = "wiz_helm" hardsuit_type = "wiz" resistance_flags = FIRE_PROOF | ACID_PROOF //No longer shall our kind be foiled by lone chemists with spray bottles! - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) heat_protection = HEAD //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -620,7 +620,7 @@ item_state = "wiz_hardsuit" w_class = WEIGHT_CLASS_NORMAL resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70) + armor = list(MELEE = 40, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) allowed = list(/obj/item/teleportation_scroll, /obj/item/tank/internals) heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS //Uncomment to enable firesuit protection max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT @@ -642,7 +642,7 @@ item_state = "medical_helm" hardsuit_type = "medical" flash_protect = 0 - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 70) clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS /obj/item/clothing/suit/space/hardsuit/medical @@ -652,7 +652,7 @@ item_state = "medical_hardsuit" supports_variations = DIGITIGRADE_VARIATION allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/firstaid, /obj/item/healthanalyzer, /obj/item/stack/medical) - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 10, BIO = 100, RAD = 60, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/medical slowdown = 0.5 @@ -673,7 +673,7 @@ hardsuit_type = "rd" resistance_flags = ACID_PROOF | FIRE_PROOF max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30, BLEED = 70) var/obj/machinery/doppler_array/integrated/bomb_radar clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL | SNUG_FIT | SCAN_REAGENTS | HEADINTERNALS actions_types = list(/datum/action/item_action/toggle_helmet_light, /datum/action/item_action/toggle_research_scanner) @@ -704,7 +704,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT //Same as an emergency firesuit. Not ideal for extended exposure. allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/gun/energy/wormhole_projector, /obj/item/hand_tele, /obj/item/aicard) - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 15, BOMB = 100, BIO = 100, RAD = 60, FIRE = 60, ACID = 80, STAMINA = 30, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/rd /obj/item/clothing/suit/space/hardsuit/research_director/ComponentInitialize() @@ -718,7 +718,7 @@ icon_state = "hardsuit0-sec" item_state = "sec_helm" hardsuit_type = "sec" - armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50) + armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70) /obj/item/clothing/suit/space/hardsuit/security @@ -727,7 +727,7 @@ desc = "A bulky, armored suit designed to protect security personnel in low pressure environments." item_state = "sec_hardsuit" supports_variations = DIGITIGRADE_VARIATION - armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50) + armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security /obj/item/clothing/suit/space/hardsuit/security/Initialize(mapload) @@ -740,7 +740,7 @@ desc = "A bulky, armored helmet designed to protect security personnel in low pressure environments. This one has markings for the head of security." icon_state = "hardsuit0-hos" hardsuit_type = "hos" - armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50) + armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70) /obj/item/clothing/suit/space/hardsuit/security/head_of_security @@ -748,7 +748,7 @@ name = "head of security's hardsuit" supports_variations = DIGITIGRADE_VARIATION desc = "A bulky, armored suit designed to protect security personnel in low pressure environments. This one has markings for the head of security." - armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50) + armor = list(MELEE = 35, BULLET = 35, LASER = 30, ENERGY = 50, BOMB = 40, BIO = 100, RAD = 50, FIRE = 75, ACID = 75, STAMINA = 50, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos jetpack = /obj/item/tank/jetpack/suit @@ -758,7 +758,7 @@ icon_state = "swat2helm" item_state = "swat2helm" desc = "A tactical SWAT helmet MK.II." - armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70) resistance_flags = FIRE_PROOF | ACID_PROOF flags_inv = HIDEEARS|HIDEEYES|HIDEFACE|HIDEHAIR|HIDESNOUT heat_protection = HEAD @@ -772,7 +772,7 @@ desc = "A MK.II SWAT suit with streamlined joints and armor made out of superior materials, insulated against intense heat. The most advanced tactical armor available." icon_state = "swat2" item_state = "swat2" - armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 50, ENERGY = 60, BOMB = 50, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70) resistance_flags = FIRE_PROOF | ACID_PROOF heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT //this needed to be added a long fucking time ago @@ -802,7 +802,7 @@ desc = "A special helmet designed for work in a hazardous, low-humor environment. Has radiation shielding." icon_state = "hardsuit0-clown" item_state = "hardsuit0-clown" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20, BLEED = 70) hardsuit_type = "clown" /obj/item/clothing/suit/space/hardsuit/clown @@ -810,7 +810,7 @@ desc = "A special suit that protects against hazardous, low humor environments. Has radiation shielding. Only a true clown can wear it." icon_state = "hardsuit-clown" item_state = "clown_hardsuit" - armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 5, LASER = 10, ENERGY = 20, BOMB = 10, BIO = 100, RAD = 75, FIRE = 60, ACID = 30, STAMINA = 20, BLEED = 70) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/clown /obj/item/clothing/suit/space/hardsuit/clown/mob_can_equip(mob/M, mob/living/equipper, slot, disable_warning = FALSE, bypass_equip_delay_self = FALSE) @@ -828,7 +828,7 @@ desc = "Early prototype RIG hardsuit helmet, designed to quickly shift over a user's head. Design constraints of the helmet mean it has no inbuilt cameras, thus it restricts the users visability." icon_state = "hardsuit0-ancient" item_state = "anc_helm" - armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30, BLEED = 70) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/gun/energy/plasmacutter, /obj/item/gun/energy/plasmacutter/adv, /obj/item/gun/energy/laser/retro, /obj/item/gun/energy/laser/retro/old, /obj/item/gun/energy/e_gun/old) hardsuit_type = "ancient" resistance_flags = FIRE_PROOF @@ -838,7 +838,7 @@ desc = "Prototype powered RIG hardsuit. Provides excellent protection from the elements of space while being comfortable to move around in, thanks to the powered locomotives. Remains very bulky however." icon_state = "hardsuit-ancient" item_state = "anc_hardsuit" - armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 5, LASER = 5, ENERGY = 10, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 75, STAMINA = 30, BLEED = 70) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/storage/bag/ore, /obj/item/pickaxe, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/gun/energy/laser/retro, /obj/item/gun/energy/laser/retro/old, /obj/item/gun/energy/e_gun/old) slowdown = 3 helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ancient @@ -854,7 +854,7 @@ helmettype = /obj/item/clothing/head/helmet/space/hardsuit/security/hos allowed = null supports_variations = DIGITIGRADE_VARIATION - armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 30, BULLET = 15, LASER = 30, ENERGY = 40, BOMB = 10, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70) resistance_flags = FIRE_PROOF | ACID_PROOF /// How many charges total the shielding has var/max_charges = 3 @@ -887,7 +887,7 @@ hardsuit_type = "ert_medical" // Adding TRAIT_NODROP is done when the CTF spawner equips people helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf - armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, STAMINA = 0, BLEED = 0) slowdown = 0 max_charges = 5 @@ -914,7 +914,7 @@ icon_state = "hardsuit0-ert_medical" item_state = "hardsuit0-ert_medical" hardsuit_type = "ert_medical" - armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 50, BIO = 100, RAD = 100, FIRE = 95, ACID = 95, STAMINA = 0, BLEED = 0) /obj/item/clothing/head/helmet/space/hardsuit/shielded/ctf/red @@ -941,7 +941,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_hardsuit" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70) allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi slowdown = 0 @@ -974,7 +974,7 @@ icon_state = "hardsuit1-syndi" item_state = "syndie_helm" hardsuit_type = "syndi" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 35, BIO = 100, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 70) actions_types = list(/datum/action/item_action/toggle_helmet_light,\ /datum/action/item_action/toggle_beacon_hud) @@ -1004,7 +1004,7 @@ hardsuit_type = "syndi" max_charges = 4 recharge_delay = 1.5 SECONDS - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY =60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY =60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT jetpack = /obj/item/tank/jetpack/suit @@ -1017,7 +1017,7 @@ icon_state = "deathsquad" item_state = "deathsquad" hardsuit_type = "syndi" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() @@ -1046,7 +1046,7 @@ item_state = "doomguy" max_charges = 1 recharge_delay = 100 - armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF | LAVA_PROOF @@ -1058,7 +1058,7 @@ desc = "A dusty old helmet, somehow capable of resisting the strongest of blows." icon_state = "doomguy" item_state = "doomguy" - armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 135, BULLET = 135, LASER = 135, ENERGY = 135, BOMB = 135, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT actions_types = list() diff --git a/code/modules/clothing/spacesuits/miscellaneous.dm b/code/modules/clothing/spacesuits/miscellaneous.dm index 5b0ff8e0f79cc..6d17f4c639af0 100644 --- a/code/modules/clothing/spacesuits/miscellaneous.dm +++ b/code/modules/clothing/spacesuits/miscellaneous.dm @@ -22,7 +22,7 @@ Contains: desc = "An advanced tactical space helmet." icon_state = "deathsquad" item_state = "deathsquad" - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -37,7 +37,7 @@ Contains: icon_state = "deathsquad" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/knife/combat) - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -55,7 +55,7 @@ Contains: dynamic_hair_suffix = "+generic" dynamic_fhair_suffix = "+generic" flags_inv = 0 - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -74,7 +74,7 @@ Contains: flags_inv = 0 w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 50, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -115,7 +115,7 @@ Contains: worn_icon = 'icons/mob/clothing/head/costume.dmi' icon_state = "pirate" item_state = "pirate" - armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 20) flags_inv = HIDEHAIR strip_delay = 40 equip_delay_other = 20 @@ -137,7 +137,7 @@ Contains: flags_inv = 0 allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/melee/transforming/energy/sword/pirate, /obj/item/clothing/glasses/eyepatch, /obj/item/reagent_containers/food/drinks/bottle/rum) slowdown = 0 - armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 60, ACID = 75, STAMINA = 20, BLEED = 20) strip_delay = 40 equip_delay_other = 20 @@ -147,7 +147,7 @@ Contains: desc = "The integrated helmet of an ERT hardsuit, this one has blue highlights." icon_state = "hardsuit0-ert_commander" item_state = "hardsuit0-ert_commander" - armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70) + armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70, BLEED = 70) strip_delay = 130 light_range = 7 resistance_flags = FIRE_PROOF @@ -185,7 +185,7 @@ Contains: item_state = "ert_command" helmettype = /obj/item/clothing/head/helmet/space/hardsuit/ert allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70) + armor = list(MELEE = 65, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 70, BLEED = 70) slowdown = 0 strip_delay = 130 resistance_flags = FIRE_PROOF @@ -279,7 +279,7 @@ Contains: icon_state = "space" item_state = "eva_suit" desc = "A lightweight space suit with the basic ability to protect the wearer from the vacuum of space during emergencies." - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 0, BLEED = 30) /obj/item/clothing/head/helmet/space/eva name = "EVA helmet" @@ -287,7 +287,7 @@ Contains: item_state = "eva_helmet" desc = "A lightweight space helmet with the basic ability to protect the wearer from the vacuum of space during emergencies." flash_protect = 0 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 20, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 0, BLEED = 30) /obj/item/clothing/head/helmet/space/freedom name = "eagle helmet" @@ -296,7 +296,7 @@ Contains: worn_icon = 'icons/mob/clothing/head/costume.dmi' icon_state = "griffinhat" item_state = null - armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10) + armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10, BLEED = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -307,7 +307,7 @@ Contains: icon_state = "freedom" item_state = "freedom" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10) + armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 25, BOMB = 100, BIO = 100, RAD = 100, FIRE = 80, ACID = 80, STAMINA = 10, BLEED = 30) strip_delay = 130 max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = ACID_PROOF | FIRE_PROOF @@ -388,7 +388,7 @@ Contains: desc = "A bulky, air-tight helmet meant to protect the user during emergency situations. It doesn't look very durable." icon_state = "syndicate-helm-orange" item_state = "syndicate-helm-orange" - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5) strip_delay = 65 flash_protect = 0 @@ -399,7 +399,7 @@ Contains: icon_state = "syndicate-orange" item_state = "syndicate-orange" slowdown = 2 - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 10, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5) strip_delay = 65 w_class = WEIGHT_CLASS_NORMAL @@ -419,7 +419,7 @@ Contains: icon_state = "hunter" item_state = "swat_suit" allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/knife/combat) - armor = list(melee = 60, bullet = 40, laser = 40, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, stamina = 70) + armor = list(melee = 60, bullet = 40, laser = 40, energy = 50, bomb = 100, bio = 100, rad = 100, fire = 100, acid = 100, stamina = 70, BLEED = 70) strip_delay = 130 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -432,7 +432,7 @@ Contains: max_integrity = 200 desc = "An airtight helmet meant to protect the wearer during emergency situations." permeability_coefficient = 0.01 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 20, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) min_cold_protection_temperature = EMERGENCY_HELM_MIN_TEMP_PROTECT heat_protection = NONE flash_protect = 0 @@ -461,7 +461,7 @@ Contains: species_restricted = null gas_transfer_coefficient = 0.5 permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) allowed = list(/obj/item/flashlight, /obj/item/tank/internals) min_cold_protection_temperature = EMERGENCY_SUIT_MIN_TEMP_PROTECT heat_protection = NONE @@ -477,4 +477,4 @@ Contains: icon_state = "hunter" item_state = "hunter" resistance_flags = FIRE_PROOF | ACID_PROOF - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 20) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 20, BLEED = 40) diff --git a/code/modules/clothing/spacesuits/plasmamen.dm b/code/modules/clothing/spacesuits/plasmamen.dm index f48881e11cde0..cbb70b6fb407a 100644 --- a/code/modules/clothing/spacesuits/plasmamen.dm +++ b/code/modules/clothing/spacesuits/plasmamen.dm @@ -5,7 +5,7 @@ name = "EVA plasma envirosuit" desc = "A special plasma containment suit designed to be space-worthy, as well as worn over other clothing. Like its smaller counterpart, it can automatically extinguish the wearer in a crisis, and holds twice as many charges." allowed = list(/obj/item/gun, /obj/item/ammo_casing, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword, /obj/item/restraints/handcuffs, /obj/item/tank) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10) resistance_flags = FIRE_PROOF icon_state = "plasmaman_suit" item_state = "plasmaman_suit" @@ -51,7 +51,7 @@ strip_delay = 80 flash_protect = 2 tint = 2 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10) resistance_flags = FIRE_PROOF light_system = MOVABLE_LIGHT light_range = 4 @@ -244,7 +244,7 @@ name = "security envirosuit helmet" desc = "A plasmaman containment helmet designed for security officers, protecting them from burning alive, along-side other undesirables." greyscale_colors = "#9F2A2E#2D2D2D#7D282D" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10, BLEED = 10) /obj/item/clothing/head/helmet/space/plasmaman/security/warden name = "warden's envirosuit helmet" @@ -295,7 +295,7 @@ name = "engineering envirosuit helmet" desc = "A space-worthy helmet specially designed for engineer plasmamen, the usual purple stripes being replaced by engineering's orange." greyscale_colors = "#F0DE00#D75600#F0DE00" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10) max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/plasmaman/engineering/atmospherics @@ -461,7 +461,7 @@ name = "security Mk.II envirosuit helmet" desc = "A stylish new iteration upon the original plasmaman containment helmet design for security officers, retaining all the old protections for a new era of fragile law enforcement." greyscale_colors = "#9F2A2E#2D2D2D" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 100, ACID = 75, STAMINA = 10, BLEED = 10) /obj/item/clothing/head/helmet/space/plasmaman/mark2/security/warden name = "warden's Mk.II envirosuit helmet" @@ -512,7 +512,7 @@ name = "engineering Mk.II envirosuit helmet" desc = "A new iteration upon the classic space-worthy design, painted in classic engineering pigments." greyscale_colors = "#E8D700#D75600" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10) max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/plasmaman/mark2/engineering/atmospherics @@ -713,7 +713,7 @@ name = "engineering protective envirosuit helmet" desc = "A safer looking re-imagining of the classic space-worthy design, painted in classic engineering pigments." greyscale_colors = "#E8D700#D75600" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 100, ACID = 75, STAMINA = 0, BLEED = 10) max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT /obj/item/clothing/head/helmet/space/plasmaman/protective/engineering/atmospherics diff --git a/code/modules/clothing/spacesuits/syndi.dm b/code/modules/clothing/spacesuits/syndi.dm index 38f43419aaa22..4124a4c74e964 100644 --- a/code/modules/clothing/spacesuits/syndi.dm +++ b/code/modules/clothing/spacesuits/syndi.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "syndicate" desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50, BLEED = 40) /obj/item/clothing/suit/space/syndicate name = "red space suit" @@ -13,7 +13,7 @@ desc = "Has a tag on it: Totally not property of an enemy corporation, honest!" w_class = WEIGHT_CLASS_NORMAL allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/melee/transforming/energy/sword/saber, /obj/item/restraints/handcuffs, /obj/item/tank/internals) - armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50) + armor = list(MELEE = 40, BULLET = 50, LASER = 30, ENERGY = 40, BOMB = 30, BIO = 30, RAD = 30, FIRE = 80, ACID = 85, STAMINA = 50, BLEED = 40) //Green syndicate space suit diff --git a/code/modules/clothing/suits/_suits.dm b/code/modules/clothing/suits/_suits.dm index c5e44eed3df98..cedfcb6216b46 100644 --- a/code/modules/clothing/suits/_suits.dm +++ b/code/modules/clothing/suits/_suits.dm @@ -10,7 +10,7 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 5) slot_flags = ITEM_SLOT_OCLOTHING var/blood_overlay_type = "suit" var/move_sound = null diff --git a/code/modules/clothing/suits/armor.dm b/code/modules/clothing/suits/armor.dm index 6360f050b52ae..cd7a215162672 100644 --- a/code/modules/clothing/suits/armor.dm +++ b/code/modules/clothing/suits/armor.dm @@ -11,7 +11,7 @@ equip_delay_other = 40 max_integrity = 250 resistance_flags = NONE - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 50) clothing_flags = THICKMATERIAL slowdown = 0.08 @@ -53,7 +53,7 @@ icon_state = "secjacket" item_state = "secjacket" body_parts_covered = CHEST|ARMS - armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 45, ACID = 45, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 25, LASER = 25, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 0, FIRE = 45, ACID = 45, STAMINA = 30, BLEED = 20) /obj/item/clothing/suit/armor/hos name = "armored greatcoat" @@ -61,7 +61,7 @@ icon_state = "hos" item_state = "greatcoat" body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 70, ACID = 90, STAMINA = 40) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 40, BOMB = 25, BIO = 0, RAD = 0, FIRE = 70, ACID = 90, STAMINA = 40, BLEED = 40) cold_protection = CHEST|GROIN|LEGS|ARMS heat_protection = CHEST|GROIN|LEGS|ARMS strip_delay = 80 @@ -112,7 +112,7 @@ icon_state = "capcarapace" item_state = "armor" body_parts_covered = CHEST|GROIN - armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 90, STAMINA = 40) + armor = list(MELEE = 50, BULLET = 40, LASER = 50, ENERGY = 60, BOMB = 25, BIO = 0, RAD = 0, FIRE = 100, ACID = 90, STAMINA = 40, BLEED = 60) dog_fashion = null resistance_flags = FIRE_PROOF @@ -134,7 +134,7 @@ icon_state = "capjacket" item_state = null body_parts_covered = CHEST|ARMS - armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 50, BOMB = 55, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 40) + armor = list(MELEE = 40, BULLET = 30, LASER = 40, ENERGY = 50, BOMB = 55, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 40, BLEED = 30) /obj/item/clothing/suit/armor/riot name = "riot suit" @@ -144,7 +144,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 50, BLEED = 70) blocks_shove_knockdown = TRUE strip_delay = 80 equip_delay_other = 60 @@ -157,7 +157,7 @@ icon_state = "bonearmor" item_state = "bonearmor" blood_overlay_type = "armor" - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 30, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 50) body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS slowdown = 0.1 @@ -167,7 +167,7 @@ icon_state = "bulletproof" item_state = "armor" blood_overlay_type = "armor" - armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 40) + armor = list(MELEE = 15, BULLET = 60, LASER = 10, ENERGY = 10, BOMB = 40, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 40, BLEED = 60) strip_delay = 70 equip_delay_other = 50 @@ -177,7 +177,7 @@ icon_state = "armor_reflec" item_state = "armor_reflec" blood_overlay_type = "armor" - armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 80, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 40) + armor = list(MELEE = 10, BULLET = 10, LASER = 60, ENERGY = 80, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 10) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF var/hit_reflect_chance = 40 @@ -199,7 +199,6 @@ allowed = GLOB.detective_vest_allowed //All of the armor below is mostly unused - /obj/item/clothing/suit/armor/heavy name = "heavy armor" desc = "A heavily armored suit that protects against moderate damage." @@ -210,7 +209,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 3 flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 60) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 60, BLEED = 70) move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') slowdown = 0.3 @@ -219,7 +218,7 @@ flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0) + armor = list(MELEE = 80, BULLET = 80, LASER = 50, ENERGY = 60, BOMB = 100, BIO = 100, RAD = 100, FIRE = 90, ACID = 90, STAMINA = 0, BLEED = 0) move_sound = list('sound/effects/suitstep1.ogg', 'sound/effects/suitstep2.ogg') /obj/item/clothing/suit/armor/tdome/red @@ -236,7 +235,7 @@ /obj/item/clothing/suit/armor/tdome/holosuit name = "thunderdome suit" - armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 10, BULLET = 10, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) cold_protection = null heat_protection = null @@ -279,14 +278,14 @@ equip_delay_other = 40 max_integrity = 200 resistance_flags = FLAMMABLE - armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30) + armor = list(MELEE = 20, BULLET = 40, LASER = 30, ENERGY = 40, BOMB = 15, BIO = 0, RAD = 0, FIRE = 40, ACID = 50, STAMINA = 30, BLEED = 60) /obj/item/clothing/suit/armor/vest/russian name = "russian vest" desc = "A bulletproof vest with forest camo. Good thing there's plenty of forests to hide in around here, right?" icon_state = "rus_armor" item_state = "rus_armor" - armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 25) + armor = list(MELEE = 25, BULLET = 30, LASER = 0, ENERGY = 15, BOMB = 10, BIO = 0, RAD = 20, FIRE = 20, ACID = 50, STAMINA = 25, BLEED = 20) slowdown = 0.05 /obj/item/clothing/suit/armor/vest/russian_coat @@ -297,7 +296,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS cold_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT - armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 20, LASER = 20, ENERGY = 30, BOMB = 20, BIO = 50, RAD = 20, FIRE = -10, ACID = 50, STAMINA = 30, BLEED = 20) /obj/item/clothing/suit/armor/centcom_formal name = "\improper CentCom formal coat" @@ -305,7 +304,7 @@ icon_state = "centcom_formal" item_state = "centcom" body_parts_covered = CHEST|GROIN|ARMS - armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60, STAMINA = 40) + armor = list(MELEE = 35, BULLET = 40, LASER = 40, ENERGY = 50, BOMB = 35, BIO = 10, RAD = 10, FIRE = 10, ACID = 60, STAMINA = 40, BLEED = 20) /obj/item/clothing/suit/armor/centcom_formal/Initialize(mapload) . = ..() diff --git a/code/modules/clothing/suits/bio.dm b/code/modules/clothing/suits/bio.dm index 3dde7ff43b8dc..3c54e15f9bdeb 100644 --- a/code/modules/clothing/suits/bio.dm +++ b/code/modules/clothing/suits/bio.dm @@ -8,7 +8,7 @@ item_state = "bio_hood" permeability_coefficient = 0.01 clothing_flags = THICKMATERIAL | BLOCK_GAS_SMOKE_EFFECT | SNUG_FIT - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0, BLEED = 5) flags_inv = HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDEFACE|HIDESNOUT resistance_flags = ACID_PROOF flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -27,7 +27,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 1 allowed = list(/obj/item/tank/internals, /obj/item/pen, /obj/item/flashlight/pen, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 0, BLEED = 5) flags_inv = HIDEGLOVES|HIDEJUMPSUIT strip_delay = 70 equip_delay_other = 70 @@ -53,11 +53,11 @@ //Security biosuit, grey with red stripe across the chest /obj/item/clothing/head/bio_hood/security - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20, BLEED = 10) icon_state = "bio_security" /obj/item/clothing/suit/bio_suit/security - armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20) + armor = list(MELEE = 25, BULLET = 15, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 100, RAD = 80, FIRE = 30, ACID = 100, STAMINA = 20, BLEED = 10) icon_state = "bio_security" diff --git a/code/modules/clothing/suits/chaplainsuits.dm b/code/modules/clothing/suits/chaplainsuits.dm index de791187c41ac..5ba05f80d4d4f 100644 --- a/code/modules/clothing/suits/chaplainsuits.dm +++ b/code/modules/clothing/suits/chaplainsuits.dm @@ -130,6 +130,44 @@ slowdown = 0 move_sound = null +/obj/item/clothing/head/helmet/plate/crusader + name = "Crusader's Hood" + desc = "A brownish hood." + icon = 'icons/obj/clothing/head/chaplain.dmi' + worn_icon = 'icons/mob/clothing/head/chaplain.dmi' + icon_state = "crusader" + w_class = WEIGHT_CLASS_NORMAL + flags_inv = HIDEHAIR|HIDEEARS|HIDEFACE + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 40, BOMB = 60, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 50, BLEED = 60) + +/obj/item/clothing/head/helmet/plate/crusader/blue + icon_state = "crusader-blue" + item_state = null + +/obj/item/clothing/head/helmet/plate/crusader/red + icon_state = "crusader-red" + item_state = null + +//Prophet helmet +/obj/item/clothing/head/helmet/plate/crusader/prophet + name = "Prophet's Hat" + desc = "A religious-looking hat." + icon_state = null + worn_icon = 'icons/mob/large-worn-icons/64x64/head.dmi' + item_state = null + flags_1 = 0 + armor = list(MELEE = 60, BULLET = 60, LASER = 60, ENERGY = 50, BOMB = 70, BIO = 50, RAD = 50, FIRE = 60, ACID = 60, STAMINA = 60, BLEED = 60) //religion protects you from disease and radiation, honk. + worn_x_dimension = 64 + worn_y_dimension = 64 + +/obj/item/clothing/head/helmet/plate/crusader/prophet/red + icon_state = "prophet-red" + item_state = null + +/obj/item/clothing/head/helmet/plate/crusader/prophet/blue + icon_state = "prophet-blue" + item_state = null + /obj/item/clothing/head/helmet/chaplain/cage name = "cage" desc = "A cage that restrains the will of the self, allowing one to see the profane world for what it is." diff --git a/code/modules/clothing/suits/cloaks.dm b/code/modules/clothing/suits/cloaks.dm index 4d17d97204bbe..2e2214d96b77f 100644 --- a/code/modules/clothing/suits/cloaks.dm +++ b/code/modules/clothing/suits/cloaks.dm @@ -63,7 +63,7 @@ icon_state = "goliath_cloak" desc = "A staunch, practical cape made out of numerous monster materials, it is coveted amongst exiles & hermits." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/pickaxe, /obj/item/spear, /obj/item/spear/bonespear, /obj/item/organ/regenerative_core/legion, /obj/item/knife/combat/bone, /obj/item/knife/combat/survival) - armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot + armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 20) //a fair alternative to bone armor, requiring alternative materials and gaining a suit slot hoodtype = /obj/item/clothing/head/hooded/cloakhood/goliath body_parts_covered = CHEST|GROIN|ARMS resistance_flags = FIRE_PROOF @@ -72,7 +72,7 @@ name = "goliath cloak hood" icon_state = "golhood" desc = "A protective & concealing hood." - armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30) + armor = list(MELEE = 50, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 30, BLEED = 30) flags_inv = HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR transparent_protection = HIDEMASK resistance_flags = FIRE_PROOF @@ -82,7 +82,7 @@ icon_state = "dragon" desc = "A suit of armour fashioned from the remains of an ash drake." allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe, /obj/item/spear) - armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30) + armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 50) hoodtype = /obj/item/clothing/head/hooded/cloakhood/drake heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -95,7 +95,7 @@ name = "drake helm" icon_state = "dragon" desc = "The skull of a dragon." - armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30) + armor = list(MELEE = 70, BULLET = 30, LASER = 50, ENERGY = 40, BOMB = 70, BIO = 60, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 30, BLEED = 50) heat_protection = HEAD max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | ACID_PROOF @@ -105,7 +105,7 @@ name = "Heavy bone armor" icon_state = "hbonearmor" desc = "A tribal armor plate, crafted from animal bone. A heavier variation of standard bone armor." - armor = list(MELEE = 40, BULLET = 25, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 40, BULLET = 25, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 70) hoodtype = /obj/item/clothing/head/hooded/cloakhood/bone heat_protection = CHEST|GROIN|LEGS|FEET|ARMS body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS @@ -117,7 +117,7 @@ name = "bone helmet" icon_state = "hskull" desc = "An intimidating tribal helmet, it doesn't look very comfortable." - armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 35, BULLET = 25, LASER = 25, ENERGY = 10, BOMB = 25, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 50) heat_protection = HEAD max_heat_protection_temperature = HELMET_MAX_TEMP_PROTECT resistance_flags = NONE diff --git a/code/modules/clothing/suits/jobs.dm b/code/modules/clothing/suits/jobs.dm index 1c20f88f186f2..26a9f314d52eb 100644 --- a/code/modules/clothing/suits/jobs.dm +++ b/code/modules/clothing/suits/jobs.dm @@ -75,7 +75,7 @@ item_state = "det_suit" blood_overlay_type = "coat" body_parts_covered = CHEST|GROIN|ARMS - armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 40) + armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 40, BLEED = 30) cold_protection = CHEST|GROIN|ARMS heat_protection = CHEST|GROIN|ARMS supports_variations = DIGITIGRADE_VARIATION_NO_NEW_ICON @@ -106,7 +106,7 @@ icon_state = "brig_phys_vest" item_state = "sec_helm"//looks kinda similar, I guess allowed = list(/obj/item/analyzer, /obj/item/stack/medical, /obj/item/storage/firstaid, /obj/item/dnainjector, /obj/item/reagent_containers/dropper, /obj/item/reagent_containers/syringe, /obj/item/reagent_containers/hypospray, /obj/item/healthanalyzer, /obj/item/flashlight/pen, /obj/item/reagent_containers/glass/bottle, /obj/item/reagent_containers/glass/beaker, /obj/item/reagent_containers/pill, /obj/item/storage/pill_bottle, /obj/item/paper, /obj/item/melee/classic_baton/police/telescopic, /obj/item/soap, /obj/item/sensor_device, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman) - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 30, BLEED = 20) //Engineering /obj/item/clothing/suit/hazardvest @@ -228,7 +228,7 @@ /obj/item/tank/internals, /obj/item/melee/curator_whip ) - armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 30) + armor = list(MELEE = 25, BULLET = 10, LASER = 25, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 45, STAMINA = 30, BLEED = 10) cold_protection = CHEST|ARMS heat_protection = CHEST|ARMS diff --git a/code/modules/clothing/suits/labcoat.dm b/code/modules/clothing/suits/labcoat.dm index d33ab50e1a761..38daa6ea23bad 100644 --- a/code/modules/clothing/suits/labcoat.dm +++ b/code/modules/clothing/suits/labcoat.dm @@ -28,7 +28,7 @@ /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman ) - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 50, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 5) species_exception = list(/datum/species/golem) /obj/item/clothing/suit/toggle/labcoat/cmo @@ -47,7 +47,7 @@ name = "security medic's labcoat" icon_state = "labcoat_sec" item_state = "labcoat_sec" - armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50, stamina = 30) + armor = list(melee = 10, bullet = 0, laser = 0, energy = 0, bomb = 0, bio = 10, rad = 0, fire = 50, acid = 50, stamina = 30, BLEED = 10) /obj/item/clothing/suit/toggle/labcoat/mad name = "\proper The Mad's labcoat" diff --git a/code/modules/clothing/suits/reactive_armour.dm b/code/modules/clothing/suits/reactive_armour.dm index e3c17fb717cd5..bfacbf6ee3390 100644 --- a/code/modules/clothing/suits/reactive_armour.dm +++ b/code/modules/clothing/suits/reactive_armour.dm @@ -12,7 +12,8 @@ /obj/effect/anomaly/bioscrambler = /obj/item/clothing/suit/armor/reactive/bioscrambling, /obj/effect/anomaly/flux = /obj/item/clothing/suit/armor/reactive/tesla, /obj/effect/anomaly/grav = /obj/item/clothing/suit/armor/reactive/repulse, - /obj/effect/anomaly/hallucination = /obj/item/clothing/suit/armor/reactive/hallucinating + /obj/effect/anomaly/hallucination = /obj/item/clothing/suit/armor/reactive/hallucinating, + /obj/effect/anomaly/blood = /obj/item/clothing/suit/armor/reactive/bleed ) if(istype(weapon, /obj/item/assembly/signaler/anomaly)) @@ -32,7 +33,7 @@ icon_state = "reactiveoff" item_state = "reactiveoff" blood_overlay_type = "armor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 10) actions_types = list(/datum/action/item_action/toggle) resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | ACID_PROOF hit_reaction_chance = 50 @@ -390,3 +391,32 @@ owner.visible_message("[src] blocks [attack_text], but pulls a massive charge of biohazard material into [owner] from the surrounding environment!") bioscrambler_pulse(owner, range, TRUE, TRUE) return TRUE + +//Bleeding + +/obj/item/clothing/suit/armor/reactive/bleed + name = "reactive bleed armor" + desc = "An experimental suit of armor with sensitive detectors hooked up to a biohazard release valve. It has some kind of blood boiling anomaly inside." + cooldown_message = "Your blood runs cold..." + emp_message = "Oh fuck..." + ///Range of the effect. + var/range = 4 + +/obj/item/clothing/suit/armor/reactive/bleed/cooldown_activation(mob/living/carbon/human/owner) + var/datum/effect_system/spark_spread/sparks = new /datum/effect_system/spark_spread + sparks.set_up(1, 1, src) + sparks.start() + return ..() + +/obj/item/clothing/suit/armor/reactive/bleed/reactive_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + owner.visible_message("[src] blocks [attack_text], the blood anomaly from within releasing a massive cloud of razors!") + owner.AddComponent(/datum/component/pellet_cloud, projectile_type=/obj/projectile/bullet/shrapnel/bleed, magnitude=3) + playsound(src, 'sound/weapons/shrapnel.ogg', 70, TRUE) + return TRUE + +/obj/item/clothing/suit/armor/reactive/bleed/emp_activation(mob/living/carbon/human/owner, atom/movable/hitby, attack_text = "the attack", final_block_chance = 0, damage = 0, attack_type = MELEE_ATTACK) + owner.visible_message("[src] blocks [attack_text], but pulls a massive charge of biohazard material into [owner] from the surrounding environment!") + owner.AddComponent(/datum/component/pellet_cloud, projectile_type=/obj/projectile/bullet/shrapnel/bleed, magnitude=5) + owner.add_bleeding(BLEED_CRITICAL) + playsound(src, 'sound/weapons/shrapnel.ogg', 70, TRUE) + return TRUE diff --git a/code/modules/clothing/suits/utility.dm b/code/modules/clothing/suits/utility.dm index 60b2b511d325b..f89989b87caa1 100644 --- a/code/modules/clothing/suits/utility.dm +++ b/code/modules/clothing/suits/utility.dm @@ -32,7 +32,7 @@ /obj/item/powertool/jaws_of_life ) slowdown = 1 - armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 10) + armor = list(MELEE = 15, BULLET = 5, LASER = 20, ENERGY = 10, BOMB = 20, BIO = 10, RAD = 20, FIRE = 100, ACID = 50, STAMINA = 10, BLEED = 25) flags_inv = HIDEGLOVES|HIDESHOES|HIDEJUMPSUIT clothing_flags = STOPSPRESSUREDAMAGE | THICKMATERIAL heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS @@ -70,7 +70,7 @@ desc = "Use in case of bomb." icon_state = "bombsuit" clothing_flags = THICKMATERIAL | SNUG_FIT - armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10) + armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10, BLEED = 25) flags_inv = HIDEFACE|HIDEMASK|HIDEEARS|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT dynamic_hair_suffix = "" dynamic_fhair_suffix = "" @@ -95,7 +95,7 @@ clothing_flags = THICKMATERIAL body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS slowdown = 2 - armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10) + armor = list(MELEE = 20, BULLET = 0, LASER = 20, ENERGY = 10, BOMB = 100, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 10, BLEED = 25) flags_inv = HIDEJUMPSUIT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT @@ -133,7 +133,7 @@ desc = "A hood with radiation protective properties. The label reads, 'Made with lead. Please do not consume insulation.'" clothing_flags = THICKMATERIAL | SNUG_FIT flags_inv = HIDEMASK|HIDEEARS|HIDEFACE|HIDEEYES|HIDEHAIR|HIDEFACIALHAIR|HIDESNOUT - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15) strip_delay = 60 equip_delay_other = 60 flags_cover = HEADCOVERSEYES | HEADCOVERSMOUTH @@ -151,7 +151,7 @@ body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS allowed = list(/obj/item/flashlight, /obj/item/tank/internals/emergency_oxygen, /obj/item/tank/internals/plasmaman, /obj/item/geiger_counter) slowdown = 1.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 60, RAD = 100, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15) strip_delay = 60 equip_delay_other = 60 flags_inv = HIDEJUMPSUIT diff --git a/code/modules/clothing/suits/wiz_robe.dm b/code/modules/clothing/suits/wiz_robe.dm index e7bca1b48511b..23405168631ed 100644 --- a/code/modules/clothing/suits/wiz_robe.dm +++ b/code/modules/clothing/suits/wiz_robe.dm @@ -7,7 +7,7 @@ item_state = "wizhat" gas_transfer_coefficient = 0.01 // IT'S MAGICAL OKAY JEEZ +1 TO NOT DIE permeability_coefficient = 0.01 - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50, BLEED = 60) strip_delay = 50 equip_delay_other = 50 clothing_flags = SNUG_FIT | THICKMATERIAL @@ -38,7 +38,7 @@ icon_state = "wizard-fake" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0) resistance_flags = FLAMMABLE dog_fashion = /datum/dog_fashion/head/blue_wizard clothing_flags = NONE @@ -74,7 +74,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|ARMS|LEGS - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 50, BLEED = 60) allowed = list(/obj/item/teleportation_scroll) flags_inv = HIDEJUMPSUIT strip_delay = 50 @@ -143,7 +143,7 @@ item_state = "wizrobe" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0) resistance_flags = FLAMMABLE clothing_flags = NONE @@ -153,7 +153,7 @@ icon_state = "marisa" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0) resistance_flags = FLAMMABLE clothing_flags = NONE @@ -164,7 +164,7 @@ item_state = "marisarobe" gas_transfer_coefficient = 1 permeability_coefficient = 1 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0, BLEED = 0) resistance_flags = FLAMMABLE clothing_flags = NONE @@ -216,7 +216,7 @@ min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT helmettype = /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) slowdown = 0 resistance_flags = FIRE_PROOF | ACID_PROOF @@ -227,7 +227,7 @@ item_state = "battlemage" min_cold_protection_temperature = ARMOR_MIN_TEMP_PROTECT max_heat_protection_temperature = ARMOR_MAX_TEMP_PROTECT - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 70, BLEED = 70) actions_types = null //No inbuilt light resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/clothing/under/_under.dm b/code/modules/clothing/under/_under.dm index 55a895f5f837d..2b1d78cfd6b5f 100644 --- a/code/modules/clothing/under/_under.dm +++ b/code/modules/clothing/under/_under.dm @@ -5,7 +5,7 @@ body_parts_covered = CHEST|GROIN|LEGS|ARMS permeability_coefficient = 0.9 slot_flags = ITEM_SLOT_ICLOTHING - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) drop_sound = 'sound/items/handling/cloth_drop.ogg' pickup_sound = 'sound/items/handling/cloth_pickup.ogg' var/fitted = FEMALE_UNIFORM_FULL // For use in alternate clothing styles for women diff --git a/code/modules/clothing/under/accessories.dm b/code/modules/clothing/under/accessories.dm index 22b024c42f02b..e980c273da0fa 100755 --- a/code/modules/clothing/under/accessories.dm +++ b/code/modules/clothing/under/accessories.dm @@ -228,7 +228,7 @@ desc = "An eccentric medal made of plasma." icon_state = "plasma" medaltype = "medal-plasma" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0, STAMINA = 0) //It's made of plasma. Of course it's flammable. + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = -10, ACID = 0, STAMINA = 0, BLEED = 0) //It's made of plasma. Of course it's flammable. custom_materials = list(/datum/material/plasma=1000) /obj/item/clothing/accessory/medal/plasma/temperature_expose(datum/gas_mixture/air, exposed_temperature, exposed_volume) @@ -361,7 +361,7 @@ name = "bone talisman" desc = "A hunter's talisman, some say the old gods smile on those who wear it." icon_state = "talisman" - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10, BLEED = 10) attachment_slot = null /obj/item/clothing/accessory/skullcodpiece @@ -369,7 +369,7 @@ desc = "A skull shaped ornament, intended to protect the important things in life." icon_state = "skull" above_suit = TRUE - armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 20, BIO = 20, RAD = 5, FIRE = 0, ACID = 25, STAMINA = 10, BLEED = 10) attachment_slot = GROIN /obj/item/clothing/accessory/holster diff --git a/code/modules/clothing/under/color.dm b/code/modules/clothing/under/color.dm index 1ee6779f7b248..255d85f5a182d 100644 --- a/code/modules/clothing/under/color.dm +++ b/code/modules/clothing/under/color.dm @@ -222,13 +222,13 @@ name = "durathread jumpsuit" desc = "A jumpsuit made from durathread, its resilient fibres provide some protection to the wearer." greyscale_colors = "#8291a1" - armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20) + armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20, BLEED = 30) /obj/item/clothing/under/color/jumpskirt/durathread name = "durathread jumpskirt" desc = "A jumpskirt made from durathread, its resilient fibres provide some protection to the wearer." greyscale_colors = "#8291a1" - armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20) + armor = list(MELEE = 10, BULLET = 15, LASER = 10, FIRE = 40, ACID = 10, BOMB = 5, ENERGY = 20, STAMINA = 20, BLEED = 30) /obj/item/clothing/under/color/rainbow name = "rainbow jumpsuit" diff --git a/code/modules/clothing/under/costume.dm b/code/modules/clothing/under/costume.dm index 318d98d308cfa..9b040935b088a 100644 --- a/code/modules/clothing/under/costume.dm +++ b/code/modules/clothing/under/costume.dm @@ -257,7 +257,7 @@ item_state = null worn_icon = 'icons/mob/clothing/under/security.dmi' alt_covers_chest = TRUE - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 15) strip_delay = 50 alt_covers_chest = TRUE sensor_mode = SENSOR_COORDS diff --git a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm index 2b99630ba30e9..e50357a9e4749 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/engineering.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/engineering.dm @@ -3,7 +3,7 @@ desc = "An air-tight suit designed to be used by plasmamen exployed as engineers, the usual purple stripes being replaced by engineer's orange. It protects the user from fire and acid damage." icon_state = "engineer_envirosuit" item_state = "engineer_envirosuit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 95, ACID = 95, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 10, FIRE = 95, ACID = 95, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/plasmaman/engineering/atmospherics name = "atmospherics plasma envirosuit" diff --git a/code/modules/clothing/under/jobs/Plasmaman/security.dm b/code/modules/clothing/under/jobs/Plasmaman/security.dm index 8b737d2b16866..26282303438f1 100644 --- a/code/modules/clothing/under/jobs/Plasmaman/security.dm +++ b/code/modules/clothing/under/jobs/Plasmaman/security.dm @@ -3,7 +3,7 @@ desc = "A plasmaman containment suit designed for security officers, offering a limited amount of extra protection." icon_state = "security_envirosuit" item_state = "security_envirosuit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10, BLEED = 10) sensor_mode = SENSOR_COORDS random_sensor = FALSE @@ -24,4 +24,4 @@ desc = "A plasmaman containment suit designed for brig physicians. It has a red cross emblasoned on the chest." icon_state = "secmed_envirosuit" item_state = "secmed_envirosuit" - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 100, RAD = 0, FIRE = 95, ACID = 95, STAMINA = 10, BLEED = 10) diff --git a/code/modules/clothing/under/jobs/civilian/civilian.dm b/code/modules/clothing/under/jobs/civilian/civilian.dm index 5b24c69e531bd..a3b979a75cef6 100644 --- a/code/modules/clothing/under/jobs/civilian/civilian.dm +++ b/code/modules/clothing/under/jobs/civilian/civilian.dm @@ -126,7 +126,7 @@ desc = "It's the official uniform of the station's janitor. It has minor protection from biohazards." name = "janitor's jumpsuit" icon_state = "janitor" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/civilian/janitor/skirt name = "janitor's jumpskirt" diff --git a/code/modules/clothing/under/jobs/command.dm b/code/modules/clothing/under/jobs/command.dm index d5029d8aa0a25..f915d5ea92f8b 100644 --- a/code/modules/clothing/under/jobs/command.dm +++ b/code/modules/clothing/under/jobs/command.dm @@ -3,7 +3,7 @@ name = "captain's jumpsuit" icon_state = "captain" item_state = "b_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10) sensor_mode = SENSOR_COORDS random_sensor = FALSE icon = 'icons/obj/clothing/under/captain.dmi' diff --git a/code/modules/clothing/under/jobs/engineering.dm b/code/modules/clothing/under/jobs/engineering.dm index d9876536acf8d..88d6289238255 100644 --- a/code/modules/clothing/under/jobs/engineering.dm +++ b/code/modules/clothing/under/jobs/engineering.dm @@ -12,7 +12,7 @@ icon_state = "chiefengineer" item_state = "gy_suit" //TODO replace it worn_icon_state = "chiefengineer" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 80, ACID = 40, STAMINA = 0, BLEED = 10) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/chief_engineer/skirt @@ -20,7 +20,7 @@ name = "chief engineer's jumpskirt" icon_state = "chiefengineer_skirt" item_state = "gy_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 7, FIRE = 80, ACID = 40, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 7, FIRE = 80, ACID = 40, STAMINA = 0, BLEED = 10) body_parts_covered = CHEST|GROIN|ARMS can_adjust = FALSE fitted = FEMALE_UNIFORM_TOP @@ -50,7 +50,7 @@ name = "engineer's jumpsuit" icon_state = "engine" item_state = "engi_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 10, FIRE = 60, ACID = 20, STAMINA = 0, BLEED = 10) resistance_flags = NONE /obj/item/clothing/under/rank/engineering/engineer/hazard diff --git a/code/modules/clothing/under/jobs/medical.dm b/code/modules/clothing/under/jobs/medical.dm index 051cfdbb4dff2..996ce9e21a1e1 100644 --- a/code/modules/clothing/under/jobs/medical.dm +++ b/code/modules/clothing/under/jobs/medical.dm @@ -9,7 +9,7 @@ icon_state = "cmo" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/medical/chief_medical_officer/skirt name = "chief medical officer's jumpskirt" @@ -28,7 +28,7 @@ icon_state = "genetics" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/medical/geneticist/skirt name = "geneticist's jumpskirt" @@ -47,7 +47,7 @@ icon_state = "virology" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/medical/virologist/skirt name = "virologist's jumpskirt" @@ -65,7 +65,7 @@ desc = "A standard jumpsuit used by paramedics onboard space stations. It's made of a special fiber that gives special protection against biohazards." icon_state = "paramedic" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) can_adjust = FALSE /obj/item/clothing/under/rank/medical/paramedic/skirt @@ -85,7 +85,7 @@ icon_state = "nursesuit" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) body_parts_covered = CHEST|GROIN|ARMS fitted = NO_FEMALE_UNIFORM can_adjust = FALSE @@ -96,7 +96,7 @@ icon_state = "medical" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/medical/doctor/skirt name = "medical doctor's jumpskirt" @@ -133,7 +133,7 @@ icon_state = "chemistry" item_state = "w_suit" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 65, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 10, RAD = 0, FIRE = 50, ACID = 65, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/medical/chemist/skirt name = "chemist's jumpskirt" diff --git a/code/modules/clothing/under/jobs/rnd.dm b/code/modules/clothing/under/jobs/rnd.dm index f084ff1e700a7..7f17125c3112c 100644 --- a/code/modules/clothing/under/jobs/rnd.dm +++ b/code/modules/clothing/under/jobs/rnd.dm @@ -7,7 +7,7 @@ desc = "It's a jumpsuit worn by those with the know-how to achieve the position of \"Research Director\". Its fabric provides minor protection from biological contaminants." icon_state = "director" item_state = "w_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 35, STAMINA = 0, BLEED = 10) can_adjust = TRUE alt_covers_chest = TRUE @@ -27,7 +27,7 @@ name = "research director's tan suit" icon_state = "rdwhimsy" item_state = "rdwhimsy" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) can_adjust = TRUE alt_covers_chest = TRUE @@ -47,7 +47,7 @@ name = "research director's turtleneck" icon_state = "rdturtle" item_state = "p_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 10, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) can_adjust = TRUE alt_covers_chest = TRUE @@ -76,7 +76,7 @@ item_state = "w_suit" worn_icon_state = "toxinswhite" permeability_coefficient = 0.5 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/rank/rnd/scientist/skirt name = "scientist's jumpskirt" diff --git a/code/modules/clothing/under/jobs/security.dm b/code/modules/clothing/under/jobs/security.dm index 96038f4ada795..6dd3db43fc331 100644 --- a/code/modules/clothing/under/jobs/security.dm +++ b/code/modules/clothing/under/jobs/security.dm @@ -22,7 +22,7 @@ desc = "A tactical security jumpsuit for officers complete with Nanotrasen belt buckle." icon_state = "rsecurity" item_state = "r_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10) alt_covers_chest = TRUE /obj/item/clothing/under/rank/security/officer/white @@ -71,6 +71,7 @@ desc = "A formal security suit for officers complete with Nanotrasen belt buckle." icon_state = "rwarden" item_state = "r_suit" + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10) /obj/item/clothing/under/rank/security/warden/white name = "white security suit" @@ -104,7 +105,7 @@ desc = "Someone who wears this means business." icon_state = "detective" item_state = "det" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 30, ACID = 30, STAMINA = 10, BLEED = 10) strip_delay = 50 alt_covers_chest = TRUE sensor_mode = SENSOR_COORDS @@ -147,7 +148,7 @@ desc = "A security jumpsuit decorated for those few with the dedication to achieve the position of Head of Security." icon_state = "rhos" item_state = "r_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 50, STAMINA = 10, BLEED = 10) strip_delay = 60 alt_covers_chest = TRUE sensor_mode = SENSOR_COORDS diff --git a/code/modules/clothing/under/miscellaneous.dm b/code/modules/clothing/under/miscellaneous.dm index 5ebf1fe341e22..fe03c6e7e234a 100644 --- a/code/modules/clothing/under/miscellaneous.dm +++ b/code/modules/clothing/under/miscellaneous.dm @@ -40,7 +40,7 @@ gas_transfer_coefficient = 0.01 permeability_coefficient = 0.01 body_parts_covered = CHEST|GROIN|LEGS|FEET|ARMS|HANDS - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 100) cold_protection = CHEST | GROIN | LEGS | FEET | ARMS | HANDS min_cold_protection_temperature = SPACE_SUIT_MIN_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|FEET|ARMS|HANDS diff --git a/code/modules/clothing/under/syndicate.dm b/code/modules/clothing/under/syndicate.dm index f6f319679be9a..a599447bca044 100644 --- a/code/modules/clothing/under/syndicate.dm +++ b/code/modules/clothing/under/syndicate.dm @@ -4,7 +4,7 @@ icon_state = "syndicate" item_state = "bl_suit" has_sensor = NO_SENSORS - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 10, BLEED = 25) alt_covers_chest = TRUE icon = 'icons/obj/clothing/under/syndicate.dmi' worn_icon = 'icons/mob/clothing/under/syndicate.dmi' @@ -14,7 +14,7 @@ desc = "Just looking at it makes you want to buy an SKS, go into the woods, and -operate-." icon_state = "tactifool" item_state = "bl_suit" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 40, STAMINA = 0, BLEED = 10) /obj/item/clothing/under/syndicate/sniper name = "Tactical turtleneck suit" @@ -35,7 +35,7 @@ desc = "Badly translated labels tell you to clean this in Vodka. Great for squatting in." icon_state = "trackpants" can_adjust = FALSE - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10, BLEED = 15) resistance_flags = NONE /obj/item/clothing/under/syndicate/combat @@ -49,5 +49,5 @@ desc = "Military grade tracksuits for frontline squatting." icon_state = "rus_under" can_adjust = FALSE - armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10) + armor = list(MELEE = 5, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 10, BLEED = 15) resistance_flags = NONE diff --git a/code/modules/clothing/under/trek.dm b/code/modules/clothing/under/trek.dm index 88055c88644f0..3e89917cdc11f 100644 --- a/code/modules/clothing/under/trek.dm +++ b/code/modules/clothing/under/trek.dm @@ -18,7 +18,7 @@ desc = "The uniform worn by engineering/security officers." icon_state = "trek_engsec" item_state = "r_suit" - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) //more sec than eng, but w/e. + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 10) //more sec than eng, but w/e. strip_delay = 50 /obj/item/clothing/under/trek/medsci diff --git a/code/modules/events/anomaly_blood.dm b/code/modules/events/anomaly_blood.dm new file mode 100644 index 0000000000000..59b914c3736a1 --- /dev/null +++ b/code/modules/events/anomaly_blood.dm @@ -0,0 +1,14 @@ +/datum/round_event_control/anomaly/blood + name = "Anomaly: Blood" + typepath = /datum/round_event/anomaly/blood + + min_players = 15 + max_occurrences = 2 + +/datum/round_event/anomaly/blood + startWhen = 3 + announceWhen = 10 + anomaly_path = /obj/effect/anomaly/blood + +/datum/round_event/anomaly/blood/announce(fake) + priority_announce("Blood anomaly detected on long range scanners. Expected location: [impact_area.name].", "Anomaly Alert", SSstation.announcer.get_rand_alert_sound()) diff --git a/code/modules/events/holiday/xmas.dm b/code/modules/events/holiday/xmas.dm index fc8a5e39b0215..8a956238270b7 100644 --- a/code/modules/events/holiday/xmas.dm +++ b/code/modules/events/holiday/xmas.dm @@ -38,14 +38,14 @@ icon_state = "xmashat" desc = "A crappy paper hat that you are REQUIRED to wear." flags_inv = 0 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) /obj/item/clothing/head/costume/festive/Initialize(mapload) //Merry christmas if(CHRISTMAS in SSevents.holidays) - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 30, ACID = 30, STAMINA = 30) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 30, RAD = 30, FIRE = 30, ACID = 30, STAMINA = 30, BLEED = 30) else if(FESTIVE_SEASON in SSevents.holidays) - armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 20) + armor = list(MELEE = 20, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 20, BIO = 20, RAD = 20, FIRE = 20, ACID = 20, STAMINA = 20, BLEED = 20) return ..() /obj/effect/spawner/xmastree diff --git a/code/modules/food_and_drinks/drinks/drinks/bottle.dm b/code/modules/food_and_drinks/drinks/drinks/bottle.dm index 6cd70bf1f8356..c169b897c6d70 100644 --- a/code/modules/food_and_drinks/drinks/drinks/bottle.dm +++ b/code/modules/food_and_drinks/drinks/drinks/bottle.dm @@ -134,6 +134,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("stabbed", "slashed", "attacked") sharpness = IS_SHARP + bleed_force = BLEED_SURFACE var/static/icon/broken_outline = icon('icons/obj/drinks.dmi', "broken") /obj/item/broken_bottle/Initialize(mapload) diff --git a/code/modules/holoparasite/abilities/major/healing.dm b/code/modules/holoparasite/abilities/major/healing.dm index 76b55b1ab7582..7b770b8e0fcc1 100644 --- a/code/modules/holoparasite/abilities/major/healing.dm +++ b/code/modules/holoparasite/abilities/major/healing.dm @@ -139,7 +139,7 @@ carbon_target.blood_volume = min(carbon_target.blood_volume + actual_heal_amt, HOLOPARA_MAX_BLOOD_VOLUME_HEAL) if(ishuman(carbon_target)) var/mob/living/carbon/human/human_target = carbon_target - human_target.bleed_rate = max(human_target.bleed_rate - actual_heal_amt, 0) + human_target.cauterise_wounds(actual_heal_amt * 0.2) if(purge_toxins) var/list/reagents_purged = list() diff --git a/code/modules/holoparasite/abilities/weapon/stab.dm b/code/modules/holoparasite/abilities/weapon/stab.dm index e75c48086d210..a6cffc338f284 100644 --- a/code/modules/holoparasite/abilities/weapon/stab.dm +++ b/code/modules/holoparasite/abilities/weapon/stab.dm @@ -14,11 +14,9 @@ ) ) /** - * The (maximum) amount of bleed damage with each hit. - * This is premultiplied by 10, and then randomized between 50% and 100% of the value. - * We need to pre-multiply by 10, as BYOND's rand() doesn't support decimal ranges, so we just multiply the final random value by 0.1. + * Randomised between 50% and 100% */ - var/premultiplied_bleed_rate = 40 + var/bleed_level = BLEED_SURFACE /datum/holoparasite_ability/weapon/blade/apply() . = ..() @@ -29,7 +27,7 @@ owner.attack_sound = 'sound/weapons/bladeslice.ogg' owner.response_harm = "stabs" owner.attacktext = "stabs" - premultiplied_bleed_rate = master_stats.damage * 8 + bleed_level = (master_stats.damage / 5) * (BLEED_DEEP_WOUND - BLEED_SURFACE) + BLEED_SURFACE /datum/holoparasite_ability/weapon/blade/remove() . = ..() @@ -45,6 +43,4 @@ . = ..() if(successful && ishuman(target)) var/mob/living/carbon/human/human_target = target - if(human_target.bleed_rate < 15) - var/randomized_bleed_rate = rand(round(premultiplied_bleed_rate * 0.5), premultiplied_bleed_rate) * 0.1 - human_target.bleed_rate = clamp(human_target.bleed_rate + randomized_bleed_rate, 0, 15) + human_target.add_bleeding((rand(500, 1000) / 1000) * bleed_level) diff --git a/code/modules/hydroponics/hydroitemdefines.dm b/code/modules/hydroponics/hydroitemdefines.dm index a64befd731700..feb342f3196fc 100644 --- a/code/modules/hydroponics/hydroitemdefines.dm +++ b/code/modules/hydroponics/hydroitemdefines.dm @@ -86,6 +86,7 @@ attack_verb = list("chopped", "tore", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP + bleed_force = BLEED_CUT /obj/item/hatchet/Initialize(mapload) . = ..() diff --git a/code/modules/library/lib_items.dm b/code/modules/library/lib_items.dm index 0f3568111afef..a583a00d3c955 100644 --- a/code/modules/library/lib_items.dm +++ b/code/modules/library/lib_items.dm @@ -24,7 +24,7 @@ opacity = FALSE resistance_flags = FLAMMABLE max_integrity = 200 - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 0, STAMINA = 0, CONSUME = 0, BLEED = 0) var/state = BOOKCASE_UNANCHORED var/list/allowed_books = list(/obj/item/book, /obj/item/spellbook, /obj/item/storage/book, /obj/item/codex_cicatrix) //Things allowed in the bookcase /// When enabled, books_to_load number of random books will be generated for this bookcase when first interacted with. diff --git a/code/modules/mining/equipment/explorer_gear.dm b/code/modules/mining/equipment/explorer_gear.dm index 997dc58a9d470..5151bf289b803 100644 --- a/code/modules/mining/equipment/explorer_gear.dm +++ b/code/modules/mining/equipment/explorer_gear.dm @@ -12,7 +12,7 @@ max_heat_protection_temperature = FIRE_SUIT_MAX_TEMP_PROTECT heat_protection = CHEST|GROIN|LEGS|ARMS hoodtype = /obj/item/clothing/head/hooded/explorer - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 30) allowed = list( /obj/item/flashlight, /obj/item/tank/internals, @@ -36,7 +36,7 @@ flags_inv = HIDEHAIR|HIDEFACE|HIDEEARS min_cold_protection_temperature = FIRE_HELM_MIN_TEMP_PROTECT max_heat_protection_temperature = FIRE_HELM_MAX_TEMP_PROTECT - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 20, BLEED = 30) resistance_flags = FIRE_PROOF high_pressure_multiplier = 0.4 @@ -58,7 +58,7 @@ visor_flags_inv = HIDEFACIALHAIR visor_flags_cover = MASKCOVERSEYES | MASKCOVERSMOUTH actions_types = list(/datum/action/item_action/adjust) - armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 10) + armor = list(MELEE = 10, BULLET = 5, LASER = 5, ENERGY = 5, BOMB = 0, BIO = 50, RAD = 0, FIRE = 20, ACID = 40, STAMINA = 10, BLEED = 10) resistance_flags = FIRE_PROOF /obj/item/clothing/mask/gas/explorer/attack_self(mob/user) @@ -83,7 +83,7 @@ max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT resistance_flags = FIRE_PROOF | LAVA_PROOF slowdown = 0 - armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40) + armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 50) allowed = list(/obj/item/flashlight, /obj/item/tank/internals, /obj/item/resonator, /obj/item/mining_scanner, /obj/item/t_scanner/adv_mining_scanner, /obj/item/gun/energy/kinetic_accelerator, /obj/item/pickaxe) high_pressure_multiplier = 0.6 @@ -115,7 +115,7 @@ w_class = WEIGHT_CLASS_NORMAL max_heat_protection_temperature = FIRE_IMMUNITY_MAX_TEMP_PROTECT clothing_flags = THICKMATERIAL // no space protection - armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40) + armor = list(MELEE = 70, BULLET = 40, LASER = 20, ENERGY = 20, BOMB = 50, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 40, BLEED = 50) resistance_flags = FIRE_PROOF | LAVA_PROOF high_pressure_multiplier = 0.6 diff --git a/code/modules/mining/equipment/kinetic_crusher.dm b/code/modules/mining/equipment/kinetic_crusher.dm index 58630fd6f4a77..bb1140c266ffe 100644 --- a/code/modules/mining/equipment/kinetic_crusher.dm +++ b/code/modules/mining/equipment/kinetic_crusher.dm @@ -18,6 +18,7 @@ hitsound = 'sound/weapons/bladeslice.ogg' attack_verb = list("smashed", "crushed", "cleaved", "chopped", "pulped") sharpness = IS_SHARP + bleed_force = BLEED_CUT actions_types = list(/datum/action/item_action/toggle_light) light_system = MOVABLE_LIGHT light_range = 5 diff --git a/code/modules/mining/equipment/marker_beacons.dm b/code/modules/mining/equipment/marker_beacons.dm index fd33252851418..48285fc0e749e 100644 --- a/code/modules/mining/equipment/marker_beacons.dm +++ b/code/modules/mining/equipment/marker_beacons.dm @@ -74,7 +74,7 @@ GLOBAL_LIST_INIT(marker_beacon_colors, sort_list(list( icon = 'icons/obj/lighting.dmi' icon_state = "markerrandom" layer = BELOW_OPEN_DOOR_LAYER - armor = list(MELEE = 50, BULLET = 75, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, RAD = 100, FIRE = 25, ACID = 0, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 75, LASER = 75, ENERGY = 75, BOMB = 25, BIO = 100, RAD = 100, FIRE = 25, ACID = 0, STAMINA = 0, BLEED = 0) max_integrity = 50 anchored = TRUE light_range = 2 diff --git a/code/modules/mining/lavaland/necropolis_chests.dm b/code/modules/mining/lavaland/necropolis_chests.dm index 01519dca33abd..13db434039bf2 100644 --- a/code/modules/mining/lavaland/necropolis_chests.dm +++ b/code/modules/mining/lavaland/necropolis_chests.dm @@ -418,6 +418,7 @@ damage_type = BRUTE hitsound = 'sound/effects/splat.ogg' knockdown = 30 + bleed_force = BLEED_SURFACE var/chain /obj/projectile/hook/fire(setAngle) @@ -710,6 +711,7 @@ hitsound_on = 'sound/weapons/bladeslice.ogg' w_class = WEIGHT_CLASS_BULKY sharpness = IS_SHARP + bleed_force = BLEED_CUT faction_bonus_force = 45 nemesis_factions = list("mining", "boss") var/transform_cooldown @@ -803,6 +805,7 @@ righthand_file = 'icons/mob/inhands/weapons/swords_righthand.dmi' flags_1 = CONDUCT_1 sharpness = IS_SHARP + bleed_force = BLEED_CUT w_class = WEIGHT_CLASS_BULKY force = 1 throwforce = 1 diff --git a/code/modules/mob/living/blood.dm b/code/modules/mob/living/blood.dm index d36bda070f3da..6d45fead32160 100644 --- a/code/modules/mob/living/blood.dm +++ b/code/modules/mob/living/blood.dm @@ -2,20 +2,258 @@ /**************************************************** BLOOD SYSTEM + +https://www.desmos.com/calculator/vxrevmdvfx + +To calculate the blood loss rate, use the following formula: +n = starting amount of blood in your mob +b = bleed rate of your mob +h = Rate at which bleeding decreases over time (0.02 constant, 0.08 for non-human mobs) + +This function calculates the amount of blood left in your system at time x +q\left(x\right)=\left\{b<2.4:ne^{-\frac{1}{560}\left(bx-\frac{1}{2}x^{2}h\right)},ne^{-\frac{bx}{560}}\right\} + +Hide this function +d\left(x\right)=\max\left(0,120-\frac{\left(120\cdot\max\left(0,\min\left(1,\frac{x-122}{560-122}\right)\right)\right)^{0.3}}{\left(120\right)^{-0.7}}\right) + +This function calculates the amount of health that your mob has at time x +y=d\left(q\left(x\right)\right) + +**Notes for porting/search:** +bleedsuppress has been replaced for is_bandaged(). Note that is_bleeding() returns if you are not bleeding, even if you have active bandages. + ****************************************************/ -/mob/living/carbon/human/proc/suppress_bloodloss(amount) - if(bleedsuppress) +/datum/status_effect/bleeding + id = "bleeding" + status_type = STATUS_EFFECT_MERGE + alert_type = /atom/movable/screen/alert/status_effect/bleeding + tick_interval = 1 SECONDS + + var/bandaged_bleeding = 0 + var/bleed_rate = 0 + var/time_applied = 0 + var/bleed_heal_multiplier = 1 + +/datum/status_effect/bleeding/merge(bleed_level) + src.bleed_rate = src.bleed_rate + max(min(bleed_level * bleed_level, sqrt(bleed_level)) / max(src.bleed_rate, 1), bleed_level - src.bleed_rate) + update_icon() + +/datum/status_effect/bleeding/on_creation(mob/living/new_owner, bleed_rate) + . = ..() + if (.) + src.bleed_rate = bleed_rate + linked_alert.maptext = MAPTEXT(owner.get_bleed_rate_string()) + +/datum/status_effect/bleeding/tick() + if (HAS_TRAIT(owner, TRAIT_NO_BLOOD)) + qdel(src) return + time_applied += tick_interval + if (time_applied < 1 SECONDS) + if(bleed_rate >= BLEED_DEEP_WOUND) + owner.add_splatter_floor(owner.loc) + else + owner.add_splatter_floor(owner.loc, TRUE) + return + time_applied = 0 + // Non-humans stop bleeding a lot quicker, even if it is not a minor cut + if (!ishuman(owner)) + bleed_rate -= BLEED_HEAL_RATE_MINOR * 4 * bleed_heal_multiplier + // Make sure to update our icon + update_icon() + // Set the rate at which we process, so we bleed more on the ground when heavy bleeding + tick_interval = bleed_rate <= BLEED_RATE_MINOR ? 1 SECONDS : 0.2 SECONDS + // Reduce the actual rate of bleeding + if (ishuman(owner)) + if (bleed_rate > 0 && bleed_rate < BLEED_RATE_MINOR) + bleed_rate -= BLEED_HEAL_RATE_MINOR * bleed_heal_multiplier + else + bandaged_bleeding -= BLEED_HEAL_RATE_MINOR * bleed_heal_multiplier + // We have finished bleeding + if (bleed_rate <= 0 && bandaged_bleeding <= 0) + qdel(src) + return + // The actual rate of bleeding, can be reduced by holding wounds + var/final_bleed_rate = bleed_rate + if (HAS_TRAIT(owner, TRAIT_BLEED_HELD)) + final_bleed_rate = max(0, final_bleed_rate - BLEED_RATE_MINOR) + // We aren't actually bleeding + if (final_bleed_rate <= 0) + return + // Actually do the bleeding + owner.bleed(min(MAX_BLEED_RATE, final_bleed_rate)) + +/datum/status_effect/bleeding/proc/update_icon() + // The actual rate of bleeding, can be reduced by holding wounds + // Calculate the message to show to the user + if (HAS_TRAIT(owner, TRAIT_BLEED_HELD)) + linked_alert.name = "Bleeding (Held)" + if (bleed_rate > BLEED_RATE_MINOR) + linked_alert.desc = "You have serious wounds which are unlikely to heal themselves. You are applying pressure to them, slowing the rate of blood loss." + else + linked_alert.desc = "You are bleeding and are applying pressure to the wounds, preventing blood from pouring out." + linked_alert.icon_state = "bleed_held" + else if (bleed_rate == 0 && bandaged_bleeding > 0) + linked_alert.name = "Bleeding (Bandaged)" + linked_alert.desc = "You have bandages covering your wounds. They will heal slowly if they are not cauterized." + linked_alert.icon_state = "bleed_bandage" else - bleedsuppress = TRUE - addtimer(CALLBACK(src, PROC_REF(resume_bleeding)), amount) + if (bleed_rate < BLEED_RATE_MINOR) + linked_alert.name = "Bleeding (Light)" + linked_alert.desc = "You have some minor cuts that look like they will heal themselves if you don't run out of blood first.[ishuman(owner) ? " Click to apply pressure to the wounds." : ""]" + linked_alert.icon_state = "bleed" + else + linked_alert.name = "Bleeding (Heavy)" + linked_alert.desc = "Your wounds are bleeding heavily and are unlikely to heal themselves. Seek medical attention immediately![ishuman(owner) ? " Click to apply pressure to the wounds." : ""]" + linked_alert.icon_state = "bleed_heavy" + + if (HAS_TRAIT(owner, TRAIT_NO_BLEEDING) || IS_IN_STASIS(owner)) + linked_alert.maptext = MAPTEXT("[owner.get_bleed_rate_string()]") + else + linked_alert.maptext = MAPTEXT(owner.get_bleed_rate_string()) -/mob/living/carbon/human/proc/resume_bleeding() - bleedsuppress = 0 - if(stat != DEAD && bleed_rate) - to_chat(src, "The blood soaks through your bandage.") +/datum/status_effect/bleeding/on_remove() + var/mob/living/carbon/human/human = owner + if (!istype(human)) + return + // Not bleeding anymore, no need to hold wounds + human.stop_holding_wounds() +/atom/movable/screen/alert/status_effect/bleeding + name = "Bleeding" + desc = "You are bleeding, find something to bandage the wound or you will die." + icon_state = "bleed" + +/atom/movable/screen/alert/status_effect/bleeding/Click(location, control, params) + var/mob/living/carbon/human/human = usr + if (!istype(human)) + return + if (locate(/obj/item/offhand/bleeding_suppress) in human.held_items) + human.stop_holding_wounds() + else + human.hold_wounds() + +/mob/living/carbon/proc/is_bandaged() + if (HAS_TRAIT(src, TRAIT_NO_BLOOD)) + return FALSE + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return FALSE + return bleed.bandaged_bleeding > 0 + +/mob/living/carbon/proc/is_bleeding() + if (HAS_TRAIT(src, TRAIT_NO_BLOOD)) + return FALSE + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return FALSE + return bleed.bleed_rate > 0 + +/mob/living/carbon/proc/add_bleeding(bleed_level) + if (HAS_TRAIT(src, TRAIT_NO_BLOOD)) + return + playsound(src, 'sound/surgery/blood_wound.ogg', 80, vary = TRUE) + apply_status_effect(dna?.species?.bleed_effect || STATUS_EFFECT_BLEED, bleed_level) + if (bleed_level >= BLEED_DEEP_WOUND) + blur_eyes(1) + to_chat(src, "Blood starts rushing out of the open wound!") + if(bleed_level >= BLEED_CUT) + add_splatter_floor(src.loc) + else + add_splatter_floor(src.loc, 1) + +/mob/living/carbon/human/add_bleeding(bleed_level) + if (NOBLOOD in dna.species.species_traits) + return + ..() + +/mob/living/carbon/proc/get_bleed_intensity() + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return 0 + return 3 ** bleed.bleed_rate + +/mob/living/carbon/proc/get_bleed_rate() + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + return bleed?.bleed_rate + +/// Can we heal bleeding using a welding tool? +/mob/living/carbon/proc/has_mechanical_bleeding() + var/obj/item/bodypart/chest = get_bodypart(BODY_ZONE_CHEST) + return chest.bodytype & BODYTYPE_ROBOTIC + +/mob/living/proc/get_bleed_rate_string() + return "0.0/s" + +/mob/living/carbon/get_bleed_rate_string() + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return "0.0/s" + var/final_bleed_rate = bleed.bleed_rate + if (HAS_TRAIT(src, TRAIT_BLEED_HELD)) + final_bleed_rate = max(0, final_bleed_rate - BLEED_RATE_MINOR) + + // Set the text to the final bleed rate + final_bleed_rate = round(final_bleed_rate, 0.1) + if ((final_bleed_rate * 10) % 10 == 0) + return "[final_bleed_rate].0/s" + return "[final_bleed_rate]/s" + +/mob/living/carbon/proc/cauterise_wounds(amount = INFINITY) + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return FALSE + bleed.bleed_rate -= amount + if (bleed.bleed_rate <= 0) + remove_status_effect(STATUS_EFFECT_BLEED) + return TRUE + +/mob/living/carbon/proc/hold_wounds() + if (stat >= UNCONSCIOUS) + return + if (!is_bleeding()) + if (is_bandaged()) + balloon_alert(src, "Wounds already bandaged!") + else + balloon_alert(src, "You are not wounded!") + return + if (locate(/obj/item/offhand/bleeding_suppress) in held_items) + balloon_alert(src, "Already applying pressure!") + return + if (has_active_hand() && get_active_held_item()) + balloon_alert(src, "Active hand is full!") + return + var/obj/item/offhand/bleeding_suppress/supressed_thing = new() + put_in_active_hand(supressed_thing) + balloon_alert(src, "You apply pressure to your wounds...") + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return + bleed.update_icon() + +/mob/living/carbon/proc/stop_holding_wounds() + var/located = FALSE + for (var/obj/item/offhand/bleeding_suppress/bleed_suppression in held_items) + qdel(bleed_suppression) + located = TRUE + if (located) + balloon_alert(src, "You stop applying pressure to your wounds...") + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return + bleed.update_icon() + +/mob/living/carbon/proc/suppress_bloodloss(amount) + var/datum/status_effect/bleeding/bleed = has_status_effect(STATUS_EFFECT_BLEED) + if (!bleed) + return + var/reduced_amount = min(bleed.bleed_rate, amount) + bleed.bleed_rate -= reduced_amount + bleed.bandaged_bleeding += reduced_amount + bleed.update_icon() + if (bleed.bleed_rate <= 0) + stop_holding_wounds() /mob/living/carbon/monkey/handle_blood() if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. @@ -28,14 +266,13 @@ // Takes care blood loss and regeneration /mob/living/carbon/human/handle_blood() - if(NOBLOOD in dna.species.species_traits) - bleed_rate = 0 + if((NOBLOOD in dna.species.species_traits) || HAS_TRAIT(src, TRAIT_NO_BLOOD)) + cauterise_wounds() return if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_HUSK))) //cryosleep or husked people do not pump the blood. - //Blood regeneration if there is some space - if(blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER) && !HAS_TRAIT(src, TRAIT_POWERHUNGRY)) + if(!is_bleeding() && blood_volume < BLOOD_VOLUME_NORMAL && !HAS_TRAIT(src, TRAIT_NOHUNGER) && !HAS_TRAIT(src, TRAIT_POWERHUNGRY)) var/nutrition_ratio = 0 switch(nutrition) if(0 to NUTRITION_LEVEL_STARVING) @@ -55,69 +292,76 @@ //Effects of bloodloss var/word = pick("dizzy","woozy","faint") + + // How much oxyloss we want to be on + var/desired_damage = (getMaxHealth() * 1.2) * CLAMP01((blood_volume - BLOOD_VOLUME_SURVIVE) / (BLOOD_VOLUME_NORMAL - BLOOD_VOLUME_SURVIVE)) + // Make it so we only go unconcious at 25% blood remaining + desired_damage = max(0, (getMaxHealth() * 1.2) - ((desired_damage ** 0.3) / ((getMaxHealth() * 1.2) ** (-0.7)))) + if (desired_damage >= getMaxHealth() * 1.2) + desired_damage = getMaxHealth() * 2.0 + if (HAS_TRAIT(src, TRAIT_BLOOD_COOLANT)) + switch(blood_volume) + if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_SAFE) + if(prob(3)) + to_chat(src, "Your sensors indicate [pick("overheating", "thermal throttling", "coolant issues")].") + if(-INFINITY to BLOOD_VOLUME_SURVIVE) + desired_damage = getMaxHealth() * 2.0 + // Rapidly die with no saving you + adjustFireLoss(clamp(getMaxHealth() * 2.0 - getFireLoss(), 0, 10)) + var/health_difference = clamp(desired_damage - getFireLoss(), 0, 5) + adjustFireLoss(health_difference) + return switch(blood_volume) if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE) if(prob(5)) to_chat(src, "You feel [word].") - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1)) if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY) - adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1)) if(prob(5)) blur_eyes(6) to_chat(src, "You feel very [word].") if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD) - adjustOxyLoss(5) - if(prob(15)) - Unconscious(rand(20,60)) + if(prob(30)) + blur_eyes(6) + Unconscious(rand(3,6)) to_chat(src, "You feel extremely [word].") if(-INFINITY to BLOOD_VOLUME_SURVIVE) - if(!HAS_TRAIT(src, TRAIT_NODEATH)) - death() - - var/temp_bleed = 0 - //Bleeding out - for(var/X in bodyparts) - var/obj/item/bodypart/BP = X - var/brutedamage = BP.brute_dam - - //We want an accurate reading of .len - list_clear_nulls(BP.embedded_objects) - for(var/obj/item/embeddies in BP.embedded_objects) - if(!embeddies.isEmbedHarmless()) - temp_bleed += 0.5 + desired_damage = getMaxHealth() * 2.0 + // Rapidly die with no saving you + adjustOxyLoss(clamp(getMaxHealth() * 2.0 - getOxyLoss(), 0, 10)) + var/health_difference = clamp(desired_damage - getOxyLoss(), 0, 5) + adjustOxyLoss(health_difference) - if(brutedamage >= 20) - temp_bleed += (brutedamage * 0.013) - - bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases - - if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH))) - bleed(bleed_rate) +/mob/living/proc/bleed(amt) + add_splatter_floor(src.loc, 1) //Makes a blood drop, leaking amt units of blood from the mob -/mob/living/carbon/proc/bleed(amt) - if(blood_volume) - blood_volume = max(blood_volume - amt, 0) - if (prob(sqrt(amt)*BLOOD_DRIP_RATE_MOD)) - if(isturf(src.loc)) //Blood loss still happens in locker, floor stays clean - if(amt >= 10) - add_splatter_floor(src.loc) - else - add_splatter_floor(src.loc, 1) +/mob/living/carbon/bleed(amt) + if(blood_volume && !HAS_TRAIT(src, TRAIT_NO_BLOOD) && !HAS_TRAIT(src, TRAIT_NO_BLEEDING) && !IS_IN_STASIS(src)) + // As you get less bloodloss, you bleed slower + // See the top of this file for desmos lines + var/decrease_multiplier = BLEED_RATE_MULTIPLIER + var/obj/item/organ/heart/heart = getorganslot(ORGAN_SLOT_HEART) + if (!heart || !heart.beating) + decrease_multiplier = BLEED_RATE_MULTIPLIER_NO_HEART + var/blood_loss_amount = blood_volume - blood_volume * NUM_E ** (-(amt * decrease_multiplier)/BLOOD_VOLUME_NORMAL) + blood_volume = max(blood_volume - blood_loss_amount, 0) + if(isturf(src.loc) && prob(sqrt(blood_loss_amount)*BLOOD_DRIP_RATE_MOD)) //Blood loss still happens in locker, floor stays clean + if(blood_loss_amount >= 2) + add_splatter_floor(src.loc) + else + add_splatter_floor(src.loc, 1) /mob/living/carbon/human/bleed(amt) amt *= physiology.bleed_mod if(!(NOBLOOD in dna.species.species_traits)) ..() - - /mob/living/proc/restore_blood() blood_volume = initial(blood_volume) /mob/living/carbon/human/restore_blood() blood_volume = BLOOD_VOLUME_NORMAL - bleed_rate = 0 + cauterise_wounds() /**************************************************** BLOOD TRANSFERS @@ -246,6 +490,8 @@ //to add a splatter of blood or other mob liquid. /mob/living/proc/add_splatter_floor(turf/T, small_drip) + if (HAS_TRAIT(src, TRAIT_NO_BLOOD) || HAS_TRAIT(src, TRAIT_NO_BLEEDING) || IS_IN_STASIS(src)) + return if(get_blood_id() != /datum/reagent/blood) return if(!T) @@ -298,3 +544,21 @@ var/obj/effect/decal/cleanable/oil/B = locate() in T.contents if(!B) B = new(T) + +/** + * Item to represent the fact that we are covering a wound + */ +/obj/item/offhand/bleeding_suppress + name = "Applying pressure" + desc = "You are applying pressure to your wounds." + icon_state = "bleed_held" + +/obj/item/offhand/bleeding_suppress/equipped(mob/living/carbon/user, slot) + . = ..() + if (istype(user)) + ADD_TRAIT(user, TRAIT_BLEED_HELD, ACTION_TRAIT) + +/obj/item/offhand/bleeding_suppress/dropped(mob/living/carbon/user, silent) + if (istype(user)) + REMOVE_TRAIT(user, TRAIT_BLEED_HELD, ACTION_TRAIT) + return ..() diff --git a/code/modules/mob/living/carbon/carbon_defense.dm b/code/modules/mob/living/carbon/carbon_defense.dm index e24c1905591ef..5e5901766ed86 100644 --- a/code/modules/mob/living/carbon/carbon_defense.dm +++ b/code/modules/mob/living/carbon/carbon_defense.dm @@ -73,6 +73,10 @@ affecting = bodyparts[1] SEND_SIGNAL(I, COMSIG_ITEM_ATTACK_ZONE, src, user, affecting) send_item_attack_message(I, user, parse_zone(affecting.body_zone)) + if (I.bleed_force) + var/armour_block = run_armor_check(affecting, BLEED, armour_penetration = I.armour_penetration, silent = (I.force > 0)) + var/hit_amount = (100 - armour_block) / 100 + add_bleeding(I.bleed_force * hit_amount) if(I.force) var/armour_block = run_armor_check(affecting, MELEE, armour_penetration = I.armour_penetration) apply_damage(I.force, I.damtype, affecting, armour_block) @@ -93,6 +97,10 @@ if(head) head.add_mob_blood(src) update_inv_head() + else if (I.damtype == BURN && is_bleeding() && IS_ORGANIC_LIMB(affecting)) + cauterise_wounds(AMOUNT_TO_BLEED_INTENSITY(I.force / 3)) + to_chat(src, "The heat from [I] cauterizes your bleeding!") + playsound(src, 'sound/surgery/cautery2.ogg', 70) //dismemberment var/dismemberthreshold = (((affecting.max_damage * 2) / max(I.is_sharp(), 0.5)) - (affecting.get_damage() + ((I.w_class - 3) * 10) + ((I.attack_weight - 1) * 15))) @@ -491,3 +499,56 @@ ADD_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) else if(getOxyLoss() <= 50) REMOVE_TRAIT(src, TRAIT_KNOCKEDOUT, OXYLOSS_TRAIT) + +/mob/living/carbon/bullet_act(obj/projectile/P, def_zone, piercing_hit) + var/obj/item/bodypart/affecting = get_bodypart(check_zone(def_zone)) + if(!affecting) //missing limb? we select the first bodypart (you can never have zero, because of chest) + affecting = bodyparts[1] + if (P.bleed_force) + var/armour_block = run_armor_check(affecting, BLEED, armour_penetration = P.armour_penetration, silent = TRUE) + var/hit_amount = (100 - armour_block) / 100 + add_bleeding(P.bleed_force * hit_amount) + if (P.damage_type == BURN && is_bleeding() && IS_ORGANIC_LIMB(affecting)) + cauterise_wounds(AMOUNT_TO_BLEED_INTENSITY(P.damage / 3)) + playsound(src, 'sound/surgery/cautery2.ogg', 70) + to_chat(src, "The heat from [P] cauterizes your bleeding!") + + return ..() + +/mob/living/carbon/attack_basic_mob(mob/living/basic/user) + . = ..() + if(!.) + return + var/affected_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/dam_zone = dismembering_strike(user, affected_zone) + if(!dam_zone) //Dismemberment successful + return TRUE + var/obj/item/bodypart/affecting = get_bodypart(affected_zone) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor = run_armor_check(affecting, MELEE, armour_penetration = user.armour_penetration) + apply_damage(user.melee_damage, user.melee_damage_type, affecting, armor) + // Apply bleeding + if (user.melee_damage_type == BRUTE) + var/armour_block = run_armor_check(dam_zone, BLEED, armour_penetration = user.armour_penetration, silent = TRUE) + var/hit_amount = (100 - armour_block) / 100 + add_bleeding(user.melee_damage * 0.1 * hit_amount) + +/mob/living/carbon/attack_animal(mob/living/simple_animal/M) + . = ..() + if(!.) + return + var/affected_zone = pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) + var/dam_zone = dismembering_strike(M, affected_zone) + if(!dam_zone) //Dismemberment successful + return TRUE + var/obj/item/bodypart/affecting = get_bodypart(affected_zone) + if(!affecting) + affecting = get_bodypart(BODY_ZONE_CHEST) + var/armor = run_armor_check(affecting, MELEE, armour_penetration = M.armour_penetration) + apply_damage(M.melee_damage, M.melee_damage_type, affecting, armor) + // Apply bleeding + if (M.melee_damage_type == BRUTE) + var/armour_block = run_armor_check(dam_zone, BLEED, armour_penetration = M.armour_penetration, silent = TRUE) + var/hit_amount = (100 - armour_block) / 100 + add_bleeding(M.melee_damage * 0.1 * hit_amount) diff --git a/code/modules/mob/living/carbon/human/examine.dm b/code/modules/mob/living/carbon/human/examine.dm index 1ea81a906fee0..15d16372a1a4d 100644 --- a/code/modules/mob/living/carbon/human/examine.dm +++ b/code/modules/mob/living/carbon/human/examine.dm @@ -189,6 +189,17 @@ burn_msg = burn_msg ? burn_msg : "burns" bleed_msg = bleed_msg ? bleed_msg : "bleeding" + if (is_bleeding()) + switch (get_bleed_rate()) + if (BLEED_DEEP_WOUND to INFINITY) + msg += "[src] is [bleed_msg] extremely quickly.\n" + if (BLEED_RATE_MINOR to BLEED_DEEP_WOUND) + msg += "[src] is [bleed_msg] at a significant rate.\n" + else + msg += "[src] has some minor [bleed_msg] which look like it will stop soon.\n" + else if (is_bandaged()) + msg += "[src] is [bleed_msg], but it is covered.\n" + if(!(user == src && src.hal_screwyhud == SCREWYHUD_HEALTHY)) //fake healthy if(temp) if(temp < 25) @@ -244,14 +255,6 @@ if(blood_volume < BLOOD_VOLUME_SAFE) msg += "[t_He] appear[p_s()] faint.\n" - if(bleedsuppress) - msg += "[t_He] [t_is] bandaged with something.\n" - else if(bleed_rate) - if(reagents.has_reagent(/datum/reagent/toxin/heparin, needs_metabolizing = TRUE)) - msg += "[t_He] [t_is] [bleed_msg] uncontrollably!\n" - else - msg += "[t_He] [t_is] [bleed_msg]!\n" - if(reagents.has_reagent(/datum/reagent/teslium, needs_metabolizing = TRUE)) msg += "[t_He] [t_is] emitting a gentle blue glow!\n" diff --git a/code/modules/mob/living/carbon/human/human_defense.dm b/code/modules/mob/living/carbon/human/human_defense.dm index 0ee0cc06683ef..dea570726a922 100644 --- a/code/modules/mob/living/carbon/human/human_defense.dm +++ b/code/modules/mob/living/carbon/human/human_defense.dm @@ -297,37 +297,6 @@ var/armor_block = run_armor_check(affecting, MELEE) apply_damage(damage, BRUTE, affecting, armor_block) -/mob/living/carbon/human/attack_basic_mob(mob/living/basic/user) - . = ..() - if(!.) - return - if(check_shields(user, user.melee_damage, "the [user.name]", MELEE_ATTACK, user.armour_penetration)) - return FALSE - var/dam_zone = dismembering_strike(user, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return TRUE - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor = run_armor_check(affecting, MELEE, armour_penetration = user.armour_penetration) - apply_damage(user.melee_damage, user.melee_damage_type, affecting, armor) - -/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) - . = ..() - if(.) - var/damage = M.melee_damage - if(check_shields(M, damage, "the [M.name]", MELEE_ATTACK, M.armour_penetration)) - return FALSE - var/dam_zone = dismembering_strike(M, pick(BODY_ZONE_CHEST, BODY_ZONE_PRECISE_L_HAND, BODY_ZONE_PRECISE_R_HAND, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG)) - if(!dam_zone) //Dismemberment successful - return TRUE - var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone)) - if(!affecting) - affecting = get_bodypart(BODY_ZONE_CHEST) - var/armor = run_armor_check(affecting, MELEE, armour_penetration = M.armour_penetration) - apply_damage(damage, M.melee_damage_type, affecting, armor) - - /mob/living/carbon/human/attack_slime(mob/living/simple_animal/slime/M) if(..()) //successful slime attack var/damage = 20 @@ -726,8 +695,10 @@ for(var/t in missing) to_chat(src, "Your [parse_zone(t)] is missing!") - if(bleed_rate) + if(is_bleeding()) to_chat(src, "You are [bleed_msg]!") + else if (is_bandaged()) + to_chat(src, "Your [bleed_msg] is bandaged!") if(getStaminaLoss()) if(getStaminaLoss() > 30) to_chat(src, "You're completely exhausted.") @@ -874,3 +845,13 @@ ADD_TRAIT(src, TRAIT_NOBLOCK, type) stoplag(50) REMOVE_TRAIT(src, TRAIT_NOBLOCK, type) + +/mob/living/carbon/human/attack_basic_mob(mob/living/basic/user) + if(user.melee_damage != 0 && !HAS_TRAIT(user, TRAIT_PACIFISM) && check_shields(user, user.melee_damage, "the [user.name]", MELEE_ATTACK, user.armour_penetration)) + return FALSE + return ..() + +/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M) + if(M.melee_damage != 0 && !HAS_TRAIT(M, TRAIT_PACIFISM) && check_shields(M, M.melee_damage, "the [M.name]", MELEE_ATTACK, M.armour_penetration)) + return FALSE + return ..() diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 83ec9ea390625..1cdff265fa1bb 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -47,7 +47,6 @@ var/special_voice = "" // For changing our voice. Used by a symptom. var/bleed_rate = 0 //how much are we bleeding - var/bleedsuppress = 0 //for stopping bloodloss, eventually this will be limb-based like bleeding /// How many "units of blood" we have on our hands var/blood_in_hands = 0 diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 39862dd1f1284..ad43b7e53e83e 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -124,6 +124,9 @@ GLOBAL_LIST_EMPTY(features_by_species) ///List of possible heights var/list/species_height = SPECIES_HEIGHTS(BODY_SIZE_SHORT, BODY_SIZE_NORMAL, BODY_SIZE_TALL) + /// What bleed status effect should we apply? + var/bleed_effect = STATUS_EFFECT_BLEED + /////////// // PROCS // /////////// @@ -1494,6 +1497,10 @@ GLOBAL_LIST_EMPTY(features_by_species) to_chat(H, "Your hair starts to fall out in clumps.") addtimer(CALLBACK(src, PROC_REF(go_bald), H), 50) + +/datum/species/proc/handle_blood(mob/living/carbon/human/H) + return FALSE + /datum/species/proc/go_bald(mob/living/carbon/human/H) if(QDELETED(H)) //may be called from a timer return @@ -1709,44 +1716,16 @@ GLOBAL_LIST_EMPTY(features_by_species) var/weakness = H.check_weakness(I, user) apply_damage(I.force * weakness, I.damtype, def_zone, armor_block, H) - H.send_item_attack_message(I, user, hit_area) - - if(!I.force) - return 0 //item force is zero - - //dismemberment - var/dismemberthreshold = ((affecting.max_damage * 2) - affecting.get_damage()) //don't take the current hit into account. - var/attackforce = (((I.w_class - 3) * 5) + ((I.attack_weight - 1) * 14) + ((I.is_sharp()-1) * 20)) //all the variables that go into ripping off a limb in one handy package. Force is absent because it's already been taken into account by the limb being damaged - if(HAS_TRAIT(src, TRAIT_EASYDISMEMBER)) - dismemberthreshold -= 30 - if(I.is_sharp()) - attackforce = max(attackforce, I.force) - if(attackforce >= dismemberthreshold && I.force >= 10) - if(affecting.dismember(I.damtype)) - I.add_mob_blood(H) - playsound(get_turf(H), I.get_dismember_sound(), 80, 1) - - var/bloody = 0 - if((I.damtype == BRUTE) && (I.force >= max(10, armor_block) || I.is_sharp())) + if (I.bleed_force) + var/armour_block = user.run_armor_check(affecting, BLEED, armour_penetration = I.armour_penetration, silent = (I.force > 0)) + var/hit_amount = (100 - armour_block) / 100 + H.add_bleeding(I.bleed_force * hit_amount) if(IS_ORGANIC_LIMB(affecting)) I.add_mob_blood(H) //Make the weapon bloody, not the person. - if(prob(I.force * 2)) //blood spatter! - bloody = 1 - var/turf/location = H.loc - if(istype(location)) - H.add_splatter_floor(location) - if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood - user.add_mob_blood(H) - - switch(hit_area) - if(BODY_ZONE_HEAD) - if(!I.is_sharp()) - if(H.mind && H.stat == CONSCIOUS && H != user && (H.health - (I.force * I.attack_weight)) <= 0) // rev deconversion through blunt trauma. - var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) - if(rev) - rev.remove_revolutionary(FALSE, user) - - if(bloody) //Apply blood + if(get_dist(user, H) <= 1) //people with TK won't get smeared with blood + user.add_mob_blood(H) + switch(hit_area) + if(BODY_ZONE_HEAD) if(H.wear_mask) H.wear_mask.add_mob_blood(H) H.update_inv_wear_mask() @@ -1757,8 +1736,7 @@ GLOBAL_LIST_EMPTY(features_by_species) H.glasses.add_mob_blood(H) H.update_inv_glasses() - if(BODY_ZONE_CHEST) - if(bloody) + if(BODY_ZONE_CHEST) if(H.wear_suit) H.wear_suit.add_mob_blood(H) H.update_inv_wear_suit() @@ -1766,8 +1744,34 @@ GLOBAL_LIST_EMPTY(features_by_species) H.w_uniform.add_mob_blood(H) H.update_inv_w_uniform() + H.send_item_attack_message(I, user, hit_area) + + if(!I.force) + return 0 //item force is zero + + //dismemberment + var/dismemberthreshold = ((affecting.max_damage * 2) - affecting.get_damage()) //don't take the current hit into account. + var/attackforce = (((I.w_class - 3) * 5) + ((I.attack_weight - 1) * 14) + ((I.is_sharp()-1) * 20)) //all the variables that go into ripping off a limb in one handy package. Force is absent because it's already been taken into account by the limb being damaged + if(HAS_TRAIT(src, TRAIT_EASYDISMEMBER)) + dismemberthreshold -= 30 + if(I.is_sharp()) + attackforce = max(attackforce, I.force) + if(attackforce >= dismemberthreshold && I.force >= 10) + if(affecting.dismember(I.damtype)) + I.add_mob_blood(H) + playsound(get_turf(H), I.get_dismember_sound(), 80, 1) + + if(I.damtype == BRUTE && (I.force >= max(10, armor_block) && hit_area == BODY_ZONE_HEAD)) + if(!I.is_sharp() && H.mind && H.stat == CONSCIOUS && H != user && (H.health - (I.force * I.attack_weight)) <= 0) // rev deconversion through blunt trauma. + var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev) + if(rev) + rev.remove_revolutionary(FALSE, user) if(Iforce > 10 || Iforce >= 5 && prob(33)) H.force_say(user) + else if (I.damtype == BURN && H.is_bleeding()) + H.cauterise_wounds(AMOUNT_TO_BLEED_INTENSITY(I.force / 3)) + to_chat(user, "The heat from [I] cauterizes your bleeding!") + playsound(src, 'sound/surgery/cautery2.ogg', 70) return TRUE /datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE) diff --git a/code/modules/mob/living/carbon/human/species_types/IPC.dm b/code/modules/mob/living/carbon/human/species_types/IPC.dm index 726367170abca..2473efcfe839a 100644 --- a/code/modules/mob/living/carbon/human/species_types/IPC.dm +++ b/code/modules/mob/living/carbon/human/species_types/IPC.dm @@ -5,7 +5,7 @@ bodyflag = FLAG_IPC sexes = FALSE species_traits = list(NOTRANSSTING,NOEYESPRITES,NO_DNA_COPY,NOZOMBIE,MUTCOLORS,REVIVESBYHEALING,NOHUSK,NOMOUTH, MUTCOLORS) - inherent_traits = list(TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_EASYDISMEMBER,TRAIT_POWERHUNGRY,TRAIT_XENO_IMMUNE, TRAIT_TOXIMMUNE) + inherent_traits = list(TRAIT_BLOOD_COOLANT,TRAIT_RESISTCOLD,TRAIT_NOBREATH,TRAIT_RADIMMUNE,TRAIT_LIMBATTACHMENT,TRAIT_EASYDISMEMBER,TRAIT_POWERHUNGRY,TRAIT_XENO_IMMUNE, TRAIT_TOXIMMUNE) inherent_biotypes = list(MOB_ROBOTIC, MOB_HUMANOID) mutant_brain = /obj/item/organ/brain/positron mutanteyes = /obj/item/organ/eyes/robotic @@ -19,7 +19,6 @@ default_features = list("mcolor" = "#7D7D7D", "ipc_screen" = "Static", "ipc_antenna" = "None", "ipc_chassis" = "Morpheus Cyberkinetics (Custom)") meat = /obj/item/stack/sheet/plasteel{amount = 5} skinned_type = /obj/item/stack/sheet/iron{amount = 10} - exotic_blood = /datum/reagent/oil damage_overlay_type = "synth" mutant_bodyparts = list("ipc_screen", "ipc_antenna", "ipc_chassis") default_features = list("ipc_screen" = "BSOD", "ipc_antenna" = "None") @@ -29,7 +28,6 @@ clonemod = 0 staminamod = 0.8 siemens_coeff = 1.5 - blood_color = "#000000" reagent_tag = PROCESS_SYNTHETIC species_gibs = GIB_TYPE_ROBOTIC attack_sound = 'sound/items/trayhit1.ogg' @@ -46,6 +44,10 @@ species_l_leg = /obj/item/bodypart/l_leg/ipc species_r_leg = /obj/item/bodypart/r_leg/ipc + exotic_blood = /datum/reagent/oil + blood_color = "#000000" + bleed_effect = /datum/status_effect/bleeding/robotic + var/saved_screen //for saving the screen when they die var/datum/action/innate/change_screen/change_screen @@ -282,3 +284,37 @@ ) return to_add + +/datum/status_effect/bleeding/robotic + alert_type = /atom/movable/screen/alert/status_effect/bleeding/robotic + bleed_heal_multiplier = 0 + +/datum/status_effect/bleeding/robotic/tick() + // Since we don't have flesh, we will instantly repair any sealed wounds + bandaged_bleeding = 0 + ..() + +/datum/status_effect/bleeding/robotic/update_icon() + // The actual rate of bleeding, can be reduced by holding wounds + // Calculate the message to show to the user + if (HAS_TRAIT(owner, TRAIT_BLEED_HELD)) + linked_alert.name = "Leaking (Held)" + if (bleed_rate > BLEED_RATE_MINOR) + linked_alert.desc = "Critical leaks have been detected in your system and require welding. Leak rate slowed by applied pressure." + else + linked_alert.desc = "Minor leaks have been detected in your system and require welding. Leak rate slowed by applied pressure." + else + if (bleed_rate < BLEED_RATE_MINOR) + linked_alert.name = "Leaking (Light)" + linked_alert.desc = "Minor leaks have been detected in your system and require welding." + else + linked_alert.name = "Leaking (Heavy)" + linked_alert.desc = "Critical leaks have been detected in your system and require welding." + linked_alert.icon_state = "bleed_robo" + + linked_alert.maptext = MAPTEXT(owner.get_bleed_rate_string()) + +/atom/movable/screen/alert/status_effect/bleeding/robotic + name = "Leaking" + desc = "You are leaking, weld the leaks back together or you will die." + icon_state = "bleed_robo" diff --git a/code/modules/mob/living/carbon/human/species_types/golems.dm b/code/modules/mob/living/carbon/human/species_types/golems.dm index 95d2a938d0dd5..21bcb156c3068 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -858,7 +858,7 @@ name = "pile of bandages" desc = "It emits a strange aura, as if there was still life within it..." max_integrity = 50 - armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50, STAMINA = 0) + armor = list(MELEE = 90, BULLET = 90, LASER = 25, ENERGY = 80, BOMB = 50, BIO = 100, FIRE = -50, ACID = -50, STAMINA = 0, BLEED = 0) icon = 'icons/obj/items_and_weapons.dmi' icon_state = "pile_bandages" resistance_flags = FLAMMABLE diff --git a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm index 3ffbcfa97eabb..b2db5f2212a10 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -97,3 +97,9 @@ species_language_holder = /datum/language_holder/lizard/ash mutantlungs = /obj/item/organ/lungs/ashwalker digitigrade_customization = DIGITIGRADE_FORCED + +/datum/species/lizard/ashwalker/spec_life(mob/living/carbon/human/H) + . = ..() + H.cauterise_wounds(0.1) + if (H.blood_volume < BLOOD_VOLUME_NORMAL && !H.is_bleeding()) + H.blood_volume += 0.5 diff --git a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm index 1cea3c8950bf2..110e753ccd9cb 100644 --- a/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/shadowpeople.dm @@ -225,6 +225,7 @@ item_flags = ABSTRACT | DROPDEL | ISWEAPON w_class = WEIGHT_CLASS_HUGE sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND /obj/item/light_eater/Initialize(mapload) . = ..() diff --git a/code/modules/mob/living/carbon/human/species_types/snail.dm b/code/modules/mob/living/carbon/human/species_types/snail.dm index 4cce83b6a141e..85d8ccb9cd4a3 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -60,7 +60,7 @@ item_state = "snailshell" lefthand_file = 'icons/mob/inhands/equipment/backpack_lefthand.dmi' righthand_file = 'icons/mob/inhands/equipment/backpack_righthand.dmi' - armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 10, LASER = 10, ENERGY = 10, BOMB = 0, BIO = 0, RAD = 0, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) max_integrity = 200 resistance_flags = FIRE_PROOF | ACID_PROOF diff --git a/code/modules/mob/living/living.dm b/code/modules/mob/living/living.dm index 3567a0a6a0432..b5b61b73a2edc 100644 --- a/code/modules/mob/living/living.dm +++ b/code/modules/mob/living/living.dm @@ -514,6 +514,7 @@ /mob/living/proc/update_resting() update_rest_hud_icon() update_mobility() + SEND_SIGNAL(src, COMSIG_LIVING_RESTING_UPDATED, resting) //Recursive function to find everything a mob is holding. Really shitty proc tbh. @@ -761,7 +762,7 @@ TH.color = spec_color /mob/living/carbon/human/makeTrail(turf/T, turf/start, direction, spec_color) - if((NOBLOOD in dna.species.species_traits) || !bleed_rate || bleedsuppress) + if((NOBLOOD in dna.species.species_traits) || !is_bleeding()) return spec_color = dna.species.blood_color ..() diff --git a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm index a8a5d7da1a4de..501549c9cd813 100644 --- a/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm +++ b/code/modules/mob/living/simple_animal/hostile/cat_butcher.dm @@ -84,11 +84,11 @@ L.reagents.remove_reagent(/datum/reagent/toxin/chloralhydrate, 100) if(L.blood_volume <= 500) //bandage them up and give em some blood if they're bleeding L.blood_volume += 30 - L.suppress_bloodloss(1800) + L.suppress_bloodloss(BLEED_DEEP_WOUND) if(L.getBruteLoss() >= 50) var/healing = min(L.getBruteLoss(), 120) L.adjustBruteLoss(-healing) - L.suppress_bloodloss(1800)//bandage their ass + L.suppress_bloodloss(BLEED_DEEP_WOUND)//bandage their ass FindTarget() /mob/living/simple_animal/hostile/cat_butcherer/proc/newvictim(var/mob/living/carbon/human/L) diff --git a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm index 4766f9269d10b..92353fa8a5813 100644 --- a/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm +++ b/code/modules/mob/living/simple_animal/hostile/mining_mobs/elites/elite.dm @@ -114,7 +114,7 @@ While using this makes the system rely on OnFire, it still gives options for tim /obj/structure/elite_tumor name = "pulsing tumor" desc = "An odd, pulsing tumor sticking out of the ground. You feel compelled to reach out and touch it..." - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) resistance_flags = INDESTRUCTIBLE icon = 'icons/obj/lavaland/tumor.dmi' icon_state = "tumor" diff --git a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm index e59213910dd7b..9b73ac41a7d3c 100644 --- a/code/modules/mob/living/simple_animal/hostile/space_dragon.dm +++ b/code/modules/mob/living/simple_animal/hostile/space_dragon.dm @@ -27,7 +27,7 @@ health = 350 spacewalk = TRUE a_intent = INTENT_HARM - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0.5, OXY = 1) + damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 1, CLONE = 1, STAMINA = 0, OXY = 1) speed = 0 attacktext = "chomps" attack_sound = 'sound/magic/demon_attack1.ogg' diff --git a/code/modules/mob/mob_helpers.dm b/code/modules/mob/mob_helpers.dm index c542890c09a6a..82a8a22d0b334 100644 --- a/code/modules/mob/mob_helpers.dm +++ b/code/modules/mob/mob_helpers.dm @@ -453,11 +453,15 @@ dam = 1 else dam = 0 - if((brute_heal > 0 && affecting.brute_dam > 0) || (burn_heal > 0 && affecting.burn_dam > 0)) + if((brute_heal > 0 && (affecting.brute_dam > 0 || (H.is_bleeding() && H.has_mechanical_bleeding()))) || (burn_heal > 0 && affecting.burn_dam > 0)) if(affecting.heal_damage(brute_heal, burn_heal, 0, BODYTYPE_ROBOTIC)) H.update_damage_overlays() - user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [parse_zone(affecting.body_zone)].", \ - "You fix some of the [dam ? "dents on" : "burnt wires in"] [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].") + if (brute_heal > 0 && H.is_bleeding() && H.has_mechanical_bleeding()) + H.cauterise_wounds(0.4) + user.visible_message("[user] has fixed some of the dents on [H]'s [parse_zone(affecting.body_zone)], reducing [H.p_their()] leaking to [H.get_bleed_rate_string()].") + else + user.visible_message("[user] has fixed some of the [dam ? "dents on" : "burnt wires in"] [H]'s [parse_zone(affecting.body_zone)].", \ + "You fix some of the [dam ? "dents on" : "burnt wires in"] [H == user ? "your" : "[H]'s"] [parse_zone(affecting.body_zone)].") return TRUE //successful heal else to_chat(user, "[affecting] is already in good condition!") diff --git a/code/modules/modular_computers/computers/item/computer.dm b/code/modules/modular_computers/computers/item/computer.dm index b8613a74f5337..f5285829b4d6a 100644 --- a/code/modules/modular_computers/computers/item/computer.dm +++ b/code/modules/modular_computers/computers/item/computer.dm @@ -56,7 +56,7 @@ GLOBAL_LIST_EMPTY(TabletMessengers) // a list of all active messengers, similar integrity_failure = 0.5 max_integrity = 100 - armor = list(MELEE = 0, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 20, LASER = 20, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 0, ACID = 0, STAMINA = 0, BLEED = 0) /// List of "connection ports" in this computer and the components with which they are plugged var/list/all_components = list() diff --git a/code/modules/ninja/energy_katana.dm b/code/modules/ninja/energy_katana.dm index 31859ccdf9523..dc0972777808a 100644 --- a/code/modules/ninja/energy_katana.dm +++ b/code/modules/ninja/energy_katana.dm @@ -18,6 +18,7 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") slot_flags = ITEM_SLOT_BACK|ITEM_SLOT_BELT sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND max_integrity = 200 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF | INDESTRUCTIBLE var/datum/effect_system/spark_spread/spark_system diff --git a/code/modules/ninja/suit/head.dm b/code/modules/ninja/suit/head.dm index 448cfc7586f1d..b02d10df78048 100644 --- a/code/modules/ninja/suit/head.dm +++ b/code/modules/ninja/suit/head.dm @@ -3,7 +3,7 @@ name = "ninja hood" icon_state = "s-ninja" item_state = "s-ninja_mask" - armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 25, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 25, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60) strip_delay = 12 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF blockTracking = TRUE//Roughly the only unique thing about this helmet. diff --git a/code/modules/ninja/suit/shoes.dm b/code/modules/ninja/suit/shoes.dm index cd9536822a4cc..6a0b16e6667c3 100644 --- a/code/modules/ninja/suit/shoes.dm +++ b/code/modules/ninja/suit/shoes.dm @@ -7,7 +7,7 @@ permeability_coefficient = 0.01 clothing_flags = NOSLIP resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF - armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60) strip_delay = 120 cold_protection = FEET min_cold_protection_temperature = SHOES_MIN_TEMP_PROTECT diff --git a/code/modules/ninja/suit/suit.dm b/code/modules/ninja/suit/suit.dm index 85a77b3c93a75..765eb824444f7 100644 --- a/code/modules/ninja/suit/suit.dm +++ b/code/modules/ninja/suit/suit.dm @@ -19,7 +19,7 @@ Contents: allowed = list(/obj/item/gun, /obj/item/ammo_box, /obj/item/ammo_casing, /obj/item/melee/baton, /obj/item/restraints/handcuffs, /obj/item/tank/internals, /obj/item/stock_parts/cell) slowdown = 1 resistance_flags = LAVA_PROOF | ACID_PROOF - armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60) + armor = list(MELEE = 60, BULLET = 50, LASER = 30, ENERGY = 15, BOMB = 30, BIO = 30, RAD = 30, FIRE = 100, ACID = 100, STAMINA = 60, BLEED = 60) strip_delay = 12 actions_types = list(/datum/action/item_action/initialize_ninja_suit, /datum/action/item_action/ninjasmoke, /datum/action/item_action/ninjaboost, /datum/action/item_action/ninjapulse, /datum/action/item_action/ninjastar, /datum/action/item_action/ninjanet, /datum/action/item_action/ninja_sword_recall, /datum/action/item_action/ninja_stealth, /datum/action/item_action/toggle_glove) diff --git a/code/modules/paperwork/pen.dm b/code/modules/paperwork/pen.dm index f82d9debd47aa..14fa0b9507970 100644 --- a/code/modules/paperwork/pen.dm +++ b/code/modules/paperwork/pen.dm @@ -103,6 +103,7 @@ colour = "crimson" custom_materials = list(/datum/material/gold = 750) sharpness = IS_SHARP + bleed_force = BLEED_SURFACE resistance_flags = FIRE_PROOF unique_reskin_icon = list("Oak" = "pen-fountain-o", "Gold" = "pen-fountain-g", @@ -243,6 +244,7 @@ embedding = list(embed_chance = EMBED_CHANCE, armour_block = 30) throwforce = initial(throwforce) sharpness = initial(sharpness) + bleed_force = initial(bleed_force) playsound(user, 'sound/weapons/saberoff.ogg', 5, 1) to_chat(user, "[src] can now be concealed.") else @@ -255,6 +257,7 @@ embedding = list(embed_chance = 200, max_damage_mult = 15, armour_block = 40) //rule of cool throwforce = 35 sharpness = IS_SHARP + bleed_force = BLEED_CUT playsound(user, 'sound/weapons/saberon.ogg', 5, 1) to_chat(user, "[src] is now active.") updateEmbedding() diff --git a/code/modules/power/apc/apc_main.dm b/code/modules/power/apc/apc_main.dm index cada253c82ce5..ac8bc8f6871da 100644 --- a/code/modules/power/apc/apc_main.dm +++ b/code/modules/power/apc/apc_main.dm @@ -135,7 +135,7 @@ if (!req_access) req_access = list(ACCESS_ENGINE_EQUIP) if (!armor) - armor = list(MELEE = 20, BULLET = 20, LASER = 10, ENERGY = 100, BOMB = 30, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 20, LASER = 10, ENERGY = 100, BOMB = 30, BIO = 100, RAD = 100, FIRE = 90, ACID = 50, STAMINA = 0, BLEED = 0) ..() GLOB.apcs_list += src diff --git a/code/modules/power/lighting/light_construct.dm b/code/modules/power/lighting/light_construct.dm index 96c23c8e7aaf4..47584ee0d1fe6 100644 --- a/code/modules/power/lighting/light_construct.dm +++ b/code/modules/power/lighting/light_construct.dm @@ -6,7 +6,7 @@ anchored = TRUE layer = WALL_OBJ_LAYER max_integrity = 200 - armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 80, ACID = 50, STAMINA = 0, BLEED = 0) var/stage = 1 var/fixture_type = "tube" diff --git a/code/modules/power/singularity/field_generator.dm b/code/modules/power/singularity/field_generator.dm index f05ed4eedfe24..ec26aa3603883 100644 --- a/code/modules/power/singularity/field_generator.dm +++ b/code/modules/power/singularity/field_generator.dm @@ -33,7 +33,7 @@ field_generator power level display use_power = NO_POWER_USE max_integrity = 500 //100% immune to lasers and energy projectiles since it absorbs their energy. - armor = list(MELEE = 25, BULLET = 10, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) var/power_level = 0 var/active = FG_OFFLINE var/power = 20 // Current amount of power diff --git a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm index d09f453d60054..24feb2fc3d024 100644 --- a/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm +++ b/code/modules/power/singularity/particle_accelerator/particle_accelerator.dm @@ -27,7 +27,7 @@ anchored = FALSE density = TRUE max_integrity = 500 - armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 20, LASER = 20, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 90, ACID = 80, STAMINA = 0, BLEED = 0) var/obj/machinery/particle_accelerator/control_box/master = null var/construction_state = PA_CONSTRUCTION_UNSECURED diff --git a/code/modules/projectiles/guns/magic/staff.dm b/code/modules/projectiles/guns/magic/staff.dm index 5d6cd84719890..be44f0a4c10da 100644 --- a/code/modules/projectiles/guns/magic/staff.dm +++ b/code/modules/projectiles/guns/magic/staff.dm @@ -92,6 +92,7 @@ armour_penetration = 75 block_flags = BLOCKING_ACTIVE | BLOCKING_NASTY | BLOCKING_PROJECTILE sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND max_charges = 4 /obj/item/gun/magic/staff/spellblade/Initialize(mapload) diff --git a/code/modules/projectiles/projectile/bullets.dm b/code/modules/projectiles/projectile/bullets.dm index 0f0f4d90dc35a..b1d8739124380 100644 --- a/code/modules/projectiles/projectile/bullets.dm +++ b/code/modules/projectiles/projectile/bullets.dm @@ -7,3 +7,4 @@ armor_flag = BULLET hitsound_wall = "ricochet" impact_effect_type = /obj/effect/temp_visual/impact_effect + bleed_force = BLEED_DEEP_WOUND diff --git a/code/modules/projectiles/projectile/bullets/dart_syringe.dm b/code/modules/projectiles/projectile/bullets/dart_syringe.dm index 2220d599a334e..22538dff1cff9 100644 --- a/code/modules/projectiles/projectile/bullets/dart_syringe.dm +++ b/code/modules/projectiles/projectile/bullets/dart_syringe.dm @@ -2,6 +2,7 @@ name = "dart" icon_state = "cbbolt" damage = 6 + bleed_force = BLEED_SURFACE var/piercing = FALSE var/obj/item/reagent_containers/syringe/syringe = null diff --git a/code/modules/projectiles/projectile/bullets/dnainjector.dm b/code/modules/projectiles/projectile/bullets/dnainjector.dm index 081e7f22edb25..3872527018119 100644 --- a/code/modules/projectiles/projectile/bullets/dnainjector.dm +++ b/code/modules/projectiles/projectile/bullets/dnainjector.dm @@ -1,6 +1,7 @@ /obj/projectile/bullet/dnainjector name = "\improper DNA injector" icon_state = "syringeproj" + bleed_force = BLEED_SURFACE var/obj/item/dnainjector/injector damage = 5 hitsound_wall = "shatter" diff --git a/code/modules/projectiles/projectile/bullets/grenade.dm b/code/modules/projectiles/projectile/bullets/grenade.dm index 254594eaaf99f..16fa4a12e46ee 100644 --- a/code/modules/projectiles/projectile/bullets/grenade.dm +++ b/code/modules/projectiles/projectile/bullets/grenade.dm @@ -5,6 +5,7 @@ desc = "USE A WEEL GUN" icon_state= "bolter" damage = 60 + bleed_force = 0 /obj/projectile/bullet/a40mm/on_hit(atom/target, blocked = FALSE) ..() diff --git a/code/modules/projectiles/projectile/bullets/revolver.dm b/code/modules/projectiles/projectile/bullets/revolver.dm index 270e760067d94..85ceca64e6a12 100644 --- a/code/modules/projectiles/projectile/bullets/revolver.dm +++ b/code/modules/projectiles/projectile/bullets/revolver.dm @@ -35,6 +35,7 @@ name = ".38 Bouncy Rubber bullet" damage = 7 stamina = 27 + bleed_force = BLEED_SCRATCH ricochets_max = 5 ricochet_incidence_leeway = 70 ricochet_chance = 130 @@ -109,6 +110,7 @@ damage = 0 nodamage = TRUE martial_arts_no_deflect = TRUE + bleed_force = 0 /obj/projectile/bullet/c38/mime/on_hit(atom/target, blocked = FALSE) if(isliving(target)) diff --git a/code/modules/projectiles/projectile/bullets/shotgun.dm b/code/modules/projectiles/projectile/bullets/shotgun.dm index 66d3b56da9f91..86a443b61519b 100644 --- a/code/modules/projectiles/projectile/bullets/shotgun.dm +++ b/code/modules/projectiles/projectile/bullets/shotgun.dm @@ -8,6 +8,7 @@ damage = 10 stamina = 50 armour_penetration = -20 + bleed_force = BLEED_TINY /obj/projectile/bullet/incendiary/shotgun name = "incendiary slug" @@ -62,6 +63,7 @@ ricochets_max = 1 ricochet_chance = 50 ricochet_decay_chance = 0.9 + bleed_force = BLEED_SCRATCH /obj/projectile/bullet/pellet/shotgun_buckshot name = "buckshot pellet" @@ -80,6 +82,7 @@ ricochet_incidence_leeway = 60 ricochet_decay_chance = 0.75 armour_penetration = -20 + bleed_force = BLEED_TINY /obj/projectile/bullet/pellet/shotgun_rubbershot/Range() if(damage <= 0 && tile_dropoff_s == 0) @@ -131,6 +134,7 @@ /obj/projectile/bullet/scattershot damage = 18 + bleed_force = BLEED_SURFACE //Breaching Ammo @@ -139,6 +143,7 @@ desc = "A breaching round designed to destroy airlocks and windows with only a few shots, but is ineffective against other targets." hitsound = 'sound/weapons/sonic_jackhammer.ogg' damage = 10 //does shit damage to everything except doors and windows + bleed_force = BLEED_SURFACE /obj/projectile/bullet/shotgun_breaching/on_hit(atom/target) if(istype(target, /obj/structure/window) || istype(target, /obj/structure/grille) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/door_assembly)) diff --git a/code/modules/projectiles/projectile/bullets/smg.dm b/code/modules/projectiles/projectile/bullets/smg.dm index a307ee3d36c2d..71b244598c3a3 100644 --- a/code/modules/projectiles/projectile/bullets/smg.dm +++ b/code/modules/projectiles/projectile/bullets/smg.dm @@ -31,3 +31,4 @@ ricochet_decay_chance = 0.8 ricochet_decay_damage = 0.85 armour_penetration = -15 + bleed_force = BLEED_SCRATCH diff --git a/code/modules/projectiles/projectile/bullets/special.dm b/code/modules/projectiles/projectile/bullets/special.dm index dc89a8e566667..6da5eb1a233c1 100644 --- a/code/modules/projectiles/projectile/bullets/special.dm +++ b/code/modules/projectiles/projectile/bullets/special.dm @@ -3,6 +3,7 @@ /obj/projectile/bullet/honker name = "banana" damage = 0 + bleed_force = 0 paralyze = 60 movement_type = FLYING projectile_piercing = ALL @@ -11,6 +12,7 @@ icon = 'icons/obj/hydroponics/harvest.dmi' icon_state = "banana" range = 200 + bleed_force = 0 /obj/projectile/bullet/honker/Initialize(mapload) . = ..() diff --git a/code/modules/projectiles/projectile/reusable/foam_dart.dm b/code/modules/projectiles/projectile/reusable/foam_dart.dm index 40bda2bd608ef..2401e2a77405b 100644 --- a/code/modules/projectiles/projectile/reusable/foam_dart.dm +++ b/code/modules/projectiles/projectile/reusable/foam_dart.dm @@ -9,6 +9,7 @@ ammo_type = /obj/item/ammo_casing/caseless/foam_dart range = 10 martial_arts_no_deflect = TRUE + bleed_force = 0 var/modified = FALSE var/obj/item/pen/pen = null diff --git a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm index c7ce0a2806bbc..d6bae0797ad6c 100644 --- a/code/modules/reagents/chemistry/reagents/medicine_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/medicine_reagents.dm @@ -1386,6 +1386,8 @@ M.adjustToxLoss(-5*REM, 0) M.adjustOrganLoss(ORGAN_SLOT_BRAIN, -15*REM) M.adjustCloneLoss(-3*REM, 0) + if (M.blood_volume < BLOOD_VOLUME_NORMAL) + M.blood_volume = max(M.blood_volume, min(M.blood_volume + 4, BLOOD_VOLUME_NORMAL)) ..() . = 1 @@ -1672,7 +1674,7 @@ /datum/reagent/medicine/polypyr //This is intended to be an ingredient in advanced chems. name = "Polypyrylium Oligomers" - description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is valued as an intermediate in the synthesis of the cutting edge pharmaceuticals." + description = "A purple mixture of short polyelectrolyte chains not easily synthesized in the laboratory. It is a powerful pharmaceutical drug which provides minor healing and prevents bloodloss, making it incredibly useful for the synthesis of other drugs." reagent_state = SOLID color = "#9423FF" chem_flags = CHEMICAL_RNG_GENERAL | CHEMICAL_RNG_FUN | CHEMICAL_RNG_BOTANY | CHEMICAL_GOAL_BOTANIST_HARVEST @@ -1683,10 +1685,9 @@ /datum/reagent/medicine/polypyr/on_mob_life(mob/living/carbon/M) //I wanted a collection of small positive effects, this is as hard to obtain as coniine after all. M.adjustOrganLoss(ORGAN_SLOT_LUNGS, -0.25) M.adjustBruteLoss(-0.35, 0) - if(prob(50)) - if(ishuman(M)) - var/mob/living/carbon/human/H = M - H.bleed_rate = max(H.bleed_rate - 1, 0) + if(ishuman(M)) + var/mob/living/carbon/human/H = M + H.cauterise_wounds(0.1) ..() . = 1 @@ -1705,7 +1706,7 @@ /datum/reagent/medicine/stabilizing_nanites name = "Stabilizing nanites" - description = "Rapidly heals a patient out of crit by regenerating damaged cells. Nanites distribution in the blood makes them ineffective against moderately healthy targets." + description = "Rapidly heals a patient out of crit by regenerating damaged cells and causing blood to clot, preventing bleeding. Nanites distribution in the blood makes them ineffective against moderately healthy targets." reagent_state = LIQUID color = "#000000" chem_flags = CHEMICAL_NOT_SYNTH | CHEMICAL_RNG_GENERAL | CHEMICAL_RNG_FUN | CHEMICAL_RNG_BOTANY @@ -1722,4 +1723,12 @@ if(prob(20)) M.Jitter(5) M.losebreath = 0 + if (M.blood_volume < BLOOD_VOLUME_SAFE) + M.blood_volume = max(M.blood_volume, min(M.blood_volume + 4, BLOOD_VOLUME_SAFE)) ..() + +/datum/reagent/medicine/stabilizing_nanites/on_mob_metabolize(mob/living/L) + ADD_TRAIT(L, TRAIT_NO_BLEEDING, type) + +/datum/reagent/medicine/stabilizing_nanites/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_NO_BLEEDING, type) diff --git a/code/modules/reagents/chemistry/reagents/other_reagents.dm b/code/modules/reagents/chemistry/reagents/other_reagents.dm index 0fdb0d7b1f881..100afadf44b2f 100644 --- a/code/modules/reagents/chemistry/reagents/other_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/other_reagents.dm @@ -320,6 +320,12 @@ return return ..() +/datum/reagent/fuel/unholywater/on_mob_metabolize(mob/living/L) + ADD_TRAIT(L, TRAIT_NO_BLEEDING, type) + +/datum/reagent/fuel/unholywater/on_mob_end_metabolize(mob/living/L) + REMOVE_TRAIT(L, TRAIT_NO_BLEEDING, type) + /datum/reagent/fuel/unholywater/on_mob_life(mob/living/carbon/M) if(iscultist(M)) M.drowsyness = max(M.drowsyness-5, 0) diff --git a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm index bcd32f4924c55..9892217b880e5 100644 --- a/code/modules/reagents/chemistry/reagents/toxin_reagents.dm +++ b/code/modules/reagents/chemistry/reagents/toxin_reagents.dm @@ -736,7 +736,8 @@ /datum/reagent/toxin/heparin/on_mob_life(mob/living/carbon/M) if(ishuman(M)) var/mob/living/carbon/human/H = M - H.bleed_rate = min(H.bleed_rate + 2, 8) + if (!H.is_bleeding()) + H.add_bleeding(BLEED_SURFACE) H.adjustBruteLoss(1, 0) //Brute damage increases with the amount they're bleeding . = 1 return ..() || . diff --git a/code/modules/reagents/reagent_containers/blood_pack.dm b/code/modules/reagents/reagent_containers/blood_pack.dm index e284a050710c7..37cb861f31e3b 100644 --- a/code/modules/reagents/reagent_containers/blood_pack.dm +++ b/code/modules/reagents/reagent_containers/blood_pack.dm @@ -3,17 +3,17 @@ desc = "Contains blood used for transfusion. Must be attached to an IV drip." icon = 'icons/obj/bloodpack.dmi' icon_state = "bloodpack" - volume = 200 + volume = 400 var/blood_type = null var/unique_blood = null var/labelled = 0 reagent_flags = TRANSPARENT | ABSOLUTELY_GRINDABLE - fill_icon_thresholds = list(10, 20, 30, 40, 50, 60, 70, 80, 90, 100) + fill_icon_thresholds = list(10, 40, 60, 80, 100, 120, 140, 160, 180, 200) /obj/item/reagent_containers/blood/Initialize(mapload) . = ..() if(blood_type != null) - reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 200, list("viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) + reagents.add_reagent(unique_blood ? unique_blood : /datum/reagent/blood, 400, list("viruses"=null,"blood_DNA"=null,"blood_type"=blood_type,"resistances"=null,"trace_chem"=null)) update_icon() /obj/item/reagent_containers/blood/examine(mob/user) diff --git a/code/modules/reagents/reagent_containers/glass.dm b/code/modules/reagents/reagent_containers/glass.dm index c4f06eec402b9..91eae09b1b5e3 100755 --- a/code/modules/reagents/reagent_containers/glass.dm +++ b/code/modules/reagents/reagent_containers/glass.dm @@ -245,7 +245,7 @@ flags_inv = HIDEHAIR slot_flags = ITEM_SLOT_HEAD resistance_flags = NONE - armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 50, STAMINA = 0) //Weak melee protection, because you can wear it on your head + armor = list(MELEE = 10, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 75, ACID = 50, STAMINA = 0, BLEED = 0) //Weak melee protection, because you can wear it on your head slot_equipment_priority = list( \ ITEM_SLOT_BACK, ITEM_SLOT_ID,\ ITEM_SLOT_ICLOTHING, ITEM_SLOT_OCLOTHING,\ diff --git a/code/modules/recycling/disposal/bin.dm b/code/modules/recycling/disposal/bin.dm index f23d7a069cbff..3addaeb41f56b 100644 --- a/code/modules/recycling/disposal/bin.dm +++ b/code/modules/recycling/disposal/bin.dm @@ -5,7 +5,7 @@ /obj/machinery/disposal icon = 'icons/obj/atmospherics/pipes/disposal.dmi' density = TRUE - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0) max_integrity = 200 resistance_flags = FIRE_PROOF interaction_flags_machine = INTERACT_MACHINE_OPEN | INTERACT_MACHINE_WIRES_IF_OPEN | INTERACT_MACHINE_ALLOW_SILICON | INTERACT_MACHINE_OPEN_SILICON diff --git a/code/modules/recycling/disposal/pipe.dm b/code/modules/recycling/disposal/pipe.dm index d3bf772f83c36..79c16ade1c3c1 100644 --- a/code/modules/recycling/disposal/pipe.dm +++ b/code/modules/recycling/disposal/pipe.dm @@ -9,7 +9,7 @@ obj_flags = CAN_BE_HIT | ON_BLUEPRINTS dir = NONE // dir will contain dominant direction for junction pipes max_integrity = 200 - armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 10, LASER = 10, ENERGY = 100, BOMB = 0, BIO = 100, RAD = 100, FIRE = 90, ACID = 30, STAMINA = 0, BLEED = 0) layer = DISPOSAL_PIPE_LAYER // slightly lower than wires and other pipes rad_flags = RAD_PROTECT_CONTENTS | RAD_NO_CONTAMINATE var/dpdir = NONE // bitmask of pipe directions diff --git a/code/modules/research/xenobiology/crossbreeding/_misc.dm b/code/modules/research/xenobiology/crossbreeding/_misc.dm index 758439b839a68..8fee94597f33f 100644 --- a/code/modules/research/xenobiology/crossbreeding/_misc.dm +++ b/code/modules/research/xenobiology/crossbreeding/_misc.dm @@ -147,7 +147,7 @@ Slimecrossing Items icon_state = "frozen" density = TRUE max_integrity = 100 - armor = list(MELEE = 30, BULLET = 50, LASER = -50, ENERGY = -50, BOMB = 0, BIO = 100, RAD = 100, FIRE = -80, ACID = 30, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 50, LASER = -50, ENERGY = -50, BOMB = 0, BIO = 100, RAD = 100, FIRE = -80, ACID = 30, STAMINA = 0, BLEED = 0) /obj/structure/ice_stasis/Initialize(mapload) . = ..() diff --git a/code/modules/research/xenobiology/crossbreeding/_weapons.dm b/code/modules/research/xenobiology/crossbreeding/_weapons.dm index 377677262d579..d52370b12d505 100644 --- a/code/modules/research/xenobiology/crossbreeding/_weapons.dm +++ b/code/modules/research/xenobiology/crossbreeding/_weapons.dm @@ -62,7 +62,7 @@ Slimecrossing Weapons icon_state = "adamshield" item_state = "adamshield" w_class = WEIGHT_CLASS_HUGE - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 70) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 70, STAMINA = 70, BLEED = 0) slot_flags = ITEM_SLOT_BACK attack_weight = 2 block_power = 75 diff --git a/code/modules/research/xenobiology/crossbreeding/warping.dm b/code/modules/research/xenobiology/crossbreeding/warping.dm index 1bb76532b3ce2..fd73b247afa8a 100644 --- a/code/modules/research/xenobiology/crossbreeding/warping.dm +++ b/code/modules/research/xenobiology/crossbreeding/warping.dm @@ -379,7 +379,7 @@ GLOBAL_DATUM(blue_storage, /obj/item/storage/backpack/holding/bluespace) /obj/item/storage/backpack/holding/bluespace name = "warped rune" anchored = TRUE - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100, STAMINA = 100, BLEED = 0) invisibility = INVISIBILITY_ABSTRACT resistance_flags = INDESTRUCTIBLE | LAVA_PROOF | FIRE_PROOF | UNACIDABLE | ACID_PROOF diff --git a/code/modules/ruins/lavalandruin_code/puzzle.dm b/code/modules/ruins/lavalandruin_code/puzzle.dm index d2ad5f06fdf73..432c4b2ea9155 100644 --- a/code/modules/ruins/lavalandruin_code/puzzle.dm +++ b/code/modules/ruins/lavalandruin_code/puzzle.dm @@ -296,7 +296,7 @@ //Some armor so it's harder to kill someone by mistake. /obj/structure/puzzle_element/prison - armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 50, LASER = 50, ENERGY = 50, BOMB = 50, BIO = 50, RAD = 50, FIRE = 50, ACID = 50, STAMINA = 0, BLEED = 0) /obj/structure/puzzle_element/prison/relaymove(mob/user) return diff --git a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm index a0f0ff5387a65..ba123aba0cd44 100644 --- a/code/modules/shuttle/shuttle_creation/shuttle_creator.dm +++ b/code/modules/shuttle/shuttle_creation/shuttle_creator.dm @@ -27,7 +27,7 @@ GLOBAL_LIST_EMPTY(custom_shuttle_machines) //Machines that require updating (He throw_range = 5 w_class = WEIGHT_CLASS_TINY req_access_txt = "11" - armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 0, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF var/ready = TRUE //pre-designation diff --git a/code/modules/surgery/amputation.dm b/code/modules/surgery/amputation.dm index 62ba5d084f0d5..fbf0caf06ce78 100644 --- a/code/modules/surgery/amputation.dm +++ b/code/modules/surgery/amputation.dm @@ -28,5 +28,5 @@ if(surgery.operated_bodypart) var/obj/item/bodypart/target_limb = surgery.operated_bodypart target_limb.drop_limb() - + target.cauterise_wounds() return 1 diff --git a/code/modules/surgery/bodyparts/dismemberment.dm b/code/modules/surgery/bodyparts/dismemberment.dm index 24a5a9bb6b150..630aa534ff260 100644 --- a/code/modules/surgery/bodyparts/dismemberment.dm +++ b/code/modules/surgery/bodyparts/dismemberment.dm @@ -27,9 +27,7 @@ drop_limb() C.update_equipment_speed_mods() // Update in case speed affecting item unequipped by dismemberment - var/turf/location = C.loc - if(istype(location)) - C.add_splatter_floor(location) + C.add_bleeding(BLEED_CRITICAL) if(QDELETED(src)) //Could have dropped into lava/explosion/chasm/whatever return TRUE @@ -61,7 +59,7 @@ return FALSE . = list() var/turf/T = get_turf(C) - C.add_splatter_floor(T) + C.add_bleeding(BLEED_CRITICAL) playsound(get_turf(C), 'sound/misc/splort.ogg', 80, 1) for(var/X in C.internal_organs) var/obj/item/organ/O = X diff --git a/code/modules/surgery/cauterize.dm b/code/modules/surgery/cauterize.dm new file mode 100644 index 0000000000000..b5ff8d7d3a854 --- /dev/null +++ b/code/modules/surgery/cauterize.dm @@ -0,0 +1,15 @@ +/datum/surgery/cauterize + steps = list(/datum/surgery_step/incise, + /datum/surgery_step/retract_skin, + /datum/surgery_step/close) + + target_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/monkey) + possible_locs = list(BODY_ZONE_R_ARM,BODY_ZONE_L_ARM,BODY_ZONE_R_LEG,BODY_ZONE_L_LEG,BODY_ZONE_CHEST,BODY_ZONE_HEAD) + requires_bodypart_type = FALSE + replaced_by = /datum/surgery + ignore_clothes = TRUE + +/datum/surgery/cauterize/can_start(mob/user, mob/living/carbon/target, target_zone) + if (..()) + return TRUE + return target.is_bleeding() diff --git a/code/modules/surgery/coronary_bypass.dm b/code/modules/surgery/coronary_bypass.dm index 2e49b36ade5c5..67b55e9399594 100644 --- a/code/modules/surgery/coronary_bypass.dm +++ b/code/modules/surgery/coronary_bypass.dm @@ -30,11 +30,11 @@ /datum/surgery_step/incise_heart/success(mob/user, mob/living/carbon/target, obj/item/tool, datum/surgery/surgery) if(ishuman(target)) var/mob/living/carbon/human/H = target - if (!(NOBLOOD in H.dna.species.species_traits)) + if (!((NOBLOOD in H.dna.species.species_traits) || HAS_TRAIT(H, TRAIT_NO_BLOOD))) display_results(user, target, "Blood pools around the incision in [H]'s heart.", "Blood pools around the incision in [H]'s heart.", "") - H.bleed_rate += 10 + H.add_bleeding(BLEED_DEEP_WOUND) H.adjustBruteLoss(10) return TRUE @@ -44,7 +44,7 @@ display_results(user, target, "You screw up, cutting too deeply into the heart!", "[user] screws up, causing blood to spurt out of [H]'s chest!", "[user] screws up, causing blood to spurt out of [H]'s chest!") - H.bleed_rate += 20 + H.add_bleeding(BLEED_CRITICAL) H.adjustOrganLoss(ORGAN_SLOT_HEART, 10) H.adjustBruteLoss(10) @@ -76,5 +76,5 @@ "[user] screws up, causing blood to spurt out of [H]'s chest profusely!", "[user] screws up, causing blood to spurt out of [H]'s chest profusely!") H.adjustOrganLoss(ORGAN_SLOT_HEART, 20) - H.bleed_rate += 30 + H.add_bleeding(BLEED_CRITICAL) return FALSE diff --git a/code/modules/surgery/dental_implant.dm b/code/modules/surgery/dental_implant.dm index 7d6dfe54e1165..0b448fa3906cc 100644 --- a/code/modules/surgery/dental_implant.dm +++ b/code/modules/surgery/dental_implant.dm @@ -18,6 +18,7 @@ if(!istype(tool)) return 0 + target.cauterise_wounds() user.transferItemToLoc(tool, target, TRUE) var/datum/action/item_action/hands_free/activate_pill/P = new(tool) diff --git a/code/modules/surgery/mechanic_steps.dm b/code/modules/surgery/mechanic_steps.dm index 4d180a7014100..230353d9f3ca5 100644 --- a/code/modules/surgery/mechanic_steps.dm +++ b/code/modules/surgery/mechanic_steps.dm @@ -48,6 +48,10 @@ return TRUE +/datum/surgery_step/mechanic_close/success(mob/user, mob/living/carbon/target, obj/item/tool, datum/surgery/surgery, default_display_results) + target.cauterise_wounds() + return ..() + //prepare electronics /datum/surgery_step/prepare_electronics name = "prepare electronics" diff --git a/code/modules/surgery/organic_steps.dm b/code/modules/surgery/organic_steps.dm index 9243218101665..900f9b7d19605 100644 --- a/code/modules/surgery/organic_steps.dm +++ b/code/modules/surgery/organic_steps.dm @@ -22,11 +22,11 @@ /datum/surgery_step/incise/success(mob/user, mob/living/carbon/target, obj/item/tool, datum/surgery/surgery) if ishuman(target) var/mob/living/carbon/human/H = target - if (!(NOBLOOD in H.dna.species.species_traits)) + if (!((NOBLOOD in H.dna.species.species_traits) || HAS_TRAIT(H, TRAIT_NO_BLOOD))) display_results(user, target, "Blood pools around the incision in [H]'s [parse_zone(surgery.location)].", "Blood pools around the incision in [H]'s [parse_zone(surgery.location)].", "") - H.bleed_rate += 3 + H.add_bleeding(BLEED_CUT) return TRUE /datum/surgery_step/incise/nobleed //silly friendly! @@ -95,6 +95,7 @@ /datum/surgery_step/close/success(mob/user, mob/living/carbon/target, obj/item/tool, datum/surgery/surgery) if(locate(/datum/surgery_step/saw) in surgery.steps) target.heal_bodypart_damage(45,0) + target.cauterise_wounds() return ..() diff --git a/code/modules/surgery/organs/vocal_cords.dm b/code/modules/surgery/organs/vocal_cords.dm index 516c027a3476a..53aa18210b69f 100644 --- a/code/modules/surgery/organs/vocal_cords.dm +++ b/code/modules/surgery/organs/vocal_cords.dm @@ -321,7 +321,7 @@ else if((findtext(message, bleed_words))) cooldown = COOLDOWN_DAMAGE for(var/mob/living/carbon/human/H in listeners) - H.bleed_rate += (5 * power_multiplier) + H.add_bleeding(BLEED_SURFACE) //FIRE else if((findtext(message, burn_words))) diff --git a/code/modules/surgery/prosthetic_replacement.dm b/code/modules/surgery/prosthetic_replacement.dm index f74a63eaeec9e..b6ba55fb11304 100644 --- a/code/modules/surgery/prosthetic_replacement.dm +++ b/code/modules/surgery/prosthetic_replacement.dm @@ -77,6 +77,7 @@ display_results(user, target, "You succeed in replacing [target]'s [parse_zone(surgery.location)].", "[user] successfully replaces [target]'s [parse_zone(surgery.location)] with [tool]!", "[user] successfully replaces [target]'s [parse_zone(surgery.location)]!") + target.cauterise_wounds() return 1 else var/obj/item/bodypart/L = target.newBodyPart(surgery.location, FALSE, FALSE) @@ -90,16 +91,20 @@ if(istype(tool, /obj/item/chainsaw/energy/doom)) var/obj/item/mounted_chainsaw/super/new_arm = new(target) surgery.location == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) + target.cauterise_wounds() return 1 else if(istype(tool, /obj/item/chainsaw/energy)) var/obj/item/mounted_chainsaw/energy/new_arm = new(target) surgery.location == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) + target.cauterise_wounds() return 1 else if(istype(tool, /obj/item/chainsaw)) var/obj/item/mounted_chainsaw/normal/new_arm = new(target) surgery.location == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) + target.cauterise_wounds() return 1 else if(istype(tool, /obj/item/melee/synthetic_arm_blade)) var/obj/item/melee/arm_blade/new_arm = new(target,TRUE,TRUE) surgery.location == BODY_ZONE_R_ARM ? target.put_in_r_hand(new_arm) : target.put_in_l_hand(new_arm) + target.cauterise_wounds() return 1 diff --git a/code/modules/surgery/remove_embedded_object.dm b/code/modules/surgery/remove_embedded_object.dm index 858946b3e9d92..34ce7cd96dfa0 100644 --- a/code/modules/surgery/remove_embedded_object.dm +++ b/code/modules/surgery/remove_embedded_object.dm @@ -27,6 +27,7 @@ if(L) if(ishuman(target)) var/mob/living/carbon/human/H = target + H.cauterise_wounds() var/objects = 0 for(var/obj/item/I in L.embedded_objects) objects++ diff --git a/code/modules/surgery/tools.dm b/code/modules/surgery/tools.dm index 3f0095d2d3970..aa65fb0d06b71 100644 --- a/code/modules/surgery/tools.dm +++ b/code/modules/surgery/tools.dm @@ -150,6 +150,7 @@ attack_verb = list("attacked", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP_ACCURATE + bleed_force = BLEED_CUT tool_behaviour = TOOL_SCALPEL toolspeed = 1 @@ -173,6 +174,7 @@ toolspeed = 0.5 hitsound = 'sound/weapons/bladeslice.ogg' sharpness = IS_SHARP_ACCURATE + bleed_force = BLEED_CUT /obj/item/scalpel/suicide_act(mob/living/user) user.visible_message("[user] is slitting [user.p_their()] [pick("wrists", "throat", "stomach")] with [src]! It looks like [user.p_theyre()] trying to commit suicide!") @@ -196,6 +198,7 @@ custom_materials = list(/datum/material/iron=10000, /datum/material/glass=6000) attack_verb = list("attacked", "slashed", "sawed", "cut") sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND tool_behaviour = TOOL_SAW toolspeed = 1 @@ -220,6 +223,7 @@ toolspeed = 0.5 attack_verb = list("attacked", "slashed", "sawed", "cut") sharpness = IS_SHARP + bleed_force = BLEED_DEEP_WOUND /obj/item/hacksaw name = "hacksaw" @@ -342,7 +346,8 @@ light_range = 1 light_color = LIGHT_COLOR_GREEN sharpness = IS_SHARP_ACCURATE - + // It cauterises the wound it causes + bleed_force = 0 /obj/item/scalpel/advanced/attack_self(mob/user) playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) diff --git a/code/modules/vehicles/_vehicle.dm b/code/modules/vehicles/_vehicle.dm index bf3584f74e24d..868028da55a0b 100644 --- a/code/modules/vehicles/_vehicle.dm +++ b/code/modules/vehicles/_vehicle.dm @@ -4,7 +4,7 @@ icon = 'icons/obj/vehicles.dmi' icon_state = "error" max_integrity = 300 - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0) density = TRUE anchored = FALSE COOLDOWN_DECLARE(cooldown_vehicle_move) diff --git a/code/modules/vehicles/atv.dm b/code/modules/vehicles/atv.dm index 7f756ba6cc3f8..e6baa174d8dfa 100644 --- a/code/modules/vehicles/atv.dm +++ b/code/modules/vehicles/atv.dm @@ -4,7 +4,7 @@ desc = "An all-terrain vehicle built for traversing rough terrain with ease. One of the few old-Earth technologies that are still relevant on most planet-bound outposts." icon_state = "atv" max_integrity = 150 - armor = list(MELEE = 50, BULLET = 25, LASER = 20, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 25, LASER = 20, ENERGY = 0, BOMB = 50, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0) key_type = /obj/item/key integrity_failure = 0.5 var/static/mutable_appearance/atvcover diff --git a/code/modules/vehicles/cars/clowncar.dm b/code/modules/vehicles/cars/clowncar.dm index 2f48b6e31bc8a..464ea93ad551e 100644 --- a/code/modules/vehicles/cars/clowncar.dm +++ b/code/modules/vehicles/cars/clowncar.dm @@ -3,7 +3,7 @@ desc = "How someone could even fit in there is beyond me." icon_state = "clowncar" max_integrity = 150 - armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0) + armor = list(MELEE = 70, BULLET = 40, LASER = 40, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 80, ACID = 80, STAMINA = 0, BLEED = 0) enter_delay = 20 max_occupants = 50 movedelay = 0.6 diff --git a/code/modules/vehicles/mecha/combat/combat.dm b/code/modules/vehicles/mecha/combat/combat.dm index 6a6636b4b45a6..af78cadb9b7df 100644 --- a/code/modules/vehicles/mecha/combat/combat.dm +++ b/code/modules/vehicles/mecha/combat/combat.dm @@ -2,7 +2,7 @@ force = 30 internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_MECH_SECURITY) internal_damage_threshold = 50 - armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 15, ENERGY = 20, BOMB = 20, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) mouse_pointer = 'icons/mecha/mecha_mouse.dmi' destruction_sleep_duration = 40 exit_delay = 40 diff --git a/code/modules/vehicles/mecha/combat/durand.dm b/code/modules/vehicles/mecha/combat/durand.dm index fa04c84a77df6..090fa2553f4ee 100644 --- a/code/modules/vehicles/mecha/combat/durand.dm +++ b/code/modules/vehicles/mecha/combat/durand.dm @@ -7,7 +7,7 @@ dir_in = 1 //Facing North. max_integrity = 400 deflect_chance = 20 - armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 35, LASER = 15, ENERGY = 10, BOMB = 20, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 30000 force = 40 wreckage = /obj/structure/mecha_wreckage/durand diff --git a/code/modules/vehicles/mecha/combat/gygax.dm b/code/modules/vehicles/mecha/combat/gygax.dm index 1ab526e29d6c7..9adf74ddd5470 100644 --- a/code/modules/vehicles/mecha/combat/gygax.dm +++ b/code/modules/vehicles/mecha/combat/gygax.dm @@ -7,7 +7,7 @@ dir_in = 1 //Facing North. max_integrity = 250 deflect_chance = 5 - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 25000 leg_overload_coeff = 80 force = 25 @@ -23,7 +23,7 @@ base_icon_state = "darkgygax" max_integrity = 300 deflect_chance = 15 - armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 40, LASER = 50, ENERGY = 35, BOMB = 20, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 35000 leg_overload_coeff = 70 operation_req_access = list(ACCESS_SYNDICATE) diff --git a/code/modules/vehicles/mecha/combat/honker.dm b/code/modules/vehicles/mecha/combat/honker.dm index 7666b68d688b9..d9a8d0fe40fc5 100644 --- a/code/modules/vehicles/mecha/combat/honker.dm +++ b/code/modules/vehicles/mecha/combat/honker.dm @@ -7,7 +7,7 @@ max_integrity = 140 deflect_chance = 60 internal_damage_threshold = 60 - armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = -20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 25000 operation_req_access = list(ACCESS_THEATRE) internals_req_access = list(ACCESS_MECH_SCIENCE, ACCESS_THEATRE) diff --git a/code/modules/vehicles/mecha/combat/marauder.dm b/code/modules/vehicles/mecha/combat/marauder.dm index 42d5cf7bb92ee..7a22dfdb54c44 100644 --- a/code/modules/vehicles/mecha/combat/marauder.dm +++ b/code/modules/vehicles/mecha/combat/marauder.dm @@ -6,7 +6,7 @@ movedelay = 5 max_integrity = 500 deflect_chance = 25 - armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 60, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 50, BULLET = 55, LASER = 40, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 60, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 60000 resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF operation_req_access = list(ACCESS_CENT_SPECOPS) diff --git a/code/modules/vehicles/mecha/combat/phazon.dm b/code/modules/vehicles/mecha/combat/phazon.dm index d7d3f805ef7f0..af921d340fa0e 100644 --- a/code/modules/vehicles/mecha/combat/phazon.dm +++ b/code/modules/vehicles/mecha/combat/phazon.dm @@ -8,7 +8,7 @@ step_energy_drain = 3 max_integrity = 200 deflect_chance = 30 - armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 30, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 30, BIO = 0, RAD = 50, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 25000 wreckage = /obj/structure/mecha_wreckage/phazon internal_damage_threshold = 25 diff --git a/code/modules/vehicles/mecha/combat/reticence.dm b/code/modules/vehicles/mecha/combat/reticence.dm index c177124e7943d..420133de3861a 100644 --- a/code/modules/vehicles/mecha/combat/reticence.dm +++ b/code/modules/vehicles/mecha/combat/reticence.dm @@ -7,7 +7,7 @@ dir_in = 1 //Facing North. max_integrity = 100 deflect_chance = 3 - armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 25, BULLET = 20, LASER = 30, ENERGY = 15, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_temperature = 15000 wreckage = /obj/structure/mecha_wreckage/reticence operation_req_access = list(ACCESS_THEATRE) diff --git a/code/modules/vehicles/mecha/working/ripley.dm b/code/modules/vehicles/mecha/working/ripley.dm index ebfbd769cff01..048577cd73994 100644 --- a/code/modules/vehicles/mecha/working/ripley.dm +++ b/code/modules/vehicles/mecha/working/ripley.dm @@ -13,7 +13,7 @@ max_integrity = 200 lights_power = 7 deflect_chance = 15 - armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 20, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_equip = 6 wreckage = /obj/structure/mecha_wreckage/ripley internals_req_access = list(ACCESS_MECH_ENGINE, ACCESS_MECH_SCIENCE, ACCESS_MECH_MINING) @@ -66,7 +66,7 @@ fast_pressure_step_in = 1.75 //step_in while in low pressure conditions slow_pressure_step_in = 3 //step_in while in normal pressure conditions movedelay = 4 - armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 20, LASER = 10, ENERGY = 20, BOMB = 40, BIO = 0, RAD = 0, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) wreckage = /obj/structure/mecha_wreckage/ripley/mk2 enclosed = TRUE enter_delay = 40 @@ -93,7 +93,7 @@ resistance_flags = LAVA_PROOF | FIRE_PROOF | ACID_PROOF rad_flags = RAD_PROTECT_CONTENTS lights_power = 7 - armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 0) + armor = list(MELEE = 40, BULLET = 30, LASER = 30, ENERGY = 30, BOMB = 60, BIO = 0, RAD = 70, FIRE = 100, ACID = 100, STAMINA = 0, BLEED = 0) max_equip = 5 // More armor, less tools wreckage = /obj/structure/mecha_wreckage/ripley/firefighter enclosed = TRUE diff --git a/code/modules/vehicles/secway.dm b/code/modules/vehicles/secway.dm index ba22f4666d8b9..4d2a4f5178421 100644 --- a/code/modules/vehicles/secway.dm +++ b/code/modules/vehicles/secway.dm @@ -4,7 +4,7 @@ desc = "A brave security cyborg gave its life to help you look like a complete tool." icon_state = "secway" max_integrity = 100 - armor = list(MELEE = 20, BULLET = 15, LASER = 10, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 15, LASER = 10, ENERGY = 0, BOMB = 30, BIO = 0, RAD = 0, FIRE = 60, ACID = 60, STAMINA = 0, BLEED = 0) key_type = /obj/item/key/security integrity_failure = 0.5 diff --git a/code/modules/vehicles/wheelchair.dm b/code/modules/vehicles/wheelchair.dm index 76c70302ec73f..5ff32254a062a 100644 --- a/code/modules/vehicles/wheelchair.dm +++ b/code/modules/vehicles/wheelchair.dm @@ -5,7 +5,7 @@ icon_state = "wheelchair" layer = OBJ_LAYER max_integrity = 100 - armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30, STAMINA = 0) //Wheelchairs aren't super tough yo + armor = list(MELEE = 10, BULLET = 10, LASER = 10, ENERGY = 0, BOMB = 10, BIO = 0, RAD = 0, FIRE = 20, ACID = 30, STAMINA = 0, BLEED = 0) //Wheelchairs aren't super tough yo legs_required = 0 //You'll probably be using this if you don't have legs canmove = TRUE density = FALSE //Thought I couldn't fix this one easily, phew diff --git a/code/modules/vending/_vending.dm b/code/modules/vending/_vending.dm index df4b672a68252..ceaae3686798e 100644 --- a/code/modules/vending/_vending.dm +++ b/code/modules/vending/_vending.dm @@ -59,7 +59,7 @@ verb_exclaim = "beeps" max_integrity = 300 integrity_failure = 0.33 - armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0) + armor = list(MELEE = 20, BULLET = 0, LASER = 0, ENERGY = 0, BOMB = 0, BIO = 0, RAD = 0, FIRE = 50, ACID = 70, STAMINA = 0, BLEED = 0) circuit = /obj/item/circuitboard/machine/vendor clicksound = 'sound/machines/pda_button1.ogg' dept_req_for_free = ACCOUNT_SRV_BITFLAG diff --git a/code/modules/vending/liberation.dm b/code/modules/vending/liberation.dm index 3023e2f45ab52..f217a7ead39c1 100644 --- a/code/modules/vending/liberation.dm +++ b/code/modules/vending/liberation.dm @@ -26,7 +26,7 @@ contraband = list(/obj/item/clothing/under/misc/patriotsuit = 3, /obj/item/bedsheet/patriot = 5, /obj/item/food/burger/superbite = 3) //U S A - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF default_price = 300 extra_price = 500 diff --git a/code/modules/vending/liberation_toy.dm b/code/modules/vending/liberation_toy.dm index 86117c87a1c0a..09ffd5acef36b 100644 --- a/code/modules/vending/liberation_toy.dm +++ b/code/modules/vending/liberation_toy.dm @@ -22,7 +22,7 @@ /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5, /obj/item/toy/cards/deck/syndicate = 10) //Gambling and it hurts, making it a +18 item - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft default_price = 75 diff --git a/code/modules/vending/magivend.dm b/code/modules/vending/magivend.dm index 6c0f75da728d2..a01f7615886a6 100644 --- a/code/modules/vending/magivend.dm +++ b/code/modules/vending/magivend.dm @@ -14,7 +14,7 @@ /obj/item/clothing/shoes/sandal/magic = 1, /obj/item/staff = 2) contraband = list(/obj/item/reagent_containers/glass/bottle/wizarditis = 1) //No one can get to the machine to hack it anyways; for the lulz - Microwave - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF default_price = 25 extra_price = 50 diff --git a/code/modules/vending/medical.dm b/code/modules/vending/medical.dm index f0f745c5ff94f..09a84878e17c5 100644 --- a/code/modules/vending/medical.dm +++ b/code/modules/vending/medical.dm @@ -31,7 +31,7 @@ /obj/item/pinpointer/crew = 2, /obj/item/healthanalyzer = 2, /obj/item/wrench/medical = 1) - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/medical default_price = 25 diff --git a/code/modules/vending/medical_wall.dm b/code/modules/vending/medical_wall.dm index ef4518a8eca4b..cc87d55106ac1 100644 --- a/code/modules/vending/medical_wall.dm +++ b/code/modules/vending/medical_wall.dm @@ -13,7 +13,7 @@ /obj/item/reagent_containers/medspray/sterilizine = 3) contraband = list(/obj/item/reagent_containers/glass/bottle/toxin = 1, /obj/item/reagent_containers/glass/bottle/morphine = 1) - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/wallmed default_price = 25 diff --git a/code/modules/vending/toys.dm b/code/modules/vending/toys.dm index 050e2f22cc8b9..e43d014bf1ea4 100644 --- a/code/modules/vending/toys.dm +++ b/code/modules/vending/toys.dm @@ -24,7 +24,7 @@ /obj/item/toy/katana = 10, /obj/item/dualsaber/toy = 5) - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 50, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF refill_canister = /obj/item/vending_refill/donksoft default_price = 75 diff --git a/code/modules/vending/youtool.dm b/code/modules/vending/youtool.dm index bf62164dd3a5c..93df6958ea3fc 100644 --- a/code/modules/vending/youtool.dm +++ b/code/modules/vending/youtool.dm @@ -23,7 +23,7 @@ /obj/item/clothing/head/utility/welding = 2, /obj/item/clothing/gloves/color/yellow = 1) refill_canister = /obj/item/vending_refill/tool - armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0) + armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 0, BIO = 0, RAD = 0, FIRE = 100, ACID = 70, STAMINA = 0, BLEED = 0) resistance_flags = FIRE_PROOF default_price = 10 extra_price = 80 diff --git a/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm b/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm index cfc0474e6deec..4c556a919ea81 100644 --- a/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm +++ b/code/modules/xenoarchaeology/traits/xenoartifact_minors.dm @@ -81,6 +81,7 @@ /datum/xenoartifact_trait/minor/sharp/on_init(obj/item/xenoartifact/X) X.sharpness = IS_SHARP_ACCURATE + X.bleed_force = BLEED_CUT X.force = X.charge_req*0.12 X.attack_verb = list("cleaved", "slashed", "stabbed", "sliced", "tore", "ripped", "diced", "cut") X.attack_weight = 2 diff --git a/icons/effects/effects.dmi b/icons/effects/effects.dmi index 34a22bf26e4c2ec35ce16fe344856c400972b19e..c6772756c8720cb19cd41d6e48bccc4181e44a37 100644 GIT binary patch delta 26366 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 SiGd9I-PXIO`$^kA;{O0WwJMMR delta 24270 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 D@!QMC diff --git a/icons/mob/screen_alert.dmi b/icons/mob/screen_alert.dmi index 4c71ed24455b1c15ab693b26a56d65e38f39d337..904168687e79eca0d16748dc4e6a032b8deb06e6 100644 GIT binary patch delta 16811 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 OkBo$(c!k&(|NjTtZ}j5; diff --git a/icons/obj/items_and_weapons.dmi b/icons/obj/items_and_weapons.dmi index 8610b3cf001c4ca87a73e45fabd6c493725859c8..eb591381cd35a3975b2d9b93cdc713bd5f4655ea 100644 GIT binary patch delta 12068 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 delta 11510 zcmYj$c|26#8$T&a2$7wMkjlQVGi9xi6luZONthHV##~vFJv)gZAqmMAVaUEt)=AP> z$Cj8G%Uq3_-}L!>zQ5mZ{y49>=iYPfInR0C&+~piw|R#(mB{+y6u^2AVtX^t#N(mc zgS+$2XxZU?)T8G!r0zP-SGR`7%Ng+me&{plbt|f~3Nb1R0-owI78binf zjoyn9?(H*!pKL$6Ppo%O4y?1{e^Pgr&{cSUDE&{+f&BY4Gdwk*1~XG>AE|)krvKQS zEWh3RZkG%jeyBXVE(XjjU%r3mBCh#X)zP~W)Q|?JjLZgUBwM?YJoFh_JNWbk-1byZ zEPJ}xh9b75T4CX*cfF(1gP6Ea7xtTn1(Xl-TcbEoW&V>*4^jpnP!X0KC(52oAH8=O zsf2kUdgRz>+?SV!j)WANu$?clQc9OzSdDAHz34VCpGH^@ZE?Q=uo;L@LTlFAgwA#4 zbx15l$v(c=_9)y>*M`U?=QC`X%eTWSU#Y2n`vXUExuFY3$dgBxa`&5n2-XKBD(|&-+uU#HZRuoIiX{@nvy3%9ujUGC$A!kcC5*v19DD5>NB| z|9tE`b^CPFv1^WA;6>n@r!~8GPPlUBBL1Q4ZC+h(b)7QQnMcUySDZ0Z67X=F?!YZ_ z$0ZLB+jbu}j)APi0;$GYjRN)Nhabd^GKb9JoJQ<9_c`DR5odpyr=K1?d9n2yJEWN} zTCn8pVGfZ;;q_KUN-{2Jrgt2N*_<;5*=-MnfABishX(c(?{eJ)%=1siVLuov8rp5L z=ex5?fBI-NJE`raC`B3SHNTtQwzvC%$1v#b?d|j40e5mnUT+vkj-(&%Nqy20lE<&` zOMLi25trnO0xtUQ)P+m~_TjC2H_H}SETTJmQyLona5q``kRzy7TmER=3vU zOqdbT+3t`r!MeoDkxhn$8>9SQb5=Z}#=;t(;#`Ci8zRT6rv<=+Mu67t(Js8#vzJ zG;_}M%=?GgruW!~0VdXur0Z)ww>VJgsKs}zN#^XA3~i+q_pTa#==)V=@yhghG8^?8F5mb{LfZh_tV0(&xk`4*4=F=F@e0 zLDlS(($uJ?Q#C(yClBTHWwcp*D9GMPdeNxfuIO&|L+sf32r?Zon%7^uckkpMJE^g` zC_zD|P~-9g&eeh~zKo?PAL3~qKS;CSQ*7zgLjEQtK0!6sLUu#`l?rlH4cSv>bWn}$ ztc{o*yHSkVp#^jA!ay$xaUK8kNYx``gX+>Mu|63O%kpgIQ!tpytvWbS$qz-`1m5`7CLQeDrMV z*=P;nafA2eXP(M^(1?Wu$v1}c-HRx+quR(n7l|tAIV}5(sq$m1>Ir6+lGSL@pUsRiH#{Wb`NN24 zE!d|kySc4bWo!dK!w+BEsOq>Q{8+>A6IZ^SxUgL}zeJKSpv@|7A~~w)o_){X+@K%( z)$)>&ZC-W1P0H0wZ+p>ruQww2-6)dFGb1&2Yhk{Typ*I5etDWX0gW;`I_^?b@2=Om z$Etr_Tar%F`KX7HP@=y9^Y^18@{!6Fe+b` zbAYzFvM%>Z>P=L{e)t%l#p5`2hxq3ElhaRJcN`ZD!Y>?o;=ZWak$cjG z>4LCR%O3E#HGf*uZf0U8Xfv-EL)Q&zDrqVKf)IB2{XKhpi#>_&+Yj_SP;_eK4A^*j ziz23pmrozDtZZL|lZ0QW+RofSC0Ks7K1WZ{4qFoX{@yCPU_RN8n)qcQ`Qijnx{%7_ z7A!r{Sm|}^9l!X4^DduKjhnIU3&6O#nb`{%(-ln4S$gX7qu48XAGbUlD-4@2{V;e^ zqC-qUm&+H@srDhPzL5sQKoKI8>VM|ZgQ_2h@Mgi?lHuaGi2i+1mD|rV>rQtm)0=O< zI-OklAbHW6dp3R?>{;ZwOA}1S+iia%JH4Yxr9*bAC~ht5*w4Gr^D*a5W|wf}U-&m> zZcM;lb(-tfMFGhEVrEtSLW4g2HV6P_4yAgdv9`+}TSCC--~$^Vb82N=S7$nVe+)P< z{zT&~8`7aqf2Y7`R%)7VC%0Qy0^Hv$hJJqiaQSzl-!cR?Hc@9@WHh_KjuuVg)g5R# zcO_1u)VhRHM$?(Ek9P;H{dq%8YwxD$$AMiY$IE#t?BqJ5K^G`_fv}vw6eDt}zb;y& zIwz!nGsUQ%^BACSmL_)-Le7%&Ip6>63_q9TkmoZ2{xDx>{^o1^uQ7E+J!i@K-d~-o zYgQ8zMkJlX0kB3{c12UE63Q}B-gBd5uoUXJ<~GmiF>_t+jc)>P@=O`l6#VJy(Hm(QczNh3Yg$4N-Xqp_pLtNw6u-r;1A%%98;f=(W&C{3 z)=~En{_1kG*wZmz!7ivFv0*5nBap-xEr&_4@<571MJ)Pj_7P5UyZmt;_C%eK7&sRK5wHV3A;n-B@Gm zZ7k6Z9D?s%M|cu^{QL_8Z{8S z%UFDH`VEvaJ+*1?3*{||C*zk-GN61dNW7n?jNW;~RaC@Rlk=N!6*WYKAGyH?O{h9c z-x5b61e+YF!=qpGPy^-ky4&ET(?#c%o=h>)XH|7R&x^$T5Yz8nn}BSOwklI%!Yn?C=%yN#sdk~In8WbgweE%Y_19}Inm&cefMK#V z7ur@NGkTD=GKMs51KQ^Go>^tDn_v*s^7&cVYrM*SZY{2W#6~nUU2>zkb4i)Yy>|px zg-tq1%Y8U3z={tYtV*s=A#m~`X|Vk0WHRKw)AtD&YULI1_0dV_n$+};P%)Jm=g~w9 zf|~4D<7l$XOSpA7hSou0o*vuTTxOfNP`{70K{={mg0(ecZ#@WG>x>;9ROXOdTok z{n-HIHl6$Xl`~@vcDA8Z;Q>f*)x;Wl?ZPrT767SU-D+WOX~vi35-ht;7dD;BOY^Xjia zowVls%Jk23{tYUxRubW|CfJ|zmwY8}1w2uA!ryGH)V)D-PM*HB&H25mUa5=z0Mi)v z2m25MQHCtRCEE7PPOUsCn-w|eagHRre3#L!SIVk6N#UkhG^D1?IxBp z3xq!QAi;lUdv6$=Jg!6Dzw2|*w@2XK!QiQ`xx~nMHJBcH(%RAyCSZ^);R?9rC1hQK zuARICmL)On$%N^-Y~^0(X&4J)N+GHa(f8oB$}p2`W^pxZTyGdd4?EabZ^xCA zoq)i++ps^Vwat(DMqJ?Ynf;z8rT3Ud6Jcv*FV-Qf*^_?R`0c>fYtN}E;CV!-SaQn& z6`cgWqU?WPzWfZc`!f_sM$|vB zIV1WD&DAkU!MuNX-Q8!$Z)#9^(obwQ!Hqnq;$Q1dDfoogpQ6-W>0$2j3+Z^1%ja0% zUzK}7Xs3!CH1!V19udJI)!gnBmQ?YMfVlOxsMX=_;9K+nc7VX5?qdb1cXZzW{#g=X zCwKTG-@&;cXb#p+8@BeIy5|79_Uc=+5%J#d{RFjkEimK&a<{@J1#ySk%&ijN=^O)kLrP?~<-Hby&qz_zXNvRE+0#@fNWOH_?y7YEZl%2( zg?33f%LE*-1Xyk=2r{M#vfP-O(aM~o?UY4%=5{!$!n$Bh2iezYea5AiE2$}-5pLCg zpA7namq1#Il}$T+n(f$GA?`b>dGmY({rOYJ!>|q0*i`R$ykDoCYsF$RSTEMPvA-<9 z{&)K7n`cjt5gu0!V$=IMw0;oJbCu}62^v7kBd3~GwSmB z2ASiR6pFhsThyPI6zUr#o?=QpS2TL4x)K>!*6hC%D|CE0EVM5pq-EOu@B`;3H)w*j z)sAyDeb!~Yv0@bII2XsWa4yTdThjk76JWJ@nclfn0zOsBiiF`soP^bL_hr5-{mJW9;A10= zJpU76`f&F=dPd6iR6Q}^V_(l6+-sUpv~ak3(_$Lv@L=U;x0aZv0Kxuc)kJ3xo+bAszP3FE%urUB!8o0x zb2U1)@!pxmrYP6Ql;2puk|<=oqZn@%%S4#Jo;UKYAYb*?nF&B%b7R`Qwjg8yo!{jy z^|KLs6fFt_jiqVl2ZD;kG9s{AQ{GiK#ujJFdHvyCoUNm41y$n_UN&tnwu-*RU5-@4 z@GCW6vvs`X(n6i(OyQj{jEUEGKNwTcs;4x8T?tT}lEb|WYl6^zdsbDo6KaN90>&&_ zO}c`O2j^yhUFA4AtCw#aln1L4%Mzu4m+fGI+;!Gk0Sa#d!H&N>UM#Cs$;9r2rOg9R z^zR$r+)+WT<7*rXW>e0kLsiLe7h{2WNuJC1oP!2YsBM0*wscwXKo zl*Wrn^M4tF4ULp+)pS|spwrdF0Da^Sq<7eN@&ZtS!$^YdlxWD_V3i`&^F?8h&=L;B z`4Dh|5JJr4bpmc^kB4>q2!z02r83(D)^{!MR@F{p@vdJbxgA3YA@8d` z){=HsqR3<+O(glA2DT@E(dvuYuH~FY`qP^iu{VfS zL(^StC4^4yiHWr^F#=8&eVDB83Q%~7Y26j8e%6+G?i18!L>E*FtIP8|EzB*73I?Ou zX`PEzKxSi2RUgI(^(PneJD7jsSoC4H+6q{>MIPO~_~+$Wpo%0{irkr^QDGLy`+bK$ z&l-2$c#@R~x;Mv|t=PM5Q}xx_JA>{RcfrdnJxf}0q`%O?;iGDBfysc^&lCYCn8&(A^h4g^R0;q%^b0l)T zK)>>Lrm>;r_ENDf^%{iy?!wXI{)d90;Kv}SDf~YFW9Ki)rejHL?@6l!V?N<&beE2EGG^ew~@S%y8WsV(23HmJFa@ziHq6{aZ8IU&DrDbcvts9dHu zfOga;PzugzQ}g;M^vKNN2+DM(QsM#YdF1V$L?-R0C!vzpbA{2i$qMtHD&z^oJMTB> zs4Kt9b$Uj{V_|<5QizF<~zH5C)ZMZo0q*0?#g?T01jCI_7 z8z&1H?E#BzIRhVm%-iMdY`BXurc4eZ*zqqx#dOGkiSP@W{Bbb+vBJCMH+c+}@Tv_J zz#KLTG5!g<`#3Ha5i2%a*ehd6L@IKeqdQ)+&=V0TF|M1?OD+ONlaj@|kbqCIlVV7qRZ+}zjn537aI*m2f96RGHrbPo_@r&L8I`q@vbh8 zf+BM+R7e9!gH^-9E~qf%IzYhnH29-BDBHjVv`9R&nNqf7bm6Nu+oI`5ZV97zFuZg2 zVOLRJ??(LeB{h=NxwrU;g=XleZox#QH`r?)M$bPLydP?Hk*l^!w#;c_o~?!^#+HlC zG1$|~YIx<`m$;?tUZ0$nR9@w@bhxBi5$$Yk1~%U~IQREWT$iyF22PsnT%{R)zB7hb zeaES`v|ZE|)wX9|7$B}gr)>-K8`-MLV?^b|ZE*a#d$CR=9m@$=15i9oYgEI?#I;Iq zgqx(OjE&f5Aq_V!=v)ciA~PU&c&no1-^P8xOC597<_zy1KqR38;^s`o59&t~9F>vicKQvRgU;LZpHazj-; z@bd)iD8wK&gc{@yHKueAB3h{q1fjD!hb$8}mkdKad`r!4Y`${-NZccz>4_ILN=t-^ z!UtjW3Rs=tjbgJ&w2;?pqB&?9`9eFqexs9U9%Y#W2M)%b_-AGL^dg@T`<~}$0eBQN zhq*sqj>Ug{zf^oob#LEHT*V#Qu?EL-+It!hh7pb5Ax$*PTsVUfRULe$%*Ur?WMq7) z11lue&imr4wf&%efjSR|VmQ|BOkK}`B0!D_HTqjM_JQnuU%i$=3IvO1Gf|4D#Tu?+kkA8uXZ{Or^ zyuUdjHMrS0h&zQ*fwA5GDa4u7@NRB`k@XEpV%-fVz@aY<$Ny~-za;yh3Y)o9BoQO0 zD#|j7-fKgJd(s~aIczy*{hb@NN@_fKI1mFy6HUjn+yVXlJ7)<(B|VtL!DJ2n=Z8z^ zS}rK^T&@b{3CT_S-zJ(wR>fRhj8)kh2;C{H>(;wwI_GvX7v|eMCIVS1l}d6TI!?mK zIao&icOW@VVEj>k_BNGwf6ojMa4+P0gg80Y1;82?R1wK42X8|22d#hS{T;4 zwGD0#1r@!kc6J$UmhhbuOLxgEM@*0Ukx~R*;xLO}t5^9bJ949v2DBgS)bBb&h(fB- zpmKT*zqsUQn}sptcEL{bIRjwVsHl{@@cU|-GCl}o?0_)M$9P#7%`q1)>d954_(=t$ zL&JYC{s#F|`y%PWcT6d!STb9s)u>4dgbtf-$1{I1rWi zY4KVB25I==o#MC45(^GQK5z!%&0NRxx1N@-%D#8lAZ9dx2vNwc8}*=N36%f zq$7vHA?=L4X&Z_=Dwd}sekr3SuQU?2dmpffbZJ#%P<|!BKJ+?qxslN0f+|c9U|;iP zItUzG?!@7sUOUy-&F5iS9wnbVrjC12yKrGP;|KfpvID`yZ&{$k0#*6;3hmEw(?P&c zup?cm62?y0drX%b*(kMoO&^b)98#7`DG-_T_x^cGQlOt#=8VLg!?LkEG}w0$d>o-`K>W%b4IuZlOXFQ<(G$ky?4=SDikCsoqo2FW^@mgvi4-M?o3MD@9J=yTyNWOqd|)TNE9-xrd+&>Reob=`&?9WxN4(t zxL_nz$KodeG97%9*|=%lq&%Z6(UI)p?^!EuGd7(xGkx6qfhBf#GKF&CNoyv!K|*3p zQ6dk@zf!nbcF3;@mDuMo{%7qm&3=X<(zGb}kA5T}OB}*?B^%p{b5I=4)oH&3T3;m3 ztOFg_JExel;!9$juF8FTbZ{LE&Cu4>r86KRhgTMc+Y^LB%;Tdw9)H)sR8j<{jF&$z z{n^dwKETZ8{$3P(itvbH!yz?~cBb~Fr2&5`l*_n>lA-5XF(sour7T-st@~DW$J80P z%Mt~)-;4Mhv<+10%q2JPruiK7qBG9`>e5Y<8Mc45pd+;0t#|v>BZ4|!IfKREAxJtb zTKF`w-?U@Wr*Y}IVyiQhoP+O<0h^bn#U9Ypq)-if_OW%T2)&(?37bu{9C!%wMo-E) zau;=Uu|bSYSof9^5XJyX@u0nKyI@c5&cHtrCW-d(rh?efJod=0kA;9q#AZyx`ywKa~&wlFuu{W%SORUJHasr2H=qYmNgVoZCJP% z^#wmSo`%70fkzA&D{1s`GGzCFezqQV0jsD=(`Yn^DC0Mz1?D0*g)75}NAN)rhX2() z{Kj?nl%hEZ_N@+zL-yQ**i_@551@~4jFgt&GiT`1fI{E92};f4Bh9Qpj;+$ZERj^Z zDx%k8D(gSe|KkmQ2*Bg(gW`X7a~XD3?z`!;P5pDnOB%-ZuQPArPvW&(@+RTs@`yc} zd2)kX)<`8YKQIwRbiJ~0Bc$Aup{Q%DRKlpW;5PA|EPlmdQX&eig@K}47PYepp*;nR zvN0y)%O{&xtpA#1pv*Oy>Cez+q6J(it^D0M7ldqnjNfWHc+LiS{f9#$+J!+C)`wkC z&lrSTS*2?)Ny?AGSr>K=aAC$r}~S)DPIxemWA(kwB>ZR&qn!(6U`Eerg(}77p1389*0W zA8RcoLz~a%j61ErO9S(!Lpn~?y6P;N{vdee-25`wwC!BnDLBYg8^H@W;{>q z7;kUZr*w42*_DqG?0?hi=6MWccvz<}Xz2-XB$K zb4h^*K91l$$ek+vZ1;CMMbdgWn(u$w%S{zyli+U)s5?A=E!^_f^8>G`YLm^-eW?eI zsDIEjZ~K!~XOMbrk>?4z!6Rwcx$Eyrau~t4AOLlMyvHD+DD7 zW9pdiGHh$r4KR`g-Tv3pXE}IYhP!vsPYmFaPAQ`t{-WSNod(-v#PZGE)%-W606+^T zr(H1Hn**eTJbz^kaE&eR7qtmwP!o}8!Gi-YSy=Ci;pW1!TI6;kO1V3e=I*K*UGa5r)8n4jyFC`UMip0-AtQG_+e*w~ zFo=MFzv$+k6H~{`t~2Zh4_pLr^p)o8S(exBZrsSct(Q@Zt2u+$h`Z8yFknQ9eNIJ= zvFim5{D94=XUx9q(q~neN=JxB|98$Fw{_8u`_h<0ga(9%wFjzIz4kWs9{Evqz%P&b zzf9ZnFVi+7^mI*7#tcwlf~_OH3@wqzC~koVHQH`B8xa8EgOya;X+;0SXVtLfZ$Ql+ zN(hgdHlkQPA!#pv!w>_Hj)Rtjq+Dw@NE<;N96CEAOwwJ&K6LokOMK7VTj_>?U0T^_ z7RAl@)tP>Vi^Me(X2p`JW=lO?J4CO=zyBE>kmWsd{XMoTZ$3ExX>FFf$)0=uR2J}? zeGa$W$CG?e;}H1I)w+6fo?)og zeM8F%Qnn+>x@*wd=gjdw^+vEX84V<4Z2lKVPLzKYcy5P4TvX5v^p#3DW@~3Bt1@OE zX8Pni_55?Lp1Y_pY9k+|jzQx||5&!vd={5`F_Z~nahSH|dJ964PP(8MMyeI%mR>Ow zcqgIlW*zbgUazg8u2H0l*@76A!`j-6v@%fnEDvit4xp)JBQkM$(3=U-> zQgb8W%3y>3V%1M&6W_d?h}Uhj@#tXV{CYM&9*a;Wudue=0{OS}k%LKI)Ysh)J+#?o zu@8pwM}Jv6KGv3*k@60``JF{a%qVFN8$iV487WO82ocOIG3zd$poz-$J53&fY%V z;6_?wr48xv!tl<-f05g@tL!|BB_a4PwNLW9lQCz9cy+?nb7ywStzq+JONr--SjkXT zH@cj-e2Hez2MpJOL*01gC{@NF#_Mnt?o>Rl7qG2)Q3cb98VwTAaG(?_cV)9D514 z%dxa>rro>k+O18`#@LV&7#jDVZ!&j$yuuF%d%<}j<=%*pn1CYBg|196gTd$5KLIvm z14flmtXo?a^G_Fp;>!^)H-U~dr+z%ox%R{JOdL27bk-Bqx}^JXG4dv8GgzgB`_I0$ zYFsLb2XQ?=FA%bRYVWWcgflpY#S2Er^&=k;a2i0^`SIOmrx`L$JdQ@VhdgNPRPkRr zvUO%Zr;0dzUysZLI6Hh6Y%5(sw07hEmnn)FDZVjhBmNIlBIsZM diff --git a/sound/surgery/blood_wound.ogg b/sound/surgery/blood_wound.ogg new file mode 100644 index 0000000000000000000000000000000000000000..e8f03caf63f8f08240fc810978be392f38cde381 GIT binary patch literal 18390 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 literal 0 HcmV?d00001 diff --git a/sound/weapons/shrapnel.ogg b/sound/weapons/shrapnel.ogg new file mode 100644 index 0000000000000000000000000000000000000000..858253841135992606e5a481d7c595cfd1a396a2 GIT binary patch literal 8027 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