[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 //organ defines
#define STANDARD_ORGAN_THRESHOLD 100 #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 /// 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 //used for the can_chromosome var on mutations
#define CHROMOSOME_NEVER 0 #define CHROMOSOME_NEVER 0

View File

@@ -9,7 +9,7 @@
#define META_GAS_OVERLAY 4 #define META_GAS_OVERLAY 4
#define META_GAS_DANGER 5 #define META_GAS_DANGER 5
#define META_GAS_ID 6 #define META_GAS_ID 6
#define META_GAS_FUSION_POWER 7 #define META_GAS_FUSION_POWER 7
//ATMOS //ATMOS
//stuff you should probably leave well alone! //stuff you should probably leave well alone!
/// kPa*L/(K*mol) /// kPa*L/(K*mol)
@@ -149,9 +149,9 @@
/// The natural temperature for a body /// The natural temperature for a body
#define BODYTEMP_NORMAL 310.15 #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. /// 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. /// 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. ///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 #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. /// 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 #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 /// 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 PRESSURE_DAMAGE_COEFFICIENT 2
#define MAX_HIGH_PRESSURE_DAMAGE 4 #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). /// 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 /// Humans are slowed by the difference between bodytemp and BODYTEMP_COLD_DAMAGE_LIMIT divided by this
#define COLD_SLOWDOWN_FACTOR 20 #define COLD_SLOWDOWN_FACTOR 20
@@ -539,6 +539,6 @@ GLOBAL_LIST_INIT(pipe_paint_colors, sortList(list(
#define MIASMA_GIBS_MOLES 0.005 #define MIASMA_GIBS_MOLES 0.005
//Defines for N2O and Healium euphoria moodlets //Defines for N2O and Healium euphoria moodlets
#define EUPHORIA_INACTIVE 0 #define EUPHORIA_INACTIVE 0
#define EUPHORIA_ACTIVE 1 #define EUPHORIA_ACTIVE 1
#define EUPHORIA_LAST_FLAG 2 #define EUPHORIA_LAST_FLAG 2

View File

@@ -43,7 +43,7 @@
#define BLOB_NODE_PULSE_RANGE 3 // The radius up to which the core activates structures, and up to which structures can be built #define BLOB_NODE_PULSE_RANGE 3 // The radius up to which the core activates structures, and up to which structures can be built
#define BLOB_NODE_EXPAND_RANGE 2 // Radius of automatic expansion #define BLOB_NODE_EXPAND_RANGE 2 // Radius of automatic expansion
#define BLOB_NODE_STRONG_REINFORCE_RANGE 0 // The radius of tiles surrounding the node that get upgraded #define BLOB_NODE_STRONG_REINFORCE_RANGE 0 // The radius of tiles surrounding the node that get upgraded
#define BLOB_NODE_REFLECTOR_REINFORCE_RANGE 0 #define BLOB_NODE_REFLECTOR_REINFORCE_RANGE 0
#define BLOB_NODE_MAX_SPORES 1 // Spores that nodes can maintain #define BLOB_NODE_MAX_SPORES 1 // Spores that nodes can maintain
#define BLOB_FACTORY_MAX_HP 200 #define BLOB_FACTORY_MAX_HP 200
@@ -65,7 +65,7 @@
#define BLOB_STRONG_HP_REGEN 2 #define BLOB_STRONG_HP_REGEN 2
#define BLOB_REFLECTOR_MAX_HP 150 #define BLOB_REFLECTOR_MAX_HP 150
#define BLOB_REFLECTOR_HP_REGEN 2 #define BLOB_REFLECTOR_HP_REGEN 2
// Structure purchasing // Structure purchasing
@@ -93,7 +93,7 @@
#define BLOBMOB_HEALING_MULTIPLIER 0.0125 // Multiplies by -maxHealth and heals the blob by this amount every blob_act #define BLOBMOB_HEALING_MULTIPLIER 0.0125 // Multiplies by -maxHealth and heals the blob by this amount every blob_act
#define BLOBMOB_SPORE_HEALTH 30 // Base spore health #define BLOBMOB_SPORE_HEALTH 30 // Base spore health
#define BLOBMOB_SPORE_SPAWN_COOLDOWN 8 SECONDS #define BLOBMOB_SPORE_SPAWN_COOLDOWN 8 SECONDS
#define BLOBMOB_SPORE_DMG_LOWER 8 #define BLOBMOB_SPORE_DMG_LOWER 8
#define BLOBMOB_SPORE_DMG_UPPER 16 #define BLOBMOB_SPORE_DMG_UPPER 16
#define BLOBMOB_BLOBBERNAUT_RESOURCE_COST 40 // Purchase price for making a blobbernaut #define BLOBMOB_BLOBBERNAUT_RESOURCE_COST 40 // Purchase price for making a blobbernaut
@@ -104,6 +104,6 @@
#define BLOBMOB_BLOBBERNAUT_DMG_UPPER 4 #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_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_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_CORE 0.05 // 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_HEALING_NODE 0.025 // 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_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 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 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_NO_GHOSTS 0
#define CAMERA_SEE_GHOSTS_BASIC 1 #define CAMERA_SEE_GHOSTS_BASIC 1

View File

@@ -28,6 +28,9 @@
#define BLOOD_VOLUME_BAD 224 #define BLOOD_VOLUME_BAD 224
#define BLOOD_VOLUME_SURVIVE 122 #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 //Sizes of mobs, used by mob/living/var/mob_size
#define MOB_SIZE_TINY 0 #define MOB_SIZE_TINY 0
#define MOB_SIZE_SMALL 1 #define MOB_SIZE_SMALL 1
@@ -71,17 +74,17 @@
#define MAX_LIVING_HEALTH 100 #define MAX_LIVING_HEALTH 100
#define HUMAN_MAX_OXYLOSS 3 #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 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_1 1 //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_2 1.5 //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_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_1 0.25 //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_2 0.75 //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_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. //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 #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 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 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 HUNGER_FACTOR 0.05 //factor at which mob nutrition decreases
#define ETHEREAL_CHARGE_FACTOR 1.6 //factor at which ethereal's charge decreases #define ETHEREAL_CHARGE_FACTOR 0.8 //factor at which ethereal's charge decreases per second
#define REAGENTS_METABOLISM 0.4 //How many units of reagent are consumed per tick, by default. #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 #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 // 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_COEFFICIENT 0.20 // Radiation applied is multiplied by this
#define RAD_MOB_SKIN_PROTECTION ((1/RAD_MOB_COEFFICIENT)+RAD_BACKGROUND_RADIATION) #define RAD_MOB_SKIN_PROTECTION ((1/RAD_MOB_COEFFICIENT)+RAD_BACKGROUND_RADIATION)
#define RAD_LOSS_PER_TICK 0.5 #define RAD_LOSS_PER_SECOND 0.25
#define RAD_TOX_COEFFICIENT 0.08 // Toxin damage per tick coefficient /// 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 #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 #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 //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 //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_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_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 /// The amount of radiation to check for vomitting
#define RAD_MOB_VOMIT_PROB 1 // Chance per tick of 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 /// 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 2000
#define RAD_MOB_KNOCKDOWN_AMOUNT 3 // Amount of knockdown when it occurs /// 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_NO_INSULATION 1.0 // For things that shouldn't become irradiated for whatever reason
#define RAD_VERY_LIGHT_INSULATION 0.9 // What girders have #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 // ~random wound balance defines
/// how quickly sanitization removes infestation and decays per tick /// how quickly sanitization removes infestation and decays per second
#define WOUND_BURN_SANITIZATION_RATE 0.15 #define WOUND_BURN_SANITIZATION_RATE 0.075
/// 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 /// 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 8 #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 /// 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) /// 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 #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) /proc/get_temp_change_amount(temp_diff, change_rate = 0.06)
if(temp_diff < 0) if(temp_diff < 0)
return (log((temp_diff * -1) * change_rate + 1) * BODYTEMP_AUTORECOVERY_DIVISOR) * -1 return -(BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 - (temp_diff * change_rate))
return log(temp_diff * change_rate + 1) * BODYTEMP_AUTORECOVERY_DIVISOR return (BODYTEMP_AUTORECOVERY_DIVISOR / 2) * log(1 + (temp_diff * change_rate))
#define ISADVANCEDTOOLUSER(mob) (HAS_TRAIT(mob, TRAIT_ADVANCEDTOOLUSER) && !HAS_TRAIT(mob, TRAIT_MONKEYLIKE)) #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) //cache for sanic speed (lists are references anyways)
var/list/currentrun = src.currentrun var/list/currentrun = src.currentrun
var/times_fired = src.times_fired 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) while(currentrun.len)
var/mob/living/L = currentrun[currentrun.len] var/mob/living/L = currentrun[currentrun.len]
currentrun.len-- currentrun.len--
if(L) if(L)
L.Life(times_fired) L.Life(delta_time, times_fired)
else else
GLOB.mob_living_list.Remove(L) GLOB.mob_living_list.Remove(L)
if (MC_TICK_CHECK) if (MC_TICK_CHECK)

View File

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

View File

@@ -36,7 +36,7 @@
antagonist.greet() antagonist.greet()
RegisterSignal(owner, COMSIG_CARBON_HUG, .proc/on_hug) 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) if(!obsession || obsession.stat == DEAD)
viewing = FALSE//important, makes sure you no longer stutter when happy if you murdered them while viewing viewing = FALSE//important, makes sure you no longer stutter when happy if you murdered them while viewing
return return
@@ -50,10 +50,10 @@
viewing = FALSE viewing = FALSE
if(viewing) if(viewing)
SEND_SIGNAL(owner, COMSIG_ADD_MOOD_EVENT, "creeping", /datum/mood_event/creeping, obsession.name) 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 time_spent_away = 0
if(attachedobsessedobj)//if an objective needs to tick down, we can do that since traumas coexist with the antagonist datum 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 else
out_of_view() out_of_view()

View File

@@ -43,9 +43,9 @@
owner.clear_alert("hypnosis") 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)) switch(rand(1,2))
if(1) if(1)
to_chat(owner, "<span class='hypnophrase'><i>...[lowertext(hypnotic_phrase)]...</i></span>") to_chat(owner, "<span class='hypnophrase'><i>...[lowertext(hypnotic_phrase)]...</i></span>")

View File

@@ -16,7 +16,7 @@
make_friend() make_friend()
get_ghost() 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) if(get_dist(owner, friend) > 9)
friend.recall() friend.recall()
if(!friend) if(!friend)

View File

@@ -11,18 +11,23 @@
scan_desc = "light hypersensitivity" scan_desc = "light hypersensitivity"
gain_text = "<span class='warning'>You feel a craving for darkness.</span>" gain_text = "<span class='warning'>You feel a craving for darkness.</span>"
lose_text = "<span class='notice'>Light no longer bothers you.</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 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 var/turf/T = owner.loc
if(istype(T)) if(!istype(T))
var/light_amount = T.get_lumcount() return
if(light_amount > SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
if(world.time > next_damage_warning) if(T.get_lumcount() <= SHADOW_SPECIES_LIGHT_THRESHOLD) //if there's enough light, start dying
to_chat(owner, "<span class='warning'><b>The light burns you!</b></span>") return
next_damage_warning = world.time + 100 //Avoid spamming
owner.take_overall_damage(0,3) 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 /datum/brain_trauma/magic/poltergeist
name = "Poltergeist" name = "Poltergeist"
@@ -31,19 +36,21 @@
gain_text = "<span class='warning'>You feel a hateful presence close to you.</span>" 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>" 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)) if(!DT_PROB(2, delta_time))
var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else return
var/obj/item/throwing
for(var/obj/item/I in view(5, get_turf(owner))) var/most_violent = -1 //So it can pick up items with 0 throwforce if there's nothing else
if(I.anchored) var/obj/item/throwing
continue for(var/obj/item/I in view(5, get_turf(owner)))
if(I.throwforce > most_violent) if(I.anchored)
most_violent = I.throwforce continue
throwing = I if(I.throwforce > most_violent)
if(throwing) most_violent = I.throwforce
throwing.throw_at(owner, 8, 2) throwing = I
if(throwing)
throwing.throw_at(owner, 8, 2)
/datum/brain_trauma/magic/antimagic /datum/brain_trauma/magic/antimagic
name = "Athaumasia" name = "Athaumasia"
@@ -81,7 +88,7 @@
QDEL_NULL(stalker) 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. // Dead and unconscious people are not interesting to the psychic stalker.
if(owner.stat != CONSCIOUS) if(owner.stat != CONSCIOUS)
return return
@@ -95,7 +102,7 @@
playsound(owner, 'sound/magic/demon_attack1.ogg', 50) 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.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) 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)) stalker.forceMove(get_step_towards(stalker, owner))
if(get_dist(owner, stalker) <= 8) if(get_dist(owner, stalker) <= 8)
if(!close_stalker) if(!close_stalker)

