[MIRROR] /mob/living/proc/Life(delta_time) (#3509)

* /mob/living/proc/Life(delta_time)

* a

Co-authored-by: TemporalOroboros <TemporalOroboros@gmail.com>
Co-authored-by: Gandalf2k15 <jzo123@hotmail.com>
This commit is contained in:
SkyratBot
2021-02-19 17:55:52 +01:00
committed by GitHub
parent b3802820c1
commit d0dc199815
199 changed files with 2975 additions and 2853 deletions

View File

@@ -162,9 +162,9 @@
//organ defines
#define STANDARD_ORGAN_THRESHOLD 100
#define STANDARD_ORGAN_HEALING 0.001
#define STANDARD_ORGAN_HEALING 0.0005
/// designed to fail organs when left to decay for ~15 minutes
#define STANDARD_ORGAN_DECAY 0.00222
#define STANDARD_ORGAN_DECAY 0.00111
//used for the can_chromosome var on mutations
#define CHROMOSOME_NEVER 0

View File

@@ -9,7 +9,7 @@
#define META_GAS_OVERLAY 4
#define META_GAS_DANGER 5
#define META_GAS_ID 6
#define META_GAS_FUSION_POWER 7
#define META_GAS_FUSION_POWER 7
//ATMOS
//stuff you should probably leave well alone!
/// kPa*L/(K*mol)
@@ -149,9 +149,9 @@
/// The natural temperature for a body
#define BODYTEMP_NORMAL 310.15
/// This is the divisor which handles how much of the temperature difference between the current body temperature and 310.15K (optimal temperature) humans auto-regenerate each tick. The higher the number, the slower the recovery. This is applied each tick, so long as the mob is alive.
#define BODYTEMP_AUTORECOVERY_DIVISOR 14
#define BODYTEMP_AUTORECOVERY_DIVISOR 28
/// Minimum amount of kelvin moved toward 310K per tick. So long as abs(310.15 - bodytemp) is more than 50.
#define BODYTEMP_AUTORECOVERY_MINIMUM 6
#define BODYTEMP_AUTORECOVERY_MINIMUM 3
///Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is lower than their body temperature. Make it lower to lose bodytemp faster.
#define BODYTEMP_COLD_DIVISOR 15
/// Similar to the BODYTEMP_AUTORECOVERY_DIVISOR, but this is the divisor which is applied at the stage that follows autorecovery. This is the divisor which comes into play when the human's loc temperature is higher than their body temperature. Make it lower to gain bodytemp faster.
@@ -216,10 +216,10 @@
#define SHOES_MAX_TEMP_PROTECT 1500
/// The amount of pressure damage someone takes is equal to (pressure / HAZARD_HIGH_PRESSURE)*PRESSURE_DAMAGE_COEFFICIENT, with the maximum of MAX_PRESSURE_DAMAGE
#define PRESSURE_DAMAGE_COEFFICIENT 4
#define MAX_HIGH_PRESSURE_DAMAGE 4
#define PRESSURE_DAMAGE_COEFFICIENT 2
#define MAX_HIGH_PRESSURE_DAMAGE 2
/// The amount of damage someone takes when in a low pressure area (The pressure threshold is so low that it doesn't make sense to do any calculations, so it just applies this flat value).
#define LOW_PRESSURE_DAMAGE 4
#define LOW_PRESSURE_DAMAGE 2
/// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
#define COLD_SLOWDOWN_FACTOR 20

View File

@@ -104,6 +104,6 @@
#define BLOBMOB_BLOBBERNAUT_DMG_UPPER 4
#define BLOBMOB_BLOBBERNAUT_REAGENTATK_VOL 20 // Amounts of strain reagents applied on attack -- basically the main damage stat
#define BLOBMOB_BLOBBERNAUT_DMG_OBJ 60 // Damage dealth to objects/machines
#define BLOBMOB_BLOBBERNAUT_HEALING_CORE 0.1 // Percentage multiplier HP restored on Life() when within 2 tiles of the blob core
#define BLOBMOB_BLOBBERNAUT_HEALING_NODE 0.05 // Same, but for a nearby node
#define BLOBMOB_BLOBBERNAUT_HEALTH_DECAY 0.025 // Percentage multiplier HP lost when not near blob tiles or without factory
#define BLOBMOB_BLOBBERNAUT_HEALING_CORE 0.05 // Percentage multiplier HP restored on Life() when within 2 tiles of the blob core
#define BLOBMOB_BLOBBERNAUT_HEALING_NODE 0.025 // Same, but for a nearby node
#define BLOBMOB_BLOBBERNAUT_HEALTH_DECAY 0.0125 // Percentage multiplier HP lost when not near blob tiles or without factory

View File

@@ -474,7 +474,12 @@ GLOBAL_LIST_INIT(pda_styles, sortList(list(MONO, VT, ORBITRON, SHARE)))
#define GAUSSIAN_BLUR(filter_size) filter(type="blur", size=filter_size)
#define STANDARD_GRAVITY 1 //Anything above this is high gravity, anything below no grav
#define GRAVITY_DAMAGE_TRESHOLD 3 //Starting with this value gravity will start to damage mobs
/// The gravity strength threshold for high gravity damage.
#define GRAVITY_DAMAGE_THRESHOLD 3
/// The scaling factor for high gravity damage.
#define GRAVITY_DAMAGE_SCALING 0.5
/// The maximum [BRUTE] damage a mob can take from high gravity per second.
#define GRAVITY_DAMAGE_MAXIMUM 1.5
#define CAMERA_NO_GHOSTS 0
#define CAMERA_SEE_GHOSTS_BASIC 1

View File

@@ -28,6 +28,9 @@
#define BLOOD_VOLUME_BAD 224
#define BLOOD_VOLUME_SURVIVE 122
/// How efficiently humans regenerate blood.
#define BLOOD_REGEN_FACTOR 0.25
//Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0
#define MOB_SIZE_SMALL 1
@@ -71,17 +74,17 @@
#define MAX_LIVING_HEALTH 100
#define HUMAN_MAX_OXYLOSS 3
#define HUMAN_CRIT_MAX_OXYLOSS (SSmobs.wait/30)
#define HUMAN_CRIT_MAX_OXYLOSS (SSMOBS_DT/3)
#define STAMINA_REGEN_BLOCK_TIME (10 SECONDS)
#define HEAT_DAMAGE_LEVEL_1 2 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 3 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 8 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
#define HEAT_DAMAGE_LEVEL_1 1 //Amount of damage applied when your body temperature just passes the 360.15k safety point
#define HEAT_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 400K point
#define HEAT_DAMAGE_LEVEL_3 4 //Amount of damage applied when your body temperature passes the 460K point and you are on fire
#define COLD_DAMAGE_LEVEL_1 0.5 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 1.5 //Amount of damage applied when your body temperature passes the 200K point
#define COLD_DAMAGE_LEVEL_3 3 //Amount of damage applied when your body temperature passes the 120K point
#define COLD_DAMAGE_LEVEL_1 0.25 //Amount of damage applied when your body temperature just passes the 260.15k safety point
#define COLD_DAMAGE_LEVEL_2 0.75 //Amount of damage applied when your body temperature passes the 200K point
#define COLD_DAMAGE_LEVEL_3 1.5 //Amount of damage applied when your body temperature passes the 120K point
//Note that gas heat damage is only applied once every FOUR ticks.
#define HEAT_GAS_DAMAGE_LEVEL_1 2 //Amount of damage applied when the current breath's temperature just passes the 360.15k safety point
@@ -297,9 +300,9 @@
#define POCKET_STRIP_DELAY 40 //time taken (in deciseconds) to search somebody's pockets
#define DOOR_CRUSH_DAMAGE 15 //the amount of damage that airlocks deal when they crush you
#define HUNGER_FACTOR 0.1 //factor at which mob nutrition decreases
#define ETHEREAL_CHARGE_FACTOR 1.6 //factor at which ethereal's charge decreases
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default.
#define HUNGER_FACTOR 0.05 //factor at which mob nutrition decreases
#define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second
#define REAGENTS_METABOLISM 0.2 //How many units of reagent are consumed per second, by default.
#define REAGENTS_EFFECT_MULTIPLIER (REAGENTS_METABOLISM / 0.4) // By defining the effect multiplier this way, it'll exactly adjust all effects according to how they originally were with the 0.4 metabolism
// Eye protection

View File

@@ -11,10 +11,11 @@ Ask ninjanomnom if they're around
#define RAD_MOB_COEFFICIENT 0.20 // Radiation applied is multiplied by this
#define RAD_MOB_SKIN_PROTECTION ((1/RAD_MOB_COEFFICIENT)+RAD_BACKGROUND_RADIATION)
#define RAD_LOSS_PER_TICK 0.5
#define RAD_TOX_COEFFICIENT 0.08 // Toxin damage per tick coefficient
#define RAD_LOSS_PER_SECOND 0.25
/// Toxin damage per second coefficient
#define RAD_TOX_COEFFICIENT 0.04
#define RAD_OVERDOSE_REDUCTION 0.000001 // Coefficient to the reduction in applied rads once the thing, usualy mob, has too much radiation
// WARNING: This number is highly sensitive to change, graph is first for best results
// WARNING: This number is highly sensitive to change, graph is first for best results
#define RAD_BURN_THRESHOLD 1000 // Applied radiation must be over this to burn
//Holy shit test after you tweak anything it's said like 6 times in here
//You probably want to plot any tweaks you make so you can see the curves visually
@@ -22,18 +23,30 @@ Ask ninjanomnom if they're around
#define RAD_BURN_LOG_GRADIENT 10000
#define RAD_BURN_CURVE(X) log(1+((X-RAD_BURN_THRESHOLD)/RAD_BURN_LOG_GRADIENT))/log(RAD_BURN_LOG_BASE)
#define RAD_MOB_SAFE 500 // How much stored radiation in a mob with no ill effects
/// How much stored radiation in a mob with no ill effects
#define RAD_MOB_SAFE 500
#define RAD_MOB_HAIRLOSS 800 // How much stored radiation to check for hair loss
/// How much stored radiation to check for hair loss
#define RAD_MOB_HAIRLOSS 800
/// Chance of you hair starting to fall out every second when over threshold
#define RAD_MOB_HAIRLOSS_PROB 7.5
#define RAD_MOB_MUTATE 1250 // How much stored radiation to check for mutation
/// How much stored radiation to check for mutation
#define RAD_MOB_MUTATE 1250
/// Chance of randomly mutating every second when over threshold
#define RAD_MOB_MUTATE_PROB 0.5
#define RAD_MOB_VOMIT 2000 // The amount of radiation to check for vomitting
#define RAD_MOB_VOMIT_PROB 1 // Chance per tick of vomitting
/// The amount of radiation to check for vomitting
#define RAD_MOB_VOMIT 2000
/// Chance per second of vomitting
#define RAD_MOB_VOMIT_PROB 0.5
#define RAD_MOB_KNOCKDOWN 2000 // How much stored radiation to check for stunning
#define RAD_MOB_KNOCKDOWN_PROB 1 // Chance of knockdown per tick when over threshold
#define RAD_MOB_KNOCKDOWN_AMOUNT 3 // Amount of knockdown when it occurs
/// How much stored radiation to check for stunning
#define RAD_MOB_KNOCKDOWN 2000
/// Chance of knockdown per second when over threshold
#define RAD_MOB_KNOCKDOWN_PROB 0.5
/// Amount of knockdown when it occurs
#define RAD_MOB_KNOCKDOWN_AMOUNT 3
#define RAD_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason
#define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have

View File

@@ -80,12 +80,12 @@ GLOBAL_LIST_INIT(global_all_wound_types, list(/datum/wound/blunt/critical, /datu
// ~random wound balance defines
/// how quickly sanitization removes infestation and decays per tick
#define WOUND_BURN_SANITIZATION_RATE 0.15
/// how much blood you can lose per tick per slash max. 8 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_SLASH_MAX_BLOODFLOW 8
/// how quickly sanitization removes infestation and decays per second
#define WOUND_BURN_SANITIZATION_RATE 0.075
/// how much blood you can lose per second per slash max. 4 is a LOT of blood for one cut so don't worry about hitting it easily
#define WOUND_SLASH_MAX_BLOODFLOW 4
/// dead people don't bleed, but they can clot! this is the minimum amount of clotting per tick on dead people, so even critical cuts will slowly clot in dead people
#define WOUND_SLASH_DEAD_CLOT_MIN 0.05
#define WOUND_SLASH_DEAD_CLOT_MIN 0.025
/// if we suffer a bone wound to the head that creates brain traumas, the timer for the trauma cycle is +/- by this percent (0-100)
#define WOUND_BONE_HEAD_TIME_VARIANCE 20

View File

@@ -642,8 +642,8 @@ GLOBAL_LIST_EMPTY(species_list)
*/
/proc/get_temp_change_amount(temp_diff, change_rate = 0.06)
if(temp_diff < 0)
return (log((temp_diff * -1) * change_rate + 1) * BODYTEMP_AUTORECOVERY_DIVISOR) * -1
return log(temp_diff * change_rate + 1) * BODYTEMP_AUTORECOVERY_DIVISOR
return -(BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 - (temp_diff * change_rate))
return (BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 + (temp_diff * change_rate))
#define ISADVANCEDTOOLUSER(mob) (HAS_TRAIT(mob, TRAIT_ADVANCEDTOOLUSER) && !HAS_TRAIT(mob, TRAIT_MONKEYLIKE))

View File

@@ -32,11 +32,12 @@ SUBSYSTEM_DEF(mobs)
//cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun
var/times_fired = src.times_fired
var/delta_time = wait / (1 SECONDS) // TODO: Make this actually responsive to stuff like pausing and resuming
while(currentrun.len)
var/mob/living/L = currentrun[currentrun.len]
currentrun.len--
if(L)
L.Life(times_fired)
L.Life(delta_time, times_fired)
else
GLOB.mob_living_list.Remove(L)
if (MC_TICK_CHECK)

View File

@@ -25,7 +25,7 @@
return ..()
//Called on life ticks
/datum/brain_trauma/proc/on_life()
/datum/brain_trauma/proc/on_life(delta_time, times_fired)
return
//Called on death

View File

@@ -36,7 +36,7 @@
antagonist.greet()
RegisterSignal(owner, COMSIG_CARBON_HUG, .proc/on_hug)
/datum/brain_trauma/special/obsessed/on_life()
/datum/brain_trauma/special/obsessed/on_life(delta_time, times_fired)
if(!obsession || obsession.stat == DEAD)
viewing = FALSE//important, makes sure you no longer stutter when happy if you murdered them while viewing
return
@@ -50,10 +50,10 @@
viewing = FALSE
if(viewing)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/creeping, obsession.name)
total_time_creeping += 20
total_time_creeping += delta_time SECONDS
time_spent_away = 0
if(attachedobsessedobj)//if an objective needs to tick down, we can do that since traumas coexist with the antagonist datum
attachedobsessedobj.timer -= 20 //mob subsystem ticks every 2 seconds(?), remove 20 deciseconds from the timer. sure, that makes sense.
attachedobsessedobj.timer -= delta_time SECONDS //mob subsystem ticks every 2 seconds(?), remove 20 deciseconds from the timer. sure, that makes sense.
else
out_of_view()

View File

@@ -43,9 +43,9 @@
owner.clear_alert("hypnosis")
..()
/datum/brain_trauma/hypnosis/on_life()
/datum/brain_trauma/hypnosis/on_life(delta_time, times_fired)
..()
if(prob(2))
if(DT_PROB(1, delta_time))
switch(rand(1,2))
if(1)
to_chat(owner, "<span class='hypnophrase'><i>...[lowertext(hypnotic_phrase)]...</i></span>")

View File

@@ -16,7 +16,7 @@
make_friend()
get_ghost()
/datum/brain_trauma/special/imaginary_friend/on_life()
/datum/brain_trauma/special/imaginary_friend/on_life(delta_time, times_fired)
if(get_dist(owner, friend) > 9)
friend.recall()
if(!friend)

View File

@@ -11,18 +11,23 @@
scan_desc = "light hypersensitivity"
gain_text = "<span class='warning'>You feel a craving for darkness.</span>"
lose_text = "<span class='notice'>Light no longer bothers you.</span>"
/// Cooldown to prevent warning spam
COOLDOWN_DECLARE(damage_warning_cooldown)
var/next_damage_warning = 0
/datum/brain_trauma/magic/lumiphobia/on_life()
/datum/brain_trauma/magic/lumiphobia/on_life(delta_time, times_fired)
..()
var/turf/T = owner.loc
if(istype(T))
var/light_amount = T.get_lumcount()
if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
if(world.time > next_damage_warning)
to_chat(owner, "<span class='warning'><b>The light burns you!</b></span>")
next_damage_warning = world.time + 100 //Avoid spamming
owner.take_overall_damage(0,3)
if(!istype(T))
return
if(T.get_lumcount() <= SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
return
if(COOLDOWN_FINISHED(src, damage_warning_cooldown))
to_chat(owner, "<span class='warning'><b>The light burns you!</b></span>")
COOLDOWN_START(src, damage_warning_cooldown, 10 SECONDS)
owner.take_overall_damage(0, 1.5 * delta_time)
/datum/brain_trauma/magic/poltergeist
name = "Poltergeist"
@@ -31,19 +36,21 @@
gain_text = "<span class='warning'>You feel a hateful presence close to you.</span>"
lose_text = "<span class='notice'>You feel the hateful presence fade away.</span>"
/datum/brain_trauma/magic/poltergeist/on_life()
/datum/brain_trauma/magic/poltergeist/on_life(delta_time, times_fired)
..()
if(prob(4))
var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else
var/obj/item/throwing
for(var/obj/item/I in view(5, get_turf(owner)))
if(I.anchored)
continue
if(I.throwforce > most_violent)
most_violent = I.throwforce
throwing = I
if(throwing)
throwing.throw_at(owner, 8, 2)
if(!DT_PROB(2, delta_time))
return
var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else
var/obj/item/throwing
for(var/obj/item/I in view(5, get_turf(owner)))
if(I.anchored)
continue
if(I.throwforce > most_violent)
most_violent = I.throwforce
throwing = I
if(throwing)
throwing.throw_at(owner, 8, 2)
/datum/brain_trauma/magic/antimagic
name = "Athaumasia"
@@ -81,7 +88,7 @@
QDEL_NULL(stalker)
..()
/datum/brain_trauma/magic/stalker/on_life()
/datum/brain_trauma/magic/stalker/on_life(delta_time, times_fired)
// Dead and unconscious people are not interesting to the psychic stalker.
if(owner.stat != CONSCIOUS)
return
@@ -95,7 +102,7 @@
playsound(owner, 'sound/magic/demon_attack1.ogg', 50)
owner.visible_message("<span class='warning'>[owner] is torn apart by invisible claws!</span>", "<span class='userdanger'>Ghostly claws tear your body apart!</span>")
owner.take_bodypart_damage(rand(20, 45), wound_bonus=CANT_WOUND)
else if(prob(50))
else if(DT_PROB(30, delta_time))
stalker.forceMove(get_step_towards(stalker, owner))
if(get_dist(owner, stalker) <= 8)
if(!close_stalker)

View File

@@ -11,7 +11,7 @@
gain_text = "<span class='warning'>You feel your grip on reality slipping...</span>"
lose_text = "<span class='notice'>You feel more grounded.</span>"
/datum/brain_trauma/mild/hallucinations/on_life()
/datum/brain_trauma/mild/hallucinations/on_life(delta_time, times_fired)
owner.hallucination = min(owner.hallucination + 10, 50)
..()
@@ -26,7 +26,7 @@
gain_text = "<span class='warning'>Speaking clearly is getting harder.</span>"
lose_text = "<span class='notice'>You feel in control of your speech.</span>"
/datum/brain_trauma/mild/stuttering/on_life()
/datum/brain_trauma/mild/stuttering/on_life(delta_time, times_fired)
owner.stuttering = min(owner.stuttering + 5, 25)
..()
@@ -46,16 +46,12 @@
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "dumb", /datum/mood_event/oblivious)
..()
/datum/brain_trauma/mild/dumbness/on_life()
/datum/brain_trauma/mild/dumbness/on_life(delta_time, times_fired)
owner.derpspeech = min(owner.derpspeech + 5, 25)
if(prob(3))
if(DT_PROB(1.5, delta_time))
owner.emote("drool")
//SKYRAT EDIT REMOVAL BEGIN - LRP
/*
else if(owner.stat == CONSCIOUS && prob(3))
else if(owner.stat == CONSCIOUS && DT_PROB(1.5, delta_time))
owner.say(pick_list_replacements(BRAIN_DAMAGE_FILE, "brain_damage"), forced = "brain damage")
*/
//SKYRAT EDIT END
..()
/datum/brain_trauma/mild/dumbness/on_lose()
@@ -86,8 +82,8 @@
gain_text = "<span class='warning'>Your head hurts!</span>"
lose_text = "<span class='notice'>The pressure inside your head starts fading.</span>"
/datum/brain_trauma/mild/concussion/on_life()
if(prob(5))
/datum/brain_trauma/mild/concussion/on_life(delta_time, times_fired)
if(DT_PROB(2.5, delta_time))
switch(rand(1,11))
if(1)
owner.vomit()
@@ -118,9 +114,9 @@
owner.set_screwyhud(SCREWYHUD_HEALTHY)
..()
/datum/brain_trauma/mild/healthy/on_life()
/datum/brain_trauma/mild/healthy/on_life(delta_time, times_fired)
owner.set_screwyhud(SCREWYHUD_HEALTHY) //just in case of hallucinations
owner.adjustStaminaLoss(-5) //no pain, no fatigue
owner.adjustStaminaLoss(-2.5 * delta_time) //no pain, no fatigue
..()
/datum/brain_trauma/mild/healthy/on_lose()
@@ -134,11 +130,11 @@
gain_text = "<span class='warning'>Your muscles feel oddly faint.</span>"
lose_text = "<span class='notice'>You feel in control of your muscles again.</span>"
/datum/brain_trauma/mild/muscle_weakness/on_life()
/datum/brain_trauma/mild/muscle_weakness/on_life(delta_time, times_fired)
var/fall_chance = 1
if(owner.m_intent == MOVE_INTENT_RUN)
fall_chance += 2
if(prob(fall_chance) && owner.body_position == STANDING_UP)
if(DT_PROB(0.5 * fall_chance, delta_time) && owner.body_position == STANDING_UP)
to_chat(owner, "<span class='warning'>Your leg gives out!</span>")
owner.Paralyze(35)
@@ -146,10 +142,10 @@
var/drop_chance = 1
var/obj/item/I = owner.get_active_held_item()
drop_chance += I.w_class
if(prob(drop_chance) && owner.dropItemToGround(I))
if(DT_PROB(0.5 * drop_chance, delta_time) && owner.dropItemToGround(I))
to_chat(owner, "<span class='warning'>You drop [I]!</span>")
else if(prob(3))
else if(DT_PROB(1.5, delta_time))
to_chat(owner, "<span class='warning'>You feel a sudden weakness in your muscles!</span>")
owner.adjustStaminaLoss(50)
..()
@@ -176,8 +172,8 @@
gain_text = "<span class='warning'>Your throat itches incessantly...</span>"
lose_text = "<span class='notice'>Your throat stops itching.</span>"
/datum/brain_trauma/mild/nervous_cough/on_life()
if(prob(12) && !HAS_TRAIT(owner, TRAIT_SOOTHED_THROAT))
/datum/brain_trauma/mild/nervous_cough/on_life(delta_time, times_fired)
if(DT_PROB(6, delta_time) && !HAS_TRAIT(owner, TRAIT_SOOTHED_THROAT))
if(prob(5))
to_chat(owner, "<span notice='warning'>[pick("You have a coughing fit!", "You can't stop coughing!")]</span>")
owner.Immobilize(20)

View File

@@ -5,8 +5,11 @@
gain_text = "<span class='warning'>You start finding default values very unnerving...</span>"
lose_text = "<span class='notice'>You no longer feel afraid of default values.</span>"
var/phobia_type
var/next_check = 0
var/next_scare = 0
/// Cooldown for proximity checks so we don't spam a range 7 view every two seconds.
COOLDOWN_DECLARE(check_cooldown)
/// Cooldown for freakouts to prevent permastunning.
COOLDOWN_DECLARE(scare_cooldown)
var/regex/trigger_regex
//instead of cycling every atom, only cycle the relevant types
var/list/trigger_mobs
@@ -31,50 +34,51 @@
trigger_species = SStraumas.phobia_species[phobia_type]
..()
/datum/brain_trauma/mild/phobia/on_life()
/datum/brain_trauma/mild/phobia/on_life(delta_time, times_fired)
..()
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return
if(owner.is_blind())
return
if(world.time > next_check && world.time > next_scare)
next_check = world.time + 50
var/list/seen_atoms = view(7, owner)
if(LAZYLEN(trigger_objs))
for(var/obj/O in seen_atoms)
if(is_type_in_typecache(O, trigger_objs))
freak_out(O)
return
for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items
for(var/X in HU.get_all_slots() | HU.held_items)
var/obj/I = X
if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs))
freak_out(I)
return
if(!COOLDOWN_FINISHED(src, check_cooldown) || !COOLDOWN_FINISHED(src, scare_cooldown))
return
if(LAZYLEN(trigger_turfs))
for(var/turf/T in seen_atoms)
if(is_type_in_typecache(T, trigger_turfs))
freak_out(T)
COOLDOWN_START(src, check_cooldown, 5 SECONDS)
var/list/seen_atoms = view(7, owner)
if(LAZYLEN(trigger_objs))
for(var/obj/O in seen_atoms)
if(is_type_in_typecache(O, trigger_objs))
freak_out(O)
return
for(var/mob/living/carbon/human/HU in seen_atoms) //check equipment for trigger items
for(var/X in HU.get_all_slots() | HU.held_items)
var/obj/I = X
if(!QDELETED(I) && is_type_in_typecache(I, trigger_objs))
freak_out(I)
return
seen_atoms -= owner //make sure they aren't afraid of themselves.
if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species))
for(var/mob/M in seen_atoms)
if(is_type_in_typecache(M, trigger_mobs))
freak_out(M)
if(LAZYLEN(trigger_turfs))
for(var/turf/T in seen_atoms)
if(is_type_in_typecache(T, trigger_turfs))
freak_out(T)
return
seen_atoms -= owner //make sure they aren't afraid of themselves.
if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species))
for(var/mob/M in seen_atoms)
if(is_type_in_typecache(M, trigger_mobs))
freak_out(M)
return
else if(ishuman(M)) //check their species
var/mob/living/carbon/human/H = M
if(LAZYLEN(trigger_species) && H.dna && H.dna.species && is_type_in_typecache(H.dna.species, trigger_species))
freak_out(H)
return
else if(ishuman(M)) //check their species
var/mob/living/carbon/human/H = M
if(LAZYLEN(trigger_species) && H.dna && H.dna.species && is_type_in_typecache(H.dna.species, trigger_species))
freak_out(H)
return
/datum/brain_trauma/mild/phobia/handle_hearing(datum/source, list/hearing_args)
if(!owner.can_hear() || world.time < next_scare) //words can't trigger you if you can't hear them *taps head*
if(!owner.can_hear() || !COOLDOWN_FINISHED(src, scare_cooldown)) //words can't trigger you if you can't hear them *taps head*
return
if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return
@@ -92,7 +96,7 @@
speech_args[SPEECH_MESSAGE] = ""
/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word)
next_scare = world.time + 120
COOLDOWN_START(src, scare_cooldown, 12 SECONDS)
if(owner.stat == DEAD)
return
var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine")

