Ports Physiology (#15449)

* Ports Physiology

* updates
This commit is contained in:
Fox McCloud
2021-02-26 18:33:28 +00:00
committed by GitHub
parent 289f6994ce
commit b49a99d46e
16 changed files with 153 additions and 128 deletions
@@ -217,9 +217,8 @@
if(19)
//Instrinct Resistance
T.visible_message("<span class='userdanger'>[user] looks very robust!</span>")
var/datum/species/S = user.dna.species
S.brute_mod *= 0.5
S.burn_mod *= 0.5
user.physiology.brute_mod *= 0.5
user.physiology.burn_mod *= 0.5
if(20)
//Free wizard!
@@ -38,6 +38,8 @@
dna.real_name = real_name
sync_organ_dna(1)
physiology = new()
UpdateAppearance()
GLOB.human_list += src
@@ -59,6 +61,7 @@
SSmobs.cubemonkeys -= src
QDEL_LIST(bodyparts)
splinted_limbs.Cut()
QDEL_NULL(physiology)
GLOB.human_list -= src
/mob/living/carbon/human/dummy
@@ -596,6 +599,7 @@
else if(!(flags & SHOCK_NOGLOVES)) //This gets the siemens_coeff for all non tesla shocks
if(gloves)
siemens_coeff *= gloves.siemens_coefficient
siemens_coeff *= physiology.siemens_coeff
siemens_coeff *= dna.species.siemens_coeff
. = ..()
//Don't go further if the shock was blocked/too weak.
@@ -322,11 +322,5 @@ This function restores all organs.
return bodyparts_by_name[zone]
/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, obj/used_weapon = null)
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
return 1
//Handle species apply_damage procs
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, sharp, used_weapon)
/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone, blocked = 0, sharp = FALSE, obj/used_weapon, spread_damage = FALSE)
return dna.species.apply_damage(damage, damagetype, def_zone, blocked, src, sharp, used_weapon, spread_damage)
@@ -151,7 +151,7 @@ emp_act
var/obj/item/clothing/C = bp
if(C.body_parts_covered & def_zone.body_part)
protection += C.armor.getRating(type)
protection += physiology.armor.getRating(type)
return protection
//this proc returns the Siemens coefficient of electrical resistivity for a particular external organ.
@@ -48,6 +48,8 @@
var/name_override //For temporary visible name changes
var/datum/physiology/physiology
var/xylophone = 0 //For the spoooooooky xylophone cooldown
var/mob/remoteview_target = null
+5 -4
View File
@@ -284,7 +284,7 @@
if(bodytemperature > dna.species.heat_level_1)
//Body temperature is too hot.
if(status_flags & GODMODE) return 1 //godmode
var/mult = dna.species.heatmod
var/mult = dna.species.heatmod * physiology.heat_mod
if(bodytemperature >= dna.species.heat_level_1 && bodytemperature <= dna.species.heat_level_2)
throw_alert("temp", /obj/screen/alert/hot, 1)
@@ -306,7 +306,7 @@
return 1
if(!istype(loc, /obj/machinery/atmospherics/unary/cryo_cell))
var/mult = dna.species.coldmod
var/mult = dna.species.coldmod * physiology.cold_mod
if(bodytemperature >= dna.species.cold_level_2 && bodytemperature <= dna.species.cold_level_1)
throw_alert("temp", /obj/screen/alert/cold, 1)
take_overall_damage(burn=mult*COLD_DAMAGE_LEVEL_1, updating_health = TRUE, used_weapon = "Low Body Temperature")
@@ -330,7 +330,7 @@
if(adjusted_pressure >= dna.species.hazard_high_pressure)
if(!HAS_TRAIT(src, TRAIT_RESISTHIGHPRESSURE))
var/pressure_damage = min( ( (adjusted_pressure / dna.species.hazard_high_pressure) -1 )*PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE)
var/pressure_damage = min(((adjusted_pressure / dna.species.hazard_high_pressure) - 1) * PRESSURE_DAMAGE_COEFFICIENT , MAX_HIGH_PRESSURE_DAMAGE) * physiology.pressure_mod
take_overall_damage(brute=pressure_damage, updating_health = TRUE, used_weapon = "High Pressure")
throw_alert("pressure", /obj/screen/alert/highpressure, 2)
else
@@ -345,7 +345,7 @@
if(HAS_TRAIT(src, TRAIT_RESISTLOWPRESSURE))
clear_alert("pressure")
else
take_overall_damage(brute=LOW_PRESSURE_DAMAGE, updating_health = TRUE, used_weapon = "Low Pressure")
take_overall_damage(brute = LOW_PRESSURE_DAMAGE * physiology.pressure_mod, updating_health = TRUE, used_weapon = "Low Pressure")
throw_alert("pressure", /obj/screen/alert/lowpressure, 2)
@@ -556,6 +556,7 @@
if(prob(round(-satiety/40)))
Jitter(5)
hunger_rate = 3 * hunger_drain
hunger_rate *= physiology.hunger_mod
adjust_nutrition(-hunger_rate)
if(nutrition > NUTRITION_LEVEL_FULL)
@@ -0,0 +1,46 @@
/**
* # physiology datum
*
* Datum that stores several modifiers in a way that isn't cleared by changing species
*
*/
/datum/physiology
/// % of brute damage taken from all sources
var/brute_mod = 1
/// % of burn damage taken from all sources
var/burn_mod = 1
/// % of toxin damage taken from all sources
var/tox_mod = 1
/// % of oxygen damage taken from all sources
var/oxy_mod = 1
/// % of clone damage taken from all sources
var/clone_mod = 1
/// % of stamina damage taken from all sources
var/stamina_mod = 1
/// % of brain damage taken from all sources
var/brain_mod = 1
/// % of brute damage taken from low or high pressure (stacks with brute_mod)
var/pressure_mod = 1
/// % of burn damage taken from heat (stacks with burn_mod)
var/heat_mod = 1
/// % of burn damage taken from cold (stacks with burn_mod)
var/cold_mod = 1
/// %damage reduction from all sources
var/damage_resistance = 0
/// resistance to shocks
var/siemens_coeff = 1
/// % stun modifier
var/stun_mod = 1
/// % bleeding modifier
var/bleed_mod = 1
/// internal armor datum
var/datum/armor/armor
///% of hunger rate taken per tick.
var/hunger_mod = 1
/datum/physiology/New()
armor = new
@@ -51,6 +51,8 @@
var/stamina_mod = 1
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/speed_mod = 0 // this affects the race's speed. positive numbers make it move slower, negative numbers make it move faster
///Percentage modifier for overall defense of the race, or less defense, if it's negative.
var/armor = 0
var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood?
var/total_health = 100
var/punchdamagelow = 0 //lowest possible punch damage
@@ -343,46 +345,66 @@
/datum/species/proc/handle_death(gibbed, mob/living/carbon/human/H) //Handles any species-specific death events (such as dionaea nymph spawns).
return
/datum/species/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, mob/living/carbon/human/H, sharp = 0, obj/used_weapon = null)
blocked = (100 - blocked) / 100
if(blocked <= 0)
return 0
/datum/species/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone, blocked = 0, mob/living/carbon/human/H, sharp = FALSE, obj/used_weapon, spread_damage = FALSE)
var/hit_percent = (100 - (blocked + armor)) / 100
hit_percent = (hit_percent * (100 - H.physiology.damage_resistance)) / 100
if(!damage || (hit_percent <= 0))
return FALSE
var/obj/item/organ/external/organ = null
if(isorgan(def_zone))
organ = def_zone
else
if(!def_zone)
def_zone = ran_zone(def_zone)
organ = H.get_organ(check_zone(def_zone))
if(!organ)
return 0
damage = damage * blocked
if(!spread_damage)
if(isorgan(def_zone))
organ = def_zone
else
if(!def_zone)
def_zone = ran_zone(def_zone)
organ = H.get_organ(check_zone(def_zone))
if(!organ)
organ = H.bodyparts[1]
switch(damagetype)
if(BRUTE)
damage = damage * brute_mod
if(damage)
var/damage_amount = damage * hit_percent * brute_mod * H.physiology.brute_mod
if(damage_amount)
H.damageoverlaytemp = 20
if(organ.receive_damage(damage, 0, sharp, used_weapon))
H.UpdateDamageIcon()
if(organ)
if(organ.receive_damage(damage_amount, 0, sharp, used_weapon))
H.UpdateDamageIcon()
else //no bodypart, we deal damage with a more general method.
H.adjustBruteLoss(damage_amount)
if(BURN)
damage = damage * burn_mod
if(damage)
var/damage_amount = damage * hit_percent * burn_mod * H.physiology.burn_mod
if(damage_amount)
H.damageoverlaytemp = 20
if(organ.receive_damage(0, damage, sharp, used_weapon))
H.UpdateDamageIcon()
if(organ)
if(organ.receive_damage(0, damage_amount, sharp, used_weapon))
H.UpdateDamageIcon()
else
H.adjustFireLoss(damage_amount)
if(TOX)
var/damage_amount = damage * hit_percent * H.physiology.tox_mod
H.adjustToxLoss(damage_amount)
if(OXY)
var/damage_amount = damage * hit_percent * H.physiology.oxy_mod
H.adjustOxyLoss(damage_amount)
if(CLONE)
var/damage_amount = damage * hit_percent * H.physiology.clone_mod
H.adjustCloneLoss(damage_amount)
if(STAMINA)
var/damage_amount = damage * hit_percent * H.physiology.stamina_mod
H.adjustStaminaLoss(damage_amount)
if(BRAIN)
var/damage_amount = damage * hit_percent * H.physiology.brain_mod
H.adjustBrainLoss(damage_amount)
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
H.updatehealth("apply damage")
return 1
return TRUE
/datum/species/proc/spec_stun(mob/living/carbon/human/H,amount)
return
/datum/species/proc/spec_stun(mob/living/carbon/human/H, amount)
. = stun_mod * H.physiology.stun_mod * amount
/datum/species/proc/spec_electrocute_act(mob/living/carbon/human/H, shock_damage, source, siemens_coeff = 1, flags = NONE)
return
@@ -9,12 +9,7 @@
inherent_biotypes = MOB_HUMANOID | MOB_MINERAL
dies_at_threshold = TRUE
speed_mod = 2
brute_mod = 0.45 //55% damage reduction
burn_mod = 0.45
tox_mod = 0.45
clone_mod = 0.45
brain_mod = 0.45
stamina_mod = 0.45
armor = 55
siemens_coeff = 0
punchdamagelow = 5
punchdamagehigh = 14
@@ -186,12 +181,7 @@
/datum/species/golem/diamond
name = "Diamond Golem"
golem_colour = rgb(0, 255, 255)
brute_mod = 0.3 //70% damage reduction up from 55%
burn_mod = 0.3
tox_mod = 0.3
clone_mod = 0.3
brain_mod = 0.3
stamina_mod = 0.3
armor = 70 //up from 55
skinned_type = /obj/item/stack/ore/diamond
info_text = "As a <span class='danger'>Diamond Golem</span>, you are more resistant than the average golem."
prefix = "Diamond"
@@ -202,12 +192,7 @@
name = "Gold Golem"
golem_colour = rgb(204, 204, 0)
speed_mod = 1
brute_mod = 0.75 //25% damage reduction down from 55%
burn_mod = 0.75
tox_mod = 0.75
clone_mod = 0.75
brain_mod = 0.75
stamina_mod = 0.75
armor = 25 //down from 55
skinned_type = /obj/item/stack/ore/gold
info_text = "As a <span class='danger'>Gold Golem</span>, you are faster but less resistant than the average golem."
prefix = "Golden"
@@ -248,7 +233,7 @@
golem_colour = rgb(255, 255, 255)
skinned_type = /obj/item/stack/ore/titanium
info_text = "As a <span class='danger'>Titanium Golem</span>, you are resistant to burn damage and immune to ash storms."
burn_mod = 0.405
burn_mod = 0.9
prefix = "Titanium"
special_names = list("Dioxide")
@@ -266,7 +251,7 @@
golem_colour = rgb(136, 136, 136)
skinned_type = /obj/item/stack/ore/titanium
info_text = "As a <span class='danger'>Plastitanium Golem</span>, you are very resistant to burn damage and immune to both ash storms and lava."
burn_mod = 0.36
burn_mod = 0.8
prefix = "Plastitanium"
special_names = null
@@ -317,12 +302,8 @@
//Can burn and take damage from heat
inherent_traits = list(TRAIT_NOBREATH, TRAIT_RESISTCOLD, TRAIT_RESISTHIGHPRESSURE, TRAIT_RESISTLOWPRESSURE, TRAIT_CHUNKYFINGERS, TRAIT_RADIMMUNE, TRAIT_PIERCEIMMUNE, TRAIT_NOPAIN)
inherent_biotypes = MOB_ORGANIC | MOB_HUMANOID | MOB_PLANT
brute_mod = 0.7 //30% damage reduction down from 55%
burn_mod = 0.875
tox_mod = 0.7
clone_mod = 0.7
brain_mod = 0.7
stamina_mod = 0.7
armor = 30
burn_mod = 1.25
heatmod = 1.5
dietflags = DIET_HERB // Plants eat...plants?
@@ -390,12 +371,9 @@
name = "Sand Golem"
golem_colour = rgb(255, 220, 143)
skinned_type = /obj/item/stack/ore/glass //this is sand
brute_mod = 0.25
armor = 0
burn_mod = 3 //melts easily
tox_mod = 1
clone_mod = 1
brain_mod = 1
stamina_mod = 1
brute_mod = 0.25
info_text = "As a <span class='danger'>Sand Golem</span>, you are immune to physical bullets and take very little brute damage, but are extremely vulnerable to burn damage and energy weapons. You will also turn to sand when dying, preventing any form of recovery."
unarmed_type = /datum/unarmed_attack/golem/sand
prefix = "Sand"
@@ -426,12 +404,9 @@
name = "Glass Golem"
golem_colour = rgb(90, 150, 180)
skinned_type = /obj/item/shard
armor = 0
brute_mod = 3 //very fragile
burn_mod = 0.25
tox_mod = 1
clone_mod = 1
brain_mod = 1
stamina_mod = 1
info_text = "As a <span class='danger'>Glass Golem</span>, you reflect lasers and energy weapons, and are very resistant to burn damage. However, you are extremely vulnerable to brute damage. On death, you'll shatter beyond any hope of recovery."
unarmed_type = /datum/unarmed_attack/golem/glass
prefix = "Glass"
@@ -1,27 +1,15 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(dna.species.stun_mod)
amount = amount * dna.species.stun_mod
else
amount = dna.species.spec_stun(src,amount)
amount = dna.species.spec_stun(src, amount)
return ..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
if(dna.species.stun_mod)
amount = amount * dna.species.stun_mod
else
amount = dna.species.spec_stun(src,amount)
amount = dna.species.spec_stun(src, amount)
return ..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
if(dna.species.stun_mod)
amount = amount * dna.species.stun_mod
else
amount = dna.species.spec_stun(src,amount)
amount = dna.species.spec_stun(src, amount)
return ..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1, no_alert = FALSE)
if(dna.species.stun_mod)
amount = amount * dna.species.stun_mod
else
amount = dna.species.spec_stun(src,amount)
amount = dna.species.spec_stun(src, amount)
return ..()
+12 -10
View File
@@ -8,24 +8,26 @@
Returns
standard 0 if fail
*/
/mob/living/proc/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/used_weapon = null)
blocked = (100-blocked)/100
if(!damage || (blocked <= 0)) return 0
/mob/living/proc/apply_damage(damage = 0, damagetype = BRUTE, def_zone, blocked = 0, sharp = FALSE, used_weapon, spread_damage = FALSE)
var/hit_percent = (100 - blocked) / 100
if(!damage || (hit_percent <= 0))
return FALSE
var/damage_amount = damage * hit_percent
switch(damagetype)
if(BRUTE)
adjustBruteLoss(damage * blocked)
adjustBruteLoss(damage_amount)
if(BURN)
adjustFireLoss(damage * blocked)
adjustFireLoss(damage_amount)
if(TOX)
adjustToxLoss(damage * blocked)
adjustToxLoss(damage_amount)
if(OXY)
adjustOxyLoss(damage * blocked)
adjustOxyLoss(damage_amount)
if(CLONE)
adjustCloneLoss(damage * blocked)
adjustCloneLoss(damage_amount)
if(STAMINA)
adjustStaminaLoss(damage * blocked)
adjustStaminaLoss(damage_amount)
updatehealth("apply damage")
return 1
return TRUE
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
switch(damagetype)
@@ -1242,12 +1242,12 @@
..()
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.dna.species.siemens_coeff *= 2
H.physiology.siemens_coeff *= 2
/datum/reagent/teslium/on_mob_delete(mob/living/M)
if(ishuman(M))
var/mob/living/carbon/human/H = M
H.dna.species.siemens_coeff *= 0.5
H.physiology.siemens_coeff *= 0.5
..()
/datum/reagent/gluttonytoxin
+1 -7
View File
@@ -321,13 +321,7 @@ GLOBAL_LIST_INIT(non_simple_animals, typecacheof(list(/mob/living/carbon/human/m
S.stun_mod *= 0.5
if(VAULT_ARMOUR)
to_chat(H, "<span class='notice'>You feel tough.</span>")
S.brute_mod *= 0.7
S.burn_mod *= 0.7
S.tox_mod *= 0.7
S.oxy_mod *= 0.7
S.clone_mod *= 0.7
S.brain_mod *= 0.7
S.stamina_mod *= 0.7
S.armor = 30
ADD_TRAIT(H, TRAIT_PIERCEIMMUNE, "dna_vault")
if(VAULT_SPEED)
to_chat(H, "<span class='notice'>You feel very fast and agile.</span>")
+1
View File
@@ -91,6 +91,7 @@
add_splatter_floor(loc, 1)
/mob/living/carbon/human/bleed(amt)
amt *= physiology.bleed_mod
if(!(NO_BLOOD in dna.species.species_traits))
..()
if(dna.species.exotic_blood)