View File

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

View File

@@ -5,8 +5,11 @@
gain_text = "<span class='warning'>You start finding default values very unnerving...</span>" 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>" lose_text = "<span class='notice'>You no longer feel afraid of default values.</span>"
var/phobia_type var/phobia_type
var/next_check = 0 /// Cooldown for proximity checks so we don't spam a range 7 view every two seconds.
var/next_scare = 0 COOLDOWN_DECLARE(check_cooldown)
/// Cooldown for freakouts to prevent permastunning.
COOLDOWN_DECLARE(scare_cooldown)
var/regex/trigger_regex var/regex/trigger_regex
//instead of cycling every atom, only cycle the relevant types //instead of cycling every atom, only cycle the relevant types
var/list/trigger_mobs var/list/trigger_mobs
@@ -31,50 +34,51 @@
trigger_species = SStraumas.phobia_species[phobia_type] 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)) if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return return
if(owner.is_blind()) if(owner.is_blind())
return 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)) if(!COOLDOWN_FINISHED(src, check_cooldown) || !COOLDOWN_FINISHED(src, scare_cooldown))
for(var/obj/O in seen_atoms) return
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(LAZYLEN(trigger_turfs)) COOLDOWN_START(src, check_cooldown, 5 SECONDS)
for(var/turf/T in seen_atoms) var/list/seen_atoms = view(7, owner)
if(is_type_in_typecache(T, trigger_turfs)) if(LAZYLEN(trigger_objs))
freak_out(T) 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 return
seen_atoms -= owner //make sure they aren't afraid of themselves. if(LAZYLEN(trigger_turfs))
if(LAZYLEN(trigger_mobs) || LAZYLEN(trigger_species)) for(var/turf/T in seen_atoms)
for(var/mob/M in seen_atoms) if(is_type_in_typecache(T, trigger_turfs))
if(is_type_in_typecache(M, trigger_mobs)) freak_out(T)
freak_out(M) 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 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) /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 return
if(HAS_TRAIT(owner, TRAIT_FEARLESS)) if(HAS_TRAIT(owner, TRAIT_FEARLESS))
return return
@@ -92,7 +96,7 @@
speech_args[SPEECH_MESSAGE] = "" speech_args[SPEECH_MESSAGE] = ""
/datum/brain_trauma/mild/phobia/proc/freak_out(atom/reason, trigger_word) /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) if(owner.stat == DEAD)
return return
var/message = pick("spooks you to the bone", "shakes you up", "terrifies you", "sends you into a panic", "sends chills down your spine") 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>" 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>" 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()) if(owner.IsSleeping())
return return
@@ -133,10 +133,10 @@
sleep_chance += 2 sleep_chance += 2
if(owner.drowsyness) if(owner.drowsyness)
sleep_chance += 3 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>") to_chat(owner, "<span class='warning'>You fall asleep.</span>")
owner.Sleeping(60) 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>") to_chat(owner, "<span class='warning'>You feel tired...</span>")
owner.drowsyness += 10 owner.drowsyness += 10
@@ -155,14 +155,14 @@
else else
to_chat(owner, "<span class='notice'>You feel safe, as long as you have people around you.</span>") 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()) if(check_alone())
stress = min(stress + 0.5, 100) stress = min(stress + 0.5, 100)
if(stress > 10 && (prob(5))) if(stress > 10 && DT_PROB(2.5, delta_time))
stress_reaction() stress_reaction()
else else
stress = max(stress - 4, 0) stress = max(stress - (2 * delta_time), 0)
/datum/brain_trauma/severe/monophobia/proc/check_alone() /datum/brain_trauma/severe/monophobia/proc/check_alone()
if(owner.is_blind()) if(owner.is_blind())
@@ -260,9 +260,9 @@
..() ..()
owner.remove_status_effect(/datum/status_effect/trance) 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) owner.apply_status_effect(/datum/status_effect/trance, rand(100,300), FALSE)
/datum/brain_trauma/severe/hypnotic_trigger /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>" 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>" 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())) if(prob(33) && (owner.IsStun() || owner.IsParalyzed() || owner.IsUnconscious()))
speak("unstun", TRUE) speak("unstun", TRUE)
else if(prob(60) && owner.health <= owner.crit_threshold) else if(prob(60) && owner.health <= owner.crit_threshold)
@@ -53,42 +53,47 @@
scan_desc = "bluespace attunement" scan_desc = "bluespace attunement"
gain_text = "<span class='notice'>You feel the bluespace pulsing around you...</span>" 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>" 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() /datum/brain_trauma/special/bluespace_prophet/on_life(delta_time, times_fired)
if(world.time > next_portal) if(!COOLDOWN_FINISHED(src, portal_cooldown))
next_portal = world.time + 100 return
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
if(!LAZYLEN(possible_turfs)) COOLDOWN_START(src, portal_cooldown, 10 SECONDS)
return 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) var/clear = TRUE
if(!first_turf) for(var/obj/O in T)
return 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) var/turf/first_turf = pick(possible_turfs)
if(!second_turf) if(!first_turf)
return return
var/obj/effect/hallucination/simple/bluespace_stream/first = new(first_turf, owner) possible_turfs -= (possible_turfs & range(first_turf, 3))
var/obj/effect/hallucination/simple/bluespace_stream/second = new(second_turf, owner)
first.linked_to = second var/turf/second_turf = pick(possible_turfs)
second.linked_to = first if(!second_turf)
first.seer = owner return
second.seer = owner
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 /obj/effect/hallucination/simple/bluespace_stream
name = "bluespace stream" name = "bluespace stream"
@@ -129,17 +134,19 @@
var/atom/linked_target = null var/atom/linked_target = null
var/linked = FALSE var/linked = FALSE
var/returning = 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(linked)
if(QDELETED(linked_target)) if(QDELETED(linked_target))
linked_target = null linked_target = null
linked = FALSE linked = FALSE
else if(!returning && world.time > snapback_time) return
if(!returning && COOLDOWN_FINISHED(src, snapback_cooldown))
start_snapback() start_snapback()
return return
if(prob(4)) if(DT_PROB(2, delta_time))
try_entangle() try_entangle()
/datum/brain_trauma/special/quantum_alignment/proc/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>") to_chat(owner, "<span class='notice'>You start feeling a strong sense of connection to [target].</span>")
linked_target = target linked_target = target
linked = TRUE 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() /datum/brain_trauma/special/quantum_alignment/proc/start_snapback()
if(QDELETED(linked_target)) if(QDELETED(linked_target))
@@ -275,11 +282,12 @@
gain_text = "<span class='notice'>You feel less real.</span>" gain_text = "<span class='notice'>You feel less real.</span>"
lose_text = "<span class='warning'>You feel more substantial again.</span>" lose_text = "<span class='warning'>You feel more substantial again.</span>"
var/obj/effect/abstract/sync_holder/veil/veil 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)) if(isturf(owner.loc))
fade_out() fade_out()
@@ -291,7 +299,7 @@
/datum/brain_trauma/special/existential_crisis/proc/fade_out() /datum/brain_trauma/special/existential_crisis/proc/fade_out()
if(veil) if(veil)
return return
var/duration = rand(50, 450) var/duration = rand(5 SECONDS, 45 SECONDS)
veil = new(owner.drop_location()) veil = new(owner.drop_location())
to_chat(owner, "<span class='warning'>[pick("You stop thinking for a moment. Therefore you are not.",\ to_chat(owner, "<span class='warning'>[pick("You stop thinking for a moment. Therefore you are not.",\
"To be or not to be...",\ "To be or not to be...",\
@@ -305,13 +313,13 @@
for(var/thing in owner) for(var/thing in owner)
var/atom/movable/AM = thing var/atom/movable/AM = thing
SEND_SIGNAL(AM, COMSIG_MOVABLE_SECLUDED_LOCATION) 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) addtimer(CALLBACK(src, .proc/fade_in), duration)
/datum/brain_trauma/special/existential_crisis/proc/fade_in() /datum/brain_trauma/special/existential_crisis/proc/fade_in()
QDEL_NULL(veil) QDEL_NULL(veil)
to_chat(owner, "<span class='notice'>You fade back into reality.</span>") 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 //base sync holder is in desynchronizer.dm
/obj/effect/abstract/sync_holder/veil /obj/effect/abstract/sync_holder/veil

View File

@@ -42,12 +42,12 @@
else else
qdel(src) 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(owner.stat == DEAD)
if(current_controller != OWNER) if(current_controller != OWNER)
switch_personalities() switch_personalities()
qdel(src) qdel(src)
else if(prob(3)) else if(DT_PROB(1.5, delta_time))
switch_personalities() switch_personalities()
..() ..()
@@ -131,7 +131,7 @@
trauma = _trauma trauma = _trauma
return ..() return ..()
/mob/living/split_personality/Life() /mob/living/split_personality/Life(delta_time = SSMOBS_DT, times_fired)
if(QDELETED(body)) if(QDELETED(body))
qdel(src) //in case trauma deletion doesn't already do it qdel(src) //in case trauma deletion doesn't already do it
@@ -203,7 +203,7 @@
else else
qdel(src) 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 return //no random switching
/datum/brain_trauma/severe/split_personality/brainwashing/handle_hearing(datum/source, list/hearing_args) /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>") 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) 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>") 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>") 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 return
else //If you're feeding it to someone else. else //If you're feeding it to someone else.
if(isbrain(eater)) if(isbrain(eater))
to_chat(feeder, "<span class='warning'>[eater] doesn't seem to have a mouth!</span>") to_chat(feeder, "<span class='warning'>[eater] doesn't seem to have a mouth!</span>")
return 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>", \ eater.visible_message("<span class='danger'>[feeder] attempts to feed [eater] [parent].</span>", \
"<span class='userdanger'>[feeder] attempts to feed you [parent].</span>") "<span class='userdanger'>[feeder] attempts to feed you [parent].</span>")
else else

View File

@@ -15,14 +15,17 @@
//Stages //Stages
var/stage = 1 var/stage = 1
var/max_stages = 0 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 //Other
var/list/viable_mobtypes = list() //typepaths of viable mobs var/list/viable_mobtypes = list() //typepaths of viable mobs
var/mob/living/carbon/affected_mob = null 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/list/cures = list() //list of cures if the disease has the CURABLE flag, these are reagent ids
var/infectivity = 65 /// The probability of spreading through the air every second
var/cure_chance = 8 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/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/bypasses_immunity = FALSE //Does it skip species virus immunity check? Some things may diseases and not viruses
var/permeability_mod = 1 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. ///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(has_cure())
if(prob(cure_chance)) if(DT_PROB(cure_chance, delta_time))
update_stage(max(stage - 1, 1)) update_stage(max(stage - 1, 1))
if(disease_flags & CURABLE && prob(cure_chance)) if(disease_flags & CURABLE && DT_PROB(cure_chance, delta_time))
cure() cure()
return FALSE return FALSE
else if(prob(stage_prob)) else if(DT_PROB(stage_prob, delta_time))
update_stage(min(stage + 1, max_stages)) update_stage(min(stage + 1, max_stages))
return !carrier return !carrier

View File

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

View File

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

View File

@@ -12,32 +12,32 @@
severity = DISEASE_SEVERITY_MINOR severity = DISEASE_SEVERITY_MINOR
/datum/disease/anxiety/stage_act() /datum/disease/anxiety/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) //also changes say, see say.dm 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>") to_chat(affected_mob, "<span class='notice'>You feel anxious.</span>")
if(3) if(3)
if(prob(10)) if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='notice'>Your stomach flutters.</span>") 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>") 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>") to_chat(affected_mob, "<span class='danger'>You're overtaken with panic!</span>")
affected_mob.add_confusion(rand(2,3)) affected_mob.add_confusion(rand(2,3))
if(4) 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>") 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>", \ affected_mob.visible_message("<span class='danger'>[affected_mob] stumbles around in a panic.</span>", \
"<span class='userdanger'>You have a panic attack!</span>") "<span class='userdanger'>You have a panic attack!</span>")
affected_mob.add_confusion(rand(6,8)) affected_mob.add_confusion(rand(6,8))
affected_mob.jitteriness += (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>", \ affected_mob.visible_message("<span class='danger'>[affected_mob] coughs up butterflies!</span>", \
"<span class='userdanger'>You cough up butterflies!</span>") "<span class='userdanger'>You cough up butterflies!</span>")
new /mob/living/simple_animal/butterfly(affected_mob.loc) 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 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(1) if(1)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough") affected_mob.emote("cough")
if(2) if(2)
var/obj/item/organ/appendix/A = affected_mob.getorgan(/obj/item/organ/appendix) var/obj/item/organ/appendix/A = affected_mob.getorgan(/obj/item/organ/appendix)
if(A) if(A)
A.inflamed = 1 A.inflamed = 1
A.update_appearance() 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>") 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.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 5)
affected_mob.Stun(rand(40,60)) affected_mob.Stun(rand(40, 60))
affected_mob.adjustToxLoss(1, FALSE) affected_mob.adjustToxLoss(1, FALSE)
if(3) if(3)
if(prob(1)) if(DT_PROB(0.5, delta_time))
affected_mob.vomit(95) affected_mob.vomit(95)
affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15) affected_mob.adjustOrganLoss(ORGAN_SLOT_APPENDIX, 15)