View File

@@ -124,7 +124,7 @@
gain_text = "<span class='warning'>You have a constant feeling of drowsiness...</span>"
lose_text = "<span class='notice'>You feel awake and aware again.</span>"
/datum/brain_trauma/severe/narcolepsy/on_life()
/datum/brain_trauma/severe/narcolepsy/on_life(delta_time, times_fired)
..()
if(owner.IsSleeping())
return
@@ -133,10 +133,10 @@
sleep_chance += 2
if(owner.drowsyness)
sleep_chance += 3
if(prob(sleep_chance))
if(DT_PROB(0.5 * sleep_chance, delta_time))
to_chat(owner, "<span class='warning'>You fall asleep.</span>")
owner.Sleeping(60)
else if(!owner.drowsyness && prob(sleep_chance * 2))
else if(!owner.drowsyness && DT_PROB(sleep_chance, delta_time))
to_chat(owner, "<span class='warning'>You feel tired...</span>")
owner.drowsyness += 10
@@ -155,14 +155,14 @@
else
to_chat(owner, "<span class='notice'>You feel safe, as long as you have people around you.</span>")
/datum/brain_trauma/severe/monophobia/on_life()
/datum/brain_trauma/severe/monophobia/on_life(delta_time, times_fired)
..()
if(check_alone())
stress = min(stress + 0.5, 100)
if(stress > 10 && (prob(5)))
if(stress > 10 && DT_PROB(2.5, delta_time))
stress_reaction()
else
stress = max(stress - 4, 0)
stress = max(stress - (2 * delta_time), 0)
/datum/brain_trauma/severe/monophobia/proc/check_alone()
if(owner.is_blind())
@@ -260,9 +260,9 @@
..()
owner.remove_status_effect(/datum/status_effect/trance)
/datum/brain_trauma/severe/hypnotic_stupor/on_life()
/datum/brain_trauma/severe/hypnotic_stupor/on_life(delta_time, times_fired)
..()
if(prob(1) && !owner.has_status_effect(/datum/status_effect/trance))
if(DT_PROB(0.5, delta_time) && !owner.has_status_effect(/datum/status_effect/trance))
owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE)
/datum/brain_trauma/severe/hypnotic_trigger

View File

@@ -10,9 +10,9 @@
gain_text = "<span class='notice'>You feel a higher power inside your mind...</span>"
lose_text = "<span class='warning'>The divine presence leaves your head, no longer interested.</span>"
/datum/brain_trauma/special/godwoken/on_life()
/datum/brain_trauma/special/godwoken/on_life(delta_time, times_fired)
..()
if(prob(4))
if(DT_PROB(2, delta_time))
if(prob(33) && (owner.IsStun() || owner.IsParalyzed() || owner.IsUnconscious()))
speak("unstun", TRUE)
else if(prob(60) && owner.health <= owner.crit_threshold)
@@ -53,42 +53,47 @@
scan_desc = "bluespace attunement"
gain_text = "<span class='notice'>You feel the bluespace pulsing around you...</span>"
lose_text = "<span class='warning'>The faint pulsing of bluespace fades into silence.</span>"
var/next_portal = 0
/// Cooldown so we can't teleport literally everywhere on a whim
COOLDOWN_DECLARE(portal_cooldown)
/datum/brain_trauma/special/bluespace_prophet/on_life()
if(world.time > next_portal)
next_portal = world.time + 100
var/list/turf/possible_turfs = list()
for(var/turf/T in range(owner, 8))
if(!T.density)
var/clear = TRUE
for(var/obj/O in T)
if(O.density)
clear = FALSE
break
if(clear)
possible_turfs += T
/datum/brain_trauma/special/bluespace_prophet/on_life(delta_time, times_fired)
if(!COOLDOWN_FINISHED(src, portal_cooldown))
return
if(!LAZYLEN(possible_turfs))
return
COOLDOWN_START(src, portal_cooldown, 10 SECONDS)
var/list/turf/possible_turfs = list()
for(var/turf/T in range(owner, 8))
if(T.density)
continue
var/turf/first_turf = pick(possible_turfs)
if(!first_turf)
return
var/clear = TRUE
for(var/obj/O in T)
if(O.density)
clear = FALSE
break
if(clear)
possible_turfs += T
possible_turfs -= (possible_turfs & range(first_turf, 3))
if(!LAZYLEN(possible_turfs))
return
var/turf/second_turf = pick(possible_turfs)
if(!second_turf)
return
var/turf/first_turf = pick(possible_turfs)
if(!first_turf)
return
var/obj/effect/hallucination/simple/bluespace_stream/first = new(first_turf, owner)
var/obj/effect/hallucination/simple/bluespace_stream/second = new(second_turf, owner)
possible_turfs -= (possible_turfs & range(first_turf, 3))
first.linked_to = second
second.linked_to = first
first.seer = owner
second.seer = owner
var/turf/second_turf = pick(possible_turfs)
if(!second_turf)
return
var/obj/effect/hallucination/simple/bluespace_stream/first = new(first_turf, owner)
var/obj/effect/hallucination/simple/bluespace_stream/second = new(second_turf, owner)
first.linked_to = second
second.linked_to = first
first.seer = owner
second.seer = owner
/obj/effect/hallucination/simple/bluespace_stream
name = "bluespace stream"
@@ -129,17 +134,19 @@
var/atom/linked_target = null
var/linked = FALSE
var/returning = FALSE
var/snapback_time = 0
/// Cooldown for snapbacks
COOLDOWN_DECLARE(snapback_cooldown)
/datum/brain_trauma/special/quantum_alignment/on_life()
/datum/brain_trauma/special/quantum_alignment/on_life(delta_time, times_fired)
if(linked)
if(QDELETED(linked_target))
linked_target = null
linked = FALSE
else if(!returning && world.time > snapback_time)
return
if(!returning && COOLDOWN_FINISHED(src, snapback_cooldown))
start_snapback()
return
if(prob(4))
if(DT_PROB(2, delta_time))
try_entangle()
/datum/brain_trauma/special/quantum_alignment/proc/try_entangle()
@@ -176,7 +183,7 @@
to_chat(owner, "<span class='notice'>You start feeling a strong sense of connection to [target].</span>")
linked_target = target
linked = TRUE
snapback_time = world.time + rand(450, 6000)
COOLDOWN_START(src, snapback_cooldown, rand(45 SECONDS, 10 MINUTES))
/datum/brain_trauma/special/quantum_alignment/proc/start_snapback()
if(QDELETED(linked_target))
@@ -275,11 +282,12 @@
gain_text = "<span class='notice'>You feel less real.</span>"
lose_text = "<span class='warning'>You feel more substantial again.</span>"
var/obj/effect/abstract/sync_holder/veil/veil
var/next_crisis = 0
/// A cooldown to prevent constantly erratic dolphining through the fabric of reality
COOLDOWN_DECLARE(crisis_cooldown)
/datum/brain_trauma/special/existential_crisis/on_life()
/datum/brain_trauma/special/existential_crisis/on_life(delta_time, times_fired)
..()
if(!veil && world.time > next_crisis && prob(3))
if(!veil && COOLDOWN_FINISHED(src, crisis_cooldown) && DT_PROB(1.5, delta_time))
if(isturf(owner.loc))
fade_out()
@@ -291,7 +299,7 @@
/datum/brain_trauma/special/existential_crisis/proc/fade_out()
if(veil)
return
var/duration = rand(50, 450)
var/duration = rand(5 SECONDS, 45 SECONDS)
veil = new(owner.drop_location())
to_chat(owner, "<span class='warning'>[pick("You stop thinking for a moment. Therefore you are not.",\
"To be or not to be...",\
@@ -305,13 +313,13 @@
for(var/thing in owner)
var/atom/movable/AM = thing
SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION)
next_crisis = world.time + 600
COOLDOWN_START(src, crisis_cooldown, 1 MINUTES)
addtimer(CALLBACK(src, .proc/fade_in), duration)
/datum/brain_trauma/special/existential_crisis/proc/fade_in()
QDEL_NULL(veil)
to_chat(owner, "<span class='notice'>You fade back into reality.</span>")
next_crisis = world.time + 600
COOLDOWN_START(src, crisis_cooldown, 1 MINUTES)
//base sync holder is in desynchronizer.dm
/obj/effect/abstract/sync_holder/veil

View File

@@ -42,12 +42,12 @@
else
qdel(src)
/datum/brain_trauma/severe/split_personality/on_life()
/datum/brain_trauma/severe/split_personality/on_life(delta_time, times_fired)
if(owner.stat == DEAD)
if(current_controller != OWNER)
switch_personalities()
qdel(src)
else if(prob(3))
else if(DT_PROB(1.5, delta_time))
switch_personalities()
..()
@@ -131,7 +131,7 @@
trauma = _trauma
return ..()
/mob/living/split_personality/Life()
/mob/living/split_personality/Life(delta_time = SSMOBS_DT, times_fired)
if(QDELETED(body))
qdel(src) //in case trauma deletion doesn't already do it
@@ -203,7 +203,7 @@
else
qdel(src)
/datum/brain_trauma/severe/split_personality/brainwashing/on_life()
/datum/brain_trauma/severe/split_personality/brainwashing/on_life(delta_time, times_fired)
return //no random switching
/datum/brain_trauma/severe/split_personality/brainwashing/handle_hearing(datum/source, list/hearing_args)

View File

@@ -286,14 +286,14 @@ Behavior that's still missing from this component that original food items had t
eater.visible_message("<span class='notice'>[eater] [eatverb]s \the [parent].</span>", "<span class='notice'>You [eatverb] \the [parent].</span>")
else if(fullness > 500 && fullness < 600)
eater.visible_message("<span class='notice'>[eater] unwillingly [eatverb]s a bit of \the [parent].</span>", "<span class='notice'>You unwillingly [eatverb] a bit of \the [parent].</span>")
else if(fullness > (600 * (1 + eater.overeatduration / 2000))) // The more you eat - the more you can eat
else if(fullness > (600 * (1 + eater.overeatduration / (4000 SECONDS)))) // The more you eat - the more you can eat
eater.visible_message("<span class='warning'>[eater] cannot force any more of \the [parent] to go down [eater.p_their()] throat!</span>", "<span class='warning'>You cannot force any more of \the [parent] to go down your throat!</span>")
return
else //If you're feeding it to someone else.
if(isbrain(eater))
to_chat(feeder, "<span class='warning'>[eater] doesn't seem to have a mouth!</span>")
return
if(fullness <= (600 * (1 + eater.overeatduration / 1000)))
if(fullness <= (600 * (1 + eater.overeatduration / (2000 SECONDS))))
eater.visible_message("<span class='danger'>[feeder] attempts to feed [eater] [parent].</span>", \
"<span class='userdanger'>[feeder] attempts to feed you [parent].</span>")
else

View File

@@ -15,14 +15,17 @@
//Stages
var/stage = 1
var/max_stages = 0
var/stage_prob = 4
/// The probability of this infection advancing a stage every second the cure is not present.
var/stage_prob = 2
//Other
var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob = null
var/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/infectivity = 65
var/cure_chance = 8
/// The probability of spreading through the air every second
var/infectivity = 41
/// The probability of this infection being cured every second the cure is present
var/cure_chance = 4
var/carrier = FALSE //If our host is only a carrier
var/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/permeability_mod = 1
@@ -64,16 +67,16 @@
///Proc to process the disease and decide on whether to advance, cure or make the sympthoms appear. Returns a boolean on whether to continue acting on the symptoms or not.
/datum/disease/proc/stage_act()
/datum/disease/proc/stage_act(delta_time, times_fired)
if(has_cure())
if(prob(cure_chance))
if(DT_PROB(cure_chance, delta_time))
update_stage(max(stage - 1, 1))
if(disease_flags & CURABLE && prob(cure_chance))
if(disease_flags & CURABLE && DT_PROB(cure_chance, delta_time))
cure()
return FALSE
else if(prob(stage_prob))
else if(DT_PROB(stage_prob, delta_time))
update_stage(min(stage + 1, max_stages))
return !carrier

View File

@@ -105,7 +105,7 @@
// Randomly pick a symptom to activate.
/datum/disease/advance/stage_act()
/datum/disease/advance/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -254,8 +254,8 @@
SetSpread(DISEASE_SPREAD_BLOOD)
permeability_mod = max(CEILING(0.4 * properties["transmittable"], 1), 1)
cure_chance = 15 - clamp(properties["resistance"], -5, 5) // can be between 10 and 20
stage_prob = max(properties["stage_rate"], 2)
cure_chance = clamp(7.5 - (0.5 * properties["resistance"]), 5, 10) // can be between 5 and 10
stage_prob = max(0.5 * properties["stage_rate"], 1)
SetSeverity(properties["severity"])
GenerateCure(properties)
else

View File

