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

🆑
refactor: Species brute and burn damage modifiers are now handled by
bodyparts, instead of being universal. Go ham at the surgical bay.
/🆑
This commit is contained in:
ChungusGamer666
2023-06-17 18:46:27 +02:00
committed by GitHub
parent 54ea3658e5
commit f07b74ea90
25 changed files with 138 additions and 89 deletions
+6 -2
View File
@@ -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.
+2 -2
View File
@@ -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)
@@ -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)
@@ -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)
@@ -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))
@@ -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
+26 -25
View File
@@ -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()
@@ -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,
@@ -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 ..()
@@ -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)
@@ -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 ..()
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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
@@ -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"
@@ -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"
@@ -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()
@@ -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
+9 -4
View File
@@ -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)
@@ -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)
. = ..()
@@ -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'
@@ -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
@@ -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