View File

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

View File

@@ -7,52 +7,52 @@
cures = list(/datum/reagent/medicine/mannitol) cures = list(/datum/reagent/medicine/mannitol)
agent = "Cryptococcus Cosmosis" agent = "Cryptococcus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human) 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." desc = "This disease destroys the braincells, causing brain fever, brain necrosis and general intoxication."
required_organs = list(/obj/item/organ/brain) required_organs = list(/obj/item/organ/brain)
severity = DISEASE_SEVERITY_HARMFUL 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("blink") affected_mob.emote("blink")
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("yawn") 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>") 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) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 1, 170)
if(3) if(3)
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("stare") affected_mob.emote("stare")
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("drool") affected_mob.emote("drool")
if(prob(10)) if(DT_PROB(5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 2, 170)
if(prob(2)) if(prob(2))
to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>") to_chat(affected_mob, "<span class='danger'>Your try to remember something important...but can't.</span>")
if(4) if(4)
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("stare") affected_mob.emote("stare")
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("drool") affected_mob.emote("drool")
if(prob(15)) if(DT_PROB(7.5, delta_time))
affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170) affected_mob.adjustOrganLoss(ORGAN_SLOT_BRAIN, 3, 170)
if(prob(2)) if(prob(2))
to_chat(affected_mob, "<span class='danger'>Strange buzzing fills your head, removing all thoughts.</span>") 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>") to_chat(affected_mob, "<span class='danger'>You lose consciousness...</span>")
affected_mob.visible_message("<span class='warning'>[affected_mob] suddenly collapses!</span>", \ affected_mob.visible_message("<span class='warning'>[affected_mob] suddenly collapses!</span>", \
"<span class='userdanger'>You suddenly collapse!</span>") "<span class='userdanger'>You suddenly collapse!</span>")
affected_mob.Unconscious(rand(100,200)) affected_mob.Unconscious(rand(100, 200))
if(prob(1)) if(prob(1))
affected_mob.emote("snore") affected_mob.emote("snore")
if(prob(15)) if(DT_PROB(7.5, delta_time))
affected_mob.stuttering += 3 affected_mob.stuttering += 3

View File

@@ -10,48 +10,40 @@
severity = DISEASE_SEVERITY_NONTHREAT severity = DISEASE_SEVERITY_NONTHREAT
/datum/disease/cold/stage_act() /datum/disease/cold/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if(affected_mob.body_position == LYING_DOWN && prob(40)) //changed FROM prob(10) until sleeping is fixed if(DT_PROB(0.5, delta_time))
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))
affected_mob.emote("sneeze") affected_mob.emote("sneeze")
if(prob(1)) if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough") 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>") 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>") 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(3)
if(affected_mob.body_position == LYING_DOWN && prob(25)) //changed FROM prob(5) until sleeping is fixed if(DT_PROB(0.5, delta_time))
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))
affected_mob.emote("sneeze") affected_mob.emote("sneeze")
if(prob(1)) if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough") 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>") 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>") 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() var/datum/disease/Flu = new /datum/disease/flu()
affected_mob.ForceContractDisease(Flu, FALSE, TRUE) affected_mob.ForceContractDisease(Flu, FALSE, TRUE)
cure() cure()
return FALSE 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 severity = DISEASE_SEVERITY_HARMFUL
/datum/disease/cold9/stage_act() /datum/disease/cold9/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
affected_mob.adjust_bodytemperature(-10) affected_mob.adjust_bodytemperature(-5 * delta_time)
if(prob(0.1)) 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>") to_chat(affected_mob, "<span class='notice'>You feel better.</span>")
cure() cure()
return FALSE 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) if(3)
affected_mob.adjust_bodytemperature(-20) affected_mob.adjust_bodytemperature(-10 * delta_time)
if(prob(1)) if(DT_PROB(0.5, delta_time))
affected_mob.emote("sneeze") affected_mob.emote("sneeze")
if(prob(1)) if(DT_PROB(0.5, delta_time))
affected_mob.emote("cough") 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>") 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>") to_chat(affected_mob, "<span class='danger'>You feel stiff.</span>")

View File

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

View File

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

View File

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

View File

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

View File

@@ -6,12 +6,12 @@
cure_text = "Salt and mutadone" cure_text = "Salt and mutadone"
agent = "Agent S and DNA restructuring" agent = "Agent S and DNA restructuring"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
stage_prob = 1 stage_prob = 0.5
disease_flags = CURABLE disease_flags = CURABLE
cures = list(/datum/reagent/consumable/salt, /datum/reagent/medicine/mutadone) 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(!.) if(!.)
return return
@@ -22,54 +22,58 @@
switch(stage) switch(stage)
if(2) if(2)
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("gag") affected_mob.emote("gag")
if(prob(1)) if(DT_PROB(0.5, delta_time))
var/turf/open/OT = get_turf(affected_mob) var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT)) if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 40) OT.MakeSlippery(TURF_WET_LUBE, 40)
if(3) if(3)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("gag") affected_mob.emote("gag")
if(prob(5)) if(DT_PROB(2.5, delta_time))
var/turf/open/OT = get_turf(affected_mob) var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT)) if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100) OT.MakeSlippery(TURF_WET_LUBE, 100)
if(4) if(4)
var/obj/item/organ/eyes/eyes = locate(/obj/item/organ/eyes/snail) in affected_mob.internal_organs 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() var/obj/item/organ/eyes/snail/new_eyes = new()
new_eyes.Insert(affected_mob, drop_if_replaced = TRUE) 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>", \ 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>") "<span class='userdanger'>You scream in pain as your eyes are pushed out by your new snail eyes!</span>")
affected_mob.emote("scream") affected_mob.emote("scream")
return return
var/obj/item/shell = affected_mob.get_item_by_slot(ITEM_SLOT_BACK) var/obj/item/shell = affected_mob.get_item_by_slot(ITEM_SLOT_BACK)
if(!istype(shell, /obj/item/storage/backpack/snail)) if(!istype(shell, /obj/item/storage/backpack/snail))
shell = null 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))) 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.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>", \ 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>") "<span class='userdanger'>You scream in pain as a shell pushes itself out from under your skin!</span>")
affected_mob.emote("scream") affected_mob.emote("scream")
return return
var/obj/item/organ/tongue/tongue = locate(/obj/item/organ/tongue/snail) in affected_mob.internal_organs 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() var/obj/item/organ/tongue/snail/new_tongue = new()
new_tongue.Insert(affected_mob) new_tongue.Insert(affected_mob)
to_chat(affected_mob, "<span class='userdanger'>You feel your speech slow down...</span>") to_chat(affected_mob, "<span class='userdanger'>You feel your speech slow down...</span>")
return 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.set_species(/datum/species/snail)
affected_mob.client?.give_award(/datum/award/achievement/misc/snail, affected_mob) 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>", \ 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>") "<span class='boldnotice'>You turned into a snail person! You feel an urge to cccrrraaawwwlll...</span>")
cure() cure()
return FALSE return FALSE
if(prob(10))
if(DT_PROB(5, delta_time))
affected_mob.emote("gag") affected_mob.emote("gag")
if(prob(10)) if(DT_PROB(5, delta_time))
var/turf/open/OT = get_turf(affected_mob) var/turf/open/OT = get_turf(affected_mob)
if(isopenturf(OT)) if(isopenturf(OT))
OT.MakeSlippery(TURF_WET_LUBE, 100) 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 spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Synaptizine & Sulfur" cure_text = "Synaptizine & Sulfur"
cures = list(/datum/reagent/medicine/synaptizine,/datum/reagent/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+" agent = "Gravitokinetic Bipotential SADS+"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CAN_CARRY|CAN_RESIST|CURABLE disease_flags = CAN_CARRY|CAN_RESIST|CURABLE
permeability_mod = 1 permeability_mod = 1
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/gbs/stage_act() /datum/disease/gbs/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough") affected_mob.emote("cough")
if(3) if(3)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("gasp") 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>") to_chat(affected_mob, "<span class='danger'>Your body hurts all over!</span>")
if(4) if(4)
to_chat(affected_mob, "<span class='userdanger'>Your body feels as if it's trying to rip itself apart!</span>") 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() affected_mob.gib()
return FALSE return FALSE

View File

@@ -2,7 +2,7 @@
form = "Condition" form = "Condition"
name = "Myocardial Infarction" name = "Myocardial Infarction"
max_stages = 5 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." 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" agent = "Shitty Heart"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
@@ -22,7 +22,7 @@
return D return D
/datum/disease/heart_failure/stage_act() /datum/disease/heart_failure/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
@@ -33,25 +33,25 @@
switch(stage) switch(stage)
if(1 to 2) 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>") 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>") to_chat(affected_mob, "<span class='warning'>You feel dizzy.</span>")
affected_mob.add_confusion(6) 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>") 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(3 to 4)
if(!sound) if(!sound)
affected_mob.playsound_local(affected_mob, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE) affected_mob.playsound_local(affected_mob, 'sound/health/slowbeat.ogg', 40, FALSE, channel = CHANNEL_HEARTBEAT, use_reverb = FALSE)
sound = TRUE 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>") to_chat(affected_mob, "<span class='danger'>You feel a sharp pain in your chest!</span>")
if(prob(25)) if(prob(25))
affected_mob.vomit(95) affected_mob.vomit(95)
affected_mob.emote("cough") affected_mob.emote("cough")
affected_mob.Paralyze(40) affected_mob.Paralyze(40)
affected_mob.losebreath += 4 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>") to_chat(affected_mob, "<span class='danger'>You feel very weak and dizzy...</span>")
affected_mob.add_confusion(8) affected_mob.add_confusion(8)
affected_mob.adjustStaminaLoss(40, FALSE) affected_mob.adjustStaminaLoss(40, FALSE)

View File

@@ -14,16 +14,16 @@
process_dead = TRUE process_dead = TRUE
/datum/disease/magnitis/stage_act() /datum/disease/magnitis/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) 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>") 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)) for(var/obj/nearby_object in orange(2, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1)) if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue continue
@@ -35,11 +35,11 @@
var/move_dir = get_dir(nearby_silicon, affected_mob) var/move_dir = get_dir(nearby_silicon, affected_mob)
nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir) nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir)
if(3) 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>") 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>") 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)) for(var/obj/nearby_object in orange(4, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1)) if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue continue
@@ -55,11 +55,11 @@
if(!nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir)) if(!nearby_silicon.Move(get_step(nearby_silicon, move_dir), move_dir))
break break
if(4) 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>") 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>") 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)) for(var/obj/nearby_object in orange(6, affected_mob))
if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1)) if(nearby_object.anchored || !(nearby_object.flags_1 & CONDUCT_1))
continue continue

View File