@@ -160,10 +160,9 @@
/datum/symptom/heal/metabolism/Heal(mob/living/carbon/C, datum/disease/advance/A, actual_power)
if(!istype(C))
return
C.reagents.metabolize(C, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
if(triple_metabolism)
C.reagents.metabolize(C, can_overdose=TRUE)
C.overeatduration = max(C.overeatduration - 2, 0)
var/metabolic_boost = triple_metabolism ? 2 : 1
C.reagents.metabolize(C, metabolic_boost * SSMOBS_DT, 0, can_overdose=TRUE) //this works even without a liver; it's intentional since the virus is metabolizing by itself
C.overeatduration = max(C.overeatduration - 4 SECONDS, 0)
var/lost_nutrition = 9 - (reduced_hunger * 5)
C.adjust_nutrition(-lost_nutrition * HUNGER_FACTOR) //Hunger depletes at 10x the normal speed
if(prob(2))
@@ -417,12 +416,13 @@
if(prob(5))
to_chat(M, "<span class='notice'>You feel yourself absorbing plasma inside and around you...</span>")
if(M.bodytemperature > M.get_body_temp_normal())
M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, M.get_body_temp_normal())
var/target_temp = M.get_body_temp_normal()
if(M.bodytemperature > target_temp)
M.adjust_bodytemperature(-20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, target_temp)
if(prob(5))
to_chat(M, "<span class='notice'>You feel less hot.</span>")
else if(M.bodytemperature < (M.get_body_temp_normal() + 1))
M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT,0, M.get_body_temp_normal())
M.adjust_bodytemperature(20 * temp_rate * TEMPERATURE_DAMAGE_COEFFICIENT, 0, target_temp)
if(prob(5))
to_chat(M, "<span class='notice'>You feel warmer.</span>")

View File

@@ -49,5 +49,5 @@ Bonus
to_chat(M, "<span class='warning'>[pick("You feel hungry.", "You crave for food.")]</span>")
else
to_chat(M, "<span class='warning'><i>[pick("So hungry...", "You'd kill someone for a bite of food...", "Hunger cramps seize you...")]</i></span>")
M.overeatduration = max(M.overeatduration - 100, 0)
M.overeatduration = max(M.overeatduration - 200 SECONDS, 0)
M.adjust_nutrition(-100)

View File

@@ -12,32 +12,32 @@
severity = DISEASE_SEVERITY_MINOR
/datum/disease/anxiety/stage_act()
/datum/disease/anxiety/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2) //also changes say, see say.dm
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel anxious.</span>")
if(3)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='notice'>Your stomach flutters.</span>")
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel panicky.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You're overtaken with panic!</span>")
affected_mob.add_confusion(rand(2,3))
if(4)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel butterflies in your stomach.</span>")
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.visible_message("<span class='danger'>[affected_mob] stumbles around in a panic.</span>", \
"<span class='userdanger'>You have a panic attack!</span>")
affected_mob.add_confusion(rand(6,8))
affected_mob.jitteriness += (rand(6,8))
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up butterflies!</span>", \
"<span class='userdanger'>You cough up butterflies!</span>")
new /mob/living/simple_animal/butterfly(affected_mob.loc)

View File

@@ -15,26 +15,26 @@
bypasses_immunity = TRUE // Immunity is based on not having an appendix; this isn't a virus
/datum/disease/appendicitis/stage_act()
/datum/disease/appendicitis/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(1)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
if(2)
var/obj/item/organ/appendix/A = affected_mob.getorgan(/obj/item/organ/appendix)
if(A)
A.inflamed = 1
A.update_appearance()
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='warning'>You feel a stabbing pain in your abdomen!</span>")
affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5)
affected_mob.Stun(rand(40,60))
affected_mob.Stun(rand(40, 60))
affected_mob.adjustToxLoss(1, FALSE)
if(3)
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.vomit(95)
affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15)

View File

@@ -13,29 +13,29 @@
infectable_biotypes = MOB_ORGANIC|MOB_UNDEAD //bees nesting in corpses
/datum/disease/beesease/stage_act()
/datum/disease/beesease/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2) //also changes say, see say.dm
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='notice'>You taste honey in your mouth.</span>")
if(3)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='notice'>Your stomach rumbles.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach stings painfully.</span>")
if(prob(20))
affected_mob.adjustToxLoss(2)
if(4)
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.visible_message("<span class='danger'>[affected_mob] buzzes.</span>", \
"<span class='userdanger'>Your stomach buzzes violently!</span>")
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel something moving in your throat.</span>")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up a swarm of bees!</span>", \
"<span class='userdanger'>You cough up a swarm of bees!</span>")
new /mob/living/simple_animal/hostile/poison/bees(affected_mob.loc)

View File

