From f07b74ea9042a60f5f8e9a4b746408bcebbd4aae Mon Sep 17 00:00:00 2001 From: ChungusGamer666 <82850673+ChungusGamer666@users.noreply.github.com> Date: Sat, 17 Jun 2023 13:46:27 -0300 Subject: [PATCH] Moves species brutemod and burnmod to be handled by bodyparts (#76060) ## About The Pull Request Title. Brute modifier and burn modifier are now handled by bodyparts. Cold modifier and heat modifier are still handled by species, though mmmmmaybe I'll make a PR addressing those later, yes? ## Why It's Good For The Game Medical abominations will have even more consistent behavior! Also bloating the species datum less is kinda good. ## Changelog :cl: refactor: Species brute and burn damage modifiers are now handled by bodyparts, instead of being universal. Go ham at the surgical bay. /:cl: --- code/__DEFINES/traits.dm | 8 ++- code/datums/dna.dm | 4 +- .../nightmare/nightmare_species.dm | 1 - code/modules/mob/living/carbon/human/human.dm | 10 ++-- .../mob/living/carbon/human/human_defines.dm | 2 +- .../mob/living/carbon/human/physiology.dm | 1 - .../mob/living/carbon/human/species.dm | 51 ++++++++++--------- .../carbon/human/species_types/ethereal.dm | 1 - .../carbon/human/species_types/golems.dm | 4 +- .../carbon/human/species_types/jellypeople.dm | 1 - .../human/species_types/lizardpeople.dm | 23 ++++----- .../carbon/human/species_types/mushpeople.dm | 1 - .../carbon/human/species_types/plasmamen.dm | 2 - .../carbon/human/species_types/podpeople.dm | 1 - .../carbon/human/species_types/snail.dm | 1 - .../carbon/human/species_types/zombies.dm | 10 ++-- .../crossbreeding/_status_effects.dm | 4 +- .../research/xenobiology/xenobiology.dm | 13 ++--- .../surgery/advanced/bioware/bioware.dm | 10 ++-- .../advanced/bioware/bioware_surgery.dm | 2 +- code/modules/surgery/bodyparts/_bodyparts.dm | 13 +++-- .../species_parts/ethereal_bodyparts.dm | 7 ++- .../bodyparts/species_parts/misc_bodyparts.dm | 32 ++++++++++++ .../species_parts/plasmaman_bodyparts.dm | 12 +++++ .../surgery/organs/stomach/stomach_golem.dm | 13 ++--- 25 files changed, 138 insertions(+), 89 deletions(-) diff --git a/code/__DEFINES/traits.dm b/code/__DEFINES/traits.dm index 4659df3da81..6cbc424ffa9 100644 --- a/code/__DEFINES/traits.dm +++ b/code/__DEFINES/traits.dm @@ -488,6 +488,8 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define TRAIT_HATED_BY_DOGS "hated_by_dogs" /// Mobs with this trait will not be immobilized when held up #define TRAIT_NOFEAR_HOLDUPS "no_fear_holdup" +/// Mob has gotten an armor buff from adamantine extract +#define TRAIT_ADAMANTINE_EXTRACT_ARMOR "adamantine_extract_armor" /// Mobs with this trait won't be able to dual wield guns. #define TRAIT_NO_GUN_AKIMBO "no_gun_akimbo" @@ -950,8 +952,10 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai #define BEAUTY_ELEMENT_TRAIT "beauty_element" #define MOOD_DATUM_TRAIT "mood_datum" #define DRONE_SHY_TRAIT "drone_shy" -/// Pacifism trait given by stabilized light pink extracts. -#define STABILIZED_LIGHT_PINK_TRAIT "stabilized_light_pink" +/// Trait given by stabilized light pink extracts +#define STABILIZED_LIGHT_PINK_EXTRACT_TRAIT "stabilized_light_pink" +/// Trait given by adamantine extracts +#define ADAMANTINE_EXTRACT_TRAIT "adamantine_extract" /// Given by the multiple_lives component to the previous body of the mob upon death. #define EXPIRED_LIFE_TRAIT "expired_life" /// Trait given to an atom/movable when they orbit something. diff --git a/code/datums/dna.dm b/code/datums/dna.dm index d79153f7ef7..33c72c65327 100644 --- a/code/datums/dna.dm +++ b/code/datums/dna.dm @@ -832,8 +832,8 @@ GLOBAL_LIST_INIT(total_uf_len_by_block, populate_total_uf_len_by_block()) if(3) to_chat(src, span_notice("Oh, I actually feel quite alright!")) if(4) - to_chat(src, span_notice("Oh, I actually feel quite alright!")) //you thought - physiology.damage_resistance = -20000 + to_chat(src, span_notice("Oh, I actually feel quite alright!")) + physiology.damage_resistance -= 20000 //you thought if(5) to_chat(src, span_notice("Oh, I actually feel quite alright!")) reagents.add_reagent(/datum/reagent/aslimetoxin, 10) diff --git a/code/modules/antagonists/nightmare/nightmare_species.dm b/code/modules/antagonists/nightmare/nightmare_species.dm index 9fc44cb434c..fa8c0da16e6 100644 --- a/code/modules/antagonists/nightmare/nightmare_species.dm +++ b/code/modules/antagonists/nightmare/nightmare_species.dm @@ -5,7 +5,6 @@ name = "Nightmare" id = SPECIES_NIGHTMARE examine_limb_id = SPECIES_SHADOW - burnmod = 1.5 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE species_traits = list(NO_UNDERWEAR,NO_DNA_COPY,NOTRANSSTING,NOEYESPRITES) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index cf1f4dd106c..4f921010b13 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -7,6 +7,8 @@ setup_mood() // This needs to be called very very early in human init (before organs / species are created at the minimum) setup_organless_effects() + // Physiology needs to be created before species, as some species modify physiology + setup_physiology() create_dna() dna.species.create_fresh_body(src) @@ -17,8 +19,6 @@ prepare_huds() //Prevents a nasty runtime on human init - physiology = new() - . = ..() RegisterSignal(src, COMSIG_COMPONENT_CLEAN_FACE_ACT, PROC_REF(clean_face)) @@ -33,6 +33,9 @@ AddElement(/datum/element/connect_loc, loc_connections) GLOB.human_list += src +/mob/living/carbon/human/proc/setup_physiology() + physiology = new() + /mob/living/carbon/human/proc/setup_mood() if (CONFIG_GET(flag/disable_human_mood)) return @@ -56,7 +59,8 @@ /mob/living/carbon/human/Destroy() QDEL_NULL(physiology) - QDEL_LIST(bioware) + if(biowares) + QDEL_LIST(biowares) GLOB.human_list -= src if (mob_mood) diff --git a/code/modules/mob/living/carbon/human/human_defines.dm b/code/modules/mob/living/carbon/human/human_defines.dm index 3e4006dceff..57298f2b5ac 100644 --- a/code/modules/mob/living/carbon/human/human_defines.dm +++ b/code/modules/mob/living/carbon/human/human_defines.dm @@ -62,7 +62,7 @@ var/datum/physiology/physiology - var/list/datum/bioware = list() + var/list/datum/bioware/biowares /// What types of mobs are allowed to ride/buckle to this mob var/static/list/can_ride_typecache = typecacheof(list(/mob/living/carbon/human, /mob/living/simple_animal/slime, /mob/living/simple_animal/parrot)) diff --git a/code/modules/mob/living/carbon/human/physiology.dm b/code/modules/mob/living/carbon/human/physiology.dm index f83cc5e6203..b2998db26ac 100644 --- a/code/modules/mob/living/carbon/human/physiology.dm +++ b/code/modules/mob/living/carbon/human/physiology.dm @@ -1,5 +1,4 @@ //Stores several modifiers in a way that isn't cleared by changing species - /datum/physiology var/brute_mod = 1 // % of brute damage taken from all sources var/burn_mod = 1 // % of burn damage taken from all sources diff --git a/code/modules/mob/living/carbon/human/species.dm b/code/modules/mob/living/carbon/human/species.dm index 066fa1fbb4d..674e48be51d 100644 --- a/code/modules/mob/living/carbon/human/species.dm +++ b/code/modules/mob/living/carbon/human/species.dm @@ -33,8 +33,6 @@ GLOBAL_LIST_EMPTY(features_by_species) ///The alpha used by the hair. 255 is completely solid, 0 is invisible. var/hair_alpha = 255 - ///Examine text when the person has cellular damage. - var/cellular_damage_desc = DEFAULT_CLONE_EXAMINE_TEXT ///This is used for children, it will determine their default limb ID for use of examine. See [/mob/living/carbon/human/proc/examine]. var/examine_limb_id ///Never, Optional, or Forced digi legs? @@ -106,12 +104,11 @@ GLOBAL_LIST_EMPTY(features_by_species) ///Multiplier for the race's speed. Positive numbers make it move slower, negative numbers make it move faster. var/speedmod = 0 - ///Percentage modifier for overall defense of the race, or less defense, if it's negative. - var/armor = 0 - ///multiplier for brute damage - var/brutemod = 1 - ///multiplier for burn damage - var/burnmod = 1 + /** + * Percentage modifier for overall defense of the race, or less defense, if it's negative + * THIS MODIFIES ALL DAMAGE TYPES. + **/ + var/damage_modifier = 0 ///multiplier for damage from cold temperature var/coldmod = 1 ///multiplier for damage from hot temperature @@ -447,7 +444,7 @@ GLOBAL_LIST_EMPTY(features_by_species) * * old_species - The species that the carbon used to be before becoming this race, used for regenerating organs. * * pref_load - Preferences to be loaded from character setup, loads in preferred mutant things like bodyparts, digilegs, skin color, etc. */ -/datum/species/proc/on_species_gain(mob/living/carbon/C, datum/species/old_species, pref_load) +/datum/species/proc/on_species_gain(mob/living/carbon/human/C, datum/species/old_species, pref_load) SHOULD_CALL_PARENT(TRUE) // Drop the items the new species can't wear if((AGENDER in species_traits)) @@ -461,7 +458,7 @@ GLOBAL_LIST_EMPTY(features_by_species) C.mob_biotypes = inherent_biotypes C.mob_respiration_type = inherent_respiration_type - if (old_species.type != type) + if(old_species.type != type) replace_body(C, src) regenerate_organs(C, old_species, visual_only = C.visual_only_organs) @@ -1376,7 +1373,7 @@ GLOBAL_LIST_EMPTY(features_by_species) /datum/species/proc/apply_damage(damage, damagetype = BRUTE, def_zone = null, blocked, mob/living/carbon/human/H, forced = FALSE, spread_damage = FALSE, wound_bonus = 0, bare_wound_bonus = 0, sharpness = NONE, attack_direction = null, attacking_item) SEND_SIGNAL(H, COMSIG_MOB_APPLY_DAMAGE, damage, damagetype, def_zone, blocked, wound_bonus, bare_wound_bonus, sharpness, attack_direction, attacking_item) - var/hit_percent = (100-(blocked+armor))/100 + var/hit_percent = (100-(damage_modifier+blocked))/100 hit_percent = (hit_percent * (100-H.physiology.damage_resistance))/100 if(!damage || (!forced && hit_percent <= 0)) return 0 @@ -1395,7 +1392,7 @@ GLOBAL_LIST_EMPTY(features_by_species) switch(damagetype) if(BRUTE) H.damageoverlaytemp = 20 - var/damage_amount = forced ? damage : damage * hit_percent * brutemod * H.physiology.brute_mod + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.brute_mod if(BP) if(BP.receive_damage(damage_amount, 0, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) H.update_damage_overlays() @@ -1403,7 +1400,7 @@ GLOBAL_LIST_EMPTY(features_by_species) H.adjustBruteLoss(damage_amount) if(BURN) H.damageoverlaytemp = 20 - var/damage_amount = forced ? damage : damage * hit_percent * burnmod * H.physiology.burn_mod + var/damage_amount = forced ? damage : damage * hit_percent * H.physiology.burn_mod if(BP) if(BP.receive_damage(0, damage_amount, wound_bonus = wound_bonus, bare_wound_bonus = bare_wound_bonus, sharpness = sharpness, attack_direction = attack_direction, damage_source = attacking_item)) H.update_damage_overlays() @@ -1972,10 +1969,13 @@ GLOBAL_LIST_EMPTY(features_by_species) * Returns a list containing perks, or an empty list. */ /datum/species/proc/create_pref_damage_perks() + // We use the chest to figure out brute and burn mod perks + var/obj/item/bodypart/chest/fake_chest = bodypart_overrides[BODY_ZONE_CHEST] + var/list/to_add = list() // Brute related - if(brutemod > 1) + if(initial(fake_chest.brute_modifier) > 1) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "band-aid", @@ -1983,29 +1983,29 @@ GLOBAL_LIST_EMPTY(features_by_species) SPECIES_PERK_DESC = "[plural_form] are weak to brute damage.", )) - if(brutemod < 1) + if(initial(fake_chest.brute_modifier) < 1) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "shield-alt", SPECIES_PERK_NAME = "Brutal Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to bruising and brute damage.", + SPECIES_PERK_DESC = "[plural_form] are resilient to brute damage.", )) // Burn related - if(burnmod > 1) + if(initial(fake_chest.burn_modifier) > 1) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_NEGATIVE_PERK, SPECIES_PERK_ICON = "burn", - SPECIES_PERK_NAME = "Fire Weakness", - SPECIES_PERK_DESC = "[plural_form] are weak to fire and burn damage.", + SPECIES_PERK_NAME = "Burn Weakness", + SPECIES_PERK_DESC = "[plural_form] are weak to burn damage.", )) - if(burnmod < 1) + if(initial(fake_chest.burn_modifier) < 1) to_add += list(list( SPECIES_PERK_TYPE = SPECIES_POSITIVE_PERK, SPECIES_PERK_ICON = "shield-alt", - SPECIES_PERK_NAME = "Fire Resilience", - SPECIES_PERK_DESC = "[plural_form] are resilient to flames, and burn damage.", + SPECIES_PERK_NAME = "Burn Resilience", + SPECIES_PERK_DESC = "[plural_form] are resilient to burn damage.", )) // Shock damage @@ -2296,15 +2296,16 @@ GLOBAL_LIST_EMPTY(features_by_species) new_species ||= target.dna.species //If no new species is provided, assume its src. //Note for future: Potentionally add a new C.dna.species() to build a template species for more accurate limb replacement + var/list/final_bodypart_overrides = new_species.bodypart_overrides.Copy() if((new_species.digitigrade_customization == DIGITIGRADE_OPTIONAL && target.dna.features["legs"] == DIGITIGRADE_LEGS) || new_species.digitigrade_customization == DIGITIGRADE_FORCED) - new_species.bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade - new_species.bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade + final_bodypart_overrides[BODY_ZONE_R_LEG] = /obj/item/bodypart/leg/right/digitigrade + final_bodypart_overrides[BODY_ZONE_L_LEG] = /obj/item/bodypart/leg/left/digitigrade for(var/obj/item/bodypart/old_part as anything in target.bodyparts) if((old_part.change_exempt_flags & BP_BLOCK_CHANGE_SPECIES) || (old_part.bodypart_flags & BODYPART_IMPLANTED)) continue - var/path = new_species.bodypart_overrides?[old_part.body_zone] + var/path = final_bodypart_overrides?[old_part.body_zone] var/obj/item/bodypart/new_part if(path) new_part = new path() diff --git a/code/modules/mob/living/carbon/human/species_types/ethereal.dm b/code/modules/mob/living/carbon/human/species_types/ethereal.dm index 85322a89341..4070ee9ae2b 100644 --- a/code/modules/mob/living/carbon/human/species_types/ethereal.dm +++ b/code/modules/mob/living/carbon/human/species_types/ethereal.dm @@ -9,7 +9,6 @@ exotic_blood = /datum/reagent/consumable/liquidelectricity //Liquid Electricity. fuck you think of something better gamer exotic_bloodtype = "LE" siemens_coeff = 0.5 //They thrive on energy - brutemod = 1.25 //They're weak to punches payday_modifier = 0.75 species_traits = list( DYNCOLORS, 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 a594b88e4e0..38be9757777 100644 --- a/code/modules/mob/living/carbon/human/species_types/golems.dm +++ b/code/modules/mob/living/carbon/human/species_types/golems.dm @@ -23,7 +23,7 @@ mutantlungs = null inherent_biotypes = MOB_HUMANOID|MOB_MINERAL liked_food = STONE - armor = 10 + damage_modifier = 10 //golem is stronk payday_modifier = 0.75 siemens_coeff = 0 no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING | ITEM_SLOT_SUITSTORE @@ -98,7 +98,7 @@ /// Remove nutrient value from non-mineral food, wish this was on an organ and not species but such is life /datum/species/golem/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired) - if (istype(chem, /datum/reagent/consumable) && !istype(chem, /datum/reagent/consumable/nutriment/mineral)) + if(istype(chem, /datum/reagent/consumable) && !istype(chem, /datum/reagent/consumable/nutriment/mineral)) var/datum/reagent/consumable/yummy_chem = chem yummy_chem.nutriment_factor = 0 return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm index 68773e9a41e..a0d32c751d6 100644 --- a/code/modules/mob/living/carbon/human/species_types/jellypeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/jellypeople.dm @@ -30,7 +30,6 @@ toxic_food = NONE coldmod = 6 // = 3x cold damage heatmod = 0.5 // = 1/4x heat damage - burnmod = 0.5 // = 1/2x generic burn damage payday_modifier = 0.75 changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_PRIDE | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN | SLIME_EXTRACT inherent_factions = list(FACTION_SLIME) 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 cf8925471d5..707df141132 100644 --- a/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/lizardpeople.dm @@ -178,9 +178,9 @@ Lizard subspecies: SILVER SCALED TRAIT_WINE_TASTER, ) mutantlungs = null + damage_modifier = 10 //very light silvery scales soften blows species_language_holder = /datum/language_holder/lizard/silver mutanttongue = /obj/item/organ/internal/tongue/lizard/silver - armor = 10 //very light silvery scales soften blows changesource_flags = MIRROR_BADMIN | MIRROR_MAGIC | RACE_SWAP | ERT_SPAWN examine_limb_id = SPECIES_LIZARD ///stored mutcolor for when we turn back off of a silverscale. @@ -190,22 +190,19 @@ Lizard subspecies: SILVER SCALED ///See above var/old_eye_color_right -/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/new_silverscale, datum/species/old_species, pref_load) - var/mob/living/carbon/human/silverscale = new_silverscale +/datum/species/lizard/silverscale/on_species_gain(mob/living/carbon/human/new_silverscale, datum/species/old_species, pref_load) old_mutcolor = new_silverscale.dna.features["mcolor"] - old_eye_color_left = silverscale.eye_color_left - old_eye_color_right = silverscale.eye_color_right + old_eye_color_left = new_silverscale.eye_color_left + old_eye_color_right = new_silverscale.eye_color_right new_silverscale.dna.features["mcolor"] = "#eeeeee" - silverscale.eye_color_left = "#0000a0" - silverscale.eye_color_right = "#0000a0" - ..() - silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2)) + new_silverscale.eye_color_left = "#0000a0" + new_silverscale.eye_color_right = "#0000a0" + . = ..() + new_silverscale.add_filter("silver_glint", 2, list("type" = "outline", "color" = "#ffffff63", "size" = 2)) -/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/old_silverscale, datum/species/new_species, pref_load) - var/mob/living/carbon/human/was_silverscale = old_silverscale +/datum/species/lizard/silverscale/on_species_loss(mob/living/carbon/human/was_silverscale, datum/species/new_species, pref_load) was_silverscale.dna.features["mcolor"] = old_mutcolor was_silverscale.eye_color_left = old_eye_color_left was_silverscale.eye_color_right = old_eye_color_right - was_silverscale.remove_filter("silver_glint") - ..() + return ..() diff --git a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm index 4a1981f4478..2b9ef4ef16d 100644 --- a/code/modules/mob/living/carbon/human/species_types/mushpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/mushpeople.dm @@ -22,7 +22,6 @@ no_equip_flags = ITEM_SLOT_MASK | ITEM_SLOT_OCLOTHING | ITEM_SLOT_GLOVES | ITEM_SLOT_FEET | ITEM_SLOT_ICLOTHING - burnmod = 1.25 heatmod = 1.5 mutanttongue = /obj/item/organ/internal/tongue/mush diff --git a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm index 8b8c4a3c86e..6d6cb9f985c 100644 --- a/code/modules/mob/living/carbon/human/species_types/plasmamen.dm +++ b/code/modules/mob/living/carbon/human/species_types/plasmamen.dm @@ -25,9 +25,7 @@ mutantstomach = /obj/item/organ/internal/stomach/bone/plasmaman mutantappendix = null mutantheart = null - burnmod = 1.5 heatmod = 1.5 - brutemod = 1.5 payday_modifier = 0.75 breathid = GAS_PLASMA disliked_food = FRUIT | CLOTH diff --git a/code/modules/mob/living/carbon/human/species_types/podpeople.dm b/code/modules/mob/living/carbon/human/species_types/podpeople.dm index db38cc85fc0..5296d0e823a 100644 --- a/code/modules/mob/living/carbon/human/species_types/podpeople.dm +++ b/code/modules/mob/living/carbon/human/species_types/podpeople.dm @@ -16,7 +16,6 @@ inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT inherent_factions = list(FACTION_PLANTS, FACTION_VINES) - burnmod = 1.25 heatmod = 1.5 payday_modifier = 0.75 meat = /obj/item/food/meat/slab/human/mutant/plant 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 6dc24addcf8..b9b9c1533a9 100644 --- a/code/modules/mob/living/carbon/human/species_types/snail.dm +++ b/code/modules/mob/living/carbon/human/species_types/snail.dm @@ -10,7 +10,6 @@ ) coldmod = 0.5 //snails only come out when its cold and wet - burnmod = 2 speedmod = 6 siemens_coeff = 2 //snails are mostly water changesource_flags = MIRROR_BADMIN | WABBAJACK | MIRROR_MAGIC | MIRROR_PRIDE | RACE_SWAP diff --git a/code/modules/mob/living/carbon/human/species_types/zombies.dm b/code/modules/mob/living/carbon/human/species_types/zombies.dm index 5c6c8fc6b88..7de3427fed9 100644 --- a/code/modules/mob/living/carbon/human/species_types/zombies.dm +++ b/code/modules/mob/living/carbon/human/species_types/zombies.dm @@ -88,8 +88,8 @@ name = "Infectious Zombie" id = SPECIES_ZOMBIE_INFECTIOUS examine_limb_id = SPECIES_ZOMBIE - armor = 20 // 120 damage to KO a zombie, which kills it speedmod = 1.6 + damage_modifier = 20 // 120 damage to KO a zombie, which kills it mutanteyes = /obj/item/organ/internal/eyes/zombie mutantbrain = /obj/item/organ/internal/brain/zombie mutanttongue = /obj/item/organ/internal/tongue/zombie @@ -120,13 +120,13 @@ TRAIT_STABLELIVER, // Not necessary but for consistency with above ) -/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/C, datum/species/old_species) +/datum/species/zombie/infectious/on_species_gain(mob/living/carbon/human/new_zombie, datum/species/old_species) . = ..() - C.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie) + new_zombie.AddComponent(/datum/component/mutant_hands, mutant_hand_path = /obj/item/mutant_hand/zombie) -/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/C, datum/species/new_species, pref_load) +/datum/species/zombie/infectious/on_species_loss(mob/living/carbon/human/was_zombie, datum/species/new_species, pref_load) . = ..() - qdel(C.GetComponent(/datum/component/mutant_hands)) + qdel(was_zombie.GetComponent(/datum/component/mutant_hands)) /datum/species/zombie/infectious/check_roundstart_eligible() return FALSE diff --git a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm index 845116d9327..bde40d944ec 100644 --- a/code/modules/research/xenobiology/crossbreeding/_status_effects.dm +++ b/code/modules/research/xenobiology/crossbreeding/_status_effects.dm @@ -1003,7 +1003,7 @@ /datum/status_effect/stabilized/lightpink/on_apply() owner.add_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - ADD_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_TRAIT) + ADD_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) return ..() /datum/status_effect/stabilized/lightpink/tick() @@ -1015,7 +1015,7 @@ /datum/status_effect/stabilized/lightpink/on_remove() owner.remove_movespeed_modifier(/datum/movespeed_modifier/status_effect/lightpink) - REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_TRAIT) + REMOVE_TRAIT(owner, TRAIT_PACIFISM, STABILIZED_LIGHT_PINK_EXTRACT_TRAIT) /datum/status_effect/stabilized/adamantine id = "stabilizedadamantine" diff --git a/code/modules/research/xenobiology/xenobiology.dm b/code/modules/research/xenobiology/xenobiology.dm index 7c3465e9796..ddbbe3eca43 100644 --- a/code/modules/research/xenobiology/xenobiology.dm +++ b/code/modules/research/xenobiology/xenobiology.dm @@ -473,12 +473,13 @@ /obj/item/slime_extract/adamantine/activate(mob/living/carbon/human/user, datum/species/jelly/luminescent/species, activation_type) switch(activation_type) if(SLIME_ACTIVATE_MINOR) - if(species.armor > 0) + if(HAS_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR)) to_chat(user, span_warning("Your skin is already hardened!")) return + ADD_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT) to_chat(user, span_notice("You feel your skin harden and become more resistant.")) - species.armor += 25 - addtimer(CALLBACK(src, PROC_REF(reset_armor), species), 1200) + user.physiology.damage_resistance += 25 + addtimer(CALLBACK(src, PROC_REF(reset_armor), user), 120 SECONDS) return 450 if(SLIME_ACTIVATE_MAJOR) @@ -489,9 +490,9 @@ return to_chat(user, span_notice("You stop feeding [src], and your body returns to its slimelike state.")) -/obj/item/slime_extract/adamantine/proc/reset_armor(datum/species/jelly/luminescent/species) - if(istype(species)) - species.armor -= 25 +/obj/item/slime_extract/adamantine/proc/reset_armor(mob/living/carbon/human/user) + REMOVE_TRAIT(user, TRAIT_ADAMANTINE_EXTRACT_ARMOR, ADAMANTINE_EXTRACT_TRAIT) + user.physiology.damage_resistance -= 25 /obj/item/slime_extract/bluespace name = "bluespace slime extract" diff --git a/code/modules/surgery/advanced/bioware/bioware.dm b/code/modules/surgery/advanced/bioware/bioware.dm index 6a4ce36a83f..4a679e74631 100644 --- a/code/modules/surgery/advanced/bioware/bioware.dm +++ b/code/modules/surgery/advanced/bioware/bioware.dm @@ -9,16 +9,18 @@ var/can_process = FALSE var/mod_type = BIOWARE_GENERIC -/datum/bioware/New(mob/living/carbon/human/_owner) - owner = _owner - for(var/datum/bioware/bioware as anything in owner.bioware) +/datum/bioware/New(mob/living/carbon/human/new_owner) + owner = new_owner + for(var/datum/bioware/bioware as anything in owner.biowares) if(bioware.mod_type == mod_type) qdel(src) return - owner.bioware += src + LAZYADD(owner.biowares, src) on_gain() /datum/bioware/Destroy() + if(owner) + LAZYREMOVE(owner.biowares, src) owner = null if(active) on_lose() diff --git a/code/modules/surgery/advanced/bioware/bioware_surgery.dm b/code/modules/surgery/advanced/bioware/bioware_surgery.dm index 203c8b17fba..4db161e5249 100644 --- a/code/modules/surgery/advanced/bioware/bioware_surgery.dm +++ b/code/modules/surgery/advanced/bioware/bioware_surgery.dm @@ -7,7 +7,7 @@ return FALSE if(!istype(target)) return FALSE - for(var/datum/bioware/bioware as anything in target.bioware) + for(var/datum/bioware/bioware as anything in target.biowares) if(bioware.mod_type == bioware_target) return FALSE return TRUE diff --git a/code/modules/surgery/bodyparts/_bodyparts.dm b/code/modules/surgery/bodyparts/_bodyparts.dm index 202f00a0330..2aadd04459d 100644 --- a/code/modules/surgery/bodyparts/_bodyparts.dm +++ b/code/modules/surgery/bodyparts/_bodyparts.dm @@ -88,10 +88,15 @@ ///Gradually increases while burning when at full damage, destroys the limb when at 100 var/cremation_progress = 0 + //Multiplicative damage modifiers + /// Brute damage gets multiplied by this on receive_damage() + var/brute_modifier = 1 + /// Burn damage gets multiplied by this on receive_damage() + var/burn_modifier = 1 // Damage reduction variables for damage handled on the limb level. Handled after worn armor. - ///Amount subtracted from brute damage inflicted on the limb. + /// Amount subtracted from brute damage inflicted on the limb. var/brute_reduction = 0 - ///Amount subtracted from burn damage inflicted on the limb. + /// Amount subtracted from burn damage inflicted on the limb. var/burn_reduction = 0 //Coloring and proper item icon update @@ -437,8 +442,8 @@ return FALSE var/dmg_multi = CONFIG_GET(number/damage_multiplier) * hit_percent - brute = round(max(brute * dmg_multi, 0),DAMAGE_PRECISION) - burn = round(max(burn * dmg_multi, 0),DAMAGE_PRECISION) + brute = round(max(brute * dmg_multi * brute_modifier, 0), DAMAGE_PRECISION) + burn = round(max(burn * dmg_multi * burn_modifier, 0), DAMAGE_PRECISION) brute = max(0, brute - brute_reduction) burn = max(0, burn - burn_reduction) diff --git a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm index 767ee35cb7d..076d4f684a1 100644 --- a/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/ethereal_bodyparts.dm @@ -6,6 +6,7 @@ attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/head/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -19,6 +20,7 @@ limb_id = SPECIES_ETHEREAL is_dimorphic = FALSE dmg_overlay_type = null + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/chest/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -35,6 +37,7 @@ unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/arm/left/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -51,6 +54,7 @@ unarmed_attack_verb = "burn" unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damages /obj/item/bodypart/arm/right/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -59,7 +63,6 @@ var/datum/species/ethereal/eth_holder = potato_oc.dna.species species_color = eth_holder.current_color - /obj/item/bodypart/leg/left/ethereal icon_greyscale = 'icons/mob/species/ethereal/bodyparts.dmi' limb_id = SPECIES_ETHEREAL @@ -67,6 +70,7 @@ attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/leg/left/ethereal/update_limb(dropping_limb, is_creating) . = ..() @@ -82,6 +86,7 @@ attack_type = BURN // bish buzz unarmed_attack_sound = 'sound/weapons/etherealhit.ogg' unarmed_miss_sound = 'sound/weapons/etherealmiss.ogg' + brute_modifier = 1.25 //ethereal are weak to brute damage /obj/item/bodypart/leg/right/ethereal/update_limb(dropping_limb, is_creating) . = ..() diff --git a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm index a27232d8069..fe298dc0e01 100644 --- a/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/misc_bodyparts.dm @@ -2,29 +2,36 @@ /obj/item/bodypart/head/snail limb_id = SPECIES_SNAIL is_dimorphic = FALSE + burn_modifier = 2 /obj/item/bodypart/chest/snail limb_id = SPECIES_SNAIL is_dimorphic = FALSE + burn_modifier = 2 /obj/item/bodypart/arm/left/snail limb_id = SPECIES_SNAIL unarmed_attack_verb = "slap" unarmed_attack_effect = ATTACK_EFFECT_DISARM unarmed_damage_high = 0.5 //snails are soft and squishy + burn_modifier = 2 /obj/item/bodypart/arm/right/snail limb_id = SPECIES_SNAIL unarmed_attack_verb = "slap" unarmed_attack_effect = ATTACK_EFFECT_DISARM unarmed_damage_high = 0.5 + burn_modifier = 2 /obj/item/bodypart/leg/left/snail limb_id = SPECIES_SNAIL unarmed_damage_high = 0.5 + burn_modifier = 2 + /obj/item/bodypart/leg/right/snail limb_id = SPECIES_SNAIL unarmed_damage_high = 0.5 + burn_modifier = 2 ///ABDUCTOR /obj/item/bodypart/head/abductor @@ -67,32 +74,38 @@ limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/chest/jelly biological_state = BIO_INORGANIC limb_id = SPECIES_JELLYPERSON is_dimorphic = TRUE dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/arm/left/jelly biological_state = BIO_INORGANIC limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/arm/right/jelly biological_state = BIO_INORGANIC limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/leg/left/jelly biological_state = BIO_INORGANIC limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage /obj/item/bodypart/leg/right/jelly biological_state = BIO_INORGANIC limb_id = SPECIES_JELLYPERSON dmg_overlay_type = null + burn_modifier = 0.5 // = 1/2x generic burn damage ///SLIME /obj/item/bodypart/head/slime @@ -179,10 +192,12 @@ /obj/item/bodypart/head/pod limb_id = SPECIES_PODPERSON is_dimorphic = TRUE + burn_modifier = 1.25 /obj/item/bodypart/chest/pod limb_id = SPECIES_PODPERSON is_dimorphic = TRUE + burn_modifier = 1.25 /obj/item/bodypart/arm/left/pod limb_id = SPECIES_PODPERSON @@ -190,6 +205,7 @@ unarmed_attack_effect = ATTACK_EFFECT_CLAW unarmed_attack_sound = 'sound/weapons/slice.ogg' unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + burn_modifier = 1.25 /obj/item/bodypart/arm/right/pod limb_id = SPECIES_PODPERSON @@ -197,12 +213,15 @@ unarmed_attack_effect = ATTACK_EFFECT_CLAW unarmed_attack_sound = 'sound/weapons/slice.ogg' unarmed_miss_sound = 'sound/weapons/slashmiss.ogg' + burn_modifier = 1.25 /obj/item/bodypart/leg/left/pod limb_id = SPECIES_PODPERSON + burn_modifier = 1.25 /obj/item/bodypart/leg/right/pod limb_id = SPECIES_PODPERSON + burn_modifier = 1.25 ///FLY /obj/item/bodypart/head/fly @@ -237,32 +256,38 @@ limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/chest/shadow biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW is_dimorphic = FALSE should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/left/shadow biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/right/shadow biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/leg/left/shadow biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/leg/right/shadow biological_state = BIO_INORGANIC limb_id = SPECIES_SHADOW should_draw_greyscale = FALSE + burn_modifier = 1.5 /obj/item/bodypart/arm/left/shadow/nightmare bodypart_traits = list(TRAIT_CHUNKYFINGERS) @@ -313,36 +338,43 @@ /obj/item/bodypart/head/mushroom limb_id = SPECIES_MUSHROOM is_dimorphic = TRUE + burn_modifier = 1.25 /obj/item/bodypart/chest/mushroom limb_id = SPECIES_MUSHROOM is_dimorphic = TRUE bodypart_traits = list(TRAIT_NO_JUMPSUIT) + burn_modifier = 1.25 /obj/item/bodypart/arm/left/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 6 unarmed_damage_high = 14 unarmed_stun_threshold = 14 + burn_modifier = 1.25 /obj/item/bodypart/arm/right/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 6 unarmed_damage_high = 14 unarmed_stun_threshold = 14 + burn_modifier = 1.25 /obj/item/bodypart/leg/left/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 9 unarmed_damage_high = 21 unarmed_stun_threshold = 14 + burn_modifier = 1.25 /obj/item/bodypart/leg/right/mushroom limb_id = SPECIES_MUSHROOM unarmed_damage_low = 9 unarmed_damage_high = 21 unarmed_stun_threshold = 14 + burn_modifier = 1.25 +//GOLEM /obj/item/bodypart/head/golem icon = 'icons/mob/species/golems.dmi' icon_static = 'icons/mob/species/golems.dmi' diff --git a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm index 8adc098844d..b77c89da323 100644 --- a/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm +++ b/code/modules/surgery/bodyparts/species_parts/plasmaman_bodyparts.dm @@ -7,6 +7,8 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/chest/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -17,6 +19,8 @@ is_dimorphic = FALSE should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/arm/left/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -26,6 +30,8 @@ limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/arm/right/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -35,6 +41,8 @@ limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/leg/left/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -44,6 +52,8 @@ limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak /obj/item/bodypart/leg/right/plasmaman icon = 'icons/mob/species/plasmaman/bodyparts.dmi' @@ -53,3 +63,5 @@ limb_id = SPECIES_PLASMAMAN should_draw_greyscale = FALSE dmg_overlay_type = null + brute_modifier = 1.5 //Plasmemes are weak + burn_modifier = 1.5 //Plasmemes are weak diff --git a/code/modules/surgery/organs/stomach/stomach_golem.dm b/code/modules/surgery/organs/stomach/stomach_golem.dm index 9a085a5bbfb..6b556c8d1f6 100644 --- a/code/modules/surgery/organs/stomach/stomach_golem.dm +++ b/code/modules/surgery/organs/stomach/stomach_golem.dm @@ -15,25 +15,20 @@ /obj/item/organ/internal/stomach/golem/on_insert(mob/living/carbon/organ_owner, special) . = ..() RegisterSignal(owner, COMSIG_CARBON_ATTEMPT_EAT, PROC_REF(try_eating)) - if (!ishuman(organ_owner)) + if(!ishuman(organ_owner)) return - if (organ_owner.flags_1 & INITIALIZED_1) - setup_physiology(organ_owner) - else - RegisterSignal(owner, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE, PROC_REF(setup_physiology)) + setup_physiology(organ_owner) /// Physiology doesn't exist yet if this is added on initialisation of a golem, so we need to wait until it does /obj/item/organ/internal/stomach/golem/proc/setup_physiology(mob/living/carbon/human/human_owner) - SIGNAL_HANDLER human_owner.physiology?.hunger_mod *= hunger_mod - UnregisterSignal(human_owner, COMSIG_ATOM_AFTER_SUCCESSFUL_INITIALIZE) /obj/item/organ/internal/stomach/golem/on_remove(mob/living/carbon/organ_owner, special) . = ..() UnregisterSignal(organ_owner, COMSIG_CARBON_ATTEMPT_EAT) organ_owner.remove_movespeed_modifier(/datum/movespeed_modifier/golem_hunger) organ_owner.remove_status_effect(/datum/status_effect/golem_statued) - if (!ishuman(organ_owner)) + if(!ishuman(organ_owner)) return var/mob/living/carbon/human/human_owner = organ_owner human_owner.physiology?.hunger_mod /= hunger_mod @@ -41,7 +36,7 @@ /// Reject food, rocks only /obj/item/organ/internal/stomach/golem/proc/try_eating(mob/living/carbon/source, atom/eating) SIGNAL_HANDLER - if (istype(eating, /obj/item/food/golem_food)) + if(istype(eating, /obj/item/food/golem_food)) return source.balloon_alert(source, "minerals only!") return COMSIG_CARBON_BLOCK_EAT