@@ -15,7 +15,7 @@
bypasses_immunity = TRUE bypasses_immunity = TRUE
/datum/disease/parasite/stage_act() /datum/disease/parasite/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
@@ -28,20 +28,20 @@
switch(stage) switch(stage)
if(1) if(1)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("cough") affected_mob.emote("cough")
if(2) if(2)
if(prob(10)) if(DT_PROB(5, delta_time))
if(prob(50)) if(prob(50))
to_chat(affected_mob, "<span class='notice'>You feel the weight loss already!</span>") to_chat(affected_mob, "<span class='notice'>You feel the weight loss already!</span>")
affected_mob.adjust_nutrition(-3) affected_mob.adjust_nutrition(-3)
if(3) if(3)
if(prob(20)) if(DT_PROB(10, delta_time))
if(prob(20)) if(prob(20))
to_chat(affected_mob, "<span class='notice'>You're... REALLY starting to feel the weight loss.</span>") to_chat(affected_mob, "<span class='notice'>You're... REALLY starting to feel the weight loss.</span>")
affected_mob.adjust_nutrition(-6) affected_mob.adjust_nutrition(-6)
if(4) if(4)
if(prob(30)) if(DT_PROB(16, delta_time))
if(affected_mob.nutrition >= 100) if(affected_mob.nutrition >= 100)
if(prob(10)) if(prob(10))
to_chat(affected_mob, "<span class='warning'>You feel like your body's shedding weight rapidly!</span>") 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 disease_flags = CURABLE
cure_text = "Holy Water." cure_text = "Holy Water."
cures = list(/datum/reagent/water/holywater) cures = list(/datum/reagent/water/holywater)
cure_chance = 20 cure_chance = 10
agent = "Avian Vengence" agent = "Avian Vengence"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
desc = "Subject is possessed by the vengeful spirit of a parrot. Call the priest." 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 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(!.) if(!.)
return return
@@ -25,7 +25,7 @@
cure() cure()
return FALSE 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") affected_mob.say(pick(parrot.speech_buffer), forced = "parrot possession")

View File

@@ -4,7 +4,7 @@
spread_text = "Airborne" spread_text = "Airborne"
cure_text = "Banana products, especially banana bread." cure_text = "Banana products, especially banana bread."
cures = list(/datum/reagent/consumable/banana) cures = list(/datum/reagent/consumable/banana)
cure_chance = 75 cure_chance = 50
agent = "H0NI<42 Virus" agent = "H0NI<42 Virus"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 0.75 permeability_mod = 0.75
@@ -12,23 +12,23 @@
severity = DISEASE_SEVERITY_MEDIUM severity = DISEASE_SEVERITY_MEDIUM
/datum/disease/pierrot_throat/stage_act() /datum/disease/pierrot_throat/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(1) if(1)
if(prob(10)) if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You feel a little silly.</span>") to_chat(affected_mob, "<span class='danger'>You feel a little silly.</span>")
if(2) if(2)
if(prob(10)) if(DT_PROB(5, delta_time))
to_chat(affected_mob, "<span class='danger'>You start seeing rainbows.</span>") to_chat(affected_mob, "<span class='danger'>You start seeing rainbows.</span>")
if(3) 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>") to_chat(affected_mob, "<span class='danger'>Your thoughts are interrupted by a loud <b>HONK!</b></span>")
if(4) 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") 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_text = "Contact"
spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS spread_flags = DISEASE_SPREAD_BLOOD | DISEASE_SPREAD_CONTACT_SKIN | DISEASE_SPREAD_CONTACT_FLUIDS
cure_text = "Rest or an injection of mutadone" cure_text = "Rest or an injection of mutadone"
cure_chance = 6 cure_chance = 3
agent = "" agent = ""
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly." desc = "A DNA-altering retrovirus that scrambles the structural and unique enzymes of a host constantly."
severity = DISEASE_SEVERITY_HARMFUL severity = DISEASE_SEVERITY_HARMFUL
permeability_mod = 0.4 permeability_mod = 0.4
stage_prob = 2 stage_prob = 1
var/restcure = 0 var/restcure = 0
/datum/disease/dna_retrovirus/New() /datum/disease/dna_retrovirus/New()
@@ -26,62 +26,56 @@
D.restcure = restcure D.restcure = restcure
return D return D
/datum/disease/dna_retrovirus/stage_act() /datum/disease/dna_retrovirus/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(1) if(1)
if(restcure) if(DT_PROB(4, delta_time))
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))
to_chat(affected_mob, "<span class='danger'>Your head hurts.</span>") 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>") 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>") 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(2)
if(restcure) if(DT_PROB(4, delta_time))
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))
to_chat(affected_mob, "<span class='danger'>Your skin feels loose.</span>") 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>") 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>") to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head!</span>")
affected_mob.Unconscious(40) affected_mob.Unconscious(40)
if (prob(4)) if(DT_PROB(2, delta_time))
to_chat(affected_mob, "<span class='danger'>Your stomach churns.</span>") 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(3)
if(restcure) if(DT_PROB(5, delta_time))
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))
to_chat(affected_mob, "<span class='danger'>Your entire body vibrates.</span>") to_chat(affected_mob, "<span class='danger'>Your entire body vibrates.</span>")
if(DT_PROB(19, delta_time))
if (prob(35))
if(prob(50)) if(prob(50))
scramble_dna(affected_mob, 1, 0, rand(15,45)) scramble_dna(affected_mob, 1, 0, rand(15,45))
else else
scramble_dna(affected_mob, 0, 1, rand(15,45)) 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(4)
if(restcure) if(DT_PROB(37, delta_time))
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(prob(50)) if(prob(50))
scramble_dna(affected_mob, 1, 0, rand(50,75)) scramble_dna(affected_mob, 1, 0, rand(50,75))
else else
scramble_dna(affected_mob, 0, 1, rand(50,75)) 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 permeability_mod = 1
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
/datum/disease/rhumba_beat/stage_act() /datum/disease/rhumba_beat/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if(prob(45)) if(DT_PROB(26, delta_time))
affected_mob.adjustFireLoss(5, FALSE) 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>") to_chat(affected_mob, "<span class='danger'>You feel strange...</span>")
if(3) 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>") 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") 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>") to_chat(affected_mob, "<span class='danger'>You feel the need to chick chicky boom...</span>")
if(4) if(4)
if(prob(20)) if(DT_PROB(10, delta_time))
if (prob(50)) if(prob(50))
affected_mob.adjust_fire_stacks(2) affected_mob.adjust_fire_stacks(2)
affected_mob.IgniteMob() affected_mob.IgniteMob()
else else
@@ -38,5 +38,5 @@
to_chat(affected_mob, "<span class='danger'>You feel a burning beat inside...</span>") to_chat(affected_mob, "<span class='danger'>You feel a burning beat inside...</span>")
if(5) if(5)
to_chat(affected_mob, "<span class='danger'>Your body is unable to contain the Rhumba Beat...</span>") 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 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" agent = "Shenanigans"
viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien) viable_mobtypes = list(/mob/living/carbon/human, /mob/living/carbon/alien)
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 10 stage_prob = 5
visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC visibility_flags = HIDDEN_SCANNER|HIDDEN_PANDEMIC
disease_flags = CURABLE disease_flags = CURABLE
var/list/stage1 = list("You feel unremarkable.") var/list/stage1 = list("You feel unremarkable.")
@@ -30,23 +30,23 @@
return D return D
/datum/disease/transformation/stage_act() /datum/disease/transformation/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(1) if(1)
if (stage1 && prob(stage_prob)) if (stage1 && DT_PROB(stage_prob, delta_time))
to_chat(affected_mob, pick(stage1)) to_chat(affected_mob, pick(stage1))
if(2) if(2)
if (stage2 && prob(stage_prob)) if (stage2 && DT_PROB(stage_prob, delta_time))
to_chat(affected_mob, pick(stage2)) to_chat(affected_mob, pick(stage2))
if(3) if(3)
if (stage3 && prob(stage_prob * 2)) if (stage3 && DT_PROB(stage_prob * 2, delta_time))
to_chat(affected_mob, pick(stage3)) to_chat(affected_mob, pick(stage3))
if(4) if(4)
if (stage4 && prob(stage_prob * 2)) if (stage4 && DT_PROB(stage_prob * 2, delta_time))
to_chat(affected_mob, pick(stage4)) to_chat(affected_mob, pick(stage4))
if(5) if(5)
do_disease_transformation(affected_mob) do_disease_transformation(affected_mob)
@@ -105,11 +105,11 @@
spread_flags = DISEASE_SPREAD_SPECIAL spread_flags = DISEASE_SPREAD_SPECIAL
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
permeability_mod = 1 permeability_mod = 1
cure_chance = 1 cure_chance = 0.5
disease_flags = CAN_CARRY|CAN_RESIST disease_flags = CAN_CARRY|CAN_RESIST
desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey." desc = "Monkeys with this disease will bite humans, causing humans to mutate into a monkey."
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
stage_prob = 4 stage_prob = 2
visibility_flags = NONE visibility_flags = NONE
agent = "Kongey Vibrion M-909" agent = "Kongey Vibrion M-909"
new_form = /mob/living/carbon/human/species/monkey new_form = /mob/living/carbon/human/species/monkey
@@ -130,21 +130,21 @@
ADD_TRAIT(affected_mob, TRAIT_VENTCRAWLER_ALWAYS, type) 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) 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>") to_chat(affected_mob, "<span class='notice'>Your [pick("back", "arm", "leg", "elbow", "head")] itches.</span>")
if(3) 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>") to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.add_confusion(10) affected_mob.add_confusion(10)
if(4) 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") affected_mob.say(pick("Eeek, ook ook!", "Eee-eeek!", "Eeee!", "Ungh, ungh."), forced = "jungle fever")
@@ -167,7 +167,7 @@
name = "Robotic Transformation" name = "Robotic Transformation"
cure_text = "An injection of copper." cure_text = "An injection of copper."
cures = list(/datum/reagent/copper) cures = list(/datum/reagent/copper)
cure_chance = 5 cure_chance = 2.5
agent = "R2D2 Nanomachines" agent = "R2D2 Nanomachines"
desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg." desc = "This disease, actually acute nanomachine infection, converts the victim into a cyborg."
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
@@ -182,20 +182,20 @@
bantype = "Cyborg" bantype = "Cyborg"
/datum/disease/transformation/robot/stage_act() /datum/disease/transformation/robot/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(3) if(3)
if (prob(8)) if (DT_PROB(4, delta_time))
affected_mob.say(pick("Beep, boop", "beep, beep!", "Boop...bop"), forced = "robotic transformation") 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>") to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Unconscious(40) affected_mob.Unconscious(40)
if(4) 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") 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" name = "Xenomorph Transformation"
cure_text = "Spaceacillin & Glycerol" cure_text = "Spaceacillin & Glycerol"
cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol) cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/glycerol)
cure_chance = 5 cure_chance = 2.5
agent = "Rip-LEY Alien Microbes" agent = "Rip-LEY Alien Microbes"
desc = "This disease changes the victim into a xenomorph." desc = "This disease changes the victim into a xenomorph."
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
@@ -218,18 +218,18 @@
bantype = ROLE_ALIEN bantype = ROLE_ALIEN
/datum/disease/transformation/xeno/stage_act() /datum/disease/transformation/xeno/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(3) 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>") to_chat(affected_mob, "<span class='danger'>You feel a stabbing pain in your head.</span>")
affected_mob.Unconscious(40) affected_mob.Unconscious(40)
if(4) 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") affected_mob.say(pick("You look delicious.", "Going to... devour you...", "Hsssshhhhh!"), forced = "xenomorph transformation")
@@ -237,7 +237,7 @@
name = "Advanced Mutation Transformation" name = "Advanced Mutation Transformation"
cure_text = "frost oil" cure_text = "frost oil"
cures = list(/datum/reagent/consumable/frostoil) cures = list(/datum/reagent/consumable/frostoil)
cure_chance = 80 cure_chance = 55
agent = "Advanced Mutation Toxin" agent = "Advanced Mutation Toxin"
desc = "This highly concentrated extract converts anything into more of itself." desc = "This highly concentrated extract converts anything into more of itself."
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
@@ -250,7 +250,7 @@
new_form = /mob/living/simple_animal/slime/random 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(!.) if(!.)
return return
@@ -283,16 +283,16 @@
new_form = /mob/living/simple_animal/pet/dog/corgi 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(3) if(3)
if (prob(8)) if (DT_PROB(4, delta_time))
affected_mob.say(pick("YAP", "Woof!"), forced = "corgi transformation") affected_mob.say(pick("YAP", "Woof!"), forced = "corgi transformation")
if(4) if(4)
if (prob(20)) if (DT_PROB(10, delta_time))
affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation") affected_mob.say(pick("Bark!", "AUUUUUU"), forced = "corgi transformation")
@@ -302,7 +302,7 @@
cures = list(/datum/reagent/consumable/nothing) cures = list(/datum/reagent/consumable/nothing)
agent = "Gluttony's Blessing" agent = "Gluttony's Blessing"
desc = "A 'gift' from somewhere terrible." desc = "A 'gift' from somewhere terrible."
stage_prob = 20 stage_prob = 10
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
visibility_flags = NONE visibility_flags = NONE
stage1 = list("Your stomach rumbles.") stage1 = list("Your stomach rumbles.")
@@ -318,8 +318,8 @@
name = "Gondola Transformation" name = "Gondola Transformation"
cure_text = "Condensed Capsaicin, ingested or injected." //getting pepper sprayed doesn't help 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 cures = list(/datum/reagent/consumable/condensedcapsaicin) //beats the hippie crap right out of your system
cure_chance = 80 cure_chance = 55
stage_prob = 5 stage_prob = 2.5
agent = "Tranquility" agent = "Tranquility"
desc = "Consuming the flesh of a Gondola comes at a terrible price." desc = "Consuming the flesh of a Gondola comes at a terrible price."
severity = DISEASE_SEVERITY_BIOHAZARD severity = DISEASE_SEVERITY_BIOHAZARD
@@ -332,28 +332,28 @@
new_form = /mob/living/simple_animal/pet/gondola 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if (prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile") affected_mob.emote("smile")
if (prob(20)) if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
if(3) if(3)
if (prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile") affected_mob.emote("smile")
if (prob(20)) if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5))
if(4) if(4)
if (prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("smile") affected_mob.emote("smile")
if (prob(20)) if(DT_PROB(10, delta_time))
affected_mob.reagents.add_reagent_list(list(/datum/reagent/pax = 5)) 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() var/obj/item/held_item = affected_mob.get_active_held_item()
if(held_item) if(held_item)
to_chat(affected_mob, "<span class='danger'>You let go of what you were holding.</span>") 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) cures = list(/datum/reagent/medicine/spaceacillin, /datum/reagent/medicine/c2/convermol)
agent = "Fungal Tubercle bacillus Cosmosis" agent = "Fungal Tubercle bacillus Cosmosis"
viable_mobtypes = list(/mob/living/carbon/human) 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." 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) required_organs = list(/obj/item/organ/lungs)
severity = DISEASE_SEVERITY_BIOHAZARD 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. 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(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) if(2)
if(prob(2)) if(DT_PROB(1, delta_time))
affected_mob.emote("cough") affected_mob.emote("cough")
to_chat(affected_mob, "<span class='danger'>Your chest hurts.</span>") 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>") 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>") to_chat(affected_mob, "<span class='danger'>You feel a cold sweat form.</span>")
if(4) if(4)
if(prob(2)) if(DT_PROB(1, delta_time))
to_chat(affected_mob, "<span class='userdanger'>You see four of everything!</span>") to_chat(affected_mob, "<span class='userdanger'>You see four of everything!</span>")
affected_mob.Dizzy(5) 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>") to_chat(affected_mob, "<span class='danger'>You feel a sharp pain from your lower chest!</span>")
affected_mob.adjustOxyLoss(5, FALSE) affected_mob.adjustOxyLoss(5, FALSE)
affected_mob.emote("gasp") 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>") to_chat(affected_mob, "<span class='danger'>You feel air escape from your lungs painfully.</span>")
affected_mob.adjustOxyLoss(25, FALSE) affected_mob.adjustOxyLoss(25, FALSE)
affected_mob.emote("gasp") affected_mob.emote("gasp")
if(5) 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>") 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) affected_mob.adjustStaminaLoss(70, FALSE)
if(prob(10)) if(DT_PROB(5, delta_time))
affected_mob.adjustStaminaLoss(100, FALSE) 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.visible_message("<span class='warning'>[affected_mob] faints!</span>", "<span class='userdanger'>You surrender yourself and feel at peace...</span>")
affected_mob.AdjustSleeping(100) 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>") 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)) affected_mob.set_confusion(min(100, affected_mob.get_confusion() + 8))
if(prob(10)) if(DT_PROB(5, delta_time))
affected_mob.vomit(20) 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>") 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) 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>") 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) affected_mob.adjust_bodytemperature(40)