@@ -7,52 +7,52 @@
cures = list(/datum/reagent/medicine/mannitol)
agent = "Cryptococcus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 15//higher chance to cure, since two reagents are required
cure_chance = 7.5 //higher chance to cure, since two reagents are required
desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/brain)
severity = DISEASE_SEVERITY_HARMFUL
/datum/disease/brainrot/stage_act() //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
/datum/disease/brainrot/stage_act(delta_time, times_fired) //Removed toxloss because damaging diseases are pretty horrible. Last round it killed the entire station because the cure didn't work -- Urist -ACTUALLY Removed rather than commented out, I don't see it returning - RR
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("blink")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("yawn")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You don't feel like yourself.</span>")
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
if(3)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("stare")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("drool")
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
if(4)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("stare")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("drool")
if(prob(15))
if(DT_PROB(7.5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170)
if(prob(2))
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>")
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You lose consciousness...</span>")
affected_mob.visible_message("<span class='warning'>[affected_mob] suddenly collapses!</span>", \
"<span class='userdanger'>You suddenly collapse!</span>")
affected_mob.Unconscious(rand(100,200))
affected_mob.Unconscious(rand(100, 200))
if(prob(1))
affected_mob.emote("snore")
if(prob(15))
if(DT_PROB(7.5, delta_time))
affected_mob.stuttering += 3

View File

@@ -10,48 +10,40 @@
severity = DISEASE_SEVERITY_NONTHREAT
/datum/disease/cold/stage_act()
/datum/disease/cold/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(affected_mob.body_position == LYING_DOWN && prob(40)) //changed FROM prob(10) until sleeping is fixed
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(prob(0.05))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if((affected_mob.body_position == LYING_DOWN && DT_PROB(23, delta_time)) || DT_PROB(0.025, delta_time)) //changed FROM prob(10) until sleeping is fixed // Has sleeping been fixed yet?
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(3)
if(affected_mob.body_position == LYING_DOWN && prob(25)) //changed FROM prob(5) until sleeping is fixed
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(prob(0.01))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(prob(0.5) && !LAZYFIND(affected_mob.disease_resistances, /datum/disease/flu))
if(DT_PROB(0.25, delta_time) && !LAZYFIND(affected_mob.disease_resistances, /datum/disease/flu))
var/datum/disease/Flu = new /datum/disease/flu()
affected_mob.ForceContractDisease(Flu, FALSE, TRUE)
cure()
return FALSE
if((affected_mob.body_position == LYING_DOWN && DT_PROB(12.5, delta_time)) || DT_PROB(0.005, delta_time)) //changed FROM prob(5) until sleeping is fixed
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE

View File

@@ -11,33 +11,33 @@
severity = DISEASE_SEVERITY_HARMFUL
/datum/disease/cold9/stage_act()
/datum/disease/cold9/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
affected_mob.adjust_bodytemperature(-10)
if(prob(0.1))
affected_mob.adjust_bodytemperature(-5 * delta_time)
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel stiff.</span>")
if(DT_PROB(0.05, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(prob(1))
affected_mob.emote("sneeze")
if(prob(1))
affected_mob.emote("cough")
if(prob(1))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(prob(5))
to_chat(affected_mob, "<span class='danger'>You feel stiff.</span>")
if(3)
affected_mob.adjust_bodytemperature(-20)
if(prob(1))
affected_mob.adjust_bodytemperature(-10 * delta_time)
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your throat feels sore.</span>")
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel stiff.</span>")

View File

@@ -2,7 +2,7 @@
form = "Virus"
name = "Cellular Degeneration"
max_stages = 5
stage_prob = 1
stage_prob = 0.5
cure_text = "Rezadone or death."
agent = "Severe Genetic Damage"
viable_mobtypes = list(/mob/living/carbon/human)
@@ -13,7 +13,7 @@
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
process_dead = TRUE
/datum/disease/decloning/stage_act()
/datum/disease/decloning/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -24,38 +24,38 @@
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("itch")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("yawn")
if(3)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("itch")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("drool")
if(prob(3))
if(DT_PROB(1.5, delta_time))
affected_mob.adjustCloneLoss(1, FALSE)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>Your skin feels strange.</span>")
if(4)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("itch")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("drool")
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
affected_mob.adjustCloneLoss(2, FALSE)
if(prob(15))
if(DT_PROB(7.5, delta_time))
affected_mob.stuttering += 3
if(5)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("itch")
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("drool")
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your skin starts degrading!</span>")
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.adjustCloneLoss(5, FALSE)
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
if(affected_mob.cloneloss >= 100)

View File

@@ -14,7 +14,7 @@
severity = DISEASE_SEVERITY_MEDIUM
/datum/disease/dnaspread/stage_act()
/datum/disease/dnaspread/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -36,16 +36,16 @@
return
switch(stage)
if(2 || 3) //Pretend to be a cold and give time to spread.
if(prob(8))
if(2, 3) //Pretend to be a cold and give time to spread.
if(DT_PROB(4, delta_time))
affected_mob.emote("sneeze")
if(prob(8))
if(DT_PROB(4, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
affected_mob.take_bodypart_damage(1, updating_health = FALSE)
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
affected_mob.adjustToxLoss(2, FALSE)

View File

@@ -11,26 +11,26 @@
severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/fake_gbs/stage_act()
/datum/disease/fake_gbs/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(3)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
else if(prob(5))
else if(DT_PROB(2.5, delta_time))
affected_mob.emote("gasp")
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You're starting to feel very weak...</span>")
if(4)
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.emote("cough")
if(5)
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.emote("cough")

View File

@@ -4,7 +4,7 @@
spread_text = "Airborne"
cure_text = "Spaceacillin"
cures = list(/datum/reagent/medicine/spaceacillin)
cure_chance = 10
cure_chance = 5
agent = "H13N1 flu virion"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
@@ -12,44 +12,44 @@
severity = DISEASE_SEVERITY_MINOR
/datum/disease/flu/stage_act()
/datum/disease/flu/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(affected_mob.body_position == LYING_DOWN && prob(20))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
stage--
return
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
affected_mob.take_bodypart_damage(1, updating_health = FALSE)
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
affected_mob.adjustToxLoss(1, FALSE)
if(affected_mob.body_position == LYING_DOWN && DT_PROB(10, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
stage--
return
if(3)
if(affected_mob.body_position == LYING_DOWN && prob(15))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
stage--
return
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze")
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
affected_mob.take_bodypart_damage(1, updating_health = FALSE)
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
affected_mob.adjustToxLoss(1, FALSE)
if(affected_mob.body_position == LYING_DOWN && DT_PROB(7.5, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
stage--
return

View File

@@ -4,7 +4,7 @@
spread_text = "Airborne"
cure_text = "Spaceacillin & Anti-bodies to the common flu"
cures = list(/datum/reagent/medicine/spaceacillin)
cure_chance = 10
cure_chance = 5
agent = "1nqu1s1t10n flu virion"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
@@ -12,28 +12,28 @@
severity = DISEASE_SEVERITY_DANGEROUS
/datum/disease/fluspanish/stage_act()
/datum/disease/fluspanish/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
affected_mob.adjust_bodytemperature(10)
if(prob(5))
affected_mob.adjust_bodytemperature(5 * delta_time)
if(DT_PROB(2.5, delta_time))
affected_mob.emote("sneeze")
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You're burning in your own skin!</span>")
affected_mob.take_bodypart_damage(0, 5, updating_health = FALSE)
if(3)
affected_mob.adjust_bodytemperature(20)
if(prob(5))
affected_mob.adjust_bodytemperature(10 * delta_time)
if(DT_PROB(2.5, delta_time))
affected_mob.emote("sneeze")
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You're burning in your own skin!</span>")
affected_mob.take_bodypart_damage(0, 5, updating_health = FALSE)

View File

@@ -6,12 +6,12 @@
cure_text = "Salt and mutadone"
agent = "Agent S and DNA restructuring"
viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 1
stage_prob = 0.5
disease_flags = CURABLE
cures = list(/datum/reagent/consumable/salt, /datum/reagent/medicine/mutadone)
/datum/disease/gastrolosis/stage_act()
/datum/disease/gastrolosis/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -22,54 +22,58 @@
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("gag")
if(prob(1))
if(DT_PROB(0.5, delta_time))
var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 40)
if(3)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("gag")
if(prob(5))
if(DT_PROB(2.5, delta_time))
var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100)
if(4)
var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.internal_organs
if(!eyes && prob(5))
if(!eyes && DT_PROB(2.5, delta_time))
var/obj/item/organ/eyes/snail/new_eyes = new()
new_eyes.Insert(affected_mob, drop_if_replaced = TRUE)
affected_mob.visible_message("<span class='warning'>[affected_mob]'s eyes fall out, with snail eyes taking its place!</span>", \
"<span class='userdanger'>You scream in pain as your eyes are pushed out by your new snail eyes!</span>")
affected_mob.emote("scream")
return
var/obj/item/shell = affected_mob.get_item_by_slot(ITEM_SLOT_BACK)
if(!istype(shell, /obj/item/storage/backpack/snail))
shell = null
if(!shell && prob(5))
if(!shell && DT_PROB(2.5, delta_time))
if(affected_mob.dropItemToGround(affected_mob.get_item_by_slot(ITEM_SLOT_BACK)))
affected_mob.equip_to_slot_or_del(new /obj/item/storage/backpack/snail(affected_mob), ITEM_SLOT_BACK)
affected_mob.visible_message("<span class='warning'>[affected_mob] grows a grotesque shell on their back!</span>", \
"<span class='userdanger'>You scream in pain as a shell pushes itself out from under your skin!</span>")
affected_mob.emote("scream")
return
var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.internal_organs
if(!tongue && prob(5))
if(!tongue && DT_PROB(2.5, delta_time))
var/obj/item/organ/tongue/snail/new_tongue = new()
new_tongue.Insert(affected_mob)
to_chat(affected_mob, "<span class='userdanger'>You feel your speech slow down...</span>")
return
if(shell && eyes && tongue && prob(5))
if(shell && eyes && tongue && DT_PROB(2.5, delta_time))
affected_mob.set_species(/datum/species/snail)
affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob)
affected_mob.visible_message("<span class='warning'>[affected_mob] turns into a snail!</span>", \
"<span class='boldnotice'>You turned into a snail person! You feel an urge to cccrrraaawwwlll...</span>")
cure()
return FALSE
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.emote("gag")
if(prob(10))
if(DT_PROB(5, delta_time))
var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100)

View File

@@ -5,29 +5,29 @@
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Synaptizine & Sulfur"
cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/sulfur)
cure_chance = 15//higher chance to cure, since two reagents are required
cure_chance = 7.5 //higher chance to cure, since two reagents are required
agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 1
severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/gbs/stage_act()
/datum/disease/gbs/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
if(3)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("gasp")
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your body hurts all over!</span>")
if(4)
to_chat(affected_mob, "<span class='userdanger'>Your body feels as if it's trying to rip itself apart!</span>")
if(prob(50))
if(DT_PROB(30, delta_time))
affected_mob.gib()
return FALSE

View File

@@ -2,7 +2,7 @@
form = "Condition"
name = "Myocardial Infarction"
max_stages = 5
stage_prob = 2
stage_prob = 1
cure_text = "Heart replacement surgery to cure. Defibrillation (or as a last resort, uncontrolled electric shocking) may also be effective after the onset of cardiac arrest. Penthrite can also mitigate cardiac arrest."
agent = "Shitty Heart"
viable_mobtypes = list(/mob/living/carbon/human)
@@ -22,7 +22,7 @@
return D
/datum/disease/heart_failure/stage_act()
/datum/disease/heart_failure/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -33,25 +33,25 @@
switch(stage)
if(1 to 2)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='warning'>You feel [pick("discomfort", "pressure", "a burning sensation", "pain")] in your chest.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='warning'>You feel dizzy.</span>")
affected_mob.add_confusion(6)
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='warning'>You feel [pick("full", "nauseated", "sweaty", "weak", "tired", "short on breath", "uneasy")].</span>")
if(3 to 4)
if(!sound)
affected_mob.playsound_local(affected_mob, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
sound = TRUE
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a sharp pain in your chest!</span>")
if(prob(25))
affected_mob.vomit(95)
affected_mob.emote("cough")
affected_mob.Paralyze(40)
affected_mob.losebreath += 4
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel very weak and dizzy...</span>")
affected_mob.add_confusion(8)
affected_mob.adjustStaminaLoss(40, FALSE)

View File

@@ -14,16 +14,16 @@
process_dead = TRUE
/datum/disease/magnitis/stage_act()
/datum/disease/magnitis/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a slight shock course through your body.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
for(var/obj/nearby_object in orange(2, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue
@@ -35,11 +35,11 @@
var/move_dir = get_dir(nearby_silicon, affected_mob)
nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir)
if(3)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a strong shock course through your body.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel like clowning around.</span>")
if(prob(4))
if(DT_PROB(2, delta_time))
for(var/obj/nearby_object in orange(4, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue
@@ -55,11 +55,11 @@
if(!nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir))
break
if(4)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a powerful shock course through your body.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You query upon the nature of miracles.</span>")
if(prob(8))
if(DT_PROB(4, delta_time))
for(var/obj/nearby_object in orange(6, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue

View File

@@ -15,7 +15,7 @@
bypasses_immunity = TRUE
/datum/disease/parasite/stage_act()
/datum/disease/parasite/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -28,20 +28,20 @@
switch(stage)
if(1)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough")
if(2)
if(prob(10))
if(DT_PROB(5, delta_time))
if(prob(50))
to_chat(affected_mob, "<span class='notice'>You feel the weight loss already!</span>")
affected_mob.adjust_nutrition(-3)
if(3)
if(prob(20))
if(DT_PROB(10, delta_time))
if(prob(20))
to_chat(affected_mob, "<span class='notice'>You're... REALLY starting to feel the weight loss.</span>")
affected_mob.adjust_nutrition(-6)
if(4)
if(prob(30))
if(DT_PROB(16, delta_time))
if(affected_mob.nutrition >= 100)
if(prob(10))
to_chat(affected_mob, "<span class='warning'>You feel like your body's shedding weight rapidly!</span>")

View File

@@ -6,7 +6,7 @@
disease_flags = CURABLE
cure_text = "Holy Water."
cures = list(/datum/reagent/water/holywater)
cure_chance = 20
cure_chance = 10
agent = "Avian Vengence"
viable_mobtypes = list(/mob/living/carbon/human)
desc = "Subject is possessed by the vengeful spirit of a parrot. Call the priest."
@@ -16,7 +16,7 @@
var/mob/living/simple_animal/parrot/poly/ghost/parrot
/datum/disease/parrot_possession/stage_act()
/datum/disease/parrot_possession/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -25,7 +25,7 @@
cure()
return FALSE
if(length(parrot.speech_buffer) && prob(parrot.speak_chance))
if(length(parrot.speech_buffer) && DT_PROB(parrot.speak_chance, delta_time)) // I'm not going to dive into polycode trying to adjust that probability. Enjoy doubled ghost parrot speach
affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession")

View File

@@ -4,7 +4,7 @@
spread_text = "Airborne"
cure_text = "Banana products, especially banana bread."
cures = list(/datum/reagent/consumable/banana)
cure_chance = 75
cure_chance = 50
agent = "H0NI<42 Virus"
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75
@@ -12,23 +12,23 @@
severity = DISEASE_SEVERITY_MEDIUM
/datum/disease/pierrot_throat/stage_act()
/datum/disease/pierrot_throat/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(1)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a little silly.</span>")
if(2)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You start seeing rainbows.</span>")
if(3)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>")
if(4)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.say( pick( list("HONK!", "Honk!", "Honk.", "Honk?", "Honk!!", "Honk?!", "Honk...") ) , forced = "pierrot's throat")

View File

@@ -4,13 +4,13 @@
spread_text = "Contact"
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Rest or an injection of mutadone"
cure_chance = 6
cure_chance = 3
agent = ""
viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
severity = DISEASE_SEVERITY_HARMFUL
permeability_mod = 0.4
stage_prob = 2
stage_prob = 1
var/restcure = 0
/datum/disease/dna_retrovirus/New()
@@ -26,62 +26,56 @@
D.restcure = restcure
return D
/datum/disease/dna_retrovirus/stage_act()
/datum/disease/dna_retrovirus/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(1)
if(restcure)
if(affected_mob.body_position == LYING_DOWN && prob(30))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if (prob(8))
if(DT_PROB(4, delta_time))
to_chat(affected_mob, "<span class='danger'>Your head hurts.</span>")
if (prob(9))
if(DT_PROB(4.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a tingling sensation in your chest.</span>")
if (prob(9))
if(DT_PROB(4.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel angry.</span>")
if(restcure && affected_mob.body_position == LYING_DOWN && DT_PROB(16, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(2)
if(restcure)
if(affected_mob.body_position == LYING_DOWN && prob(20))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if (prob(8))
if(DT_PROB(4, delta_time))
to_chat(affected_mob, "<span class='danger'>Your skin feels loose.</span>")
if (prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel very strange.</span>")
if (prob(4))
if(DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head!</span>")
affected_mob.Unconscious(40)
if (prob(4))
if(DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach churns.</span>")
if(restcure && affected_mob.body_position == LYING_DOWN && DT_PROB(10, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(3)
if(restcure)
if(affected_mob.body_position == LYING_DOWN && prob(20))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if (prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>Your entire body vibrates.</span>")
if (prob(35))
if(DT_PROB(19, delta_time))
if(prob(50))
scramble_dna(affected_mob, 1, 0, rand(15,45))
else
scramble_dna(affected_mob, 0, 1, rand(15,45))
if(restcure && affected_mob.body_position == LYING_DOWN && DT_PROB(10, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if(4)
if(restcure)
if(affected_mob.body_position == LYING_DOWN && prob(5))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE
if (prob(60))
if(DT_PROB(37, delta_time))
if(prob(50))
scramble_dna(affected_mob, 1, 0, rand(50,75))
else
scramble_dna(affected_mob, 0, 1, rand(50,75))
if(restcure && affected_mob.body_position == LYING_DOWN && DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure()
return FALSE

View File

@@ -10,27 +10,27 @@
permeability_mod = 1
severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/rhumba_beat/stage_act()
/datum/disease/rhumba_beat/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(45))
if(DT_PROB(26, delta_time))
affected_mob.adjustFireLoss(5, FALSE)
if(prob(1))
if(DT_PROB(0.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel strange...</span>")
if(3)
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel the urge to dance...</span>")
else if(prob(5))
else if(DT_PROB(2.5, delta_time))
affected_mob.emote("gasp")
else if(prob(10))
else if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel the need to chick chicky boom...</span>")
if(4)
if(prob(20))
if (prob(50))
if(DT_PROB(10, delta_time))
if(prob(50))
affected_mob.adjust_fire_stacks(2)
affected_mob.IgniteMob()
else
@@ -38,5 +38,5 @@
to_chat(affected_mob, "<span class='danger'>You feel a burning beat inside...</span>")
if(5)
to_chat(affected_mob, "<span class='danger'>Your body is unable to contain the Rhumba Beat...</span>")
if(prob(50))
if(DT_PROB(29, delta_time))
explosion(get_turf(affected_mob), -1, 0, 2, 3, 0, 2) // This is equivalent to a lvl 1 fireball

View File

@@ -7,7 +7,7 @@
agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 10
stage_prob = 5
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
disease_flags = CURABLE
var/list/stage1 = list("You feel unremarkable.")
@@ -30,23 +30,23 @@
return D
/datum/disease/transformation/stage_act()
/datum/disease/transformation/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(1)
if (stage1 && prob(stage_prob))
if (stage1 && DT_PROB(stage_prob, delta_time))
to_chat(affected_mob, pick(stage1))
if(2)
if (stage2 && prob(stage_prob))
if (stage2 && DT_PROB(stage_prob, delta_time))
to_chat(affected_mob, pick(stage2))
if(3)
if (stage3 && prob(stage_prob * 2))
if (stage3 && DT_PROB(stage_prob * 2, delta_time))
to_chat(affected_mob, pick(stage3))
if(4)
if (stage4 && prob(stage_prob * 2))
if (stage4 && DT_PROB(stage_prob * 2, delta_time))
to_chat(affected_mob, pick(stage4))
if(5)
do_disease_transformation(affected_mob)
@@ -105,11 +105,11 @@
spread_flags = DISEASE_SPREAD_SPECIAL
viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1
cure_chance = 1
cure_chance = 0.5
disease_flags = CAN_CARRY|CAN_RESIST
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 4
stage_prob = 2
visibility_flags = NONE
agent = "Kongey Vibrion M-909"
new_form = /mob/living/carbon/human/species/monkey
@@ -130,21 +130,21 @@
ADD_TRAIT(affected_mob, TRAIT_VENTCRAWLER_ALWAYS, type)
/datum/disease/transformation/jungle_fever/stage_act()
/datum/disease/transformation/jungle_fever/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='notice'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>")
if(3)
if(prob(4))
if(DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.add_confusion(10)
if(4)
if(prob(3))
if(DT_PROB(1.5, delta_time))
affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever")
@@ -167,7 +167,7 @@
name = "Robotic Transformation"
cure_text = "An injection of copper."
cures = list(/datum/reagent/copper)
cure_chance = 5
cure_chance = 2.5
agent = "R2D2 Nanomachines"
desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
severity = DISEASE_SEVERITY_BIOHAZARD
@@ -182,20 +182,20 @@
bantype = "Cyborg"
/datum/disease/transformation/robot/stage_act()
/datum/disease/transformation/robot/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(3)
if (prob(8))
if (DT_PROB(4, delta_time))
affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"), forced = "robotic transformation")
if (prob(4))
if (DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Unconscious(40)
if(4)
if (prob(20))
if (DT_PROB(10, delta_time))
affected_mob.say(pick("beep, beep!", "Boop bop boop beep.", "kkkiiiill mmme", "I wwwaaannntt tttoo dddiiieeee..."), forced = "robotic transformation")
@@ -204,7 +204,7 @@
name = "Xenomorph Transformation"
cure_text = "Spaceacillin & Glycerol"
cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol)
cure_chance = 5
cure_chance = 2.5
agent = "Rip-LEY Alien Microbes"
desc = "This disease changes the victim into a xenomorph."
severity = DISEASE_SEVERITY_BIOHAZARD
@@ -218,18 +218,18 @@
bantype = ROLE_ALIEN
/datum/disease/transformation/xeno/stage_act()
/datum/disease/transformation/xeno/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(3)
if (prob(4))
if(DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Unconscious(40)
if(4)
if (prob(20))
if(DT_PROB(10, delta_time))
affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"), forced = "xenomorph transformation")
@@ -237,7 +237,7 @@
name = "Advanced Mutation Transformation"
cure_text = "frost oil"
cures = list(/datum/reagent/consumable/frostoil)
cure_chance = 80
cure_chance = 55
agent = "Advanced Mutation Toxin"
desc = "This highly concentrated extract converts anything into more of itself."
severity = DISEASE_SEVERITY_BIOHAZARD
@@ -250,7 +250,7 @@
new_form = /mob/living/simple_animal/slime/random
/datum/disease/transformation/slime/stage_act()
/datum/disease/transformation/slime/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
@@ -283,16 +283,16 @@
new_form = /mob/living/simple_animal/pet/dog/corgi
/datum/disease/transformation/corgi/stage_act()
/datum/disease/transformation/corgi/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(3)
if (prob(8))
if (DT_PROB(4, delta_time))
affected_mob.say(pick("YAP", "Woof!"), forced = "corgi transformation")
if(4)
if (prob(20))
if (DT_PROB(10, delta_time))
affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation")
@@ -302,7 +302,7 @@
cures = list(/datum/reagent/consumable/nothing)
agent = "Gluttony's Blessing"
desc = "A 'gift' from somewhere terrible."
stage_prob = 20
stage_prob = 10
severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = NONE
stage1 = list("Your stomach rumbles.")
@@ -318,8 +318,8 @@
name = "Gondola Transformation"
cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help
cures = list(/datum/reagent/consumable/condensedcapsaicin) //beats the hippie crap right out of your system
cure_chance = 80
stage_prob = 5
cure_chance = 55
stage_prob = 2.5
agent = "Tranquility"
desc = "Consuming the flesh of a Gondola comes at a terrible price."
severity = DISEASE_SEVERITY_BIOHAZARD
@@ -332,28 +332,28 @@
new_form = /mob/living/simple_animal/pet/gondola
/datum/disease/transformation/gondola/stage_act()
/datum/disease/transformation/gondola/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if (prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile")
if (prob(20))
if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
if(3)
if (prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile")
if (prob(20))
if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
if(4)
if (prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile")
if (prob(20))
if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
if (prob(2))
if(DT_PROB(1, delta_time))
var/obj/item/held_item = affected_mob.get_active_held_item()
if(held_item)
to_chat(affected_mob, "<span class='danger'>You let go of what you were holding.</span>")

View File

@@ -7,55 +7,55 @@
cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/c2/convermol)
agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human)
cure_chance = 5//like hell are you getting out of hell
cure_chance = 2.5 //like hell are you getting out of hell
desc = "A rare highly transmissible virulent virus. Few samples exist, rumoured to be carefully grown and cultured by clandestine bio-weapon specialists. Causes fever, blood vomiting, lung damage, weight loss, and fatigue."
required_organs = list(/obj/item/organ/lungs)
severity = DISEASE_SEVERITY_BIOHAZARD
bypasses_immunity = TRUE // TB primarily impacts the lungs; it's also bacterial or fungal in nature; viral immunity should do nothing.
/datum/disease/tuberculosis/stage_act() //it begins
/datum/disease/tuberculosis/stage_act(delta_time, times_fired) //it begins
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(2))
if(DT_PROB(1, delta_time))
affected_mob.emote("cough")
to_chat(affected_mob, "<span class='danger'>Your chest hurts.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach violently rumbles!</span>")
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a cold sweat form.</span>")
if(4)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='userdanger'>You see four of everything!</span>")
affected_mob.Dizzy(5)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a sharp pain from your lower chest!</span>")
affected_mob.adjustOxyLoss(5, FALSE)
affected_mob.emote("gasp")
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel air escape from your lungs painfully.</span>")
affected_mob.adjustOxyLoss(25, FALSE)
affected_mob.emote("gasp")
if(5)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='userdanger'>[pick("You feel your heart slowing...", "You relax and slow your heartbeat.")]</span>")
affected_mob.adjustStaminaLoss(70, FALSE)
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.adjustStaminaLoss(100, FALSE)
affected_mob.visible_message("<span class='warning'>[affected_mob] faints!</span>", "<span class='userdanger'>You surrender yourself and feel at peace...</span>")
affected_mob.AdjustSleeping(100)
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='userdanger'>You feel your mind relax and your thoughts drift!</span>")
affected_mob.set_confusion(min(100, affected_mob.get_confusion() + 8))
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.vomit(20)
if(prob(3))
if(DT_PROB(1.5, delta_time))
to_chat(affected_mob, "<span class='warning'><i>[pick("Your stomach silently rumbles...", "Your stomach seizes up and falls limp, muscles dead and lifeless.", "You could eat a crayon")]</i></span>")
affected_mob.overeatduration = max(affected_mob.overeatduration - 100, 0)
affected_mob.overeatduration = max(affected_mob.overeatduration - (200 SECONDS), 0)
affected_mob.adjust_nutrition(-100)
if(prob(15))
if(DT_PROB(7.5, delta_time))
to_chat(affected_mob, "<span class='danger'>[pick("You feel uncomfortably hot...", "You feel like unzipping your jumpsuit...", "You feel like taking off some clothes...")]</span>")
affected_mob.adjust_bodytemperature(40)

View File

@@ -23,30 +23,30 @@ TARCOL MINTI ZHERI - forcewall
STI KALY - blind
*/
/datum/disease/wizarditis/stage_act()
/datum/disease/wizarditis/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
switch(stage)
if(2)
if(prob(0.5))
if(DT_PROB(0.25, delta_time))
affected_mob.say(pick("You shall not pass!", "Expeliarmus!", "By Merlins beard!", "Feel the power of the Dark Side!"), forced = "wizarditis")
if(prob(0.5))
if(DT_PROB(0.25, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel [pick("that you don't have enough mana", "that the winds of magic are gone", "an urge to summon familiar")].</span>")
if(3)
if(prob(0.5))
if(DT_PROB(0.25, delta_time))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!", "STI KALY!", "TARCOL MINTI ZHERI!"), forced = "wizarditis")
if(prob(0.5))
if(DT_PROB(0.25, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel [pick("the magic bubbling in your veins","that this location gives you a +1 to INT","an urge to summon familiar")].</span>")
if(4)
if(prob(1))
if(DT_PROB(0.5, delta_time))
affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis")
return
if(prob(0.5))
if(DT_PROB(0.25, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel [pick("the tidal wave of raw power building inside","that this location gives you a +2 to INT and +1 to WIS","an urge to teleport")].</span>")
spawn_wizard_clothes(50)
if(prob(0.01))
if(DT_PROB(0.005, delta_time))
teleport()

View File

@@ -91,7 +91,7 @@
/datum/mutation/human/proc/get_visual_indicator()
return
/datum/mutation/human/proc/on_life()
/datum/mutation/human/proc/on_life(delta_time, times_fired)
return
/datum/mutation/human/proc/on_losing(mob/living/carbon/human/owner)

View File

@@ -167,10 +167,10 @@
energy_coeff = 1
synchronizer_coeff = 1
/datum/mutation/human/void/on_life()
/datum/mutation/human/void/on_life(delta_time, times_fired)
if(!isturf(owner.loc))
return
if(prob((0.5+((100-dna.stability)/20))) * GET_MUTATION_SYNCHRONIZER(src)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability
if(DT_PROB((0.25+((100-dna.stability)/40)) * GET_MUTATION_SYNCHRONIZER(src), delta_time)) //very rare, but enough to annoy you hopefully. +0.5 probability for every 10 points lost in stability
new /obj/effect/immortality_talisman/void(get_turf(owner), owner)
/obj/effect/proc_holder/spell/self/void

View File

@@ -9,8 +9,8 @@
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/epilepsy/on_life()
if(prob(1 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS)
/datum/mutation/human/epilepsy/on_life(delta_time, times_fired)
if(DT_PROB(0.5 * GET_MUTATION_SYNCHRONIZER(src), delta_time) && owner.stat == CONSCIOUS)
owner.visible_message("<span class='danger'>[owner] starts having a seizure!</span>", "<span class='userdanger'>You have a seizure!</span>")
owner.Unconscious(200 * GET_MUTATION_POWER(src))
owner.Jitter(1000 * GET_MUTATION_POWER(src))
@@ -57,8 +57,8 @@
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/cough/on_life()
if(prob(5 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS)
/datum/mutation/human/cough/on_life(delta_time, times_fired)
if(DT_PROB(2.5 * GET_MUTATION_SYNCHRONIZER(src), delta_time) && owner.stat == CONSCIOUS)
owner.drop_all_held_items()
owner.emote("cough")
if(GET_MUTATION_POWER(src) > 1)
@@ -73,8 +73,8 @@
text_gain_indication = "<span class='danger'>You feel screams echo through your mind...</span>"
text_lose_indication = "<span class='notice'>The screaming in your mind fades.</span>"
/datum/mutation/human/paranoia/on_life()
if(prob(5) && owner.stat == CONSCIOUS)
/datum/mutation/human/paranoia/on_life(delta_time, times_fired)
if(DT_PROB(2.5, delta_time) && owner.stat == CONSCIOUS)
owner.emote("scream")
if(prob(25))
owner.hallucination += 20
@@ -135,8 +135,8 @@
text_gain_indication = "<span class='danger'>You twitch.</span>"
synchronizer_coeff = 1
/datum/mutation/human/tourettes/on_life()
if(prob(10 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS && !owner.IsStun())
/datum/mutation/human/tourettes/on_life(delta_time, times_fired)
if(DT_PROB(5 * GET_MUTATION_SYNCHRONIZER(src), delta_time) && owner.stat == CONSCIOUS && !owner.IsStun())
owner.Stun(200)
switch(rand(1, 3))
if(1)
@@ -284,8 +284,8 @@
synchronizer_coeff = 1
power_coeff = 1
/datum/mutation/human/fire/on_life()
if(prob((1+(100-dna.stability)/10)) * GET_MUTATION_SYNCHRONIZER(src))
/datum/mutation/human/fire/on_life(delta_time, times_fired)
if(DT_PROB((0.05+(100-dna.stability)/19.5) * GET_MUTATION_SYNCHRONIZER(src), delta_time))
owner.adjust_fire_stacks(2 * GET_MUTATION_POWER(src))
owner.IgniteMob()
@@ -312,8 +312,8 @@
power_coeff = 1
var/warpchance = 0
/datum/mutation/human/badblink/on_life()
if(prob(warpchance))
/datum/mutation/human/badblink/on_life(delta_time, times_fired)
if(DT_PROB(warpchance, delta_time))
var/warpmessage = pick(
"<span class='warning'>With a sickening 720-degree twist of [owner.p_their()] back, [owner] vanishes into thin air.</span>",
"<span class='warning'>[owner] does some sort of strange backflip into another dimension. It looks pretty painful.</span>",
@@ -321,13 +321,13 @@
"<span class='warning'>[owner]'s torso starts folding inside out until it vanishes from reality, taking [owner] with it.</span>",
"<span class='warning'>One moment, you see [owner]. The next, [owner] is gone.</span>")
owner.visible_message(warpmessage, "<span class='userdanger'>You feel a wave of nausea as you fall through reality!</span>")
var/warpdistance = rand(10,15) * GET_MUTATION_POWER(src)
var/warpdistance = rand(10, 15) * GET_MUTATION_POWER(src)
do_teleport(owner, get_turf(owner), warpdistance, channel = TELEPORT_CHANNEL_FREE)
owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * (warpchance * warpdistance))
warpchance = 0
owner.visible_message("<span class='danger'>[owner] appears out of nowhere!</span>")
else
warpchance += 0.25 * GET_MUTATION_ENERGY(src)
warpchance += 0.0625 * GET_MUTATION_ENERGY(src) * delta_time
/datum/mutation/human/acidflesh
name = "Acidic Flesh"
@@ -336,15 +336,16 @@
text_gain_indication = "<span class='userdanger'>A horrible burning sensation envelops you as your flesh turns to acid!</span>"
text_lose_indication = "<span class='notice'>A feeling of relief fills you as your flesh goes back to normal.</span>"
difficulty = 18//high so it's hard to unlock and use on others
var/msgcooldown = 0
/// The cooldown for the warning message
COOLDOWN_DECLARE(msgcooldown)
/datum/mutation/human/acidflesh/on_life()
if(prob(25))
if(world.time > msgcooldown)
/datum/mutation/human/acidflesh/on_life(delta_time, times_fired)
if(DT_PROB(13, delta_time))
if(COOLDOWN_FINISHED(src, msgcooldown))
to_chat(owner, "<span class='danger'>Your acid flesh bubbles...</span>")
msgcooldown = world.time + 200
COOLDOWN_START(src, msgcooldown, 20 SECONDS)
if(prob(15))
owner.acid_act(rand(30,50), 10)
owner.acid_act(rand(30, 50), 10)
owner.visible_message("<span class='warning'>[owner]'s skin bubbles and pops.</span>", "<span class='userdanger'>Your bubbling flesh pops! It burns!</span>")
playsound(owner,'sound/weapons/sear.ogg', 50, TRUE)

View File

@@ -16,8 +16,8 @@
RegisterSignal(owner, COMSIG_MOVABLE_MOVED, .proc/on_move)
RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/on_attack_hand)
/datum/mutation/human/chameleon/on_life()
owner.alpha = max(0, owner.alpha - 25)
/datum/mutation/human/chameleon/on_life(delta_time, times_fired)
owner.alpha = max(owner.alpha - (12.5 * delta_time), 0)
/datum/mutation/human/chameleon/proc/on_move()
SIGNAL_HANDLER

View File

@@ -65,7 +65,7 @@
if(35 to 41)
arm.force_wound_upwards(/datum/wound/blunt/moderate)
/datum/mutation/human/hulk/on_life()
/datum/mutation/human/hulk/on_life(delta_time, times_fired)
if(owner.health < 0)
on_losing(owner)
to_chat(owner, "<span class='danger'>You suddenly feel very weak.</span>")

View File

@@ -9,8 +9,8 @@
power_coeff = 1
/datum/mutation/human/radioactive/on_life()
radiation_pulse(owner, 20 * GET_MUTATION_POWER(src))
/datum/mutation/human/radioactive/on_life(delta_time, times_fired)
radiation_pulse(owner, 10 * GET_MUTATION_POWER(src) * delta_time)
/datum/mutation/human/radioactive/New(class_ = MUT_OTHER, timer, datum/mutation/human/copymut)
..()

View File

@@ -7,8 +7,8 @@
quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel nervous.</span>"
/datum/mutation/human/nervousness/on_life()
if(prob(10))
/datum/mutation/human/nervousness/on_life(delta_time, times_fired)
if(DT_PROB(5, delta_time))
owner.stuttering = max(10, owner.stuttering)
@@ -152,15 +152,15 @@
text_gain_indication = "<span class='notice'>You feel pretty good, honeydoll.</span>"
text_lose_indication = "<span class='notice'>You feel a little less conversation would be great.</span>"
/datum/mutation/human/elvis/on_life()
/datum/mutation/human/elvis/on_life(delta_time, times_fired)
switch(pick(1,2))
if(1)
if(prob(15))
if(DT_PROB(7.5, delta_time))
var/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing")
var/dancemoves = pick(dancetypes)
owner.visible_message("<b>[owner]</b> busts out some [dancemoves] moves!")
if(2)
if(prob(15))
if(DT_PROB(7.5, delta_time))
owner.visible_message("<b>[owner]</b> [pick("jiggles their hips", "rotates their hips", "gyrates their hips", "taps their foot", "dances to an imaginary song", "jiggles their legs", "snaps their fingers")]!")
/datum/mutation/human/elvis/on_acquiring(mob/living/carbon/human/owner)

View File

@@ -36,9 +36,9 @@
var/mob/living/carbon/human/H = quirk_holder
if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return
else
if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment
H.blood_volume -= 0.275 * delta_time
if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment
H.blood_volume -= 0.275 * delta_time
/datum/quirk/blindness
name = "Blind"

View File

@@ -316,7 +316,7 @@
return
/// If var/processing is TRUE, this is run on each life tick
/datum/wound/proc/handle_process()
/datum/wound/proc/handle_process(delta_time, times_fired)
return
/// For use in do_after callback checks
@@ -338,7 +338,7 @@
return
/// Called when the patient is undergoing stasis, so that having fully treated a wound doesn't make you sit there helplessly until you think to unbuckle them
/datum/wound/proc/on_stasis()
/datum/wound/proc/on_stasis(delta_time, times_fired)
return
/// Used when we're being dragged while bleeding, the value we return is how much bloodloss this wound causes from being dragged. Since it's a proc, you can let bandages soak some of the blood

View File

@@ -63,7 +63,7 @@
UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
return ..()
/datum/wound/blunt/handle_process()
/datum/wound/blunt/handle_process(delta_time, times_fired)
. = ..()
if(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle)
if(active_trauma)
@@ -77,12 +77,12 @@
regen_ticks_current++
if(victim.body_position == LYING_DOWN)
if(prob(50))
if(DT_PROB(30, delta_time))
regen_ticks_current += 0.5
if(victim.IsSleeping() && prob(50))
if(victim.IsSleeping() && DT_PROB(30, delta_time))
regen_ticks_current += 0.5
if(prob(severity * 3))
if(DT_PROB(severity * 1.5, delta_time))
victim.take_bodypart_damage(rand(1, severity * 2), stamina=rand(2, severity * 2.5), wound_bonus=CANT_WOUND)
if(prob(33))
to_chat(victim, "<span class='danger'>You feel a sharp pain in your body as your bones are reforming!</span>")

View File

@@ -34,11 +34,11 @@
var/strikes_to_lose_limb = 3
/datum/wound/burn/handle_process()
/datum/wound/burn/handle_process(delta_time, times_fired)
. = ..()
if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do
victim.adjustToxLoss(0.5)
if(prob(1))
victim.adjustToxLoss(0.25 * delta_time)
if(DT_PROB(0.5, delta_time))
victim.visible_message("<span class='danger'>The infection on the remnants of [victim]'s [limb.name] shift and bubble nauseatingly!</span>", "<span class='warning'>You can feel the infection on the remnants of your [limb.name] coursing through your veins!</span>", vision_distance = COMBAT_MESSAGE_RANGE)
return
@@ -52,12 +52,12 @@
flesh_healing += 0.5
if(limb.current_gauze)
limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE)
limb.seep_gauze(WOUND_BURN_SANITIZATION_RATE * delta_time)
if(flesh_healing > 0) // good bandages multiply the length of flesh healing
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
flesh_damage = max(0, flesh_damage - 1)
flesh_healing = max(0, flesh_healing - bandage_factor)
flesh_damage = max(flesh_damage - (0.5 * delta_time), 0)
flesh_healing = max(flesh_healing - (0.5 * bandage_factor * delta_time), 0) // good bandages multiply the length of flesh healing
// if we have little/no infection, the limb doesn't have much burn damage, and our nutrition is good, heal some flesh
if(infestation <= WOUND_INFECTION_MODERATE && (limb.burn_dam < 5) && (victim.nutrition >= NUTRITION_LEVEL_FED))
@@ -72,42 +72,52 @@
// sanitization is checked after the clearing check but before the actual ill-effects, because we freeze the effects of infection while we have sanitization
if(sanitization > 0)
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE)
sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor))
infestation = max(infestation - (WOUND_BURN_SANITIZATION_RATE * delta_time), 0)
sanitization = max(sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor * delta_time), 0)
return
infestation += infestation_rate
infestation += infestation_rate * delta_time
switch(infestation)
if(0 to WOUND_INFECTION_MODERATE)
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
if(prob(30))
if(DT_PROB(15, delta_time))
victim.adjustToxLoss(0.2)
if(prob(6))
to_chat(victim, "<span class='warning'>The blisters on your [limb.name] ooze a strange pus...</span>")
if(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
if(!disabling && prob(2))
to_chat(victim, "<span class='warning'><b>Your [limb.name] completely locks up, as you struggle for control against the infection!</b></span>")
set_disabling(TRUE)
else if(disabling && prob(8))
if(!disabling)
if(DT_PROB(1, delta_time))
to_chat(victim, "<span class='warning'><b>Your [limb.name] completely locks up, as you struggle for control against the infection!</b></span>")
set_disabling(TRUE)
return
else if(DT_PROB(4, delta_time))
to_chat(victim, "<span class='notice'>You regain sensation in your [limb.name], but it's still in terrible shape!</span>")
set_disabling(FALSE)
else if(prob(20))
return
if(DT_PROB(10, delta_time))
victim.adjustToxLoss(0.5)
if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
if(!disabling && prob(3))
to_chat(victim, "<span class='warning'><b>You suddenly lose all sensation of the festering infection in your [limb.name]!</b></span>")
set_disabling(TRUE)
else if(disabling && prob(3))
if(!disabling)
if(DT_PROB(1.5, delta_time))
to_chat(victim, "<span class='warning'><b>You suddenly lose all sensation of the festering infection in your [limb.name]!</b></span>")
set_disabling(TRUE)
return
else if(DT_PROB(1.5, delta_time))
to_chat(victim, "<span class='notice'>You can barely feel your [limb.name] again, and you have to strain to retain motor control!</span>")
set_disabling(FALSE)
else if(prob(1))
to_chat(victim, "<span class='warning'>You contemplate life without your [limb.name]...</span>")
victim.adjustToxLoss(0.75)
else if(prob(4))
victim.adjustToxLoss(1)
return
if(DT_PROB(2.48, delta_time))
if(prob(20))
to_chat(victim, "<span class='warning'>You contemplate life without your [limb.name]...</span>")
victim.adjustToxLoss(0.75)
else
victim.adjustToxLoss(1)
if(WOUND_INFECTION_SEPTIC to INFINITY)
if(prob(infestation))
if(DT_PROB(0.5 * infestation, delta_time))
switch(strikes_to_lose_limb)
if(3 to INFINITY)
to_chat(victim, "<span class='deadsay'>The skin on your [limb.name] is literally dripping off, you feel awful!</span>")
@@ -230,16 +240,16 @@
uv(I, user)
// people complained about burns not healing on stasis beds, so in addition to checking if it's cured, they also get the special ability to very slowly heal on stasis beds if they have the healing effects stored
/datum/wound/burn/on_stasis()
/datum/wound/burn/on_stasis(delta_time, times_fired)
. = ..()
if(flesh_healing > 0)
flesh_damage = max(0, flesh_damage - 0.2)
flesh_damage = max(flesh_damage - (0.1 * delta_time), 0)
if((flesh_damage <= 0) && (infestation <= 1))
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
qdel(src)
return
if(sanitization > 0)
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE * 0.2)
infestation = max(infestation - (0.1 * WOUND_BURN_SANITIZATION_RATE * delta_time), 0)
/datum/wound/burn/on_synthflesh(amount)
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
@@ -288,7 +298,7 @@
threshold_penalty = 80
status_effect_type = /datum/status_effect/wound/burn/critical
treatable_by = list(/obj/item/flashlight/pen/paramedic, /obj/item/stack/medical/ointment, /obj/item/stack/medical/mesh)
infestation_rate = 0.15 // appx 4.33 minutes to reach sepsis without any treatment
infestation_rate = 0.075 // appx 4.33 minutes to reach sepsis without any treatment
flesh_damage = 20
scar_keyword = "burncritical"
*/

View File

@@ -58,25 +58,25 @@
return BLOOD_FLOW_DECREASING
return BLOOD_FLOW_STEADY
/datum/wound/pierce/handle_process()
/datum/wound/pierce/handle_process(delta_time, times_fired)
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
blood_flow -= 0.2
if(prob(5))
blood_flow -= 0.1 * delta_time
if(DT_PROB(2.5, delta_time))
to_chat(victim, "<span class='notice'>You feel the [lowertext(name)] in your [limb.name] firming up from the cold!</span>")
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
blood_flow += 0.5 // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
blood_flow += 0.25 * delta_time // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
if(limb.current_gauze)
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate
limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate * delta_time
limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate * delta_time
if(blood_flow <= 0)
qdel(src)
/datum/wound/pierce/on_stasis()
/datum/wound/pierce/on_stasis(delta_time, times_fired)
. = ..()
if(blood_flow <= 0)
qdel(src)
@@ -97,7 +97,7 @@
/datum/wound/pierce/on_synthflesh(power)
. = ..()
blood_flow -= 0.05 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
blood_flow -= 0.025 * power // 20u * 0.05 = -1 blood flow, less than with slashes but still good considering smaller bleed rates
/// If someone is using a suture to close this puncture
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)

View File

@@ -92,9 +92,9 @@
if(clot_rate < 0)
return BLOOD_FLOW_INCREASING
/datum/wound/slash/handle_process()
/datum/wound/slash/handle_process(delta_time, times_fired)
if(victim.stat == DEAD)
blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN)
blood_flow -= max(clot_rate, WOUND_SLASH_DEAD_CLOT_MIN) * delta_time
if(blood_flow < minimum_flow)
if(demotes_to)
replace_wound(demotes_to)
@@ -105,15 +105,15 @@
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS))
blood_flow += 0.5 // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
blood_flow += 0.25 // old heparin used to just add +2 bleed stacks per tick, this adds 0.5 bleed flow to all open cuts which is probably even stronger as long as you can cut them first
if(limb.current_gauze)
if(clot_rate > 0)
blood_flow -= clot_rate
blood_flow -= limb.current_gauze.absorption_rate
limb.seep_gauze(limb.current_gauze.absorption_rate)
blood_flow -= clot_rate * delta_time
blood_flow -= limb.current_gauze.absorption_rate * delta_time
limb.seep_gauze(limb.current_gauze.absorption_rate * delta_time)
else
blood_flow -= clot_rate
blood_flow -= clot_rate * delta_time
if(blood_flow > highest_flow)
highest_flow = blood_flow
@@ -126,7 +126,7 @@
qdel(src)
/datum/wound/slash/on_stasis()
/datum/wound/slash/on_stasis(delta_time, times_fired)
if(blood_flow >= minimum_flow)
return
if(demotes_to)
@@ -262,7 +262,7 @@
severity = WOUND_SEVERITY_MODERATE
initial_flow = 2
minimum_flow = 0.5
clot_rate = 0.12
clot_rate = 0.06
threshold_minimum = 20
threshold_penalty = 10
status_effect_type = /datum/status_effect/wound/slash/moderate
@@ -278,7 +278,7 @@
severity = WOUND_SEVERITY_SEVERE
initial_flow = 3.25
minimum_flow = 2.75
clot_rate = 0.06
clot_rate = 0.03
threshold_minimum = 50
threshold_penalty = 25
demotes_to = /datum/wound/slash/moderate
@@ -295,7 +295,7 @@
severity = WOUND_SEVERITY_CRITICAL
initial_flow = 4.25
minimum_flow = 4
clot_rate = -0.05 // critical cuts actively get worse instead of better
clot_rate = -0.025 // critical cuts actively get worse instead of better
threshold_minimum = 80
threshold_penalty = 40
demotes_to = /datum/wound/slash/severe

View File

@@ -29,17 +29,17 @@
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner)
..()
/obj/item/organ/body_egg/on_death()
/obj/item/organ/body_egg/on_death(delta_time, times_fired)
. = ..()
if(!owner)
return
egg_process()
egg_process(delta_time, times_fired)
/obj/item/organ/body_egg/on_life()
/obj/item/organ/body_egg/on_life(delta_time, times_fired)
. = ..()
egg_process()
egg_process(delta_time, times_fired)
/obj/item/organ/body_egg/proc/egg_process()
/obj/item/organ/body_egg/proc/egg_process(delta_time, times_fired)
return
/obj/item/organ/body_egg/proc/RefreshInfectionImage()

View File

@@ -130,7 +130,7 @@
amount = 6
grind_results = list(/datum/reagent/cellulose = 2)
custom_price = PAYCHECK_ASSISTANT * 2
absorption_rate = 0.25
absorption_rate = 0.125
absorption_capacity = 5
splint_factor = 0.35
merge_type = /obj/item/stack/medical/gauze
@@ -200,7 +200,7 @@
desc = "A roll of cloth roughly cut from something that does a decent job of stabilizing wounds, but less efficiently so than real medical gauze."
self_delay = 6 SECONDS
other_delay = 3 SECONDS
absorption_rate = 0.15
absorption_rate = 0.075
absorption_capacity = 4
merge_type = /obj/item/stack/medical/gauze/improvised
gauze_type = /datum/bodypart_aid/gauze/improvised //SKYRAT EDIT ADDITION - MEDICAL

View File

@@ -35,7 +35,7 @@
var/splint_factor
/// How much blood flow this stack can absorb if used as a bandage on a cut wound, note that absorption is how much we lower the flow rate, not the raw amount of blood we suck up
var/absorption_capacity
/// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in ticks is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first
/// How quickly we lower the blood flow on a cut wound we're bandaging. Expected lifetime of this bandage in seconds is thus absorption_capacity/absorption_rate, or until the cut heals, whichever comes first
var/absorption_rate
/// Amount of matter for RCD
var/matter_amount = 0

View File

@@ -7,10 +7,15 @@
organ_flags = NONE
beating = TRUE
var/true_name = "baseline placebo referencer"
var/cooldown_low = 300
var/cooldown_high = 300
var/next_activation = 0
var/uses // -1 For infinite
/// The minimum time between activations
var/cooldown_low = 30 SECONDS
/// The maximum time between activations
var/cooldown_high = 30 SECONDS
/// The cooldown for activations
COOLDOWN_DECLARE(activation_cooldown)
/// The number of remaining uses this gland has.
var/uses = 0 // -1 For infinite
var/human_only = FALSE
var/active = FALSE
@@ -36,7 +41,7 @@
/obj/item/organ/heart/gland/proc/Start()
active = 1
next_activation = world.time + rand(cooldown_low,cooldown_high)
COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high))
/obj/item/organ/heart/gland/proc/update_gland_hud()
if(!owner)
@@ -91,7 +96,7 @@
hud.add_to_hud(owner)
update_gland_hud()
/obj/item/organ/heart/gland/on_life()
/obj/item/organ/heart/gland/on_life(delta_time, times_fired)
if(!beating)
// alien glands are immune to stopping.
beating = TRUE
@@ -100,10 +105,10 @@
if(!ownerCheck())
active = FALSE
return
if(next_activation <= world.time)
if(COOLDOWN_FINISHED(src, activation_cooldown))
activate()
uses--
next_activation = world.time + rand(cooldown_low,cooldown_high)
COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high))
if(!uses)
active = FALSE

View File

@@ -124,7 +124,7 @@
notify_ghosts("A controllable spore has been created in \the [get_area(src)].", source = src, action = NOTIFY_ORBIT, flashwindow = FALSE, header = "Sentient Spore Created")
add_cell_sample()
/mob/living/simple_animal/hostile/blob/blobspore/Life()
/mob/living/simple_animal/hostile/blob/blobspore/Life(delta_time = SSMOBS_DT, times_fired)
if(!is_zombie && isturf(src.loc))
for(var/mob/living/carbon/human/H in view(src,1)) //Only for corpse right next to/on same tile
if(!is_weak && H.stat == DEAD)
@@ -278,39 +278,41 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/add_cell_sample()
AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/blob/blobbernaut/Life()
if(..())
var/list/blobs_in_area = range(2, src)
if(independent)
return // strong independent blobbernaut that don't need no blob
var/damagesources = 0
if(!(locate(/obj/structure/blob) in blobs_in_area))
damagesources++
if(!factory)
damagesources++
else
if(locate(/obj/structure/blob/special/core) in blobs_in_area)
adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(locate(/obj/structure/blob/special/node) in blobs_in_area)
adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_NODE)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src))
if(overmind)
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(damagesources)
for(var/i in 1 to damagesources)
adjustHealth(maxHealth*BLOBMOB_BLOBBERNAUT_HEALTH_DECAY) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both
var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01)
I.appearance_flags = RESET_COLOR
/mob/living/simple_animal/hostile/blob/blobbernaut/Life(delta_time = SSMOBS_DT, times_fired)
if(!..())
return
var/list/blobs_in_area = range(2, src)
if(independent)
return // strong independent blobbernaut that don't need no blob
var/damagesources = 0
if(!(locate(/obj/structure/blob) in blobs_in_area))
damagesources++
if(!factory)
damagesources++
else
if(locate(/obj/structure/blob/special/core) in blobs_in_area)
adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE * delta_time)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
if(overmind)
I.color = overmind.blobstrain.complementary_color
flick_overlay_view(I, src, 8)
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(locate(/obj/structure/blob/special/node) in blobs_in_area)
adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_NODE * delta_time)
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src))
if(overmind)
H.color = overmind.blobstrain.complementary_color
else
H.color = "#000000"
if(damagesources)
adjustHealth(maxHealth * BLOBMOB_BLOBBERNAUT_HEALTH_DECAY * damagesources * delta_time) //take 2.5% of max health as damage when not near the blob or if the naut has no factory, 5% if both
var/image/I = new('icons/mob/blob.dmi', src, "nautdamage", MOB_LAYER+0.01)
I.appearance_flags = RESET_COLOR
if(overmind)
I.color = overmind.blobstrain.complementary_color
flick_overlay_view(I, src, 8)
/mob/living/simple_animal/hostile/blob/blobbernaut/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
. = ..()

View File

@@ -25,9 +25,9 @@
exposed_mob.reagents.add_reagent(/datum/reagent/blob/cryogenic_poison, 0.3*reac_volume)
exposed_mob.apply_damage(0.2*reac_volume, BRUTE, wound_bonus=CANT_WOUND)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob)
exposed_mob.adjustBruteLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
exposed_mob.adjustFireLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
exposed_mob.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE)
/datum/reagent/blob/cryogenic_poison/on_mob_life(mob/living/carbon/exposed_mob, delta_time, times_fired)
exposed_mob.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
exposed_mob.adjustFireLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
exposed_mob.adjustToxLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
. = 1
..()

View File

@@ -24,8 +24,8 @@
exposed_mob.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume)
exposed_mob.apply_damage(0.7*reac_volume, TOX)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C)
C.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C, delta_time, times_fired)
C.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
C.hal_screwyhud = SCREWYHUD_HEALTHY //fully healed, honest
..()

View File

@@ -24,7 +24,7 @@
var/trueabsorbs = 0//dna gained using absorb, not dna sting
var/chem_charges = 20
var/chem_storage = 75
var/chem_recharge_rate = 1
var/chem_recharge_rate = 0.5
var/chem_recharge_slowdown = 0
var/sting_range = 2
var/geneticdamage = 0
@@ -209,15 +209,15 @@
return FALSE
//Called in life()
/datum/antagonist/changeling/proc/regenerate()//grants the HuD in life.dm
/datum/antagonist/changeling/proc/regenerate(delta_time, times_fired)//grants the HuD in life.dm
var/mob/living/carbon/the_ling = owner.current
if(istype(the_ling))
if(the_ling.stat == DEAD)
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5))
geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1)
chem_charges = min(max(0, chem_charges + ((chem_recharge_rate - chem_recharge_slowdown) * delta_time)), (chem_storage * 0.5))
geneticdamage = max(geneticdamage - (0.5 * delta_time), LING_DEAD_GENETICDAMAGE_HEAL_CAP)
else //not dead? no chem/geneticdamage caps.
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage)
geneticdamage = max(0, geneticdamage-1)
chem_charges = min(max(0, chem_charges + ((chem_recharge_rate - chem_recharge_slowdown) * delta_time)), chem_storage)
geneticdamage = max(geneticdamage - (0.5 * delta_time), 0)
/datum/antagonist/changeling/proc/get_dna(dna_owner)

View File

@@ -12,7 +12,7 @@
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling.mimicing)
changeling.mimicing = ""
changeling.chem_recharge_slowdown -= 0.5
changeling.chem_recharge_slowdown -= 0.25
to_chat(user, "<span class='notice'>We return our vocal glands to their original position.</span>")
return
@@ -21,7 +21,7 @@
return
..()
changeling.mimicing = mimic_voice
changeling.chem_recharge_slowdown += 0.5
changeling.chem_recharge_slowdown += 0.25
to_chat(user, "<span class='notice'>We shape our glands to take the voice of <b>[mimic_voice]</b>, this will slow down regenerating chemicals while active.</span>")
to_chat(user, "<span class='notice'>Use this power again to return to our original voice and return chemical production to normal levels.</span>")
return TRUE

View File

@@ -465,7 +465,7 @@
helmet_type = /obj/item/clothing/head/helmet/space/changeling
suit_name_simple = "flesh shell"
helmet_name_simple = "space helmet"
recharge_slowdown = 0.5
recharge_slowdown = 0.25
blood_on_castoff = 1
/obj/item/clothing/suit/space/changeling
@@ -520,7 +520,7 @@
chemical_cost = 20
dna_cost = 1
req_human = 1
recharge_slowdown = 0.25
recharge_slowdown = 0.125
suit_type = /obj/item/clothing/suit/armor/changeling
helmet_type = /obj/item/clothing/head/helmet/changeling

View File

@@ -16,11 +16,11 @@
var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(!receptors_active)
to_chat(user, "<span class='warning'>We search for the scent of any nearby changelings.</span>")
changeling.chem_recharge_slowdown += 0.5
changeling.chem_recharge_slowdown += 0.25
user.apply_status_effect(/datum/status_effect/agent_pinpointer/changeling)
else
to_chat(user, "<span class='notice'>We stop searching for now.</span>")
changeling.chem_recharge_slowdown -= 0.5
changeling.chem_recharge_slowdown -= 0.25
user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling)
receptors_active = !receptors_active

View File

@@ -1,5 +1,5 @@
/// How many life ticks are required for the nightmare's heart to revive the nightmare.
#define HEART_RESPAWN_THRESHHOLD 40
#define HEART_RESPAWN_THRESHHOLD (80 SECONDS)
/// A special flag value used to make a nightmare heart not grant a light eater. Appears to be unused.
#define HEART_SPECIAL_SHADOWIFY 2
@@ -73,14 +73,14 @@
/obj/item/organ/heart/nightmare/Stop()
return 0
/obj/item/organ/heart/nightmare/on_death()
/obj/item/organ/heart/nightmare/on_death(delta_time, times_fired)
if(!owner)
return
var/turf/T = get_turf(owner)
if(istype(T))
var/light_amount = T.get_lumcount()
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
respawn_progress++
respawn_progress += delta_time SECONDS
playsound(owner, 'sound/effects/singlebeat.ogg', 40, TRUE)
if(respawn_progress < HEART_RESPAWN_THRESHHOLD)
return

View File

@@ -57,7 +57,7 @@
var/essence = 75 //The resource, and health, of revenants.
var/essence_regen_cap = 75 //The regeneration cap of essence (go figure); regenerates every Life() tick up to this amount.
var/essence_regenerating = TRUE //If the revenant regenerates essence or not
var/essence_regen_amount = 5 //How much essence regenerates
var/essence_regen_amount = 2.5 //How much essence regenerates per second
var/essence_accumulated = 0 //How much essence the revenant has stolen
var/essence_excess = 0 //How much stolen essence avilable for unlocks
var/revealed = FALSE //If the revenant can take damage from normal sources.
@@ -113,7 +113,7 @@
mind.add_antag_datum(/datum/antagonist/revenant)
//Life, Stat, Hud Updates, and Say
/mob/living/simple_animal/revenant/Life()
/mob/living/simple_animal/revenant/Life(delta_time = SSMOBS_DT, times_fired)
if(stasis)
return
if(revealed && essence <= 0)
@@ -129,7 +129,7 @@
notransform = FALSE
to_chat(src, "<span class='revenboldnotice'>You can move again!</span>")
if(essence_regenerating && !inhibited && essence < essence_regen_cap) //While inhibited, essence will not regenerate
essence = min(essence_regen_cap, essence+essence_regen_amount)
essence = min(essence + (essence_regen_amount * delta_time), essence_regen_cap)
update_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
update_spooky_icon()
update_health_hud()

View File

@@ -1,12 +1,12 @@
/datum/disease/revblight
name = "Unnatural Wasting"
max_stages = 5
stage_prob = 10
stage_prob = 5
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
cure_text = "Holy water or extensive rest."
spread_text = "A burst of unholy energy"
cures = list(/datum/reagent/water/holywater)
cure_chance = 50 //higher chance to cure, because revenants are assholes
cure_chance = 30 //higher chance to cure, because revenants are assholes
agent = "Unholy Forces"
viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE
@@ -25,42 +25,42 @@
..()
/datum/disease/revblight/stage_act()
/datum/disease/revblight/stage_act(delta_time, times_fired)
. = ..()
if(!.)
return
if(!finalstage)
if(affected_mob.body_position == LYING_DOWN && prob(stage * 6))
if(affected_mob.body_position == LYING_DOWN && DT_PROB(3 * stage, delta_time))
cure()
return FALSE
if(prob(stage * 3))
if(DT_PROB(1.5 * stage, delta_time))
to_chat(affected_mob, "<span class='revennotice'>You suddenly feel [pick("sick and tired", "disoriented", "tired and confused", "nauseated", "faint", "dizzy")]...</span>")
affected_mob.add_confusion(8)
affected_mob.adjustStaminaLoss(20, FALSE)
new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(stagedamage < stage)
stagedamage++
affected_mob.adjustToxLoss(stage * 2, FALSE) //should, normally, do about 30 toxin damage.
affected_mob.adjustToxLoss(1 * stage * delta_time, FALSE) //should, normally, do about 30 toxin damage.
new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(prob(45))
if(DT_PROB(25, delta_time))
affected_mob.adjustStaminaLoss(stage, FALSE)
switch(stage)
if(2)
if(prob(5))
if(DT_PROB(2.5, delta_time))
affected_mob.emote("pale")
if(3)
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.emote(pick("pale","shiver"))
if(4)
if(prob(15))
if(DT_PROB(7.5, delta_time))
affected_mob.emote(pick("pale","shiver","cries"))
if(5)
if(!finalstage)
finalstage = TRUE
to_chat(affected_mob, "<span class='revenbignotice'>You feel like [pick("nothing's worth it anymore", "nobody ever needed your help", "nothing you did mattered", "everything you tried to do was worthless")].</span>")
affected_mob.adjustStaminaLoss(45, FALSE)
affected_mob.adjustStaminaLoss(22.5 * delta_time, FALSE)
new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")

View File

@@ -72,7 +72,7 @@
human.update_spacesuit_hud_icon("0")
// Space Suit temperature regulation and power usage
/obj/item/clothing/suit/space/process()
/obj/item/clothing/suit/space/process(delta_time)
var/mob/living/carbon/human/user = src.loc
if(!user || !ishuman(user) || !(user.wear_suit == src))
return
@@ -97,7 +97,7 @@
// If we got here, it means thermals are on, the cell is in and the cell has
// just had enough charge subtracted from it to power the thermal regulator
user.adjust_bodytemperature(get_temp_change_amount((temperature_setting - user.bodytemperature), 0.16))
user.adjust_bodytemperature(get_temp_change_amount((temperature_setting - user.bodytemperature), 0.08 * delta_time))
update_hud_icon(user)
// Clean up the cell on destroy

View File

@@ -661,7 +661,7 @@ This section is for the crystal monsters variations
attack_verb_simple = "smash"
attack_sound = 'sound/effects/supermatter.ogg'
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
unsuitable_atmos_damage = 10
unsuitable_atmos_damage = 5
robust_searching = 1
stat_attack = HARD_CRIT
faction = list("crystal")

View File

@@ -25,12 +25,11 @@ GLOBAL_LIST_INIT(hallucination_list, list(
))
/mob/living/carbon/proc/handle_hallucinations()
/mob/living/carbon/proc/handle_hallucinations(delta_time, times_fired)
if(!hallucination)
return
hallucination = max(hallucination - 1, 0)
hallucination = max(hallucination - (0.5 * delta_time), 0)
if(world.time < next_hallucination)
return

View File

@@ -64,7 +64,7 @@
owner.revive(full_heal = TRUE, admin_revive = FALSE)
qdel(src)
/obj/item/organ/regenerative_core/on_life()
/obj/item/organ/regenerative_core/on_life(delta_time, times_fired)
..()
if(owner.health <= owner.crit_threshold)
ui_action_click()

View File

@@ -966,7 +966,7 @@
cures = list(/datum/reagent/medicine/adminordrazine)
agent = "dragon's blood"
desc = "What do dragons have to do with Space Station 13?"
stage_prob = 20
stage_prob = 10
severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = 0
stage1 = list("Your bones ache.")

View File

@@ -5,7 +5,7 @@
****************************************************/
// Takes care blood loss and regeneration
/mob/living/carbon/human/handle_blood()
/mob/living/carbon/human/handle_blood(delta_time, times_fired)
if(NOBLOOD in dna.species.species_traits || HAS_TRAIT(src, TRAIT_NOBLEED) || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
return
@@ -28,31 +28,31 @@
nutrition_ratio = 1
if(satiety > 80)
nutrition_ratio *= 1.25
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR)
blood_volume = min(BLOOD_VOLUME_NORMAL, blood_volume + 0.5 * nutrition_ratio)
adjust_nutrition(-nutrition_ratio * HUNGER_FACTOR * delta_time)
blood_volume = min(blood_volume + (BLOOD_REGEN_FACTOR * nutrition_ratio * delta_time), BLOOD_VOLUME_NORMAL)
//Effects of bloodloss
var/word = pick("dizzy","woozy","faint")
switch(blood_volume)
if(BLOOD_VOLUME_EXCESS to BLOOD_VOLUME_MAX_LETHAL)
if(prob(15))
if(DT_PROB(7.5, delta_time))
to_chat(src, "<span class='userdanger'>Blood starts to tear your skin apart. You're going to burst!</span>")
inflate_gib()
if(BLOOD_VOLUME_MAXIMUM to BLOOD_VOLUME_EXCESS)
if(prob(10))
if(DT_PROB(5, delta_time))
to_chat(src, "<span class='warning'>You feel terribly bloated.</span>")
if(BLOOD_VOLUME_OKAY to BLOOD_VOLUME_SAFE)
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(src, "<span class='warning'>You feel [word].</span>")
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.01, 1))
adjustOxyLoss(round(0.005 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
if(BLOOD_VOLUME_BAD to BLOOD_VOLUME_OKAY)
adjustOxyLoss(round((BLOOD_VOLUME_NORMAL - blood_volume) * 0.02, 1))
if(prob(5))
adjustOxyLoss(round(0.01 * (BLOOD_VOLUME_NORMAL - blood_volume) * delta_time, 1))
if(DT_PROB(2.5, delta_time))
blur_eyes(6)
to_chat(src, "<span class='warning'>You feel very [word].</span>")
if(BLOOD_VOLUME_SURVIVE to BLOOD_VOLUME_BAD)
adjustOxyLoss(5)
if(prob(15))
adjustOxyLoss(2.5 * delta_time)
if(DT_PROB(7.5, delta_time))
Unconscious(rand(20,60))
to_chat(src, "<span class='warning'>You feel extremely [word].</span>")
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
@@ -63,7 +63,7 @@
//Bleeding out
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
temp_bleed += BP.get_bleed_rate()
temp_bleed += BP.get_bleed_rate() * delta_time
BP.generic_bleedstacks = max(0, BP.generic_bleedstacks - 1)
if(temp_bleed)

View File

@@ -229,7 +229,7 @@
owner.mind.current = null
return ..()
/obj/item/organ/brain/on_life()
/obj/item/organ/brain/on_life(delta_time, times_fired)
if(damage >= BRAIN_DAMAGE_DEATH) //rip
to_chat(owner, "<span class='userdanger'>The last spark of life in your brain fizzles out...</span>")
owner.death()

View File

@@ -1,37 +1,40 @@
/mob/living/brain/Life()
/mob/living/brain/Life(delta_time = SSMOBS_DT, times_fired)
if (notransform)
return
if(!loc)
return
. = ..()
handle_emp_damage()
handle_emp_damage(delta_time, times_fired)
/mob/living/brain/update_stat()
if(status_flags & GODMODE)
return
if(health <= HEALTH_THRESHOLD_DEAD)
if(stat != DEAD)
death()
var/obj/item/organ/brain/BR
if(container?.brain)
BR = container.brain
else if(istype(loc, /obj/item/organ/brain))
BR = loc
if(BR)
BR.damage = BRAIN_DAMAGE_DEATH //beaten to a pulp
if(health > HEALTH_THRESHOLD_DEAD)
return
if(stat != DEAD)
death()
var/obj/item/organ/brain/BR
if(container?.brain)
BR = container.brain
else if(istype(loc, /obj/item/organ/brain))
BR = loc
if(BR)
BR.damage = BRAIN_DAMAGE_DEATH //beaten to a pulp
/mob/living/brain/proc/handle_emp_damage()
if(emp_damage)
if(stat == DEAD)
emp_damage = 0
else
emp_damage = max(emp_damage-1, 0)
/mob/living/brain/proc/handle_emp_damage(delta_time, times_fired)
if(!emp_damage)
return
/mob/living/brain/handle_status_effects()
if(stat == DEAD)
emp_damage = 0
else
emp_damage = max(emp_damage - (0.5 * delta_time), 0)
/mob/living/brain/handle_status_effects(delta_time, times_fired)
return
/mob/living/brain/handle_traits()
/mob/living/brain/handle_traits(delta_time, times_fired)
return

View File

@@ -48,7 +48,7 @@
/mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums
return -10
/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment)
/mob/living/carbon/alien/handle_environment(datum/gas_mixture/environment, delta_time, times_fired)
// Run base mob body temperature proc before taking damage
// this balances body temp to the environment and natural stabilization
. = ..()
@@ -58,19 +58,19 @@
throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire)
switch(bodytemperature)
if(360 to 400)
apply_damage(HEAT_DAMAGE_LEVEL_1, BURN)
apply_damage(HEAT_DAMAGE_LEVEL_1 * delta_time, BURN)
if(400 to 460)
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
apply_damage(HEAT_DAMAGE_LEVEL_2 * delta_time, BURN)
if(460 to INFINITY)
if(on_fire)
apply_damage(HEAT_DAMAGE_LEVEL_3, BURN)
apply_damage(HEAT_DAMAGE_LEVEL_3 * delta_time, BURN)
else
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
apply_damage(HEAT_DAMAGE_LEVEL_2 * delta_time, BURN)
else
clear_alert("alien_fire")
/mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents
return 0
/mob/living/carbon/alien/reagent_check(datum/reagent/R, delta_time, times_fired) //can metabolize all reagents
return FALSE
/mob/living/carbon/alien/get_status_tab_items()
. = ..()

View File

@@ -1,13 +1,13 @@
/mob/living/carbon/alien/larva/Life()
/mob/living/carbon/alien/larva/Life(delta_time = SSMOBS_DT, times_fired)
if (notransform)
return
if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis
// GROW!
if(amount_grown < max_grown)
amount_grown++
update_icons()
if(!..() || IS_IN_STASIS(src) || (amount_grown >= max_grown))
return // We're dead, in stasis, or already grown.
// GROW!
amount_grown = min(amount_grown + (0.5 * delta_time), max_grown)
update_icons()
/mob/living/carbon/alien/larva/update_stat()

View File

@@ -1,4 +1,4 @@
/mob/living/carbon/alien/Life()
/mob/living/carbon/alien/Life(delta_time = SSMOBS_DT, times_fired)
findQueen()
return..()
@@ -38,17 +38,17 @@
//BREATH TEMPERATURE
handle_breath_temperature(breath)
/mob/living/carbon/alien/handle_status_effects()
/mob/living/carbon/alien/handle_status_effects(delta_time, times_fired)
..()
//natural reduction of movement delay due to stun.
if(move_delay_add > 0)
move_delay_add = max(0, move_delay_add - rand(1, 2))
move_delay_add = max(0, move_delay_add - (0.5 * rand(1, 2) * delta_time))
/mob/living/carbon/alien/handle_changeling()
return
/mob/living/carbon/alien/handle_fire()//Aliens on fire code
/mob/living/carbon/alien/handle_fire(delta_time, times_fired)//Aliens on fire code
. = ..()
if(.) //if the mob isn't on fire anymore
return
adjust_bodytemperature(BODYTEMP_HEATING_MAX) //If you're on fire, you heat up!
adjust_bodytemperature(BODYTEMP_HEATING_MAX * 0.5 * delta_time) //If you're on fire, you heat up!

View File

@@ -35,10 +35,14 @@
alien_powers = list(/obj/effect/proc_holder/alien/plant, /obj/effect/proc_holder/alien/transfer)
food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10)
/// The current amount of stored plasma.
var/storedPlasma = 100
/// The maximum plasma this organ can store.
var/max_plasma = 250
var/heal_rate = 5
var/plasma_rate = 10
/// The rate this organ regenerates its owners health at per damage type per second.
var/heal_rate = 2.5
/// The rate this organ regenerates plasma at per second.
var/plasma_rate = 5
/obj/item/organ/alien/plasmavessel/large
name = "large plasma vessel"
@@ -46,10 +50,10 @@
w_class = WEIGHT_CLASS_BULKY
storedPlasma = 200
max_plasma = 500
plasma_rate = 15
plasma_rate = 7.5
/obj/item/organ/alien/plasmavessel/large/queen
plasma_rate = 20
plasma_rate = 10
/obj/item/organ/alien/plasmavessel/small
name = "small plasma vessel"
@@ -57,7 +61,7 @@
w_class = WEIGHT_CLASS_SMALL
storedPlasma = 100
max_plasma = 150
plasma_rate = 5
plasma_rate = 2.5
/obj/item/organ/alien/plasmavessel/small/tiny
name = "tiny plasma vessel"
@@ -66,22 +70,22 @@
max_plasma = 100
alien_powers = list(/obj/effect/proc_holder/alien/transfer)
/obj/item/organ/alien/plasmavessel/on_life()
/obj/item/organ/alien/plasmavessel/on_life(delta_time, times_fired)
//If there are alien weeds on the ground then heal if needed or give some plasma
if(locate(/obj/structure/alien/weeds) in owner.loc)
if(owner.health >= owner.maxHealth)
owner.adjustPlasma(plasma_rate)
owner.adjustPlasma(plasma_rate * delta_time)
else
var/heal_amt = heal_rate
if(!isalien(owner))
heal_amt *= 0.2
owner.adjustPlasma(plasma_rate*0.5)
owner.adjustBruteLoss(-heal_amt)
owner.adjustFireLoss(-heal_amt)
owner.adjustOxyLoss(-heal_amt)
owner.adjustCloneLoss(-heal_amt)
owner.adjustPlasma(0.5 * plasma_rate * delta_time)
owner.adjustBruteLoss(-heal_amt * delta_time)
owner.adjustFireLoss(-heal_amt * delta_time)
owner.adjustOxyLoss(-heal_amt * delta_time)
owner.adjustCloneLoss(-heal_amt * delta_time)
else
owner.adjustPlasma(plasma_rate * 0.1)
owner.adjustPlasma(0.1 * plasma_rate * delta_time)
/obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0)
..()

