Merge pull request #6170 from Fox-McCloud/species-lever-options

Adds Species Levers
This commit is contained in:
Crazy Lemon
2017-01-18 15:35:17 -08:00
committed by GitHub
21 changed files with 124 additions and 86 deletions

View File

@@ -39,11 +39,10 @@
#define IS_PLANT 128
#define CAN_BE_FAT 256
#define NO_INTORGANS 512
#define NO_POISON 1024
#define RADIMMUNE 2048
#define ALL_RPARTS 4096
#define NOGUNS 8192
#define NOTRANSSTING 16384
#define RADIMMUNE 1024
#define ALL_RPARTS 2048
#define NOGUNS 4096
#define NOTRANSSTING 8192
//Species clothing flags
#define HAS_UNDERWEAR 1

View File

@@ -304,6 +304,7 @@ Made by Xhuis
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE | NOGUNS //Can't use guns due to muzzle flash
burn_mod = 1.5 //1.5x burn damage, 2x is excessive
oxy_mod = 0
hot_env_multiplier = 1.5
silent_steps = 1
@@ -341,6 +342,7 @@ Made by Xhuis
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
burn_mod = 1.1
oxy_mod = 0
hot_env_multiplier = 1.1
/datum/species/shadow/ling/lesser/handle_life(var/mob/living/carbon/human/H)

View File

@@ -116,12 +116,6 @@
mmi_icon_state = "slime_mmi"
// parent_organ = "chest" Hello I am from the ministry of rubber forehead aliens how are you
/obj/item/organ/internal/brain/slime/take_damage(var/amount, var/silent = 1)
//Slimes are 150% more vulnerable to brain damage
damage = between(0, src.damage + (1.5*amount), max_damage) //Since they take the damage twice, this is +150%
return ..()
/obj/item/organ/internal/brain/golem
name = "Runic mind"
desc = "A tightly furled roll of paper, covered with indecipherable runes."

View File

@@ -35,9 +35,9 @@
. = ..()
if(.)
if(nutrition && stat != DEAD)
nutrition -= HUNGER_FACTOR/10
nutrition -= hunger_drain / 10
if(m_intent == "run")
nutrition -= HUNGER_FACTOR/10
nutrition -= hunger_drain / 10
if((FAT in mutations) && m_intent == "run" && bodytemperature <= 360)
bodytemperature += 2
@@ -942,7 +942,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
var/fullness = nutrition + 10
if(istype(toEat, /obj/item/weapon/reagent_containers/food/snacks))
for(var/datum/reagent/consumable/C in reagents.reagent_list) //we add the nutrition value of what we're currently digesting
fullness += C.nutriment_factor * C.volume / C.metabolization_rate
fullness += C.nutriment_factor * C.volume / (C.metabolization_rate * metabolism_efficiency * digestion_ratio)
if(user == src)
if(istype(toEat, /obj/item/weapon/reagent_containers/food/drinks))
if(!selfDrink(toEat))

View File

@@ -1539,6 +1539,9 @@
else
see_invisible = SEE_INVISIBLE_LIVING
hunger_drain = species.hunger_drain
digestion_ratio = species.digestion_ratio
if(species.base_color && default_colour)
//Apply colour.
r_skin = color2R(species.base_color)

View File