View File

@@ -23,30 +23,30 @@ TARCOL MINTI ZHERI - forcewall
STI KALY - blind STI KALY - blind
*/ */
/datum/disease/wizarditis/stage_act() /datum/disease/wizarditis/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
switch(stage) switch(stage)
if(2) 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") 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>") 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(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") 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>") 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(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") affected_mob.say(pick("NEC CANTIO!","AULIE OXIN FIERA!","STI KALY!","EI NATH!"), forced = "wizarditis")
return 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>") 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) spawn_wizard_clothes(50)
if(prob(0.01)) if(DT_PROB(0.005, delta_time))
teleport() teleport()

View File

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

View File

@@ -167,10 +167,10 @@
energy_coeff = 1 energy_coeff = 1
synchronizer_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)) if(!isturf(owner.loc))
return 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) new /obj/effect/immortality_talisman/void(get_turf(owner), owner)
/obj/effect/proc_holder/spell/self/void /obj/effect/proc_holder/spell/self/void

View File

@@ -9,8 +9,8 @@
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
/datum/mutation/human/epilepsy/on_life() /datum/mutation/human/epilepsy/on_life(delta_time, times_fired)
if(prob(1 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) 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.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.Unconscious(200 * GET_MUTATION_POWER(src))
owner.Jitter(1000 * GET_MUTATION_POWER(src)) owner.Jitter(1000 * GET_MUTATION_POWER(src))
@@ -57,8 +57,8 @@
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
/datum/mutation/human/cough/on_life() /datum/mutation/human/cough/on_life(delta_time, times_fired)
if(prob(5 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS) if(DT_PROB(2.5 * GET_MUTATION_SYNCHRONIZER(src), delta_time) && owner.stat == CONSCIOUS)
owner.drop_all_held_items() owner.drop_all_held_items()
owner.emote("cough") owner.emote("cough")
if(GET_MUTATION_POWER(src) > 1) 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_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>" text_lose_indication = "<span class='notice'>The screaming in your mind fades.</span>"
/datum/mutation/human/paranoia/on_life() /datum/mutation/human/paranoia/on_life(delta_time, times_fired)
if(prob(5) && owner.stat == CONSCIOUS) if(DT_PROB(2.5, delta_time) && owner.stat == CONSCIOUS)
owner.emote("scream") owner.emote("scream")
if(prob(25)) if(prob(25))
owner.hallucination += 20 owner.hallucination += 20
@@ -135,8 +135,8 @@
text_gain_indication = "<span class='danger'>You twitch.</span>" text_gain_indication = "<span class='danger'>You twitch.</span>"
synchronizer_coeff = 1 synchronizer_coeff = 1
/datum/mutation/human/tourettes/on_life() /datum/mutation/human/tourettes/on_life(delta_time, times_fired)
if(prob(10 * GET_MUTATION_SYNCHRONIZER(src)) && owner.stat == CONSCIOUS && !owner.IsStun()) if(DT_PROB(5 * GET_MUTATION_SYNCHRONIZER(src), delta_time) && owner.stat == CONSCIOUS && !owner.IsStun())
owner.Stun(200) owner.Stun(200)
switch(rand(1, 3)) switch(rand(1, 3))
if(1) if(1)
@@ -284,8 +284,8 @@
synchronizer_coeff = 1 synchronizer_coeff = 1
power_coeff = 1 power_coeff = 1
/datum/mutation/human/fire/on_life() /datum/mutation/human/fire/on_life(delta_time, times_fired)
if(prob((1+(100-dna.stability)/10)) * GET_MUTATION_SYNCHRONIZER(src)) 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.adjust_fire_stacks(2 * GET_MUTATION_POWER(src))
owner.IgniteMob() owner.IgniteMob()
@@ -312,8 +312,8 @@
power_coeff = 1 power_coeff = 1
var/warpchance = 0 var/warpchance = 0
/datum/mutation/human/badblink/on_life() /datum/mutation/human/badblink/on_life(delta_time, times_fired)
if(prob(warpchance)) if(DT_PROB(warpchance, delta_time))
var/warpmessage = pick( 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'>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>", "<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'>[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>") "<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>") 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) do_teleport(owner, get_turf(owner), warpdistance, channel = TELEPORT_CHANNEL_FREE)
owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * (warpchance * warpdistance)) owner.adjust_disgust(GET_MUTATION_SYNCHRONIZER(src) * (warpchance * warpdistance))
warpchance = 0 warpchance = 0
owner.visible_message("<span class='danger'>[owner] appears out of nowhere!</span>") owner.visible_message("<span class='danger'>[owner] appears out of nowhere!</span>")
else else
warpchance += 0.25 * GET_MUTATION_ENERGY(src) warpchance += 0.0625 * GET_MUTATION_ENERGY(src) * delta_time
/datum/mutation/human/acidflesh /datum/mutation/human/acidflesh
name = "Acidic Flesh" 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_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>" 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 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() /datum/mutation/human/acidflesh/on_life(delta_time, times_fired)
if(prob(25)) if(DT_PROB(13, delta_time))
if(world.time > msgcooldown) if(COOLDOWN_FINISHED(src, msgcooldown))
to_chat(owner, "<span class='danger'>Your acid flesh bubbles...</span>") to_chat(owner, "<span class='danger'>Your acid flesh bubbles...</span>")
msgcooldown = world.time + 200 COOLDOWN_START(src, msgcooldown, 20 SECONDS)
if(prob(15)) 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>") 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) 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_MOVABLE_MOVED, .proc/on_move)
RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/on_attack_hand) RegisterSignal(owner, COMSIG_HUMAN_EARLY_UNARMED_ATTACK, .proc/on_attack_hand)
/datum/mutation/human/chameleon/on_life() /datum/mutation/human/chameleon/on_life(delta_time, times_fired)
owner.alpha = max(0, owner.alpha - 25) owner.alpha = max(owner.alpha - (12.5 * delta_time), 0)
/datum/mutation/human/chameleon/proc/on_move() /datum/mutation/human/chameleon/proc/on_move()
SIGNAL_HANDLER SIGNAL_HANDLER

View File

@@ -65,7 +65,7 @@
if(35 to 41) if(35 to 41)
arm.force_wound_upwards(/datum/wound/blunt/moderate) 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) if(owner.health < 0)
on_losing(owner) on_losing(owner)
to_chat(owner, "<span class='danger'>You suddenly feel very weak.</span>") to_chat(owner, "<span class='danger'>You suddenly feel very weak.</span>")

View File

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

View File

@@ -7,8 +7,8 @@
quality = MINOR_NEGATIVE quality = MINOR_NEGATIVE
text_gain_indication = "<span class='danger'>You feel nervous.</span>" text_gain_indication = "<span class='danger'>You feel nervous.</span>"
/datum/mutation/human/nervousness/on_life() /datum/mutation/human/nervousness/on_life(delta_time, times_fired)
if(prob(10)) if(DT_PROB(5, delta_time))
owner.stuttering = max(10, owner.stuttering) owner.stuttering = max(10, owner.stuttering)
@@ -152,15 +152,15 @@
text_gain_indication = "<span class='notice'>You feel pretty good, honeydoll.</span>" 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>" 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)) switch(pick(1,2))
if(1) 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/list/dancetypes = list("swinging", "fancy", "stylish", "20'th century", "jivin'", "rock and roller", "cool", "salacious", "bashing", "smashing")
var/dancemoves = pick(dancetypes) var/dancemoves = pick(dancetypes)
owner.visible_message("<b>[owner]</b> busts out some [dancemoves] moves!") owner.visible_message("<b>[owner]</b> busts out some [dancemoves] moves!")
if(2) 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")]!") 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) /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 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 if(NOBLOOD in H.dna.species.species_traits) //can't lose blood if your species doesn't have any
return return
else
if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment if (H.blood_volume > (BLOOD_VOLUME_SAFE - 25)) // just barely survivable without treatment
H.blood_volume -= 0.275 * delta_time H.blood_volume -= 0.275 * delta_time
/datum/quirk/blindness /datum/quirk/blindness
name = "Blind" name = "Blind"