View File

@@ -25,34 +25,34 @@
if(prob(10))
AttemptGrow(0)
/obj/item/organ/body_egg/alien_embryo/on_life()
/obj/item/organ/body_egg/alien_embryo/on_life(delta_time, times_fired)
. = ..()
switch(stage)
if(3, 4)
if(prob(2))
if(DT_PROB(1, delta_time))
owner.emote("sneeze")
if(prob(2))
if(DT_PROB(1, delta_time))
owner.emote("cough")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(owner, "<span class='danger'>Your throat feels sore.</span>")
if(prob(2))
if(DT_PROB(1, delta_time))
to_chat(owner, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(5)
if(prob(2))
if(DT_PROB(1, delta_time))
owner.emote("sneeze")
if(prob(2))
if(DT_PROB(1, delta_time))
owner.emote("cough")
if(prob(4))
if(DT_PROB(2, delta_time))
to_chat(owner, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
owner.take_bodypart_damage(1)
if(prob(4))
if(DT_PROB(2, delta_time))
to_chat(owner, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
owner.adjustToxLoss(1)
if(6)
to_chat(owner, "<span class='danger'>You feel something tearing its way out of your chest...</span>")
owner.adjustToxLoss(10)
owner.adjustToxLoss(5 * delta_time) // Why is this [TOX]?
/// Controls Xenomorph Embryo growth. If embryo is fully grown (or overgrown), stop the proc. If not, increase the stage by one and if it's not fully grown (stage 6), add a timer to do this proc again after however long the growth time variable is.
/obj/item/organ/body_egg/alien_embryo/proc/advance_embryo_stage()
@@ -62,7 +62,6 @@
INVOKE_ASYNC(src, .proc/RefreshInfectionImage)
addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time)
/obj/item/organ/body_egg/alien_embryo/egg_process()
if(stage == 6 && prob(50))
for(var/datum/surgery/S in owner.surgeries)

View File

@@ -11,7 +11,7 @@ INITIALIZE_IMMEDIATE(/mob/living/carbon/human/dummy)
in_use = FALSE
return ..()
/mob/living/carbon/human/dummy/Life()
/mob/living/carbon/human/dummy/Life(delta_time = SSMOBS_DT, times_fired)
return
/mob/living/carbon/human/dummy/attach_rot(mapload)

View File

@@ -84,8 +84,8 @@
//Check inventory slots
return (wear_id?.GetID() || belt?.GetID())
/mob/living/carbon/human/reagent_check(datum/reagent/R)
return dna.species.handle_chemicals(R,src)
/mob/living/carbon/human/reagent_check(datum/reagent/R, delta_time, times_fired)
return dna.species.handle_chemicals(R, src, delta_time, times_fired)
// if it returns 0, it will run the usual on_mob_life for that reagent. otherwise, it will stop after running handle_chemicals for the species.

View File

@@ -18,34 +18,33 @@
#define THERMAL_PROTECTION_HAND_LEFT 0.025
#define THERMAL_PROTECTION_HAND_RIGHT 0.025
/mob/living/carbon/human/Life()
if (notransform)
/mob/living/carbon/human/Life(delta_time = SSMOBS_DT, times_fired)
if(notransform)
return
. = ..()
if (QDELETED(src))
if(QDELETED(src))
return FALSE
//Body temperature stability and damage
dna.species.handle_body_temperature(src)
dna.species.handle_body_temperature(src, delta_time, times_fired)
if(!IS_IN_STASIS(src))
if(.) //not dead
for(var/datum/mutation/human/HM in dna.mutations) // Handle active genes
HM.on_life()
HM.on_life(delta_time, times_fired)
if(stat != DEAD)
//heart attack stuff
handle_heart()
handle_liver()
handle_heart(delta_time, times_fired)
handle_liver(delta_time, times_fired)
dna.species.spec_life(src) // for mutantraces
dna.species.spec_life(src, delta_time, times_fired) // for mutantraces
else
for(var/i in all_wounds)
var/datum/wound/iter_wound = i
iter_wound.on_stasis()
iter_wound.on_stasis(delta_time, times_fired)
//Update our name based on whether our face is obscured/disfigured
name = get_visible_name()
@@ -68,15 +67,15 @@
return pressure
/mob/living/carbon/human/handle_traits()
/mob/living/carbon/human/handle_traits(delta_time, times_fired)
if (getOrganLoss(ORGAN_SLOT_BRAIN) >= 60)
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "brain_damage", /datum/mood_event/brain_damage)
else
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "brain_damage")
return ..()
/mob/living/carbon/human/handle_mutations_and_radiation()
if(!dna || !dna.species.handle_mutations_and_radiation(src))
/mob/living/carbon/human/handle_mutations_and_radiation(delta_time, times_fired)
if(!dna || !dna.species.handle_mutations_and_radiation(src, delta_time, times_fired))
..()
/mob/living/carbon/human/breathe()
@@ -113,12 +112,12 @@
lun.check_breath(breath,src)
/// Environment handlers for species
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment)
/mob/living/carbon/human/handle_environment(datum/gas_mixture/environment, delta_time, times_fired)
// If we are in a cryo bed do not process life functions
if(istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
return
dna.species.handle_environment(environment, src)
dna.species.handle_environment(src, environment, delta_time, times_fired)
/**
* Adjust the core temperature of a mob
@@ -146,13 +145,13 @@
return dna.species.bodytemp_normal + get_body_temp_normal_change()
///FIRE CODE
/mob/living/carbon/human/handle_fire()
/mob/living/carbon/human/handle_fire(delta_time, times_fired)
. = ..()
if(.) //if the mob isn't on fire anymore
return
if(dna)
. = dna.species.handle_fire(src) //do special handling based on the mob's species. TRUE = they are immune to the effects of the fire.
. = dna.species.handle_fire(src, delta_time, times_fired) //do special handling based on the mob's species. TRUE = they are immune to the effects of the fire.
if(!last_fire_update)
last_fire_update = fire_stacks
@@ -303,14 +302,17 @@
return min(1, thermal_protection)
/mob/living/carbon/human/handle_random_events()
/mob/living/carbon/human/handle_random_events(delta_time, times_fired)
//Puke if toxloss is too high
if(!stat)
if(getToxLoss() >= 45 && nutrition > 20)
lastpuke += prob(50)
if(lastpuke >= 50) // about 25 second delay I guess
vomit(20)
lastpuke = 0
if(stat)
return
if(getToxLoss() < 45 || nutrition <= 20)
return
lastpuke += DT_PROB(30, delta_time)
if(lastpuke >= 50) // about 25 second delay I guess // This is actually closer to 150 seconds
vomit(20)
lastpuke = 0
/mob/living/carbon/human/has_smoke_protection()
@@ -326,17 +328,17 @@
return TRUE
return ..()
/mob/living/carbon/human/proc/handle_heart()
/mob/living/carbon/human/proc/handle_heart(delta_time, times_fired)
var/we_breath = !HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT)
if(!undergoing_cardiac_arrest())
return
if(we_breath)
adjustOxyLoss(8)
adjustOxyLoss(4 * delta_time)
Unconscious(80)
// Tissues die without blood circulation
adjustBruteLoss(2)
adjustBruteLoss(1 * delta_time)
#undef THERMAL_PROTECTION_HEAD
#undef THERMAL_PROTECTION_CHEST

View File

@@ -67,7 +67,7 @@
if(relic_mask)
equip_to_slot_or_del(new relic_mask, ITEM_SLOT_MASK)
/mob/living/carbon/human/species/monkey/punpun/Life()
/mob/living/carbon/human/species/monkey/punpun/Life(delta_time = SSMOBS_DT, times_fired)
if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE, FALSE)
memory_saved = TRUE

View File

@@ -973,14 +973,14 @@ GLOBAL_LIST_EMPTY(roundstart_races)
return "FRONT"
/datum/species/proc/spec_life(mob/living/carbon/human/H)
/datum/species/proc/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(HAS_TRAIT(H, TRAIT_NOBREATH))
H.setOxyLoss(0)
H.losebreath = 0
var/takes_crit_damage = (!HAS_TRAIT(H, TRAIT_NOCRITDAMAGE))
if((H.health < H.crit_threshold) && takes_crit_damage)
H.adjustBruteLoss(1)
H.adjustBruteLoss(0.5 * delta_time)
if(flying_species)
HandleFlight(H)
@@ -1149,7 +1149,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/after_equip_job(datum/job/J, mob/living/carbon/human/H)
H.update_mutant_bodyparts()
/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/proc/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
if(chem.type == exotic_blood)
H.blood_volume = min(H.blood_volume + round(chem.volume, 0.1), BLOOD_VOLUME_MAXIMUM)
H.reagents.del_reagent(chem.type)
@@ -1173,20 +1173,20 @@ GLOBAL_LIST_EMPTY(roundstart_races)
////////
//LIFE//
////////
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
/datum/species/proc/handle_digestion(mob/living/carbon/human/H, delta_time, times_fired)
if(HAS_TRAIT(H, TRAIT_NOHUNGER))
return //hunger is for BABIES
//The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
if(HAS_TRAIT_FROM(H, TRAIT_FAT, OBESITY))//I share your pain, past coder.
if(H.overeatduration < 100)
if(H.overeatduration < (200 SECONDS))
to_chat(H, "<span class='notice'>You feel fit again!</span>")
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
H.remove_movespeed_modifier(/datum/movespeed_modifier/obesity)
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration >= 100)
if(H.overeatduration >= (200 SECONDS))
to_chat(H, "<span class='danger'>You suddenly feel blubbery!</span>")
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
H.add_movespeed_modifier(/datum/movespeed_modifier/obesity)
@@ -1199,7 +1199,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/hunger_rate = HUNGER_FACTOR
var/datum/component/mood/mood = H.GetComponent(/datum/component/mood)
if(mood && mood.sanity > SANITY_DISTURBED)
hunger_rate *= max(0.5, 1 - 0.002 * mood.sanity) //0.85 to 0.75
hunger_rate *= max(1 - 0.002 * mood.sanity, 0.5) //0.85 to 0.75
// Whether we cap off our satiety or move it towards 0
if(H.satiety > MAX_SATIETY)
H.satiety = MAX_SATIETY
@@ -1209,19 +1209,18 @@ GLOBAL_LIST_EMPTY(roundstart_races)
H.satiety = -MAX_SATIETY
else if(H.satiety < 0)
H.satiety++
if(prob(round(-H.satiety/40)))
if(DT_PROB(round(-H.satiety/77), delta_time))
H.Jitter(5)
hunger_rate = 3 * HUNGER_FACTOR
hunger_rate *= H.physiology.hunger_mod
H.adjust_nutrition(-hunger_rate)
H.adjust_nutrition(-hunger_rate * delta_time)
if (H.nutrition > NUTRITION_LEVEL_FULL)
if(H.overeatduration < 600) //capped so people don't take forever to unfat
H.overeatduration++
if(H.nutrition > NUTRITION_LEVEL_FULL)
if(H.overeatduration < 20 MINUTES) //capped so people don't take forever to unfat
H.overeatduration = min(H.overeatduration + (1 SECONDS * delta_time), 20 MINUTES)
else
if(H.overeatduration > 1)
H.overeatduration -= 2 //doubled the unfat rate
if(H.overeatduration > 0)
H.overeatduration = max(H.overeatduration - (2 SECONDS * delta_time), 0) //doubled the unfat rate
//metabolism change
if(H.nutrition > NUTRITION_LEVEL_FAT)
@@ -1265,41 +1264,53 @@ GLOBAL_LIST_EMPTY(roundstart_races)
/datum/species/proc/update_health_hud(mob/living/carbon/human/H)
return FALSE
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/H)
if(HAS_TRAIT(H, TRAIT_RADIMMUNE))
H.radiation = 0
/**
* Species based handling for irradiation
*
* Arguments:
* - [source][/mob/living/carbon/human]: The mob requesting handling
* - delta_time: The amount of time that has passed since the last tick
* - times_fired: The number of times SSmobs has fired
*/
/datum/species/proc/handle_mutations_and_radiation(mob/living/carbon/human/source, delta_time, times_fired)
if(HAS_TRAIT(source, TRAIT_RADIMMUNE))
source.radiation = 0
return TRUE
. = FALSE
var/radiation = H.radiation
var/radiation = source.radiation
if(radiation > RAD_MOB_KNOCKDOWN && DT_PROB(RAD_MOB_KNOCKDOWN_PROB, delta_time))
if(!source.IsParalyzed())
source.emote("collapse")
source.Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(source, "<span class='danger'>You feel weak.</span>")
if(radiation > RAD_MOB_KNOCKDOWN && prob(RAD_MOB_KNOCKDOWN_PROB))
if(!H.IsParalyzed())
H.emote("collapse")
H.Paralyze(RAD_MOB_KNOCKDOWN_AMOUNT)
to_chat(H, "<span class='danger'>You feel weak.</span>")
if(radiation > RAD_MOB_VOMIT && DT_PROB(RAD_MOB_VOMIT_PROB, delta_time))
source.vomit(10, TRUE)
if(radiation > RAD_MOB_VOMIT && prob(RAD_MOB_VOMIT_PROB))
H.vomit(10, TRUE)
if(radiation > RAD_MOB_MUTATE && DT_PROB(RAD_MOB_MUTATE_PROB, delta_time))
to_chat(source, "<span class='danger'>You mutate!</span>")
source.easy_randmut(NEGATIVE + MINOR_NEGATIVE)
source.emote("gasp")
source.domutcheck()
if(radiation > RAD_MOB_MUTATE)
if(prob(1))
to_chat(H, "<span class='danger'>You mutate!</span>")
H.easy_randmut(NEGATIVE+MINOR_NEGATIVE)
H.emote("gasp")
H.domutcheck()
if(radiation > RAD_MOB_HAIRLOSS && DT_PROB(RAD_MOB_HAIRLOSS_PROB, delta_time))
if(!(source.hairstyle == "Bald") && (HAIR in species_traits))
to_chat(source, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
addtimer(CALLBACK(src, .proc/go_bald, source), 5 SECONDS)
if(radiation > RAD_MOB_HAIRLOSS)
if(prob(15) && !(H.hairstyle == "Bald") && (HAIR in species_traits))
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...</span>")
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
/datum/species/proc/go_bald(mob/living/carbon/human/H)
if(QDELETED(H)) //may be called from a timer
/**
* Makes the target human bald.
*
* Arguments:
* - [target][/mob/living/carbon/human]: The mob to make go bald.
*/
/datum/species/proc/go_bald(mob/living/carbon/human/target)
if(QDELETED(target)) //may be called from a timer
return
H.facial_hairstyle = "Shaved"
H.hairstyle = "Bald"
H.update_hair()
target.facial_hairstyle = "Shaved"
target.hairstyle = "Bald"
target.update_hair()
//////////////////
// ATTACK PROCS //
@@ -1677,8 +1688,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* * environment (required) The environment gas mix
* * humi (required)(type: /mob/living/carbon/human) The mob we will target
*/
/datum/species/proc/handle_environment(datum/gas_mixture/environment, mob/living/carbon/human/humi)
handle_environment_pressure(environment, humi)
/datum/species/proc/handle_environment(mob/living/carbon/human/humi, datum/gas_mixture/environment, delta_time, times_fired)
handle_environment_pressure(humi, environment, delta_time, times_fired)
/**
* Body temperature handler for species
@@ -1688,18 +1699,22 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* vars:
* * humi (required)(type: /mob/living/carbon/human) The mob we will target
*/
/datum/species/proc/handle_body_temperature(mob/living/carbon/human/humi)
/datum/species/proc/handle_body_temperature(mob/living/carbon/human/humi, delta_time, times_fired)
//when in a cryo unit we suspend all natural body regulation
if(istype(humi.loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
return
//when dead the air still effects your skin temp
if(humi.stat == DEAD || IS_IN_STASIS(humi))
body_temperature_skin(humi)
else //when alive do all the things
body_temperature_core(humi)
body_temperature_skin(humi)
body_temperature_alerts(humi)
body_temperature_damage(humi)
//Only stabilise core temp when alive and not in statis
if(humi.stat < DEAD && !IS_IN_STASIS(humi))
body_temperature_core(humi, delta_time, times_fired)
//These do run in statis
body_temperature_skin(humi, delta_time, times_fired)
body_temperature_alerts(humi, delta_time, times_fired)
//Do not cause more damage in statis
if(!IS_IN_STASIS(humi))
body_temperature_damage(humi, delta_time, times_fired)
/**
* Used to stabilize the core temperature back to normal on living mobs
@@ -1708,8 +1723,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* vars:
* * humi (required) The mob we will stabilize
*/
/datum/species/proc/body_temperature_core(mob/living/carbon/human/humi)
var/natural_change = get_temp_change_amount(humi.get_body_temp_normal() - humi.coretemperature, 0.12)
/datum/species/proc/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired)
var/natural_change = get_temp_change_amount(humi.get_body_temp_normal() - humi.coretemperature, 0.06 * delta_time)
humi.adjust_coretemperature(humi.metabolism_efficiency * natural_change)
/**
@@ -1719,13 +1734,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* This happens even when dead so bodies revert to room temp over time.
* vars:
* * humi (required) The mob we will targeting
* - delta_time: The amount of time that is considered as elapsing
* - times_fired: The number of times SSmobs has fired
*/
/datum/species/proc/body_temperature_skin(mob/living/carbon/human/humi)
/datum/species/proc/body_temperature_skin(mob/living/carbon/human/humi, delta_time, times_fired)
// change the core based on the skin temp
var/skin_core_diff = humi.bodytemperature - humi.coretemperature
// change rate of 0.08 to be slightly below area to skin change rate and still have a solid curve
var/skin_core_change = get_temp_change_amount(skin_core_diff, 0.08)
// change rate of 0.04 per second to be slightly below area to skin change rate and still have a solid curve
var/skin_core_change = get_temp_change_amount(skin_core_diff, 0.04 * delta_time)
humi.adjust_coretemperature(skin_core_change)
@@ -1743,8 +1760,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
// Changes to the skin temperature based on the area
var/area_skin_diff = area_temp - humi.bodytemperature
if(!humi.on_fire || area_skin_diff > 0)
// change rate of 0.1 as area temp has large impact on the surface
var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.1)
// change rate of 0.05 as area temp has large impact on the surface
var/area_skin_change = get_temp_change_amount(area_skin_diff, 0.05 * delta_time)
// We need to apply the thermal protection of the clothing when applying area to surface change
// If the core bodytemp goes over the normal body temp you are overheating and becom sweaty
@@ -1762,8 +1779,8 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(!humi.on_fire)
// Get the changes to the skin from the core temp
var/core_skin_diff = humi.coretemperature - humi.bodytemperature
// change rate of 0.09 to reflect temp back to the skin at the slight higher rate then core to skin
var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.09)
// change rate of 0.045 to reflect temp back to the skin at the slight higher rate then core to skin
var/core_skin_change = (1 + thermal_protection) * get_temp_change_amount(core_skin_diff, 0.045 * delta_time)
// We do not want to over shoot after using protection
if(core_skin_diff > 0)
@@ -1825,17 +1842,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* vars:
* * humi (required) The mob we will targeting
*/
/datum/species/proc/body_temperature_damage(mob/living/carbon/human/humi)
/datum/species/proc/body_temperature_damage(mob/living/carbon/human/humi, delta_time, times_fired)
//If the body temp is above the wound limit start adding exposure stacks
if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT)
humi.heat_exposure_stacks = min(humi.heat_exposure_stacks + 1, 40)
humi.heat_exposure_stacks = min(humi.heat_exposure_stacks + (0.5 * delta_time), 40)
else //When below the wound limit, reduce the exposure stacks fast.
humi.heat_exposure_stacks = max(humi.heat_exposure_stacks - 4, 0)
humi.heat_exposure_stacks = max(humi.heat_exposure_stacks - (2 * delta_time), 0)
//when exposure stacks are greater then 10 + rand20 try to apply wounds and reset stacks
if(humi.heat_exposure_stacks > (10 + rand(0, 20)))
apply_burn_wounds(humi)
apply_burn_wounds(humi, delta_time, times_fired)
humi.heat_exposure_stacks = 0
// Body temperature is too hot, and we do not have resist traits
@@ -1846,10 +1863,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
firemodifier = min(firemodifier, 0)
// this can go below 5 at log 2.5
var/burn_damage = max(log(2 - firemodifier, (humi.coretemperature - humi.get_body_temp_normal(apply_change=FALSE))) - 5,0)
var/burn_damage = max(log(2 - firemodifier, (humi.coretemperature - humi.get_body_temp_normal(apply_change=FALSE))) - 5, 0)
// Apply species and physiology modifiers to heat damage
burn_damage = burn_damage * heatmod * humi.physiology.heat_mod
burn_damage = burn_damage * heatmod * humi.physiology.heat_mod * 0.5 * delta_time
// 40% for level 3 damage on humans to scream in pain
if (humi.stat < UNCONSCIOUS && (prob(burn_damage) * 10) / 4)
@@ -1864,15 +1881,15 @@ GLOBAL_LIST_EMPTY(roundstart_races)
var/cold_damage_limit = bodytemp_cold_damage_limit + (is_hulk ? BODYTEMP_HULK_COLD_DAMAGE_LIMIT_MODIFIER : 0)
if(humi.coretemperature < cold_damage_limit && !HAS_TRAIT(humi, TRAIT_RESISTCOLD))
var/damage_type = is_hulk ? BRUTE : BURN
var/damage_type = is_hulk ? BRUTE : BURN // Why?
var/damage_mod = coldmod * humi.physiology.cold_mod * (is_hulk ? HULK_COLD_DAMAGE_MOD : 1)
switch(humi.coretemperature)
if(201 to cold_damage_limit)
humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod, damage_type)
humi.apply_damage(COLD_DAMAGE_LEVEL_1 * damage_mod * delta_time, damage_type)
if(120 to 200)
humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod, damage_type)
humi.apply_damage(COLD_DAMAGE_LEVEL_2 * damage_mod * delta_time, damage_type)
else
humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod, damage_type)
humi.apply_damage(COLD_DAMAGE_LEVEL_3 * damage_mod * delta_time, damage_type)
/**
* Used to apply burn wounds on random limbs
@@ -1882,7 +1899,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
* vars:
* * humi (required) The mob we will targeting
*/
/datum/species/proc/apply_burn_wounds(mob/living/carbon/human/humi)
/datum/species/proc/apply_burn_wounds(mob/living/carbon/human/humi, delta_time, times_fired)
// If we are resistant to heat exit
if(HAS_TRAIT(humi, TRAIT_RESISTHEAT))
return
@@ -1914,21 +1931,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(humi.bodytemperature > BODYTEMP_HEAT_WOUND_LIMIT + 2800)
burn_damage = HEAT_DAMAGE_LEVEL_3
humi.apply_damage(burn_damage, BURN, bodypart)
humi.apply_damage(burn_damage * delta_time, BURN, bodypart)
/// Handle the air pressure of the environment
/datum/species/proc/handle_environment_pressure(datum/gas_mixture/environment, mob/living/carbon/human/H)
/datum/species/proc/handle_environment_pressure(mob/living/carbon/human/H, datum/gas_mixture/environment, delta_time, times_fired)
var/pressure = environment.return_pressure()
var/adjusted_pressure = H.calculate_affecting_pressure(pressure)
// Set alerts and apply damage based on the amount of pressure
switch(adjusted_pressure)
// Very high pressure, show an alert and take damage
if(HAZARD_HIGH_PRESSURE to INFINITY)
if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE))
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * \
PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod)
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) - 1) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod * delta_time)
H.throw_alert("pressure", /atom/movable/screen/alert/highpressure, 2)
else
H.clear_alert("pressure")
@@ -1955,7 +1970,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE))
H.clear_alert("pressure")
else
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod)
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod * delta_time)
H.throw_alert("pressure", /atom/movable/screen/alert/lowpressure, 2)
@@ -1963,7 +1978,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
// FIRE //
//////////
/datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
/datum/species/proc/handle_fire(mob/living/carbon/human/H, delta_time, times_fired, no_protection = FALSE)
if(!CanIgniteMob(H))
return TRUE
if(H.on_fire)
@@ -2020,9 +2035,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
if(thermal_protection >= FIRE_IMMUNITY_MAX_TEMP_PROTECT && !no_protection)
return
if(thermal_protection >= FIRE_SUIT_MAX_TEMP_PROTECT && !no_protection)
H.adjust_bodytemperature(11)
H.adjust_bodytemperature(5.5 * delta_time)
else
H.adjust_bodytemperature(BODYTEMP_HEATING_MAX + (H.fire_stacks * 12))
H.adjust_bodytemperature((BODYTEMP_HEATING_MAX + (H.fire_stacks * 12)) * 0.5 * delta_time)
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)