@@ -28,13 +28,15 @@
med_hud_set_status()
handle_hud_icons()
/mob/living/carbon/human/adjustBrainLoss(var/amount)
/mob/living/carbon/human/adjustBrainLoss(amount)
if(status_flags & GODMODE)
return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
if(species)
amount = amount * species.brain_mod
sponge.take_damage(amount, 1)
brainloss = sponge.damage
else
@@ -42,14 +44,16 @@
else
brainloss = 0
/mob/living/carbon/human/setBrainLoss(var/amount)
/mob/living/carbon/human/setBrainLoss(amount)
if(status_flags & GODMODE)
return 0 //godmode
if(species && species.has_organ["brain"])
var/obj/item/organ/internal/brain/sponge = get_int_organ(/obj/item/organ/internal/brain)
if(sponge)
sponge.damage = min(max(amount, 0),(maxHealth*2))
if(species)
amount = amount * species.brain_mod
sponge.damage = min(max(amount, 0), (maxHealth*2))
brainloss = sponge.damage
else
brainloss = 200
@@ -84,25 +88,25 @@
return amount
/mob/living/carbon/human/adjustBruteLoss(var/amount)
if(species && species.brute_mod)
amount = amount*species.brute_mod
/mob/living/carbon/human/adjustBruteLoss(amount)
if(species)
amount = amount * species.brute_mod
if(amount > 0)
take_overall_damage(amount, 0)
else
heal_overall_damage(-amount, 0)
/mob/living/carbon/human/adjustFireLoss(var/amount)
if(species && species.burn_mod)
amount = amount*species.burn_mod
/mob/living/carbon/human/adjustFireLoss(amount)
if(species)
amount = amount * species.burn_mod
if(amount > 0)
take_overall_damage(0, amount)
else
heal_overall_damage(0, -amount)
/mob/living/carbon/human/proc/adjustBruteLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
if(species && species.brute_mod)
amount = amount*species.brute_mod
/mob/living/carbon/human/proc/adjustBruteLossByPart(amount, organ_name, obj/damage_source = null)
if(species)
amount = amount * species.brute_mod
if(organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -114,9 +118,9 @@
O.heal_damage(-amount, 0, internal=0, robo_repair=(O.status & ORGAN_ROBOT))
/mob/living/carbon/human/proc/adjustFireLossByPart(var/amount, var/organ_name, var/obj/damage_source = null)
if(species && species.burn_mod)
amount = amount*species.burn_mod
/mob/living/carbon/human/proc/adjustFireLossByPart(amount, organ_name, obj/damage_source = null)
if(species)
amount = amount * species.burn_mod
if(organ_name in organs_by_name)
var/obj/item/organ/external/O = get_organ(organ_name)
@@ -134,13 +138,11 @@
wearing_rig.notify_ai("<span class='danger'>Warning: user consciousness failure. Mobility control passed to integrated intelligence system.</span>")
..()
/mob/living/carbon/human/adjustCloneLoss(var/amount)
/mob/living/carbon/human/adjustCloneLoss(amount)
if(species)
amount = amount * species.clone_mod
..()
if(species.flags & (NO_DNA))
cloneloss = 0
return
var/heal_prob = max(0, 80 - getCloneLoss())
var/mut_prob = min(80, getCloneLoss() + 10)
if(amount > 0) //cloneloss is being added
@@ -176,44 +178,30 @@
// Defined here solely to take species flags into account without having to recast at mob/living level.
/mob/living/carbon/human/getOxyLoss()
if(species.flags & NO_BREATHE)
oxyloss = 0
return ..()
/mob/living/carbon/human/adjustOxyLoss(amount)
if(species)
amount = amount * species.oxy_mod
..()
/mob/living/carbon/human/adjustOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
oxyloss = 0
else
..()
/mob/living/carbon/human/setOxyLoss(amount)
if(species)
amount = amount * species.oxy_mod
..()
/mob/living/carbon/human/setOxyLoss(var/amount)
if(species.flags & NO_BREATHE)
oxyloss = 0 //this literally overrides three procs, excessive much?
else
..()
/mob/living/carbon/human/adjustToxLoss(amount)
if(species)
amount = amount * species.tox_mod
..()
/mob/living/carbon/human/getToxLoss()
if(species.flags & NO_POISON)
toxloss = 0
return ..()
/mob/living/carbon/human/adjustToxLoss(var/amount)
if(species.flags & NO_POISON)
toxloss = 0
else
..()
/mob/living/carbon/human/setToxLoss(var/amount)
if(species.flags & NO_POISON)
toxloss = 0 //this *also* overrides three procs, definately excessive
else
..()
/mob/living/carbon/human/setToxLoss(amount)
if(species)
amount = amount * species.tox_mod
..()
////////////////////////////////////////////
//Returns a list of damaged organs
/mob/living/carbon/human/proc/get_damaged_organs(var/brute, var/burn, var/flags = AFFECT_ALL_ORGANS)
/mob/living/carbon/human/proc/get_damaged_organs(brute, burn, flags = AFFECT_ALL_ORGANS)
var/list/obj/item/organ/external/parts = list()
for(var/obj/item/organ/external/O in organs)
if((brute && O.brute_dam) || (burn && O.burn_dam))
@@ -235,7 +223,7 @@
//Heals ONE external organ, organ gets randomly selected from damaged ones.
//It automatically updates damage overlays if necesary
//It automatically updates health status
/mob/living/carbon/human/heal_organ_damage(var/brute, var/burn)
/mob/living/carbon/human/heal_organ_damage(brute, burn)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
if(!parts.len)
return
@@ -247,7 +235,7 @@
//Damages ONE external organ, organ gets randomly selected from damagable ones.
//It automatically updates damage overlays if necesary
//It automatically updates health status
/mob/living/carbon/human/take_organ_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0)
/mob/living/carbon/human/take_organ_damage(brute, burn, sharp = 0, edge = 0)
var/list/obj/item/organ/external/parts = get_damageable_organs()
if(!parts.len)
return
@@ -259,7 +247,7 @@
//Heal MANY external organs, in random order
/mob/living/carbon/human/heal_overall_damage(var/brute, var/burn, var/internal=0, var/robotic=0)
/mob/living/carbon/human/heal_overall_damage(brute, burn, internal=0, robotic=0)
var/list/obj/item/organ/external/parts = get_damaged_organs(brute,burn)
var/update = 0
@@ -282,7 +270,7 @@
UpdateDamageIcon()
// damage MANY external organs, in random order
/mob/living/carbon/human/take_overall_damage(var/brute, var/burn, var/sharp = 0, var/edge = 0, var/used_weapon = null)
/mob/living/carbon/human/take_overall_damage(brute, burn, sharp = 0, edge = 0, used_weapon = null)
if(status_flags & GODMODE)
return //godmode
var/list/obj/item/organ/external/parts = get_damageable_organs()
@@ -337,7 +325,7 @@ This function restores all organs.
return 0
/mob/living/carbon/human/proc/get_organ(var/zone)
/mob/living/carbon/human/proc/get_organ(zone)
if(!zone)
zone = "chest"
if(zone in list("eyes", "mouth"))
@@ -345,7 +333,7 @@ This function restores all organs.
return organs_by_name[zone]
/mob/living/carbon/human/apply_damage(var/damage = 0, var/damagetype = BRUTE, var/def_zone = null, var/blocked = 0, var/sharp = 0, var/edge = 0, var/obj/used_weapon = null)
/mob/living/carbon/human/apply_damage(damage = 0, damagetype = BRUTE, def_zone = null, blocked = 0, sharp = 0, edge = 0, obj/used_weapon = null)
//Handle other types of damage
if((damagetype != BRUTE) && (damagetype != BURN))
..(damage, damagetype, def_zone, blocked)
@@ -373,7 +361,7 @@ This function restores all organs.
switch(damagetype)
if(BRUTE)
damageoverlaytemp = 20
if(species && species.brute_mod)
if(species)
damage = damage * species.brute_mod
if(organ.take_damage(damage, 0, sharp, edge, used_weapon))
@@ -398,7 +386,7 @@ This function restores all organs.
if(BURN)
damageoverlaytemp = 20
if(species && species.burn_mod)
if(species)
damage = damage * species.burn_mod
if(organ.take_damage(0, damage, sharp, edge, used_weapon))
@@ -406,4 +394,4 @@ This function restores all organs.
// Will set our damageoverlay icon to the next level, which will then be set back to the normal level the next mob.Life().
updatehealth()
return 1
return 1