View File

@@ -316,7 +316,7 @@
return return
/// If var/processing is TRUE, this is run on each life tick /// 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 return
/// For use in do_after callback checks /// For use in do_after callback checks
@@ -338,7 +338,7 @@
return 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 /// 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 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 /// 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) UnregisterSignal(victim, COMSIG_HUMAN_EARLY_UNARMED_ATTACK)
return ..() 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(limb.body_zone == BODY_ZONE_HEAD && brain_trauma_group && world.time > next_trauma_cycle)
if(active_trauma) if(active_trauma)
@@ -77,12 +77,12 @@
regen_ticks_current++ regen_ticks_current++
if(victim.body_position == LYING_DOWN) if(victim.body_position == LYING_DOWN)
if(prob(50)) if(DT_PROB(30, delta_time))
regen_ticks_current += 0.5 regen_ticks_current += 0.5
if(victim.IsSleeping() && prob(50)) if(victim.IsSleeping() && DT_PROB(30, delta_time))
regen_ticks_current += 0.5 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) victim.take_bodypart_damage(rand(1, severity * 2), stamina=rand(2, severity * 2.5), wound_bonus=CANT_WOUND)
if(prob(33)) if(prob(33))
to_chat(victim, "<span class='danger'>You feel a sharp pain in your body as your bones are reforming!</span>") 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 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 if(strikes_to_lose_limb == 0) // we've already hit sepsis, nothing more to do
victim.adjustToxLoss(0.5) victim.adjustToxLoss(0.25 * delta_time)
if(prob(1)) 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) 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 return
@@ -52,12 +52,12 @@
flesh_healing += 0.5 flesh_healing += 0.5
if(limb.current_gauze) 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 if(flesh_healing > 0) // good bandages multiply the length of flesh healing
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1) var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
flesh_damage = max(0, flesh_damage - 1) flesh_damage = max(flesh_damage - (0.5 * delta_time), 0)
flesh_healing = max(0, flesh_healing - bandage_factor) 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 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)) 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 // 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) if(sanitization > 0)
var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1) var/bandage_factor = (limb.current_gauze ? limb.current_gauze.splint_factor : 1)
infestation = max(0, infestation - WOUND_BURN_SANITIZATION_RATE) infestation = max(infestation - (WOUND_BURN_SANITIZATION_RATE * delta_time), 0)
sanitization = max(0, sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor)) sanitization = max(sanitization - (WOUND_BURN_SANITIZATION_RATE * bandage_factor * delta_time), 0)
return return
infestation += infestation_rate infestation += infestation_rate * delta_time
switch(infestation) switch(infestation)
if(0 to WOUND_INFECTION_MODERATE) if(0 to WOUND_INFECTION_MODERATE)
if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE) if(WOUND_INFECTION_MODERATE to WOUND_INFECTION_SEVERE)
if(prob(30)) if(DT_PROB(15, delta_time))
victim.adjustToxLoss(0.2) victim.adjustToxLoss(0.2)
if(prob(6)) if(prob(6))
to_chat(victim, "<span class='warning'>The blisters on your [limb.name] ooze a strange pus...</span>") 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(WOUND_INFECTION_SEVERE to WOUND_INFECTION_CRITICAL)
if(!disabling && prob(2)) if(!disabling)
to_chat(victim, "<span class='warning'><b>Your [limb.name] completely locks up, as you struggle for control against the infection!</b></span>") if(DT_PROB(1, delta_time))
set_disabling(TRUE) to_chat(victim, "<span class='warning'><b>Your [limb.name] completely locks up, as you struggle for control against the infection!</b></span>")
else if(disabling && prob(8)) 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>") to_chat(victim, "<span class='notice'>You regain sensation in your [limb.name], but it's still in terrible shape!</span>")
set_disabling(FALSE) set_disabling(FALSE)
else if(prob(20)) return
if(DT_PROB(10, delta_time))
victim.adjustToxLoss(0.5) victim.adjustToxLoss(0.5)
if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC) if(WOUND_INFECTION_CRITICAL to WOUND_INFECTION_SEPTIC)
if(!disabling && prob(3)) if(!disabling)
to_chat(victim, "<span class='warning'><b>You suddenly lose all sensation of the festering infection in your [limb.name]!</b></span>") if(DT_PROB(1.5, delta_time))
set_disabling(TRUE) to_chat(victim, "<span class='warning'><b>You suddenly lose all sensation of the festering infection in your [limb.name]!</b></span>")
else if(disabling && prob(3)) 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>") 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) set_disabling(FALSE)
else if(prob(1)) return
to_chat(victim, "<span class='warning'>You contemplate life without your [limb.name]...</span>")
victim.adjustToxLoss(0.75) if(DT_PROB(2.48, delta_time))
else if(prob(4)) if(prob(20))
victim.adjustToxLoss(1) 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(WOUND_INFECTION_SEPTIC to INFINITY)
if(prob(infestation)) if(DT_PROB(0.5 * infestation, delta_time))
switch(strikes_to_lose_limb) switch(strikes_to_lose_limb)
if(3 to INFINITY) if(3 to INFINITY)
to_chat(victim, "<span class='deadsay'>The skin on your [limb.name] is literally dripping off, you feel awful!</span>") 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) 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 // 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) 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)) if((flesh_damage <= 0) && (infestation <= 1))
to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>") to_chat(victim, "<span class='green'>The burns on your [limb.name] have cleared up!</span>")
qdel(src) qdel(src)
return return
if(sanitization > 0) 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) /datum/wound/burn/on_synthflesh(amount)
flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard flesh_healing += amount * 0.5 // 20u patch will heal 10 flesh standard
@@ -288,7 +298,7 @@
threshold_penalty = 80 threshold_penalty = 80
status_effect_type = /datum/status_effect/wound/burn/critical 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) 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 flesh_damage = 20
scar_keyword = "burncritical" scar_keyword = "burncritical"
*/ */

View File

@@ -58,25 +58,25 @@
return BLOOD_FLOW_DECREASING return BLOOD_FLOW_DECREASING
return BLOOD_FLOW_STEADY 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) blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(victim.bodytemperature < (BODYTEMP_NORMAL - 10)) if(victim.bodytemperature < (BODYTEMP_NORMAL - 10))
blood_flow -= 0.2 blood_flow -= 0.1 * delta_time
if(prob(5)) 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>") 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)) 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) if(limb.current_gauze)
blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate blood_flow -= limb.current_gauze.absorption_rate * gauzed_clot_rate * delta_time
limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate limb.current_gauze.absorption_capacity -= limb.current_gauze.absorption_rate * delta_time
if(blood_flow <= 0) if(blood_flow <= 0)
qdel(src) qdel(src)
/datum/wound/pierce/on_stasis() /datum/wound/pierce/on_stasis(delta_time, times_fired)
. = ..() . = ..()
if(blood_flow <= 0) if(blood_flow <= 0)
qdel(src) qdel(src)
@@ -97,7 +97,7 @@
/datum/wound/pierce/on_synthflesh(power) /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 /// If someone is using a suture to close this puncture
/datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user) /datum/wound/pierce/proc/suture(obj/item/stack/medical/suture/I, mob/user)

View File

@@ -92,9 +92,9 @@
if(clot_rate < 0) if(clot_rate < 0)
return BLOOD_FLOW_INCREASING return BLOOD_FLOW_INCREASING
/datum/wound/slash/handle_process() /datum/wound/slash/handle_process(delta_time, times_fired)
if(victim.stat == DEAD) 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(blood_flow < minimum_flow)
if(demotes_to) if(demotes_to)
replace_wound(demotes_to) replace_wound(demotes_to)
@@ -105,15 +105,15 @@
blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW) blood_flow = min(blood_flow, WOUND_SLASH_MAX_BLOODFLOW)
if(HAS_TRAIT(victim, TRAIT_BLOODY_MESS)) 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(limb.current_gauze)
if(clot_rate > 0) if(clot_rate > 0)
blood_flow -= clot_rate blood_flow -= clot_rate * delta_time
blood_flow -= limb.current_gauze.absorption_rate blood_flow -= limb.current_gauze.absorption_rate * delta_time
limb.seep_gauze(limb.current_gauze.absorption_rate) limb.seep_gauze(limb.current_gauze.absorption_rate * delta_time)
else else
blood_flow -= clot_rate blood_flow -= clot_rate * delta_time
if(blood_flow > highest_flow) if(blood_flow > highest_flow)
highest_flow = blood_flow highest_flow = blood_flow
@@ -126,7 +126,7 @@
qdel(src) qdel(src)
/datum/wound/slash/on_stasis() /datum/wound/slash/on_stasis(delta_time, times_fired)
if(blood_flow >= minimum_flow) if(blood_flow >= minimum_flow)
return return
if(demotes_to) if(demotes_to)
@@ -262,7 +262,7 @@
severity = WOUND_SEVERITY_MODERATE severity = WOUND_SEVERITY_MODERATE
initial_flow = 2 initial_flow = 2
minimum_flow = 0.5 minimum_flow = 0.5
clot_rate = 0.12 clot_rate = 0.06
threshold_minimum = 20 threshold_minimum = 20
threshold_penalty = 10 threshold_penalty = 10
status_effect_type = /datum/status_effect/wound/slash/moderate status_effect_type = /datum/status_effect/wound/slash/moderate
@@ -278,7 +278,7 @@
severity = WOUND_SEVERITY_SEVERE severity = WOUND_SEVERITY_SEVERE
initial_flow = 3.25 initial_flow = 3.25
minimum_flow = 2.75 minimum_flow = 2.75
clot_rate = 0.06 clot_rate = 0.03
threshold_minimum = 50 threshold_minimum = 50
threshold_penalty = 25 threshold_penalty = 25
demotes_to = /datum/wound/slash/moderate demotes_to = /datum/wound/slash/moderate
@@ -295,7 +295,7 @@
severity = WOUND_SEVERITY_CRITICAL severity = WOUND_SEVERITY_CRITICAL
initial_flow = 4.25 initial_flow = 4.25
minimum_flow = 4 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_minimum = 80
threshold_penalty = 40 threshold_penalty = 40
demotes_to = /datum/wound/slash/severe demotes_to = /datum/wound/slash/severe

View File

@@ -29,17 +29,17 @@
INVOKE_ASYNC(src, .proc/RemoveInfectionImages, owner) 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) if(!owner)
return 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 return
/obj/item/organ/body_egg/proc/RefreshInfectionImage() /obj/item/organ/body_egg/proc/RefreshInfectionImage()

View File

@@ -130,7 +130,7 @@
amount = 6 amount = 6
grind_results = list(/datum/reagent/cellulose = 2) grind_results = list(/datum/reagent/cellulose = 2)
custom_price = PAYCHECK_ASSISTANT * 2 custom_price = PAYCHECK_ASSISTANT * 2
absorption_rate = 0.25 absorption_rate = 0.125
absorption_capacity = 5 absorption_capacity = 5
splint_factor = 0.35 splint_factor = 0.35
merge_type = /obj/item/stack/medical/gauze 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." 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 self_delay = 6 SECONDS
other_delay = 3 SECONDS other_delay = 3 SECONDS
absorption_rate = 0.15 absorption_rate = 0.075
absorption_capacity = 4 absorption_capacity = 4
merge_type = /obj/item/stack/medical/gauze/improvised merge_type = /obj/item/stack/medical/gauze/improvised
gauze_type = /datum/bodypart_aid/gauze/improvised //SKYRAT EDIT ADDITION - MEDICAL gauze_type = /datum/bodypart_aid/gauze/improvised //SKYRAT EDIT ADDITION - MEDICAL

View File

@@ -35,7 +35,7 @@
var/splint_factor 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 /// 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 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 var/absorption_rate
/// Amount of matter for RCD /// Amount of matter for RCD
var/matter_amount = 0 var/matter_amount = 0

View File