View File

@@ -48,7 +48,7 @@
H.regenerate_limb(BODY_ZONE_HEAD,FALSE)
..()
/datum/species/dullahan/spec_life(mob/living/carbon/human/H)
/datum/species/dullahan/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(QDELETED(myhead))
myhead = null
H.gib()

View File

@@ -121,9 +121,9 @@
source.emp_act(EMP_LIGHT)
return COMPONENT_BLOCK_LIGHT_EATER
/datum/species/ethereal/spec_life(mob/living/carbon/human/H)
/datum/species/ethereal/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
.=..()
handle_charge(H)
handle_charge(H, delta_time, times_fired)
/datum/species/ethereal/proc/stop_emp(mob/living/carbon/human/H)
@@ -144,7 +144,7 @@
spec_updatehealth(H)
H.visible_message("<span class='danger'>[H] stops flickering and goes back to their normal state!</span>")
/datum/species/ethereal/proc/handle_charge(mob/living/carbon/human/H)
/datum/species/ethereal/proc/handle_charge(mob/living/carbon/human/H, delta_time, times_fired)
switch(get_charge(H))
if(-INFINITY to ETHEREAL_CHARGE_NONE)
H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 3)
@@ -153,7 +153,7 @@
if(ETHEREAL_CHARGE_NONE to ETHEREAL_CHARGE_LOWPOWER)
H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 2)
if(H.health > 10.5)
apply_damage(0.65, TOX, null, null, H)
apply_damage(0.325 * delta_time, TOX, null, null, H)
if(ETHEREAL_CHARGE_LOWPOWER to ETHEREAL_CHARGE_NORMAL)
H.throw_alert("ethereal_charge", /atom/movable/screen/alert/etherealcharge, 1)
if(ETHEREAL_CHARGE_FULL to ETHEREAL_CHARGE_OVERLOAD)
@@ -161,8 +161,8 @@
apply_damage(0.2, TOX, null, null, H)
if(ETHEREAL_CHARGE_OVERLOAD to ETHEREAL_CHARGE_DANGEROUS)
H.throw_alert("ethereal_overcharge", /atom/movable/screen/alert/ethereal_overcharge, 2)
apply_damage(0.65, TOX, null, null, H)
if(prob(10)) //10% each tick for ethereals to explosively release excess energy if it reaches dangerous levels
apply_damage(0.325 * delta_time, TOX, null, null, H)
if(DT_PROB(5, delta_time)) // 5% each seacond for ethereals to explosively release excess energy if it reaches dangerous levels
discharge_process(H)
else
H.clear_alert("ethereal_charge")