View File

@@ -675,14 +675,14 @@
// nutrition decrease
if(nutrition > 0 && stat != DEAD)
// THEY HUNGER
var/hunger_rate = HUNGER_FACTOR
var/hunger_rate = hunger_drain
if(satiety > 0)
satiety--
if(satiety < 0)
satiety++
if(prob(round(-satiety/40)))
Jitter(5)
hunger_rate = 3 * HUNGER_FACTOR
hunger_rate = 3 * hunger_drain
nutrition = max(0, nutrition - hunger_rate)
if(nutrition > NUTRITION_LEVEL_FULL)

View File

@@ -11,6 +11,9 @@
eyes = "blank_eyes"
flags = HAS_LIPS | NO_BLOOD | NO_BREATHE
oxy_mod = 0
virus_immune = 1
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_OMNI

View File

@@ -37,10 +37,12 @@
"antennae" = /obj/item/organ/internal/wryn/hivenode
)
flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | NO_SCAN | HIVEMIND
flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | HIVEMIND
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
oxy_mod = 0
reagent_tag = PROCESS_ORG
base_color = "#704300"
flesh_color = "#704300"
@@ -97,6 +99,7 @@
language = "Sol Common"
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
brute_mod = 2 // damn, double wham, double dam
oxy_mod = 0
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet

View File

@@ -7,6 +7,9 @@
default_language = "Galactic Common"
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE | NOGUNS
oxy_mod = 0
virus_immune = 1
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
reagent_tag = PROCESS_ORG

View File

@@ -16,6 +16,9 @@
)
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
oxy_mod = 0
virus_immune = 1
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
reagent_tag = PROCESS_ORG

View File

@@ -14,6 +14,9 @@
flesh_color = "#E6E6C6"
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
oxy_mod = 0
virus_immune = 1 //why is this a var and not a flag?
dietflags = DIET_OMNI
reagent_tag = PROCESS_ORG

View File

@@ -43,6 +43,8 @@
var/body_temperature = 310.15 //non-IS_SYNTHETIC species will try to stabilize at this temperature. (also affects temperature processing)
var/reagent_tag //Used for metabolizing reagents.
var/hunger_drain = HUNGER_FACTOR
var/digestion_ratio = 1 //How quickly the species digests/absorbs reagents.
var/siemens_coeff = 1 //base electrocution coefficient
@@ -66,8 +68,13 @@
"sa_sleep" = 5
)
var/brute_mod = null // Physical damage reduction/malus.
var/burn_mod = null // Burn damage reduction/malus.
var/brute_mod = 1 // Physical damage reduction/amplification
var/burn_mod = 1 // Burn damage reduction/amplification
var/tox_mod = 1 // Toxin damage reduction/amplification
var/oxy_mod = 1 // Oxy damage reduction/amplification
var/clone_mod = 1 // Clone damage reduction/amplification
var/brain_mod = 1 // Brain damage damage reduction/amplification
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
var/total_health = 100
var/punchdamagelow = 0 //lowest possible punch damage
@@ -657,4 +664,4 @@ It'll return null if the organ doesn't correspond, so include null checks when u
H.see_invisible = SEE_INVISIBLE_MINIMUM
if(H.see_override) //Override all
H.see_invisible = H.see_override
H.see_invisible = H.see_override

View File

@@ -506,6 +506,9 @@
cold_level_3 = 200
cold_env_multiplier = 3
oxy_mod = 0
brain_mod = 2.5
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | NO_EYES
@@ -756,6 +759,8 @@
clothing_flags = HAS_SOCKS
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
oxy_mod = 0
body_temperature = T0C + 15 //make the plant people have a bit lower body temperature, why not
blood_color = "#004400"
flesh_color = "#907E4A"
@@ -850,9 +855,12 @@
eyes = "blank_eyes"
brute_mod = 2.5 // 100% * 2.5 * 0.6 (robolimbs) ~= 150%
burn_mod = 2.5 // So they take 50% extra damage from brute/burn overall.
tox_mod = 0
clone_mod = 0
oxy_mod = 0
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | NO_POISON | RADIMMUNE | ALL_RPARTS | NOTRANSSTING
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS| NOTRANSSTING
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
dietflags = 0 //IPCs can't eat, so no diet
@@ -1007,4 +1015,4 @@
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_2, BURN, "head", used_weapon = "Excessive Heat")
if(heat_level_3_breathe to INFINITY)
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")
H.apply_damage(hot_env_multiplier*HEAT_GAS_DAMAGE_LEVEL_3, BURN, "head", used_weapon = "Excessive Heat")