@@ -7,10 +7,15 @@
organ_flags = NONE organ_flags = NONE
beating = TRUE beating = TRUE
var/true_name = "baseline placebo referencer" var/true_name = "baseline placebo referencer"
var/cooldown_low = 300
var/cooldown_high = 300 /// The minimum time between activations
var/next_activation = 0 var/cooldown_low = 30 SECONDS
var/uses // -1 For infinite /// 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/human_only = FALSE
var/active = FALSE var/active = FALSE
@@ -36,7 +41,7 @@
/obj/item/organ/heart/gland/proc/Start() /obj/item/organ/heart/gland/proc/Start()
active = 1 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() /obj/item/organ/heart/gland/proc/update_gland_hud()
if(!owner) if(!owner)
@@ -91,7 +96,7 @@
hud.add_to_hud(owner) hud.add_to_hud(owner)
update_gland_hud() update_gland_hud()
/obj/item/organ/heart/gland/on_life() /obj/item/organ/heart/gland/on_life(delta_time, times_fired)
if(!beating) if(!beating)
// alien glands are immune to stopping. // alien glands are immune to stopping.
beating = TRUE beating = TRUE
@@ -100,10 +105,10 @@
if(!ownerCheck()) if(!ownerCheck())
active = FALSE active = FALSE
return return
if(next_activation <= world.time) if(COOLDOWN_FINISHED(src, activation_cooldown))
activate() activate()
uses-- uses--
next_activation = world.time + rand(cooldown_low,cooldown_high) COOLDOWN_START(src, activation_cooldown, rand(cooldown_low, cooldown_high))
if(!uses) if(!uses)
active = FALSE 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") 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() 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)) 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 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) if(!is_weak && H.stat == DEAD)
@@ -278,39 +278,41 @@
/mob/living/simple_animal/hostile/blob/blobbernaut/add_cell_sample() /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) AddElement(/datum/element/swabable, CELL_LINE_TABLE_BLOBBERNAUT, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5)
/mob/living/simple_animal/hostile/blob/blobbernaut/Life() /mob/living/simple_animal/hostile/blob/blobbernaut/Life(delta_time = SSMOBS_DT, times_fired)
if(..()) if(!..())
var/list/blobs_in_area = range(2, src) return
if(independent) var/list/blobs_in_area = range(2, src)
return // strong independent blobbernaut that don't need no blob if(independent)
var/damagesources = 0 return // strong independent blobbernaut that don't need no blob
if(!(locate(/obj/structure/blob) in blobs_in_area)) var/damagesources = 0
damagesources++ if(!(locate(/obj/structure/blob) in blobs_in_area))
if(!factory) damagesources++
damagesources++
else if(!factory)
if(locate(/obj/structure/blob/special/core) in blobs_in_area) damagesources++
adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE) else
var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed if(locate(/obj/structure/blob/special/core) in blobs_in_area)
if(overmind) adjustHealth(-maxHealth*BLOBMOB_BLOBBERNAUT_HEALING_CORE * delta_time)
H.color = overmind.blobstrain.complementary_color var/obj/effect/temp_visual/heal/H = new /obj/effect/temp_visual/heal(get_turf(src)) //hello yes you are being healed
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
if(overmind) if(overmind)
I.color = overmind.blobstrain.complementary_color H.color = overmind.blobstrain.complementary_color
flick_overlay_view(I, src, 8) 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) /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.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) 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) /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, FALSE) exposed_mob.adjustBruteLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
exposed_mob.adjustFireLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE) exposed_mob.adjustFireLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
exposed_mob.adjustToxLoss(0.5*REAGENTS_EFFECT_MULTIPLIER, FALSE) exposed_mob.adjustToxLoss(0.5 * REAGENTS_EFFECT_MULTIPLIER * delta_time, FALSE)
. = 1 . = 1
..() ..()

View File

@@ -24,8 +24,8 @@
exposed_mob.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume) exposed_mob.reagents.add_reagent(/datum/reagent/toxin/spore, 0.2*reac_volume)
exposed_mob.apply_damage(0.7*reac_volume, TOX) exposed_mob.apply_damage(0.7*reac_volume, TOX)
/datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C) /datum/reagent/blob/regenerative_materia/on_mob_life(mob/living/carbon/C, delta_time, times_fired)
C.adjustToxLoss(1*REAGENTS_EFFECT_MULTIPLIER) C.adjustToxLoss(1 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
C.hal_screwyhud = SCREWYHUD_HEALTHY //fully healed, honest 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/trueabsorbs = 0//dna gained using absorb, not dna sting
var/chem_charges = 20 var/chem_charges = 20
var/chem_storage = 75 var/chem_storage = 75
var/chem_recharge_rate = 1 var/chem_recharge_rate = 0.5
var/chem_recharge_slowdown = 0 var/chem_recharge_slowdown = 0
var/sting_range = 2 var/sting_range = 2
var/geneticdamage = 0 var/geneticdamage = 0
@@ -209,15 +209,15 @@
return FALSE return FALSE
//Called in life() //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 var/mob/living/carbon/the_ling = owner.current
if(istype(the_ling)) if(istype(the_ling))
if(the_ling.stat == DEAD) if(the_ling.stat == DEAD)
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), (chem_storage*0.5)) chem_charges = min(max(0, chem_charges + ((chem_recharge_rate - chem_recharge_slowdown) * delta_time)), (chem_storage * 0.5))
geneticdamage = max(LING_DEAD_GENETICDAMAGE_HEAL_CAP,geneticdamage-1) geneticdamage = max(geneticdamage - (0.5 * delta_time), LING_DEAD_GENETICDAMAGE_HEAL_CAP)
else //not dead? no chem/geneticdamage caps. else //not dead? no chem/geneticdamage caps.
chem_charges = min(max(0, chem_charges + chem_recharge_rate - chem_recharge_slowdown), chem_storage) chem_charges = min(max(0, chem_charges + ((chem_recharge_rate - chem_recharge_slowdown) * delta_time)), chem_storage)
geneticdamage = max(0, geneticdamage-1) geneticdamage = max(geneticdamage - (0.5 * delta_time), 0)
/datum/antagonist/changeling/proc/get_dna(dna_owner) /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) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(changeling.mimicing) if(changeling.mimicing)
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>") to_chat(user, "<span class='notice'>We return our vocal glands to their original position.</span>")
return return
@@ -21,7 +21,7 @@
return return
..() ..()
changeling.mimicing = mimic_voice 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'>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>") 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 return TRUE

View File

@@ -465,7 +465,7 @@
helmet_type = /obj/item/clothing/head/helmet/space/changeling helmet_type = /obj/item/clothing/head/helmet/space/changeling
suit_name_simple = "flesh shell" suit_name_simple = "flesh shell"
helmet_name_simple = "space helmet" helmet_name_simple = "space helmet"
recharge_slowdown = 0.5 recharge_slowdown = 0.25
blood_on_castoff = 1 blood_on_castoff = 1
/obj/item/clothing/suit/space/changeling /obj/item/clothing/suit/space/changeling
@@ -520,7 +520,7 @@
chemical_cost = 20 chemical_cost = 20
dna_cost = 1 dna_cost = 1
req_human = 1 req_human = 1
recharge_slowdown = 0.25 recharge_slowdown = 0.125
suit_type = /obj/item/clothing/suit/armor/changeling suit_type = /obj/item/clothing/suit/armor/changeling
helmet_type = /obj/item/clothing/head/helmet/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) var/datum/antagonist/changeling/changeling = user.mind.has_antag_datum(/datum/antagonist/changeling)
if(!receptors_active) if(!receptors_active)
to_chat(user, "<span class='warning'>We search for the scent of any nearby changelings.</span>") 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) user.apply_status_effect(/datum/status_effect/agent_pinpointer/changeling)
else else
to_chat(user, "<span class='notice'>We stop searching for now.</span>") 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) user.remove_status_effect(/datum/status_effect/agent_pinpointer/changeling)
receptors_active = !receptors_active 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. /// 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. /// A special flag value used to make a nightmare heart not grant a light eater. Appears to be unused.
#define HEART_SPECIAL_SHADOWIFY 2 #define HEART_SPECIAL_SHADOWIFY 2
@@ -73,14 +73,14 @@
/obj/item/organ/heart/nightmare/Stop() /obj/item/organ/heart/nightmare/Stop()
return 0 return 0
/obj/item/organ/heart/nightmare/on_death() /obj/item/organ/heart/nightmare/on_death(delta_time, times_fired)
if(!owner) if(!owner)
return return
var/turf/T = get_turf(owner) var/turf/T = get_turf(owner)
if(istype(T)) if(istype(T))
var/light_amount = T.get_lumcount() var/light_amount = T.get_lumcount()
if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD) if(light_amount < SHADOW_SPECIES_LIGHT_THRESHOLD)
respawn_progress++ respawn_progress += delta_time SECONDS
playsound(owner, 'sound/effects/singlebeat.ogg', 40, TRUE) playsound(owner, 'sound/effects/singlebeat.ogg', 40, TRUE)
if(respawn_progress < HEART_RESPAWN_THRESHHOLD) if(respawn_progress < HEART_RESPAWN_THRESHHOLD)
return return

View File

@@ -57,7 +57,7 @@
var/essence = 75 //The resource, and health, of revenants. 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_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_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_accumulated = 0 //How much essence the revenant has stolen
var/essence_excess = 0 //How much stolen essence avilable for unlocks var/essence_excess = 0 //How much stolen essence avilable for unlocks
var/revealed = FALSE //If the revenant can take damage from normal sources. var/revealed = FALSE //If the revenant can take damage from normal sources.
@@ -113,7 +113,7 @@
mind.add_antag_datum(/datum/antagonist/revenant) mind.add_antag_datum(/datum/antagonist/revenant)
//Life, Stat, Hud Updates, and Say //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) if(stasis)
return return
if(revealed && essence <= 0) if(revealed && essence <= 0)
@@ -129,7 +129,7 @@
notransform = FALSE notransform = FALSE
to_chat(src, "<span class='revenboldnotice'>You can move again!</span>") 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 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_action_buttons_icon() //because we update something required by our spells in life, we need to update our buttons
update_spooky_icon() update_spooky_icon()
update_health_hud() update_health_hud()

View File

@@ -1,12 +1,12 @@
/datum/disease/revblight /datum/disease/revblight
name = "Unnatural Wasting" name = "Unnatural Wasting"
max_stages = 5 max_stages = 5
stage_prob = 10 stage_prob = 5
spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS spread_flags = DISEASE_SPREAD_NON_CONTAGIOUS
cure_text = "Holy water or extensive rest." cure_text = "Holy water or extensive rest."
spread_text = "A burst of unholy energy" spread_text = "A burst of unholy energy"
cures = list(/datum/reagent/water/holywater) 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" agent = "Unholy Forces"
viable_mobtypes = list(/mob/living/carbon/human) viable_mobtypes = list(/mob/living/carbon/human)
disease_flags = CURABLE disease_flags = CURABLE
@@ -25,42 +25,42 @@
..() ..()
/datum/disease/revblight/stage_act() /datum/disease/revblight/stage_act(delta_time, times_fired)
. = ..() . = ..()
if(!.) if(!.)
return return
if(!finalstage) 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() cure()
return FALSE 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>") 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.add_confusion(8)
affected_mob.adjustStaminaLoss(20, FALSE) affected_mob.adjustStaminaLoss(20, FALSE)
new /obj/effect/temp_visual/revenant(affected_mob.loc) new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(stagedamage < stage) if(stagedamage < stage)
stagedamage++ 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) new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(prob(45)) if(DT_PROB(25, delta_time))
affected_mob.adjustStaminaLoss(stage, FALSE) affected_mob.adjustStaminaLoss(stage, FALSE)
switch(stage) switch(stage)
if(2) if(2)
if(prob(5)) if(DT_PROB(2.5, delta_time))
affected_mob.emote("pale") affected_mob.emote("pale")
if(3) if(3)
if(prob(10)) if(DT_PROB(5, delta_time))
affected_mob.emote(pick("pale","shiver")) affected_mob.emote(pick("pale","shiver"))
if(4) if(4)
if(prob(15)) if(DT_PROB(7.5, delta_time))
affected_mob.emote(pick("pale","shiver","cries")) affected_mob.emote(pick("pale","shiver","cries"))
if(5) if(5)
if(!finalstage) if(!finalstage)
finalstage = TRUE 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>") 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) new /obj/effect/temp_visual/revenant(affected_mob.loc)
if(affected_mob.dna && affected_mob.dna.species) if(affected_mob.dna && affected_mob.dna.species)
affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953") affected_mob.dna.species.handle_mutant_bodyparts(affected_mob,"#1d2953")

View File