View File

@@ -21,10 +21,10 @@
mutantappendix = /obj/item/organ/appendix/fly
mutant_organs = list(/obj/item/organ/fly, /obj/item/organ/fly/groin)
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
if(chem.type == /datum/reagent/toxin/pestkiller)
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
return TRUE
..()
@@ -70,7 +70,7 @@
name = odd_organ_name()
icon_state = pick("brain-x-d", "liver-x", "kidneys-x", "stomach-x", "lungs-x", "random_fly_1", "random_fly_2", "random_fly_3", "random_fly_4", "random_fly_5")
/obj/item/organ/stomach/fly/on_life()
/obj/item/organ/stomach/fly/on_life(delta_time, times_fired)
if(locate(/datum/reagent/consumable) in reagents.reagent_list)
var/mob/living/carbon/body = owner
// we do not loss any nutrition as a fly when vomiting out food

View File

@@ -96,7 +96,7 @@
var/boom_warning = FALSE
var/datum/action/innate/ignite/ignite
/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H)
/datum/species/golem/plasma/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(H.bodytemperature > 750)
if(!boom_warning && H.on_fire)
to_chat(H, "<span class='userdanger'>You feel like you could blow up at any moment!</span>")
@@ -107,11 +107,11 @@
boom_warning = FALSE
if(H.bodytemperature > 850 && H.on_fire && prob(25))
explosion(get_turf(H),1,2,4,flame_range = 5)
explosion(get_turf(H), 1, 2, 4, flame_range = 5)
if(H)
H.gib()
if(H.fire_stacks < 2) //flammable
H.adjust_fire_stacks(1)
H.adjust_fire_stacks(0.5 * delta_time)
..()
/datum/species/golem/plasma/on_species_gain(mob/living/carbon/C, datum/species/old_species)
@@ -263,12 +263,12 @@
special_names = list("Outsider", "Technology", "Watcher", "Stranger") //ominous and unknown
//Regenerates because self-repairing super-advanced alien tech
/datum/species/golem/alloy/spec_life(mob/living/carbon/human/H)
/datum/species/golem/alloy/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(H.stat == DEAD)
return
H.heal_overall_damage(2,2, 0, BODYPART_ORGANIC)
H.adjustToxLoss(-2)
H.adjustOxyLoss(-2)
H.heal_overall_damage(1 * delta_time, 1 * delta_time, 0, BODYPART_ORGANIC)
H.adjustToxLoss(-1 * delta_time)
H.adjustOxyLoss(-1 * delta_time)
//Since this will usually be created from a collaboration between podpeople and free golems, wood golems are a mix between the two races
/datum/species/golem/wood
@@ -288,29 +288,29 @@
special_name_chance = 100
inherent_factions = list("plants", "vines")
/datum/species/golem/wood/spec_life(mob/living/carbon/human/H)
/datum/species/golem/wood/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(H.stat == DEAD)
return
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(1,T.get_lumcount()) - 0.5
H.adjust_nutrition(light_amount * 10)
light_amount = min(1, T.get_lumcount()) - 0.5
H.adjust_nutrition(5 * light_amount * delta_time)
if(H.nutrition > NUTRITION_LEVEL_ALMOST_FULL)
H.set_nutrition(NUTRITION_LEVEL_ALMOST_FULL)
if(light_amount > 0.2) //if there's enough light, heal
H.heal_overall_damage(1,1,0, BODYPART_ORGANIC)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
H.heal_overall_damage(0.5 * delta_time, 0.5 * delta_time, 0, BODYPART_ORGANIC)
H.adjustToxLoss(-0.5 * delta_time)
H.adjustOxyLoss(-0.5 * delta_time)
if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
H.take_overall_damage(2,0)
/datum/species/golem/wood/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/golem/wood/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
if(chem.type == /datum/reagent/toxin/plantbgone)
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
return 1
H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
return TRUE
//Radioactive puncher, hits for burn but only as hard as human, slightly more durable against brute but less against everything else
/datum/species/golem/uranium
@@ -556,16 +556,19 @@
prefix = "Bananium"
special_names = null
var/last_honk = 0
var/honkooldown = 0
var/last_banana = 0
var/banana_cooldown = 100
var/active = null
/// Cooldown for producing honks
COOLDOWN_DECLARE(honkooldown)
/// Cooldown for producing bananas
COOLDOWN_DECLARE(banana_cooldown)
/// Time between possible banana productions
var/banana_delay = 10 SECONDS
/// Same as the uranium golem. I'm pretty sure this is vestigial.
var/active = FALSE
/datum/species/golem/bananium/on_species_gain(mob/living/carbon/C, datum/species/old_species)
..()
last_banana = world.time
last_honk = world.time
COOLDOWN_START(src, honkooldown, 0)
COOLDOWN_START(src, banana_cooldown, banana_delay)
RegisterSignal(C, COMSIG_MOB_SAY, .proc/handle_speech)
var/obj/item/organ/liver/liver = C.getorganslot(ORGAN_SLOT_LIVER)
if(liver)
@@ -586,21 +589,21 @@
/datum/species/golem/bananium/spec_attack_hand(mob/living/carbon/human/M, mob/living/carbon/human/H, datum/martial_art/attacker_style)
..()
if(world.time > last_banana + banana_cooldown && M != H && M.combat_mode)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
if(COOLDOWN_FINISHED(src, banana_cooldown) && M != H && M.combat_mode)
new /obj/item/grown/bananapeel/specialpeel(get_turf(H))
COOLDOWN_START(src, banana_cooldown, banana_delay)
/datum/species/golem/bananium/spec_attacked_by(obj/item/I, mob/living/user, obj/item/bodypart/affecting, mob/living/carbon/human/H)
..()
if(world.time > last_banana + banana_cooldown && user != H)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
if((user != H) && COOLDOWN_FINISHED(src, banana_cooldown))
new /obj/item/grown/bananapeel/specialpeel(get_turf(H))
COOLDOWN_START(src, banana_cooldown, banana_delay)
/datum/species/golem/bananium/on_hit(obj/projectile/P, mob/living/carbon/human/H)
..()
if(world.time > last_banana + banana_cooldown)
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
if(COOLDOWN_FINISHED(src, banana_cooldown))
new /obj/item/grown/bananapeel/specialpeel(get_turf(H))
COOLDOWN_START(src, banana_cooldown, banana_delay)
/datum/species/golem/bananium/spec_hitby(atom/movable/AM, mob/living/carbon/human/H)
..()
@@ -611,16 +614,14 @@
return 0
else
new/obj/item/grown/bananapeel/specialpeel(get_turf(H))
last_banana = world.time
COOLDOWN_START(src, banana_cooldown, banana_delay)
/datum/species/golem/bananium/spec_life(mob/living/carbon/human/H)
if(!active)
if(world.time > last_honk + honkooldown)
active = 1
playsound(get_turf(H), 'sound/items/bikehorn.ogg', 50, TRUE)
last_honk = world.time
honkooldown = rand(20, 80)
active = null
/datum/species/golem/bananium/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(!active && COOLDOWN_FINISHED(src, honkooldown))
active = TRUE
playsound(get_turf(H), 'sound/items/bikehorn.ogg', 50, TRUE)
COOLDOWN_START(src, honkooldown, rand(2 SECONDS, 8 SECONDS))
active = FALSE
..()
/datum/species/golem/bananium/spec_death(gibbed, mob/living/carbon/human/H)
@@ -673,15 +674,15 @@
if(dominate)
C.RemoveSpell(dominate)
/datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
if(istype(chem, /datum/reagent/water/holywater))
H.adjustFireLoss(4)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
H.adjustFireLoss(4 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
if(chem.type == /datum/reagent/fuel/unholywater)
H.adjustBruteLoss(-4)
H.adjustFireLoss(-4)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
H.adjustBruteLoss(-4 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.adjustFireLoss(-4 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
/datum/species/golem/cloth
name = "Cloth Golem"
@@ -995,12 +996,12 @@
bonechill.Remove(C)
..()
/datum/species/golem/bone/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/golem/bone/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
. = ..()
if(chem.type == /datum/reagent/toxin/bonehurtingjuice)
H.adjustStaminaLoss(7.5, 0)
H.adjustBruteLoss(0.5, 0)
if(prob(20))
H.adjustStaminaLoss(7.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
H.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, 0)
if(DT_PROB(10, delta_time))
switch(rand(1, 3))
if(1)
H.say(pick("oof.", "ouch.", "my bones.", "oof ouch.", "oof ouch my bones."), forced = /datum/reagent/toxin/bonehurtingjuice)
@@ -1009,7 +1010,7 @@
if(3)
to_chat(H, "<span class='warning'>Your bones hurt!</span>")
if(chem.overdosed)
if(prob(4) && iscarbon(H)) //big oof
if(DT_PROB(2, delta_time) && iscarbon(H)) //big oof
var/selected_part = pick(BODY_ZONE_L_ARM, BODY_ZONE_R_ARM, BODY_ZONE_L_LEG, BODY_ZONE_R_LEG) //God help you if the same limb gets picked twice quickly.
var/obj/item/bodypart/bp = H.get_bodypart(selected_part) //We're so sorry skeletons, you're so misunderstood
if(bp)
@@ -1020,7 +1021,7 @@
else
to_chat(H, "<span class='warning'>Your missing arm aches from wherever you left it.</span>")
H.emote("sigh")
H.reagents.remove_reagent(chem.type, chem.metabolization_rate)
H.reagents.remove_reagent(chem.type, chem.metabolization_rate * delta_time)
return TRUE
/datum/action/innate/bonechill

View File

@@ -41,23 +41,27 @@
slime_change.Grant(C)
//SKYRAT EDIT ADDITION END
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
/datum/species/jelly/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely
return
if(!H.blood_volume)
H.blood_volume += 5
H.adjustBruteLoss(5)
H.blood_volume += 2.5 * delta_time
H.adjustBruteLoss(2.5 * delta_time)
to_chat(H, "<span class='danger'>You feel empty!</span>")
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
if(H.nutrition >= NUTRITION_LEVEL_STARVING)
H.blood_volume += 3
H.adjust_nutrition(-2.5)
H.blood_volume += 1.5 * delta_time
H.adjust_nutrition(-1.25 * delta_time)
if(H.blood_volume < BLOOD_VOLUME_OKAY)
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(H, "<span class='danger'>You feel drained!</span>")
if(H.blood_volume < BLOOD_VOLUME_BAD)
Cannibalize_Body(H)
if(regenerate_limbs)
regenerate_limbs.UpdateButtonIcon()
@@ -175,13 +179,14 @@
/datum/species/jelly/slime/copy_properties_from(datum/species/jelly/slime/old_species)
bodies = old_species.bodies
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H)
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H, delta_time, times_fired)
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
if(prob(5))
if(DT_PROB(2.5, delta_time))
to_chat(H, "<span class='notice'>You feel very bloated!</span>")
else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
H.blood_volume += 3
H.adjust_nutrition(-2.5)
H.blood_volume += 1.5 * delta_time
H.adjust_nutrition(-1.25 * delta_time)
..()

View File

@@ -33,7 +33,7 @@
ass_image = 'icons/ass/asslizard.png'
/// Lizards are cold blooded and do not stabilize body temperature naturally
/datum/species/lizard/body_temperature_core(mob/living/carbon/human/humi)
/datum/species/lizard/body_temperature_core(mob/living/carbon/human/humi, delta_time, times_fired)
return
/datum/species/lizard/random_name(gender,unique,lastname)

View File

@@ -37,7 +37,7 @@
return randname
/datum/species/moth/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
/datum/species/moth/handle_fire(mob/living/carbon/human/H, delta_time, times_fired, no_protection = FALSE)
. = ..()
if(.) //if the mob is immune to fire, don't burn wings off.
return
@@ -59,11 +59,11 @@
H.dna.features["wings"] = "None"
handle_mutant_bodyparts(H)
/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
. = ..()
if(chem.type == /datum/reagent/toxin/pestkiller)
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
/datum/species/moth/check_species_weakness(obj/item/weapon, mob/living/attacker)
if(istype(weapon, /obj/item/melee/flyswatter))

View File

@@ -46,10 +46,10 @@
mush.remove(C)
QDEL_NULL(mush)
/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
/datum/species/mush/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H, delta_time, times_fired)
if(chem.type == /datum/reagent/toxin/plantbgone/weedkiller)
H.adjustToxLoss(3)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM)
H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
return TRUE
/datum/species/mush/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)

Some files were not shown because too many files have changed in this diff Show More