View File

@@ -0,0 +1,19 @@
/mob/living/carbon/human/SetStunned(amount, updating = 1, force = 0)
if(species)
amount = amount * species.stun_mod
..()
/mob/living/carbon/human/SetWeakened(amount, updating = 1, force = 0)
if(species)
amount = amount * species.stun_mod
..()
/mob/living/carbon/human/SetParalysis(amount, updating = 1, force = 0)
if(species)
amount = amount * species.stun_mod
..()
/mob/living/carbon/human/SetSleeping(amount, updating = 1)
if(species)
amount = amount * species.stun_mod
..()

View File

@@ -33,6 +33,7 @@
var/floating = 0
var/mob_size = MOB_SIZE_HUMAN
var/metabolism_efficiency = 1 //more or less efficiency to metabolize helpful/harmful reagents and regulate body temperature..
var/digestion_ratio = 1 //controls how quickly reagents metabolize; largely governered by species attributes.
var/nightvision = 0
var/bloodcrawl = 0 //0 No blood crawling, 1 blood crawling, 2 blood crawling+mob devour

View File

@@ -158,7 +158,7 @@ var/global/list/ts_spiderlist = list()
var/can_poison = 1
if(ishuman(G))
var/mob/living/carbon/human/H = G
if(!(H.species.reagent_tag & PROCESS_ORG) || (H.species.flags & NO_POISON))
if(!(H.species.reagent_tag & PROCESS_ORG) || (!H.species.tox_mod))
can_poison = 0
spider_specialattack(G,can_poison)
else

View File

@@ -69,6 +69,7 @@
var/charges = 0.0
var/nutrition = NUTRITION_LEVEL_FED + 50 //Carbon
var/satiety = 0 //Carbon
var/hunger_drain = HUNGER_FACTOR // how quickly the mob gets hungry; largely utilized by species.
var/overeatduration = 0 // How long this guy is overeating //Carbon
var/intent = null//Living

View File

@@ -73,7 +73,7 @@
/datum/reagent/proc/on_mob_life(mob/living/M)
current_cycle++
holder.remove_reagent(id, metabolization_rate * M.metabolism_efficiency) //By default it slowly disappears.
holder.remove_reagent(id, metabolization_rate * M.metabolism_efficiency * M.digestion_ratio) //By default it slowly disappears.
/datum/reagent/proc/on_mob_death(mob/living/M) //use this to have chems have a "death-triggered" effect
return

View File

@@ -4,7 +4,7 @@
/datum/reagent/medicine/on_mob_life(mob/living/M)
current_cycle++
holder.remove_reagent(id, metabolization_rate / M.metabolism_efficiency) //medicine reagents stay longer if you have a better metabolism
holder.remove_reagent(id, (metabolization_rate / M.metabolism_efficiency) * M.digestion_ratio) //medicine reagents stay longer if you have a better metabolism
/datum/reagent/medicine/hydrocodone
name = "Hydrocodone"

View File

@@ -1539,6 +1539,7 @@
#include "code\modules\mob\living\carbon\human\login.dm"
#include "code\modules\mob\living\carbon\human\npcs.dm"
#include "code\modules\mob\living\carbon\human\say.dm"
#include "code\modules\mob\living\carbon\human\status_procs.dm"
#include "code\modules\mob\living\carbon\human\update_icons.dm"
#include "code\modules\mob\living\carbon\human\whisper.dm"
#include "code\modules\mob\living\carbon\human\interactive\functions.dm"
@@ -1608,8 +1609,8 @@
#include "code\modules\mob\living\silicon\robot\robot.dm"
#include "code\modules\mob\living\silicon\robot\robot_damage.dm"
#include "code\modules\mob\living\silicon\robot\robot_items.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_module_actions.dm"
#include "code\modules\mob\living\silicon\robot\robot_modules.dm"
#include "code\modules\mob\living\silicon\robot\robot_movement.dm"
#include "code\modules\mob\living\silicon\robot\update_status.dm"
#include "code\modules\mob\living\silicon\robot\drone\drone.dm"