From e221a910492628646325ea4b608b34cb8c90ff8f Mon Sep 17 00:00:00 2001 From: NanakoAC Date: Thu, 22 Dec 2016 16:13:00 +0000 Subject: [PATCH] Nutrition fixes and tweaks (#1265) Fixes nutrition displays not updating. Adds code support for species-variable levels of max nutrition storage, and nutrition loss. No actual variations are yet implemented, awaiting input from lore team. Fixes all relevant static isntances of numeric literals with the max_nutrition variable And a feature tweak: Players will now spawn with randomised nutrition levels when they join --- code/__defines/chemistry.dm | 2 +- code/__defines/mobs.dm | 3 + .../diseases/advance/symptoms/weight.dm | 4 +- .../gamemodes/changeling/changeling_powers.dm | 2 +- code/game/machinery/rechargestation.dm | 6 +- .../living/carbon/alien/diona/diona_nymph.dm | 2 +- .../mob/living/carbon/alien/diona/life.dm | 2 +- code/modules/mob/living/carbon/carbon.dm | 4 +- code/modules/mob/living/carbon/diona_base.dm | 4 +- code/modules/mob/living/carbon/human/human.dm | 5 + .../mob/living/carbon/human/human_movement.dm | 8 +- code/modules/mob/living/carbon/human/life.dm | 169 +++++------------- .../living/carbon/human/species/species.dm | 5 +- .../mob/living/simple_animal/simple_animal.dm | 2 +- code/modules/mob/mob_defines.dm | 2 + html/changelogs/Nanako-Nutrition.yml | 36 ++++ 16 files changed, 119 insertions(+), 137 deletions(-) create mode 100644 html/changelogs/Nanako-Nutrition.yml diff --git a/code/__defines/chemistry.dm b/code/__defines/chemistry.dm index cc212c82cce..51e84a65106 100644 --- a/code/__defines/chemistry.dm +++ b/code/__defines/chemistry.dm @@ -1,4 +1,4 @@ -#define HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases + #define REM 0.2 // Means 'Reagent Effect Multiplier'. This is how many units of reagent are consumed per tick diff --git a/code/__defines/mobs.dm b/code/__defines/mobs.dm index 0859792370c..4ec106d56fa 100644 --- a/code/__defines/mobs.dm +++ b/code/__defines/mobs.dm @@ -126,6 +126,9 @@ #define GLUT_SMALLER 2 // Eat anything smaller than we are #define GLUT_ANYTHING 3 // Eat anything, ever +#define BASE_MAX_NUTRITION 400 +#define HUNGER_FACTOR 0.05 // Factor of how fast mob nutrition decreases. Moved here from chemistry define + #define TINT_NONE 0 #define TINT_MODERATE 1 #define TINT_HEAVY 2 diff --git a/code/datums/diseases/advance/symptoms/weight.dm b/code/datums/diseases/advance/symptoms/weight.dm index 4abf89240b5..1d5dabb8429 100644 --- a/code/datums/diseases/advance/symptoms/weight.dm +++ b/code/datums/diseases/advance/symptoms/weight.dm @@ -33,7 +33,7 @@ Bonus M << "[pick("You feel blubbery.", "You feel full.")]" else M.overeatduration = min(M.overeatduration + 100, 600) - M.nutrition = min(M.nutrition + 100, 500) + M.nutrition = min(M.nutrition + 100, M.max_nutrition * 1.25) return @@ -114,6 +114,6 @@ Bonus switch(A.stage) if(4, 5) M.overeatduration = 0 - M.nutrition = 400 + M.nutrition = M.max_nutrition return \ No newline at end of file diff --git a/code/game/gamemodes/changeling/changeling_powers.dm b/code/game/gamemodes/changeling/changeling_powers.dm index 366c5085147..1704d81d764 100644 --- a/code/game/gamemodes/changeling/changeling_powers.dm +++ b/code/game/gamemodes/changeling/changeling_powers.dm @@ -236,7 +236,7 @@ var/global/list/possible_changeling_IDs = list("Alpha","Beta","Gamma","Delta","E T.dna.real_name = T.real_name //Set this again, just to be sure that it's properly set. changeling.absorbed_dna |= T.dna - if(src.nutrition < 400) src.nutrition = min((src.nutrition + T.nutrition), 400) + if(src.nutrition < max_nutrition) src.nutrition = min((nutrition + T.nutrition), max_nutrition) changeling.chem_charges += 10 changeling.geneticpoints += 2 diff --git a/code/game/machinery/rechargestation.dm b/code/game/machinery/rechargestation.dm index 47d0b1008d7..0ee35951d9b 100644 --- a/code/game/machinery/rechargestation.dm +++ b/code/game/machinery/rechargestation.dm @@ -105,9 +105,9 @@ R.adjustFireLoss(-wire_rate) else if(ishuman(occupant)) var/mob/living/carbon/human/H = occupant - if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < 450) - H.nutrition = min(H.nutrition+10, 450) - cell.use(7000/450*10) + if(!isnull(H.internal_organs_by_name["cell"]) && H.nutrition < H.max_nutrition) + H.nutrition = min(H.nutrition+10, H.max_nutrition) + cell.use(7000/H.max_nutrition*10) /obj/machinery/recharge_station/examine(mob/user) diff --git a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm index e02926b06dc..1328d118c9e 100644 --- a/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm +++ b/code/modules/mob/living/carbon/alien/diona/diona_nymph.dm @@ -6,7 +6,7 @@ /mob/living/carbon/alien/diona var/datum/reagents/vessel var/list/internal_organs_by_name = list() // so internal organs have less ickiness too - var/max_nutrition = 6000 + max_nutrition = 6000 language = null var/energy_duration = 144//The time in seconds that this diona can exist in total darkness before its energy runs out var/dark_consciousness = 144//How long this diona can stay on its feet and keep moving in darkness after energy is gone. diff --git a/code/modules/mob/living/carbon/alien/diona/life.dm b/code/modules/mob/living/carbon/alien/diona/life.dm index f8e44039944..b88b1dbb66d 100644 --- a/code/modules/mob/living/carbon/alien/diona/life.dm +++ b/code/modules/mob/living/carbon/alien/diona/life.dm @@ -14,7 +14,7 @@ // nutrition decrease if (nutrition > 0 && stat != 2) - nutrition = max (0, nutrition - HUNGER_FACTOR) + nutrition = max (0, nutrition - nutrition_loss) if (nutrition > max_nutrition) nutrition = max_nutrition diff --git a/code/modules/mob/living/carbon/carbon.dm b/code/modules/mob/living/carbon/carbon.dm index 692a7b1194c..16ed79de598 100644 --- a/code/modules/mob/living/carbon/carbon.dm +++ b/code/modules/mob/living/carbon/carbon.dm @@ -36,9 +36,9 @@ . = ..() if(.) if(src.nutrition && src.stat != 2) - src.nutrition -= HUNGER_FACTOR/10 + src.nutrition -= nutrition_loss*0.1//Multiplication is faster than division if(src.m_intent == "run") - src.nutrition -= HUNGER_FACTOR/10 + src.nutrition -= nutrition_loss*0.1 if((FAT in src.mutations) && src.m_intent == "run" && src.bodytemperature <= 360) src.bodytemperature += 2 diff --git a/code/modules/mob/living/carbon/diona_base.dm b/code/modules/mob/living/carbon/diona_base.dm index b2f8dac1be7..51203359426 100644 --- a/code/modules/mob/living/carbon/diona_base.dm +++ b/code/modules/mob/living/carbon/diona_base.dm @@ -92,8 +92,8 @@ var/list/diona_banned_languages = list( if(DS.nutrient_organ.is_bruised()) plus *= 0.5 nutrition += plus - if (nutrition > 400) - nutrition = 400 + if (nutrition > max_nutrition) + nutrition = max_nutrition /mob/living/carbon/proc/diona_handle_temperature(var/datum/dionastats/DS) if (bodytemperature < TEMP_REGEN_STOP) diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm index 79c3a22db60..622ba8ffd78 100644 --- a/code/modules/mob/living/carbon/human/human.dm +++ b/code/modules/mob/living/carbon/human/human.dm @@ -1159,7 +1159,12 @@ sprint_speed_factor = species.sprint_speed_factor sprint_cost_factor = species.sprint_cost_factor stamina_recovery = species.stamina_recovery + exhaust_threshold = species.exhaust_threshold + max_nutrition = BASE_MAX_NUTRITION * species.max_nutrition_factor + nutrition = (rand(25,100)*0.01)*max_nutrition//Starting nutrition is randomised between 25-100% of max + + nutrition_loss = HUNGER_FACTOR * species.nutrition_loss_factor if(species) return 1 else diff --git a/code/modules/mob/living/carbon/human/human_movement.dm b/code/modules/mob/living/carbon/human/human_movement.dm index 08ae2b8022d..fb16cea1a6b 100644 --- a/code/modules/mob/living/carbon/human/human_movement.dm +++ b/code/modules/mob/living/carbon/human/human_movement.dm @@ -17,8 +17,12 @@ if (!(species && (species.flags & NO_PAIN))) if(halloss >= 10) tally += (halloss / 10) //halloss shouldn't slow you down if you can't even feel it - var/hungry = (500 - nutrition)/5 // So overeat would be 100 and default level would be 80 - if (hungry >= 70) tally += hungry/50 + +//Simpler hunger slowdown calculations, this should be a little faster due to no division, and more scaleable + if (nutrition < (max_nutrition * 0.4)) + tally++ + if (nutrition < (max_nutrition * 0.1)) + tally++ if(wear_suit) tally += wear_suit.slowdown diff --git a/code/modules/mob/living/carbon/human/life.dm b/code/modules/mob/living/carbon/human/life.dm index 6514c219323..25903c49024 100644 --- a/code/modules/mob/living/carbon/human/life.dm +++ b/code/modules/mob/living/carbon/human/life.dm @@ -285,60 +285,47 @@ // #TODO-MERGE: Check vaurca and IPC radiation management if (radiation) - var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs - if(rad_organ && !rad_organ.is_broken()) - var/rads = radiation/25 - radiation -= rads - nutrition += rads - adjustBruteLoss(-(rads)) - adjustFireLoss(-(rads)) - adjustOxyLoss(-(rads)) - adjustToxLoss(-(rads)) - updatehealth() - return + //var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs + if(src.is_diona()) + diona_handle_regeneration(get_dionastats()) + else + var/damage = 0 + radiation -= 1 * RADIATION_SPEED_COEFFICIENT + if(prob(25)) + damage = 1 - if (radiation) - //var/obj/item/organ/diona/nutrients/rad_organ = locate() in internal_organs - if(src.is_diona()) - diona_handle_regeneration(get_dionastats()) - else - var/damage = 0 + if (radiation > 50) + damage = 1 radiation -= 1 * RADIATION_SPEED_COEFFICIENT - if(prob(25)) - damage = 1 + if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT)) + radiation -= 5 * RADIATION_SPEED_COEFFICIENT + src << "You feel weak." + Weaken(3) + if(!lying) + emote("collapse") + if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.name == "Human") //apes go bald + if((h_style != "Bald" || f_style != "Shaved" )) + src << "Your hair falls out." + h_style = "Bald" + f_style = "Shaved" + update_hair() - if (radiation > 50) - damage = 1 - radiation -= 1 * RADIATION_SPEED_COEFFICIENT - if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT)) - radiation -= 5 * RADIATION_SPEED_COEFFICIENT - src << "You feel weak." - Weaken(3) - if(!lying) - emote("collapse") - if(prob(5) && prob(100 * RADIATION_SPEED_COEFFICIENT) && species.name == "Human") //apes go bald - if((h_style != "Bald" || f_style != "Shaved" )) - src << "Your hair falls out." - h_style = "Bald" - f_style = "Shaved" - update_hair() + if (radiation > 75) + radiation -= 1 * RADIATION_SPEED_COEFFICIENT + damage = 3 + if(prob(5)) + take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns") + if(prob(1)) + src << "You feel strange!" + adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT) + emote("gasp") - if (radiation > 75) - radiation -= 1 * RADIATION_SPEED_COEFFICIENT - damage = 3 - if(prob(5)) - take_overall_damage(0, 5 * RADIATION_SPEED_COEFFICIENT, used_weapon = "Radiation Burns") - if(prob(1)) - src << "You feel strange!" - adjustCloneLoss(5 * RADIATION_SPEED_COEFFICIENT) - emote("gasp") - - if(damage) - adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) - updatehealth() - if(organs.len) - var/obj/item/organ/external/O = pick(organs) - if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) + if(damage) + adjustToxLoss(damage * RADIATION_SPEED_COEFFICIENT) + updatehealth() + if(organs.len) + var/obj/item/organ/external/O = pick(organs) + if(istype(O)) O.add_autopsy_data("Radiation Poisoning", damage) /** breathing **/ @@ -937,58 +924,18 @@ if(status_flags & GODMODE) return 0 //godmode - var/obj/item/organ/diona/node/light_organ = locate() in internal_organs - if(light_organ && !light_organ.is_broken()) - var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing - if(isturf(loc)) //else, there's considered to be no light - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = min(10,L.lum_r + L.lum_g + L.lum_b) - 5 //hardcapped so it's not abused by having a ton of flashlights - else - light_amount = 5 - nutrition += light_amount - traumatic_shock -= light_amount - - if(species.flags & IS_PLANT) - if(nutrition > 450) - nutrition = 450 - if(light_amount >= 3) //if there's enough light, heal - adjustBruteLoss(-(round(light_amount/2))) - adjustFireLoss(-(round(light_amount/2))) - adjustToxLoss(-(light_amount)) - adjustOxyLoss(-(light_amount)) - //TODO: heal wounds, heal broken limbs. - - if(species.light_dam) - var/light_amount = 0 - if(isturf(loc)) - var/turf/T = loc - var/atom/movable/lighting_overlay/L = locate(/atom/movable/lighting_overlay) in T - if(L) - light_amount = L.lum_r + L.lum_g + L.lum_b //hardcapped so it's not abused by having a ton of flashlights - else - light_amount = 10 - if(light_amount > species.light_dam) //if there's enough light, start dying - take_overall_damage(1,1) - else //heal in the dark - heal_overall_damage(1,1) // nutrition decrease if (nutrition > 0 && stat != 2) - nutrition = max (0, nutrition - HUNGER_FACTOR) + nutrition = max (0, nutrition - nutrition_loss) - if (nutrition > 450) + if (nutrition > max_nutrition) if(overeatduration < 600) //capped so people don't take forever to unfat overeatduration++ else if(overeatduration > 1) overeatduration -= 2 //doubled the unfat rate - if(species.flags & IS_PLANT && (!light_organ || light_organ.is_broken())) - if(nutrition < 200) - take_overall_damage(2,0) - traumatic_shock++ // TODO: stomach and bloodstream organ. if(!isSynthetic()) @@ -1162,7 +1109,6 @@ handle_hud_list() // now handle what we see on our screen - if(!..()) return @@ -1197,24 +1143,7 @@ damageoverlay.overlays += I else //Oxygen damage overlay - if(oxyloss) - var/image/I - switch(oxyloss) - if(10 to 20) - I = overlays_cache[11] - if(20 to 25) - I = overlays_cache[12] - if(25 to 30) - I = overlays_cache[13] - if(30 to 35) - I = overlays_cache[14] - if(35 to 40) - I = overlays_cache[15] - if(40 to 45) - I = overlays_cache[16] - if(45 to INFINITY) - I = overlays_cache[17] - damageoverlay.overlays += I + update_oxy_overlay() // Vampire frenzy overlay. if (mind.vampire) @@ -1247,8 +1176,7 @@ see_in_dark = 8 if(!druggy) see_invisible = SEE_INVISIBLE_LEVEL_TWO if(healths) healths.icon_state = "health7" //DEAD healthmeter - // #TODO-MERGE: Check the indentation of this file! It's awful! - if(healths) + // #TODO-MERGE: Check the indentation of this file! It's awful! if(client.view != world.view) // If mob dies while zoomed in with device, unzoom them. for(var/obj/item/item in contents) if(item.zoom) @@ -1299,13 +1227,14 @@ update_health_display() - - if(nutrition_icon) - switch(nutrition) - if(450 to INFINITY) nutrition_icon.icon_state = "nutrition0" - if(350 to 450) nutrition_icon.icon_state = "nutrition1" - if(250 to 350) nutrition_icon.icon_state = "nutrition2" - if(150 to 250) nutrition_icon.icon_state = "nutrition3" + //Update hunger UI less often, its not important + if((life_tick % 3 == 0) && nutrition_icon) + var/nut_factor = max(1,nutrition) / max_nutrition + switch(nut_factor) + if(1 to INFINITY) nutrition_icon.icon_state = "nutrition0" + if(0.75 to 1) nutrition_icon.icon_state = "nutrition1" + if(0.5 to 0.75) nutrition_icon.icon_state = "nutrition2" + if(0.25 to 0.5) nutrition_icon.icon_state = "nutrition3" else nutrition_icon.icon_state = "nutrition4" if(pressure) diff --git a/code/modules/mob/living/carbon/human/species/species.dm b/code/modules/mob/living/carbon/human/species/species.dm index 21fa847af3c..bfd54d1e784 100644 --- a/code/modules/mob/living/carbon/human/species/species.dm +++ b/code/modules/mob/living/carbon/human/species/species.dm @@ -122,7 +122,6 @@ var/primitive_form // Lesser form, if any (ie. monkey for humans) var/greater_form // Greater form, if any, ie. human for monkeys. var/holder_type - var/gluttonous // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING. var/rarity_value = 1 // Relative rarity/collector value for this species. var/ethanol_resistance = 1 // How well the mob resists alcohol, lower values get drunk faster, higher values need to drink more @@ -132,6 +131,10 @@ var/sprint_cost_factor = 0.9 // Multiplier on stamina cost for sprinting var/exhaust_threshold = 50 // When stamina runs out, the mob takes oxyloss up til this value. Then collapses and drops to walk + var/gluttonous // Can eat some mobs. Values can be GLUT_TINY, GLUT_SMALLER, GLUT_ANYTHING. + var/max_nutrition_factor = 1 //Multiplier on maximum nutrition + var/nutrition_loss_factor = 1 //Multiplier on passive nutrition losses + // Determines the organs that the species spawns with and var/list/has_organ = list( // which required-organ checks are conducted. "heart" = /obj/item/organ/heart, diff --git a/code/modules/mob/living/simple_animal/simple_animal.dm b/code/modules/mob/living/simple_animal/simple_animal.dm index ac5544560c5..2bedb4f7a4a 100644 --- a/code/modules/mob/living/simple_animal/simple_animal.dm +++ b/code/modules/mob/living/simple_animal/simple_animal.dm @@ -71,7 +71,7 @@ //Hunger/feeding vars var/hunger_enabled = 1//If set to 0, a creature ignores hunger - var/max_nutrition = 50 + max_nutrition = 50 var/metabolic_factor = 1//A multiplier on how fast nutrition is lost. used to tweak the rates on a per-animal basis var/nutrition_step = 0.2 //nutrition lost per tick and per step, calculated from mob_size, 0.2 is a fallback var/bite_factor = 0.4 diff --git a/code/modules/mob/mob_defines.dm b/code/modules/mob/mob_defines.dm index 118a98ca3e4..e42c5231ae2 100644 --- a/code/modules/mob/mob_defines.dm +++ b/code/modules/mob/mob_defines.dm @@ -108,6 +108,8 @@ var/drowsyness = 0.0//Carbon var/charges = 0.0 var/nutrition = 400.0//Carbon + var/nutrition_loss = HUNGER_FACTOR//How much hunger is lost per tick. This is modified by species + var/max_nutrition = 400 var/overeatduration = 0 // How long this guy is overeating //Carbon var/paralysis = 0.0 diff --git a/html/changelogs/Nanako-Nutrition.yml b/html/changelogs/Nanako-Nutrition.yml new file mode 100644 index 00000000000..1a87562bd17 --- /dev/null +++ b/html/changelogs/Nanako-Nutrition.yml @@ -0,0 +1,36 @@ +################################ +# Example Changelog File +# +# Note: This file, and files beginning with ".", and files that don't end in ".yml" will not be read. If you change this file, you will look really dumb. +# +# Your changelog will be merged with a master changelog. (New stuff added only, and only on the date entry for the day it was merged.) +# When it is, any changes listed below will disappear. +# +# Valid Prefixes: +# bugfix +# wip (For works in progress) +# tweak +# soundadd +# sounddel +# rscadd (general adding of nice things) +# rscdel (general deleting of nice things) +# imageadd +# imagedel +# maptweak +# spellcheck (typo fixes) +# experiment +################################# + +# Your name. +author: Nanako + +# Optional: Remove this file after generating master changelog. Useful for PR changelogs that won't get used again. +delete-after: True + +# Any changes you've made. See valid prefix list above. +# INDENT WITH TWO SPACES. NOT TABS. SPACES. +# SCREW THIS UP AND IT WON'T WORK. +# Also, all entries are changed into a single [] after a master changelog generation. Just remove the brackets when you add new entries. +# Please surround your changes in double quotes ("), as certain characters otherwise screws up compiling. The quotes will not show up in the changelog. +changes: + - tweak: "Nutrition is now randomised on spawning"