@@ -72,7 +72,7 @@
human.update_spacesuit_hud_icon("0") human.update_spacesuit_hud_icon("0")
// Space Suit temperature regulation and power usage // 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 var/mob/living/carbon/human/user = src.loc
if(!user || !ishuman(user) || !(user.wear_suit == src)) if(!user || !ishuman(user) || !(user.wear_suit == src))
return return
@@ -97,7 +97,7 @@
// If we got here, it means thermals are on, the cell is in and the cell has // 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 // 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) update_hud_icon(user)
// Clean up the cell on destroy // 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_verb_simple = "smash"
attack_sound = 'sound/effects/supermatter.ogg' 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) 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 robust_searching = 1
stat_attack = HARD_CRIT stat_attack = HARD_CRIT
faction = list("crystal") 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) if(!hallucination)
return return
hallucination = max(hallucination - 1, 0) hallucination = max(hallucination - (0.5 * delta_time), 0)
if(world.time < next_hallucination) if(world.time < next_hallucination)
return return

View File

@@ -64,7 +64,7 @@
owner.revive(full_heal = TRUE, admin_revive = FALSE) owner.revive(full_heal = TRUE, admin_revive = FALSE)
qdel(src) 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) if(owner.health <= owner.crit_threshold)
ui_action_click() ui_action_click()

View File

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

View File

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

View File

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

View File

@@ -1,37 +1,40 @@
/mob/living/brain/Life() /mob/living/brain/Life(delta_time = SSMOBS_DT, times_fired)
if (notransform) if (notransform)
return return
if(!loc) if(!loc)
return return
. = ..() . = ..()
handle_emp_damage() handle_emp_damage(delta_time, times_fired)
/mob/living/brain/update_stat() /mob/living/brain/update_stat()
if(status_flags & GODMODE) if(status_flags & GODMODE)
return return
if(health <= HEALTH_THRESHOLD_DEAD) if(health > HEALTH_THRESHOLD_DEAD)
if(stat != DEAD) return
death() if(stat != DEAD)
var/obj/item/organ/brain/BR death()
if(container?.brain) var/obj/item/organ/brain/BR
BR = container.brain if(container?.brain)
else if(istype(loc, /obj/item/organ/brain)) BR = container.brain
BR = loc else if(istype(loc, /obj/item/organ/brain))
if(BR) BR = loc
BR.damage = BRAIN_DAMAGE_DEATH //beaten to a pulp if(BR)
BR.damage = BRAIN_DAMAGE_DEATH //beaten to a pulp
/mob/living/brain/proc/handle_emp_damage() /mob/living/brain/proc/handle_emp_damage(delta_time, times_fired)
if(emp_damage) if(!emp_damage)
if(stat == DEAD) return
emp_damage = 0
else
emp_damage = max(emp_damage-1, 0)
/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 return
/mob/living/brain/handle_traits() /mob/living/brain/handle_traits(delta_time, times_fired)
return 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 /mob/living/carbon/alien/assess_threat(judgement_criteria, lasercolor = "", datum/callback/weaponcheck=null) // beepsky won't hunt aliums
return -10 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 // Run base mob body temperature proc before taking damage
// this balances body temp to the environment and natural stabilization // this balances body temp to the environment and natural stabilization
. = ..() . = ..()
@@ -58,19 +58,19 @@
throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire) throw_alert("alien_fire", /atom/movable/screen/alert/alien_fire)
switch(bodytemperature) switch(bodytemperature)
if(360 to 400) if(360 to 400)
apply_damage(HEAT_DAMAGE_LEVEL_1, BURN) apply_damage(HEAT_DAMAGE_LEVEL_1 * delta_time, BURN)
if(400 to 460) 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(460 to INFINITY)
if(on_fire) if(on_fire)
apply_damage(HEAT_DAMAGE_LEVEL_3, BURN) apply_damage(HEAT_DAMAGE_LEVEL_3 * delta_time, BURN)
else else
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN) apply_damage(HEAT_DAMAGE_LEVEL_2 * delta_time, BURN)
else else
clear_alert("alien_fire") clear_alert("alien_fire")
/mob/living/carbon/alien/reagent_check(datum/reagent/R) //can metabolize all reagents /mob/living/carbon/alien/reagent_check(datum/reagent/R, delta_time, times_fired) //can metabolize all reagents
return 0 return FALSE
/mob/living/carbon/alien/get_status_tab_items() /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) if (notransform)
return return
if(..() && !IS_IN_STASIS(src)) //not dead and not in stasis if(!..() || IS_IN_STASIS(src) || (amount_grown >= max_grown))
// GROW! return // We're dead, in stasis, or already grown.
if(amount_grown < max_grown) // GROW!
amount_grown++ amount_grown = min(amount_grown + (0.5 * delta_time), max_grown)
update_icons() update_icons()
/mob/living/carbon/alien/larva/update_stat() /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() findQueen()
return..() return..()
@@ -38,17 +38,17 @@
//BREATH TEMPERATURE //BREATH TEMPERATURE
handle_breath_temperature(breath) 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. //natural reduction of movement delay due to stun.
if(move_delay_add > 0) 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() /mob/living/carbon/alien/handle_changeling()
return 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 if(.) //if the mob isn't on fire anymore
return 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) 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) food_reagents = list(/datum/reagent/consumable/nutriment = 5, /datum/reagent/toxin/plasma = 10)
/// The current amount of stored plasma.
var/storedPlasma = 100 var/storedPlasma = 100
/// The maximum plasma this organ can store.
var/max_plasma = 250 var/max_plasma = 250
var/heal_rate = 5 /// The rate this organ regenerates its owners health at per damage type per second.
var/plasma_rate = 10 var/heal_rate = 2.5
/// The rate this organ regenerates plasma at per second.
var/plasma_rate = 5
/obj/item/organ/alien/plasmavessel/large /obj/item/organ/alien/plasmavessel/large
name = "large plasma vessel" name = "large plasma vessel"
@@ -46,10 +50,10 @@
w_class = WEIGHT_CLASS_BULKY w_class = WEIGHT_CLASS_BULKY
storedPlasma = 200 storedPlasma = 200
max_plasma = 500 max_plasma = 500
plasma_rate = 15 plasma_rate = 7.5
/obj/item/organ/alien/plasmavessel/large/queen /obj/item/organ/alien/plasmavessel/large/queen
plasma_rate = 20 plasma_rate = 10
/obj/item/organ/alien/plasmavessel/small /obj/item/organ/alien/plasmavessel/small
name = "small plasma vessel" name = "small plasma vessel"
@@ -57,7 +61,7 @@
w_class = WEIGHT_CLASS_SMALL w_class = WEIGHT_CLASS_SMALL
storedPlasma = 100 storedPlasma = 100
max_plasma = 150 max_plasma = 150
plasma_rate = 5 plasma_rate = 2.5
/obj/item/organ/alien/plasmavessel/small/tiny /obj/item/organ/alien/plasmavessel/small/tiny
name = "tiny plasma vessel" name = "tiny plasma vessel"
@@ -66,22 +70,22 @@
max_plasma = 100 max_plasma = 100
alien_powers = list(/obj/effect/proc_holder/alien/transfer) 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 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(locate(/obj/structure/alien/weeds) in owner.loc)
if(owner.health >= owner.maxHealth) if(owner.health >= owner.maxHealth)
owner.adjustPlasma(plasma_rate) owner.adjustPlasma(plasma_rate * delta_time)
else else
var/heal_amt = heal_rate var/heal_amt = heal_rate
if(!isalien(owner)) if(!isalien(owner))
heal_amt *= 0.2 heal_amt *= 0.2
owner.adjustPlasma(plasma_rate*0.5) owner.adjustPlasma(0.5 * plasma_rate * delta_time)
owner.adjustBruteLoss(-heal_amt) owner.adjustBruteLoss(-heal_amt * delta_time)
owner.adjustFireLoss(-heal_amt) owner.adjustFireLoss(-heal_amt * delta_time)
owner.adjustOxyLoss(-heal_amt) owner.adjustOxyLoss(-heal_amt * delta_time)
owner.adjustCloneLoss(-heal_amt) owner.adjustCloneLoss(-heal_amt * delta_time)
else 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) /obj/item/organ/alien/plasmavessel/Insert(mob/living/carbon/M, special = 0)
..() ..()

View File

@@ -25,34 +25,34 @@
if(prob(10)) if(prob(10))
AttemptGrow(0) 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) switch(stage)
if(3, 4) if(3, 4)
if(prob(2)) if(DT_PROB(1, delta_time))
owner.emote("sneeze") owner.emote("sneeze")
if(prob(2)) if(DT_PROB(1, delta_time))
owner.emote("cough") owner.emote("cough")
if(prob(2)) if(DT_PROB(1, delta_time))
to_chat(owner, "<span class='danger'>Your throat feels sore.</span>") 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>") to_chat(owner, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(5) if(5)
if(prob(2)) if(DT_PROB(1, delta_time))
owner.emote("sneeze") owner.emote("sneeze")
if(prob(2)) if(DT_PROB(1, delta_time))
owner.emote("cough") owner.emote("cough")
if(prob(4)) if(DT_PROB(2, delta_time))
to_chat(owner, "<span class='danger'>Your muscles ache.</span>") to_chat(owner, "<span class='danger'>Your muscles ache.</span>")
if(prob(20)) if(prob(20))
owner.take_bodypart_damage(1) owner.take_bodypart_damage(1)
if(prob(4)) if(DT_PROB(2, delta_time))
to_chat(owner, "<span class='danger'>Your stomach hurts.</span>") to_chat(owner, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20)) if(prob(20))
owner.adjustToxLoss(1) owner.adjustToxLoss(1)
if(6) if(6)
to_chat(owner, "<span class='danger'>You feel something tearing its way out of your chest...</span>") 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. /// 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() /obj/item/organ/body_egg/alien_embryo/proc/advance_embryo_stage()
@@ -62,7 +62,6 @@
INVOKE_ASYNC(src, .proc/RefreshInfectionImage) INVOKE_ASYNC(src, .proc/RefreshInfectionImage)
addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time) addtimer(CALLBACK(src, .proc/advance_embryo_stage), growth_time)
/obj/item/organ/body_egg/alien_embryo/egg_process() /obj/item/organ/body_egg/alien_embryo/egg_process()
if(stage == 6 && prob(50)) if(stage == 6 && prob(50))
for(var/datum/surgery/S in owner.surgeries) for(var/datum/surgery/S in owner.surgeries)

View File

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

View File

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

View File

@@ -67,7 +67,7 @@
if(relic_mask) if(relic_mask)
equip_to_slot_or_del(new relic_mask, ITEM_SLOT_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) if(!stat && SSticker.current_state == GAME_STATE_FINISHED && !memory_saved)
Write_Memory(FALSE, FALSE) Write_Memory(FALSE, FALSE)
memory_saved = TRUE memory_saved = TRUE

View File

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

View File

@@ -48,7 +48,7 @@
H.regenerate_limb(BODY_ZONE_HEAD,FALSE) 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)) if(QDELETED(myhead))
myhead = null myhead = null
H.gib() H.gib()

View File

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

View File

@@ -21,10 +21,10 @@
mutantappendix = /obj/item/organ/appendix/fly mutantappendix = /obj/item/organ/appendix/fly
mutant_organs = list(/obj/item/organ/fly, /obj/item/organ/fly/groin) 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) if(chem.type == /datum/reagent/toxin/pestkiller)
H.adjustToxLoss(3) H.adjustToxLoss(3 * REAGENTS_EFFECT_MULTIPLIER * delta_time)
H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM) H.reagents.remove_reagent(chem.type, REAGENTS_METABOLISM * delta_time)
return TRUE return TRUE
..() ..()
@@ -70,7 +70,7 @@
name = odd_organ_name() 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") 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) if(locate(/datum/reagent/consumable) in reagents.reagent_list)
var/mob/living/carbon/body = owner var/mob/living/carbon/body = owner
// we do not loss any nutrition as a fly when vomiting out food // we do not loss any nutrition as a fly when vomiting out food

View File

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

View File

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

View File

@@ -33,7 +33,7 @@
ass_image = 'icons/ass/asslizard.png' ass_image = 'icons/ass/asslizard.png'
/// Lizards are cold blooded and do not stabilize body temperature naturally /// 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 return
/datum/species/lizard/random_name(gender,unique,lastname) /datum/species/lizard/random_name(gender,unique,lastname)

View File

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

View File

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