Merge branch 'pr/14'
This commit is contained in:
@@ -28,7 +28,7 @@
|
||||
if(job_engsec_high)
|
||||
switch(job_engsec_high)
|
||||
if(AI_JF)
|
||||
parent.show_character_previews(image('icons/mob/ai.dmi', icon_state = "AI", dir = SOUTH))
|
||||
parent.show_character_previews(image('icons/mob/ai.dmi', resolve_ai_icon(preferred_ai_core_display), dir = SOUTH))
|
||||
return
|
||||
if(CYBORG)
|
||||
parent.show_character_previews(image('icons/mob/robots.dmi', icon_state = "robot", dir = SOUTH))
|
||||
|
||||
@@ -439,6 +439,10 @@
|
||||
name = "Tress Shoulder"
|
||||
icon_state = "hair_tressshoulder"
|
||||
|
||||
/datum/sprite_accessory/hair/longtwintails
|
||||
name = "Twintails (Long)"
|
||||
icon_state = "hair_longstraighttwintails"
|
||||
|
||||
/datum/sprite_accessory/hair/updo
|
||||
name = "Updo"
|
||||
icon_state = "hair_updo"
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/handle_blood()
|
||||
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio))
|
||||
blood_volume += 0.1 // regenerate blood VERY slowly
|
||||
@@ -30,10 +30,10 @@
|
||||
bleed_rate = 0
|
||||
return
|
||||
|
||||
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
if(bodytemperature >= TCRYO && !(HAS_TRAIT(src, TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !has_trait(TRAIT_NOHUNGER))
|
||||
if(blood_volume < (BLOOD_VOLUME_NORMAL * blood_ratio) && !HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
var/nutrition_ratio = 0
|
||||
switch(nutrition)
|
||||
if(0 to NUTRITION_LEVEL_STARVING)
|
||||
@@ -71,7 +71,7 @@
|
||||
Unconscious(rand(20,60))
|
||||
to_chat(src, "<span class='warning'>You feel extremely [word].</span>")
|
||||
if(-INFINITY to BLOOD_VOLUME_SURVIVE)
|
||||
if(!has_trait(TRAIT_NODEATH))
|
||||
if(!HAS_TRAIT(src, TRAIT_NODEATH))
|
||||
death()
|
||||
|
||||
var/temp_bleed = 0
|
||||
@@ -89,7 +89,7 @@
|
||||
|
||||
bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
|
||||
|
||||
if(bleed_rate && !bleedsuppress && !(has_trait(TRAIT_FAKEDEATH)))
|
||||
if(bleed_rate && !bleedsuppress && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
bleed(bleed_rate)
|
||||
|
||||
//Makes a blood drop, leaking amt units of blood from the mob
|
||||
@@ -231,13 +231,13 @@
|
||||
return "blood"
|
||||
|
||||
/mob/living/carbon/monkey/get_blood_id()
|
||||
if(!(has_trait(TRAIT_NOCLONE)))
|
||||
if(!(HAS_TRAIT(src, TRAIT_NOCLONE)))
|
||||
return "blood"
|
||||
|
||||
/mob/living/carbon/human/get_blood_id()
|
||||
if(dna.species.exotic_blood)
|
||||
return dna.species.exotic_blood
|
||||
else if((NOBLOOD in dna.species.species_traits) || (has_trait(TRAIT_NOCLONE)))
|
||||
else if((NOBLOOD in dna.species.species_traits) || (HAS_TRAIT(src, TRAIT_NOCLONE)))
|
||||
return
|
||||
return "blood"
|
||||
|
||||
|
||||
@@ -21,7 +21,7 @@
|
||||
name = "brain"
|
||||
|
||||
if(C.mind && C.mind.has_antag_datum(/datum/antagonist/changeling) && !no_id_transfer) //congrats, you're trapped in a body you don't control
|
||||
if(brainmob && !(C.stat == DEAD || (C.has_trait(TRAIT_DEATHCOMA))))
|
||||
if(brainmob && !(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_DEATHCOMA))))
|
||||
to_chat(brainmob, "<span class = danger>You can't feel your body! You're still just a brain!</span>")
|
||||
forceMove(C)
|
||||
C.update_hair()
|
||||
@@ -64,7 +64,7 @@
|
||||
name = "[L.name]'s brain"
|
||||
if(brainmob)
|
||||
return
|
||||
|
||||
|
||||
if(!L.mind)
|
||||
return
|
||||
brainmob = new(src)
|
||||
@@ -76,7 +76,7 @@
|
||||
if(!brainmob.stored_dna)
|
||||
brainmob.stored_dna = new /datum/dna/stored(brainmob)
|
||||
C.dna.copy_dna(brainmob.stored_dna)
|
||||
if(L.has_trait(TRAIT_NOCLONE))
|
||||
if(HAS_TRAIT(L, TRAIT_NOCLONE))
|
||||
brainmob.status_traits[TRAIT_NOCLONE] = L.status_traits[TRAIT_NOCLONE]
|
||||
var/obj/item/organ/zombie_infection/ZI = L.getorganslot(ORGAN_SLOT_ZOMBIE)
|
||||
if(ZI)
|
||||
|
||||
@@ -105,7 +105,7 @@ Des: Gives the client of the alien an image on each infected mob.
|
||||
if (client)
|
||||
for (var/i in GLOB.mob_living_list)
|
||||
var/mob/living/L = i
|
||||
if(L.has_trait(TRAIT_XENO_HOST))
|
||||
if(HAS_TRAIT(L, TRAIT_XENO_HOST))
|
||||
var/obj/item/organ/body_egg/alien_embryo/A = L.getorgan(/obj/item/organ/body_egg/alien_embryo)
|
||||
if(A)
|
||||
var/I = image('icons/mob/alien.dmi', loc = L, icon_state = "infected[A.stage]")
|
||||
|
||||
@@ -18,7 +18,7 @@
|
||||
if(health<= -maxHealth || !getorgan(/obj/item/organ/brain))
|
||||
death()
|
||||
return
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (has_trait(TRAIT_DEATHCOMA)) || health <= crit_threshold)
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || health <= crit_threshold)
|
||||
if(stat == CONSCIOUS)
|
||||
stat = UNCONSCIOUS
|
||||
blind_eyes(1)
|
||||
|
||||
@@ -15,25 +15,23 @@
|
||||
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
|
||||
var/list/breath_gases = breath.gases
|
||||
|
||||
breath.assert_gases(/datum/gas/plasma, /datum/gas/oxygen)
|
||||
|
||||
//Partial pressure of the toxins in our breath
|
||||
var/Toxins_pp = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_pp = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
|
||||
|
||||
if(Toxins_pp > tox_detect_threshold) // Detect toxins in air
|
||||
adjustPlasma(breath_gases[/datum/gas/plasma][MOLES]*250)
|
||||
adjustPlasma(breath_gases[/datum/gas/plasma]*250)
|
||||
throw_alert("alien_tox", /obj/screen/alert/alien_tox)
|
||||
|
||||
toxins_used = breath_gases[/datum/gas/plasma][MOLES]
|
||||
toxins_used = breath_gases[/datum/gas/plasma]
|
||||
|
||||
else
|
||||
clear_alert("alien_tox")
|
||||
|
||||
//Breathe in toxins and out oxygen
|
||||
breath_gases[/datum/gas/plasma][MOLES] -= toxins_used
|
||||
breath_gases[/datum/gas/oxygen][MOLES] += toxins_used
|
||||
breath_gases[/datum/gas/plasma] -= toxins_used
|
||||
breath_gases[/datum/gas/oxygen] += toxins_used
|
||||
|
||||
breath.garbage_collect()
|
||||
GAS_GARBAGE_COLLECT(breath.gases)
|
||||
|
||||
//BREATH TEMPERATURE
|
||||
handle_breath_temperature(breath)
|
||||
|
||||
@@ -168,7 +168,7 @@
|
||||
if(!throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
stop_pulling()
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
adjustStaminaLossBuffered(25)//CIT CHANGE - throwing an entire person shall be very tiring
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
@@ -180,7 +180,7 @@
|
||||
thrown_thing = I
|
||||
dropItemToGround(I)
|
||||
|
||||
if(has_trait(TRAIT_PACIFISM) && I.throwforce)
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM) && I.throwforce)
|
||||
to_chat(src, "<span class='notice'>You set [I] down gently on the ground.</span>")
|
||||
return
|
||||
|
||||
@@ -417,7 +417,7 @@
|
||||
|
||||
var/modifier = 0
|
||||
|
||||
if(has_trait(TRAIT_CLUMSY))
|
||||
if(HAS_TRAIT(src, TRAIT_CLUMSY))
|
||||
modifier -= 40 //Clumsy people are more likely to hit themselves -Honk!
|
||||
|
||||
//CIT CHANGES START HERE
|
||||
@@ -463,7 +463,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/proc/vomit(lost_nutrition = 10, blood = FALSE, stun = TRUE, distance = 1, message = TRUE, toxic = FALSE)
|
||||
if(has_trait(TRAIT_NOHUNGER))
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
return 1
|
||||
|
||||
if(nutrition < 100 && !blood)
|
||||
@@ -762,14 +762,14 @@
|
||||
if(status_flags & GODMODE)
|
||||
return
|
||||
if(stat != DEAD)
|
||||
if(health <= HEALTH_THRESHOLD_DEAD && !has_trait(TRAIT_NODEATH))
|
||||
if(health <= HEALTH_THRESHOLD_DEAD && !HAS_TRAIT(src, TRAIT_NODEATH))
|
||||
death()
|
||||
return
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (has_trait(TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !has_trait(TRAIT_NOHARDCRIT)))
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (HAS_TRAIT(src, TRAIT_DEATHCOMA)) || (health <= HEALTH_THRESHOLD_FULLCRIT && !HAS_TRAIT(src, TRAIT_NOHARDCRIT)))
|
||||
stat = UNCONSCIOUS
|
||||
blind_eyes(1)
|
||||
else
|
||||
if(health <= crit_threshold && !has_trait(TRAIT_NOSOFTCRIT))
|
||||
if(health <= crit_threshold && !HAS_TRAIT(src, TRAIT_NOSOFTCRIT))
|
||||
stat = SOFT_CRIT
|
||||
else
|
||||
stat = CONSCIOUS
|
||||
|
||||
@@ -224,7 +224,7 @@
|
||||
/mob/living/carbon/electrocute_act(shock_damage, obj/source, siemens_coeff = 1, safety = 0, override = 0, tesla_shock = 0, illusion = 0, stun = TRUE)
|
||||
if(tesla_shock && (flags_1 & TESLA_IGNORE_1))
|
||||
return FALSE
|
||||
if(has_trait(TRAIT_SHOCKIMMUNE))
|
||||
if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
|
||||
return FALSE
|
||||
shock_damage *= siemens_coeff
|
||||
if(dna && dna.species)
|
||||
@@ -261,7 +261,7 @@
|
||||
to_chat(M, "<span class='warning'>You can't put [p_them()] out with just your bare hands!</span>")
|
||||
return
|
||||
|
||||
if(health >= 0 && !(has_trait(TRAIT_FAKEDEATH)))
|
||||
if(health >= 0 && !(HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
|
||||
if(lying)
|
||||
if(buckled)
|
||||
@@ -277,6 +277,12 @@
|
||||
M.visible_message("<span class='notice'>[M] gives [H] a pat on the head to make [p_them()] feel better!</span>", \
|
||||
"<span class='notice'>You give [H] a pat on the head to make [p_them()] feel better!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "headpat", /datum/mood_event/headpat)
|
||||
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
|
||||
if (mood.sanity >= SANITY_GREAT)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
|
||||
else if (mood.sanity >= SANITY_DISTURBED)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/betterhug, M)
|
||||
if(H.dna.species.can_wag_tail(H))
|
||||
if("tail_human" in pref_species.default_features)
|
||||
if(H.dna.features["tail_human"] == "None")
|
||||
@@ -306,6 +312,12 @@
|
||||
M.visible_message("<span class='notice'>[M] hugs [src] to make [p_them()] feel better!</span>", \
|
||||
"<span class='notice'>You hug [src] to make [p_them()] feel better!</span>")
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "hug", /datum/mood_event/hug)
|
||||
if(HAS_TRAIT(M, TRAIT_FRIENDLY))
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, M)
|
||||
if (mood.sanity >= SANITY_GREAT)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/besthug, M)
|
||||
else if (mood.sanity >= SANITY_DISTURBED)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "friendly_hug", /datum/mood_event/betterhug, M)
|
||||
|
||||
AdjustStun(-60)
|
||||
AdjustKnockdown(-60)
|
||||
@@ -350,12 +362,12 @@
|
||||
|
||||
if(eyes.eye_damage > 20)
|
||||
if(prob(eyes.eye_damage - 20))
|
||||
if(!has_trait(TRAIT_NEARSIGHT))
|
||||
if(!HAS_TRAIT(src, TRAIT_NEARSIGHT))
|
||||
to_chat(src, "<span class='warning'>Your eyes start to burn badly!</span>")
|
||||
become_nearsighted(EYE_DAMAGE)
|
||||
|
||||
else if(prob(eyes.eye_damage - 25))
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
if(!HAS_TRAIT(src, TRAIT_BLIND))
|
||||
to_chat(src, "<span class='warning'>You can't see anything!</span>")
|
||||
become_blind(EYE_DAMAGE)
|
||||
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
/mob/living/carbon/Move(NewLoc, direct)
|
||||
. = ..()
|
||||
if(. && mob_has_gravity()) //floating is easy
|
||||
if(has_trait(TRAIT_NOHUNGER))
|
||||
if(HAS_TRAIT(src, TRAIT_NOHUNGER))
|
||||
nutrition = NUTRITION_LEVEL_FED - 1 //just less than feeling vigorous
|
||||
else if(nutrition && stat != DEAD)
|
||||
nutrition -= HUNGER_FACTOR/10
|
||||
|
||||
@@ -83,7 +83,7 @@
|
||||
return amount
|
||||
|
||||
/mob/living/carbon/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE)
|
||||
if(!forced && has_trait(TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
|
||||
if(!forced && HAS_TRAIT(src, TRAIT_TOXINLOVER)) //damage becomes healing and healing becomes damage
|
||||
amount = -amount
|
||||
if(amount > 0)
|
||||
blood_volume -= 5*amount
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
else
|
||||
msg += "<b>[t_He] [t_is] severely deformed!</b>\n"
|
||||
|
||||
if(has_trait(TRAIT_DUMB))
|
||||
if(HAS_TRAIT(src, TRAIT_DUMB))
|
||||
msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n"
|
||||
|
||||
if(fire_stacks > 0)
|
||||
@@ -88,7 +88,7 @@
|
||||
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly unsimian manner.\n"
|
||||
|
||||
|
||||
if(combatmode)
|
||||
msg += "[t_He] [t_is] visibly tense[resting ? "." : ", and [t_is] standing in combative stance."]\n"
|
||||
|
||||
|
||||
@@ -42,13 +42,13 @@
|
||||
INVOKE_ASYNC(is_devil(src), /datum/antagonist/devil.proc/beginResurrectionCheck, src)
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
add_trait(TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
set_species(/datum/species/skeleton)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/proc/Drain()
|
||||
become_husk(CHANGELING_DRAIN)
|
||||
add_trait(TRAIT_NOCLONE, CHANGELING_DRAIN)
|
||||
ADD_TRAIT(src, TRAIT_NOCLONE, CHANGELING_DRAIN)
|
||||
blood_volume = 0
|
||||
return 1
|
||||
|
||||
@@ -10,7 +10,7 @@
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(L.has_trait(TRAIT_PROSOPAGNOSIA))
|
||||
if(HAS_TRAIT(L, TRAIT_PROSOPAGNOSIA))
|
||||
obscure_name = TRUE
|
||||
|
||||
var/msg = "<span class='info'>*---------*\nThis is <EM>[!obscure_name ? name : "Unknown"]</EM>!\n"
|
||||
@@ -93,7 +93,7 @@
|
||||
if(!(SLOT_GLASSES in obscured))
|
||||
if(glasses)
|
||||
msg += "[t_He] [t_has] [glasses.get_examine_string(user)] covering [t_his] eyes.\n"
|
||||
else if(eye_color == BLOODCULT_EYE && iscultist(src) && has_trait(CULT_EYES))
|
||||
else if(eye_color == BLOODCULT_EYE && iscultist(src) && HAS_TRAIT(src, TRAIT_CULT_EYES))
|
||||
msg += "<span class='warning'><B>[t_His] eyes are glowing an unnatural red!</B></span>\n"
|
||||
|
||||
//ears
|
||||
@@ -126,7 +126,7 @@
|
||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
||||
|
||||
var/appears_dead = 0
|
||||
if(stat == DEAD || (has_trait(TRAIT_FAKEDEATH)))
|
||||
if(stat == DEAD || (HAS_TRAIT(src, TRAIT_FAKEDEATH)))
|
||||
appears_dead = 1
|
||||
if(suiciding)
|
||||
msg += "<span class='warning'>[t_He] appear[p_s()] to have committed suicide... there is no hope of recovery.</span>\n"
|
||||
@@ -281,13 +281,34 @@
|
||||
if(91.01 to INFINITY)
|
||||
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
|
||||
|
||||
if(isliving(user))
|
||||
var/mob/living/L = user
|
||||
if(src != user && HAS_TRAIT(L, TRAIT_EMPATH) && !appears_dead)
|
||||
if (a_intent != INTENT_HELP)
|
||||
msg += "[t_He] seem[p_s()] to be on guard.\n"
|
||||
if (getOxyLoss() >= 10)
|
||||
msg += "[t_He] seem[p_s()] winded.\n"
|
||||
if (getToxLoss() >= 10)
|
||||
msg += "[t_He] seem[p_s()] sickly.\n"
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, src)
|
||||
if(mood.sanity <= SANITY_DISTURBED)
|
||||
msg += "[t_He] seem[p_s()] distressed.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empath", /datum/mood_event/sad_empath, src)
|
||||
if(mood.mood >= 5) //So roundstart people aren't all "happy"
|
||||
msg += "[t_He] seem[p_s()] to have had something nice happen to them recently.\n"
|
||||
SEND_SIGNAL(user, COMSIG_ADD_MOOD_EVENT, "empathH", /datum/mood_event/happy_empath, src)
|
||||
if (HAS_TRAIT(src, TRAIT_BLIND))
|
||||
msg += "[t_He] appear[p_s()] to be staring off into space.\n"
|
||||
if (HAS_TRAIT(src, TRAIT_DEAF))
|
||||
msg += "[t_He] appear[p_s()] to not be responding to noises.\n"
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
if(!appears_dead)
|
||||
if(stat == UNCONSCIOUS)
|
||||
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seem[p_s()] to be asleep.\n"
|
||||
else
|
||||
if(has_trait(TRAIT_DUMB))
|
||||
if(HAS_TRAIT(src, TRAIT_DUMB))
|
||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||
if(InCritical())
|
||||
msg += "[t_He] [t_is] barely conscious.\n"
|
||||
|
||||
@@ -499,7 +499,7 @@
|
||||
. = 1 // Default to returning true.
|
||||
if(user && !target_zone)
|
||||
target_zone = user.zone_selected
|
||||
if(has_trait(TRAIT_PIERCEIMMUNE) && !bypass_immunity)
|
||||
if(HAS_TRAIT(src, TRAIT_PIERCEIMMUNE) && !bypass_immunity)
|
||||
. = 0
|
||||
// If targeting the head, see if the head item is thin enough.
|
||||
// If targeting anything else, see if the wear suit is thin enough.
|
||||
@@ -604,7 +604,7 @@
|
||||
threatcount += 4 //fuk u antags <3 //no you
|
||||
|
||||
//mindshield implants imply trustworthyness
|
||||
if(has_trait(TRAIT_MINDSHIELD))
|
||||
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
|
||||
threatcount -= 1
|
||||
|
||||
//Agent cards lower threatlevel.
|
||||
@@ -640,7 +640,7 @@
|
||||
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C)
|
||||
CHECK_DNA_AND_SPECIES(C)
|
||||
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
to_chat(src, "<span class='warning'>[C.name] is dead!</span>")
|
||||
return
|
||||
if(is_mouth_covered())
|
||||
@@ -657,7 +657,7 @@
|
||||
to_chat(src, "<span class='warning'>You fail to perform CPR on [C]!</span>")
|
||||
return 0
|
||||
|
||||
var/they_breathe = !C.has_trait(TRAIT_NOBREATH)
|
||||
var/they_breathe = !HAS_TRAIT(C, TRAIT_NOBREATH)
|
||||
var/they_lung = C.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
|
||||
if(C.health > C.crit_threshold)
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
else if(I)
|
||||
if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
|
||||
if(can_embed(I))
|
||||
if(prob(I.embedding.embed_chance) && !has_trait(TRAIT_PIERCEIMMUNE))
|
||||
if(prob(I.embedding.embed_chance) && !HAS_TRAIT(src, TRAIT_PIERCEIMMUNE))
|
||||
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
|
||||
var/obj/item/bodypart/L = pick(bodyparts)
|
||||
L.embedded_objects |= I
|
||||
@@ -153,7 +153,7 @@
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/grabbedby(mob/living/carbon/user, supress_message = 0)
|
||||
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (has_trait(TRAIT_FAT)) && ismonkey(pulling))
|
||||
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (HAS_TRAIT(src, TRAIT_FAT)) && ismonkey(pulling))
|
||||
devour_mob(pulling)
|
||||
else
|
||||
..()
|
||||
@@ -256,7 +256,7 @@
|
||||
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(M.zone_selected))
|
||||
if(!affecting)
|
||||
affecting = get_bodypart(BODY_ZONE_CHEST)
|
||||
var/armor_block = run_armor_check(affecting, "melee","","",10)
|
||||
var/armor_block = run_armor_check(affecting, "melee", null, null,10)
|
||||
|
||||
playsound(loc, 'sound/weapons/slice.ogg', 25, 1, -1)
|
||||
visible_message("<span class='danger'>[M] has slashed at [src]!</span>", \
|
||||
@@ -614,7 +614,7 @@
|
||||
facial_hair_style = "Shaved"
|
||||
hair_style = "Bald"
|
||||
update_hair()
|
||||
add_trait(TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
ADD_TRAIT(src, TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
|
||||
update_damage_overlays()
|
||||
|
||||
@@ -668,7 +668,7 @@
|
||||
if(prob(30))
|
||||
burndamage += rand(30,40)
|
||||
|
||||
if(has_trait(TRAIT_SELF_AWARE))
|
||||
if(HAS_TRAIT(src, TRAIT_SELF_AWARE))
|
||||
status = "[brutedamage] brute damage and [burndamage] burn damage"
|
||||
if(!brutedamage && !burndamage)
|
||||
status = "no damage"
|
||||
@@ -695,7 +695,7 @@
|
||||
var/no_damage
|
||||
if(status == "OK" || status == "no damage")
|
||||
no_damage = TRUE
|
||||
to_chat(src, "\t <span class='[no_damage ? "notice" : "warning"]'>Your [LB.name] [has_trait(TRAIT_SELF_AWARE) ? "has" : "is"] [status].</span>")
|
||||
to_chat(src, "\t <span class='[no_damage ? "notice" : "warning"]'>Your [LB.name] [HAS_TRAIT(src, TRAIT_SELF_AWARE) ? "has" : "is"] [status].</span>")
|
||||
|
||||
for(var/obj/item/I in LB.embedded_objects)
|
||||
to_chat(src, "\t <a href='?src=[REF(src)];embedded_object=[REF(I)];embedded_limb=[REF(LB)]' class='warning'>There is \a [I] embedded in your [LB.name]!</a>")
|
||||
@@ -710,7 +710,7 @@
|
||||
to_chat(src, "<span class='info'>You're completely exhausted.</span>")
|
||||
else
|
||||
to_chat(src, "<span class='info'>You feel fatigued.</span>")
|
||||
if(has_trait(TRAIT_SELF_AWARE))
|
||||
if(HAS_TRAIT(src, TRAIT_SELF_AWARE))
|
||||
if(toxloss)
|
||||
if(toxloss > 10)
|
||||
to_chat(src, "<span class='danger'>You feel sick.</span>")
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
if( head && (head.flags_inv&HIDEFACE) )
|
||||
return if_no_face //Likewise for hats
|
||||
var/obj/item/bodypart/O = get_bodypart(BODY_ZONE_HEAD)
|
||||
if( !O || (has_trait(TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name || nameless) //disfigured. use id-name if possible
|
||||
if( !O || (HAS_TRAIT(src, TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name || nameless) //disfigured. use id-name if possible
|
||||
return if_no_face
|
||||
return real_name
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/IsAdvancedToolUser()
|
||||
if(has_trait(TRAIT_MONKEYLIKE))
|
||||
if(HAS_TRAIT(src, TRAIT_MONKEYLIKE))
|
||||
return FALSE
|
||||
return TRUE//Humans can use guns and such
|
||||
|
||||
@@ -138,7 +138,7 @@
|
||||
if(src.dna.check_mutation(HULK))
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
return FALSE
|
||||
if(has_trait(TRAIT_NOGUNS))
|
||||
if(HAS_TRAIT(src, TRAIT_NOGUNS))
|
||||
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return FALSE
|
||||
if(mind)
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
/mob/living/carbon/human/get_movespeed_modifiers()
|
||||
var/list/considering = ..()
|
||||
. = considering
|
||||
if(has_trait(TRAIT_IGNORESLOWDOWN))
|
||||
if(HAS_TRAIT(src, TRAIT_IGNORESLOWDOWN))
|
||||
for(var/id in .)
|
||||
var/list/data = .[id]
|
||||
if(data[MOVESPEED_DATA_INDEX_FLAGS] & IGNORE_NOSLOW)
|
||||
@@ -13,10 +13,10 @@
|
||||
. += dna.species.movement_delay(src)
|
||||
|
||||
/mob/living/carbon/human/slip(knockdown_amount, obj/O, lube)
|
||||
if(has_trait(TRAIT_NOSLIPALL))
|
||||
if(HAS_TRAIT(src, TRAIT_NOSLIPALL))
|
||||
return 0
|
||||
if (!(lube&GALOSHES_DONT_HELP))
|
||||
if(has_trait(TRAIT_NOSLIPWATER))
|
||||
if(HAS_TRAIT(src, TRAIT_NOSLIPWATER))
|
||||
return 0
|
||||
if(shoes && istype(shoes, /obj/item/clothing))
|
||||
var/obj/item/clothing/CS = shoes
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
if(G.tint)
|
||||
update_tint()
|
||||
if(G.vision_correction)
|
||||
if(has_trait(TRAIT_NEARSIGHT))
|
||||
if(HAS_TRAIT(src, TRAIT_NEARSIGHT))
|
||||
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
|
||||
adjust_eye_damage(0)
|
||||
if(G.vision_flags || G.darkness_view || G.invis_override || G.invis_view || !isnull(G.lighting_alpha))
|
||||
|
||||
@@ -63,7 +63,7 @@
|
||||
|
||||
/mob/living/carbon/human/handle_traits()
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(has_trait(TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster
|
||||
if(HAS_TRAIT_FROM(src, TRAIT_BLIND, EYES_COVERED)) //covering your eyes heals blurry eyes faster
|
||||
adjust_blindness(-3)
|
||||
else
|
||||
adjust_blindness(-1)
|
||||
@@ -95,7 +95,7 @@
|
||||
if(!L)
|
||||
if(health >= crit_threshold)
|
||||
adjustOxyLoss(HUMAN_MAX_OXYLOSS + 1)
|
||||
else if(!has_trait(TRAIT_NOCRITDAMAGE))
|
||||
else if(!HAS_TRAIT(src, TRAIT_NOCRITDAMAGE))
|
||||
adjustOxyLoss(HUMAN_CRIT_MAX_OXYLOSS)
|
||||
|
||||
failed_last_breath = 1
|
||||
@@ -332,7 +332,7 @@
|
||||
HM.on_life(src)
|
||||
|
||||
/mob/living/carbon/human/proc/handle_heart()
|
||||
var/we_breath = !has_trait(TRAIT_NOBREATH, SPECIES_TRAIT)
|
||||
var/we_breath = !HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT)
|
||||
|
||||
if(!undergoing_cardiac_arrest())
|
||||
return
|
||||
|
||||
@@ -54,7 +54,7 @@
|
||||
|
||||
/mob/living/carbon/human/IsVocal()
|
||||
// how do species that don't breathe talk? magic, that's what.
|
||||
if(!has_trait(TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS))
|
||||
if(!HAS_TRAIT_FROM(src, TRAIT_NOBREATH, SPECIES_TRAIT) && !getorganslot(ORGAN_SLOT_LUNGS))
|
||||
return FALSE
|
||||
if(mind)
|
||||
return !mind.miming
|
||||
|
||||
@@ -286,7 +286,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
C.put_in_hands(new mutanthands())
|
||||
|
||||
for(var/X in inherent_traits)
|
||||
C.add_trait(X, SPECIES_TRAIT)
|
||||
ADD_TRAIT(C, X, SPECIES_TRAIT)
|
||||
|
||||
if(TRAIT_VIRUSIMMUNE in inherent_traits)
|
||||
for(var/datum/disease/A in C.diseases)
|
||||
@@ -313,7 +313,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(DIGITIGRADE in species_traits)
|
||||
C.Digitigrade_Leg_Swap(TRUE)
|
||||
for(var/X in inherent_traits)
|
||||
C.remove_trait(X, SPECIES_TRAIT)
|
||||
REMOVE_TRAIT(C, X, SPECIES_TRAIT)
|
||||
|
||||
SEND_SIGNAL(C, COMSIG_SPECIES_LOSS, src)
|
||||
|
||||
@@ -322,7 +322,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
if(!HD) //Decapitated
|
||||
return
|
||||
if(H.has_trait(TRAIT_HUSK))
|
||||
if(HAS_TRAIT(H, TRAIT_HUSK))
|
||||
return
|
||||
|
||||
var/datum/sprite_accessory/S
|
||||
@@ -462,7 +462,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart(BODY_ZONE_HEAD)
|
||||
|
||||
if(HD && !(H.has_trait(TRAIT_HUSK)))
|
||||
if(HD && !(HAS_TRAIT(H, TRAIT_HUSK)))
|
||||
// lipstick
|
||||
if(H.lip_style && (LIPS in species_traits))
|
||||
var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[H.lip_style]", -BODY_LAYER)
|
||||
@@ -757,7 +757,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
for(var/index=1, index<=colorlist.len, index++)
|
||||
colorlist[index] = colorlist[index]/255
|
||||
|
||||
if(!(H.has_trait(TRAIT_HUSK)))
|
||||
if(!HAS_TRAIT(H, TRAIT_HUSK))
|
||||
if(!forced_colour)
|
||||
switch(S.color_src)
|
||||
if(SKINTONE)
|
||||
@@ -916,11 +916,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
|
||||
/datum/species/proc/spec_life(mob/living/carbon/human/H)
|
||||
if(H.has_trait(TRAIT_NOBREATH))
|
||||
if(HAS_TRAIT(H, TRAIT_NOBREATH))
|
||||
H.setOxyLoss(0)
|
||||
H.losebreath = 0
|
||||
|
||||
var/takes_crit_damage = (!H.has_trait(TRAIT_NOCRITDAMAGE))
|
||||
var/takes_crit_damage = !HAS_TRAIT(H, TRAIT_NOCRITDAMAGE)
|
||||
if((H.health < H.crit_threshold) && takes_crit_damage)
|
||||
H.adjustBruteLoss(1)
|
||||
|
||||
@@ -1158,21 +1158,21 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
|
||||
|
||||
//The fucking TRAIT_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
|
||||
if(H.has_trait(TRAIT_FAT))//I share your pain, past coder.
|
||||
if(HAS_TRAIT(H, TRAIT_FAT))//I share your pain, past coder.
|
||||
if(H.overeatduration < 100)
|
||||
to_chat(H, "<span class='notice'>You feel fit again!</span>")
|
||||
H.remove_trait(TRAIT_FAT, OBESITY)
|
||||
REMOVE_TRAIT(H, TRAIT_FAT, OBESITY)
|
||||
H.update_inv_w_uniform()
|
||||
H.update_inv_wear_suit()
|
||||
else
|
||||
if(H.overeatduration >= 100)
|
||||
to_chat(H, "<span class='danger'>You suddenly feel blubbery!</span>")
|
||||
H.add_trait(TRAIT_FAT, OBESITY)
|
||||
ADD_TRAIT(H, TRAIT_FAT, OBESITY)
|
||||
H.update_inv_w_uniform()
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
// nutrition decrease and satiety
|
||||
if (H.nutrition > 0 && H.stat != DEAD && !H.has_trait(TRAIT_NOHUNGER))
|
||||
if (H.nutrition > 0 && H.stat != DEAD && !HAS_TRAIT(H, TRAIT_NOHUNGER))
|
||||
// THEY HUNGER
|
||||
var/hunger_rate = HUNGER_FACTOR
|
||||
GET_COMPONENT_FROM(mood, /datum/component/mood, H)
|
||||
@@ -1201,7 +1201,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(H.nutrition > NUTRITION_LEVEL_FAT)
|
||||
H.metabolism_efficiency = 1
|
||||
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
|
||||
if(H.metabolism_efficiency != 1.25 && !H.has_trait(TRAIT_NOHUNGER))
|
||||
if(H.metabolism_efficiency != 1.25 && !HAS_TRAIT(H, TRAIT_NOHUNGER))
|
||||
to_chat(H, "<span class='notice'>You feel vigorous.</span>")
|
||||
H.metabolism_efficiency = 1.25
|
||||
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
|
||||
@@ -1230,7 +1230,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
. = FALSE
|
||||
var/radiation = H.radiation
|
||||
|
||||
if(H.has_trait(TRAIT_RADIMMUNE))
|
||||
if(HAS_TRAIT(H, TRAIT_RADIMMUNE))
|
||||
radiation = 0
|
||||
return TRUE
|
||||
|
||||
@@ -1277,17 +1277,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
gravity = H.has_gravity()
|
||||
|
||||
if(gravity && !flight) //Check for chemicals and innate speedups and slowdowns if we're on the ground
|
||||
if(H.has_trait(TRAIT_GOTTAGOFAST))
|
||||
if(HAS_TRAIT(H, TRAIT_GOTTAGOFAST))
|
||||
. -= 1
|
||||
if(H.has_trait(TRAIT_GOTTAGOREALLYFAST))
|
||||
if(HAS_TRAIT(H, TRAIT_GOTTAGOREALLYFAST))
|
||||
. -= 2
|
||||
. += speedmod
|
||||
. += H.physiology.speed_mod
|
||||
|
||||
if (H.m_intent == MOVE_INTENT_WALK && H.has_trait(TRAIT_SPEEDY_STEP))
|
||||
if (H.m_intent == MOVE_INTENT_WALK && HAS_TRAIT(H, TRAIT_SPEEDY_STEP))
|
||||
. -= 1
|
||||
|
||||
if(H.has_trait(TRAIT_IGNORESLOWDOWN))
|
||||
if(HAS_TRAIT(H, TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
if(!gravity)
|
||||
@@ -1338,9 +1338,9 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(SANITY_UNSTABLE to SANITY_DISTURBED)
|
||||
. += 0.5
|
||||
|
||||
if(H.has_trait(TRAIT_FAT))
|
||||
if(HAS_TRAIT(H, TRAIT_FAT))
|
||||
. += (1.5 - flight)
|
||||
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD))
|
||||
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
|
||||
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
|
||||
return .
|
||||
|
||||
@@ -1353,13 +1353,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
//////////////////
|
||||
|
||||
/datum/species/proc/help(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(target.health >= 0 && !(target.has_trait(TRAIT_FAKEDEATH)))
|
||||
if(target.health >= 0 && !HAS_TRAIT(target, TRAIT_FAKEDEATH))
|
||||
target.help_shake_act(user)
|
||||
if(target != user)
|
||||
log_combat(user, target, "shaked")
|
||||
return 1
|
||||
else
|
||||
var/we_breathe = !user.has_trait(TRAIT_NOBREATH)
|
||||
var/we_breathe = !HAS_TRAIT(user, TRAIT_NOBREATH)
|
||||
var/we_lung = user.getorganslot(ORGAN_SLOT_LUNGS)
|
||||
|
||||
if(we_breathe && we_lung)
|
||||
@@ -1384,7 +1384,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
|
||||
/datum/species/proc/harm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
if(user.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to harm [target]!</span>")
|
||||
return FALSE
|
||||
if(user.getStaminaLoss() >= STAMINA_SOFTCRIT) //CITADEL CHANGE - makes it impossible to punch while in stamina softcrit
|
||||
@@ -1480,12 +1480,26 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
"<span class='notice'>You slap [user == target ? "yourself" : "\the [target]"] in the face! </span>",\
|
||||
"You hear a slap."
|
||||
)
|
||||
if (!target.has_trait(TRAIT_NYMPHO))
|
||||
if (!HAS_TRAIT(target, TRAIT_NYMPHO))
|
||||
stop_wagging_tail(target)
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_FACE_SLAP)
|
||||
user.adjustStaminaLossBuffered(3)
|
||||
return FALSE
|
||||
else if(aim_for_groin && (target == user || target.lying || same_dir) && (target_on_help || target_restrained || target_aiming_for_groin))
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
|
||||
user.adjustStaminaLossBuffered(3)
|
||||
if(HAS_TRAIT(target, TRAIT_ASSBLASTUSA))
|
||||
var/hit_zone = (user.held_index_to_dir(user.active_hand_index) == "l" ? "l_":"r_") + "arm"
|
||||
user.adjustStaminaLoss(20, affected_zone = hit_zone)
|
||||
user.visible_message(\
|
||||
"<span class='danger'>\The [user] slaps \the [target]'s ass, but their hand bounces off like they hit metal!</span>",\
|
||||
"<span class='danger'>You slap [user == target ? "your" : "\the [target]'s"] ass, but feel an intense amount of pain as you realise their buns are harder than steel!</span>",\
|
||||
"You hear a slap."
|
||||
)
|
||||
playsound(target.loc, 'sound/weapons/tap.ogg', 50, 1, -1)
|
||||
user.emote("scream")
|
||||
return FALSE
|
||||
|
||||
playsound(target.loc, 'sound/weapons/slap.ogg', 50, 1, -1)
|
||||
user.visible_message(\
|
||||
"<span class='danger'>\The [user] slaps \the [target]'s ass!</span>",\
|
||||
@@ -1494,12 +1508,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
)
|
||||
if (target.canbearoused)
|
||||
target.adjustArousalLoss(5)
|
||||
if (target.getArousalLoss() >= 100 && ishuman(target) && target.has_trait(TRAIT_MASO) && target.has_dna())
|
||||
if (target.getArousalLoss() >= 100 && ishuman(target) && HAS_TRAIT(target, TRAIT_MASO) && target.has_dna())
|
||||
target.mob_climax(forced_climax=TRUE)
|
||||
if (!target.has_trait(TRAIT_NYMPHO))
|
||||
if (!HAS_TRAIT(target, TRAIT_NYMPHO))
|
||||
stop_wagging_tail(target)
|
||||
user.do_attack_animation(target, ATTACK_EFFECT_ASS_SLAP)
|
||||
user.adjustStaminaLossBuffered(3)
|
||||
|
||||
return FALSE
|
||||
else if(attacker_style && attacker_style.disarm_act(user,target))
|
||||
return 1
|
||||
@@ -1632,7 +1645,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
//dismemberment
|
||||
var/probability = I.get_dismemberment_chance(affecting)
|
||||
if(prob(probability) || (H.has_trait(TRAIT_EASYDISMEMBER) && prob(probability))) //try twice
|
||||
if(prob(probability) || (HAS_TRAIT(H, TRAIT_EASYDISMEMBER) && prob(probability))) //try twice
|
||||
if(affecting.dismember(I.damtype))
|
||||
I.add_mob_blood(H)
|
||||
playsound(get_turf(H), I.get_dismember_sound(), 80, 1)
|
||||
@@ -1666,8 +1679,11 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
if(H.stat == CONSCIOUS && H != user && prob(I.force + ((100 - H.health) * 0.5))) // rev deconversion through blunt trauma.
|
||||
var/datum/antagonist/rev/rev = H.mind.has_antag_datum(/datum/antagonist/rev)
|
||||
var/datum/antagonist/gang/gang = H.mind.has_antag_datum(/datum/antagonist/gang/)
|
||||
if(rev)
|
||||
rev.remove_revolutionary(FALSE, user)
|
||||
if(gang)
|
||||
H.mind.remove_antag_datum(/datum/antagonist/gang)
|
||||
|
||||
if(bloody) //Apply blood
|
||||
if(H.wear_mask)
|
||||
@@ -1727,7 +1743,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(BP)
|
||||
if(damage > 0 ? BP.receive_damage(damage * hit_percent * brutemod * H.physiology.brute_mod, 0) : BP.heal_damage(abs(damage * hit_percent * brutemod * H.physiology.brute_mod), 0))
|
||||
H.update_damage_overlays()
|
||||
if(H.has_trait(TRAIT_MASO))
|
||||
if(HAS_TRAIT(H, TRAIT_MASO))
|
||||
H.adjustArousalLoss(damage * brutemod * H.physiology.brute_mod)
|
||||
if (H.getArousalLoss() >= 100 && ishuman(H) && H.has_dna())
|
||||
H.mob_climax(forced_climax=TRUE)
|
||||
@@ -1776,7 +1792,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
/////////////
|
||||
|
||||
/datum/species/proc/breathe(mob/living/carbon/human/H)
|
||||
if(H.has_trait(TRAIT_NOBREATH))
|
||||
if(HAS_TRAIT(H, TRAIT_NOBREATH))
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -1824,7 +1840,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.throw_alert("temp", /obj/screen/alert/hot, 3)
|
||||
|
||||
// +/- 50 degrees from 310K is the 'safe' zone, where no damage is dealt.
|
||||
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTHEAT))
|
||||
if(H.bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTHEAT))
|
||||
//Body temperature is too hot.
|
||||
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "cold")
|
||||
@@ -1842,7 +1858,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
H.emote("scream")
|
||||
H.apply_damage(burn_damage, BURN)
|
||||
|
||||
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !H.has_trait(TRAIT_RESISTCOLD))
|
||||
else if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(H, TRAIT_RESISTCOLD))
|
||||
SEND_SIGNAL(H, COMSIG_CLEAR_MOOD_EVENT, "hot")
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "cold", /datum/mood_event/cold)
|
||||
switch(H.bodytemperature)
|
||||
@@ -1861,7 +1877,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
var/adjusted_pressure = H.calculate_affecting_pressure(pressure) //Returns how much pressure actually affects the mob.
|
||||
switch(adjusted_pressure)
|
||||
if(HAZARD_HIGH_PRESSURE to INFINITY)
|
||||
if(!H.has_trait(TRAIT_RESISTHIGHPRESSURE))
|
||||
if(!HAS_TRAIT(H, TRAIT_RESISTHIGHPRESSURE))
|
||||
H.adjustBruteLoss(min(((adjusted_pressure / HAZARD_HIGH_PRESSURE) -1 ) * PRESSURE_DAMAGE_COEFFICIENT, MAX_HIGH_PRESSURE_DAMAGE) * H.physiology.pressure_mod)
|
||||
H.throw_alert("pressure", /obj/screen/alert/highpressure, 2)
|
||||
else
|
||||
@@ -1873,7 +1889,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(HAZARD_LOW_PRESSURE to WARNING_LOW_PRESSURE)
|
||||
H.throw_alert("pressure", /obj/screen/alert/lowpressure, 1)
|
||||
else
|
||||
if(H.has_trait(TRAIT_RESISTLOWPRESSURE))
|
||||
if(HAS_TRAIT(H, TRAIT_RESISTLOWPRESSURE))
|
||||
H.clear_alert("pressure")
|
||||
else
|
||||
H.adjustBruteLoss(LOW_PRESSURE_DAMAGE * H.physiology.pressure_mod)
|
||||
@@ -1884,7 +1900,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
//////////
|
||||
|
||||
/datum/species/proc/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
|
||||
if(H.has_trait(TRAIT_NOFIRE))
|
||||
if(HAS_TRAIT(H, TRAIT_NOFIRE))
|
||||
return
|
||||
if(H.on_fire)
|
||||
//the fire tries to damage the exposed clothes and items
|
||||
@@ -1952,7 +1968,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
SEND_SIGNAL(H, COMSIG_ADD_MOOD_EVENT, "on_fire", /datum/mood_event/on_fire)
|
||||
|
||||
/datum/species/proc/CanIgniteMob(mob/living/carbon/human/H)
|
||||
if(H.has_trait(TRAIT_NOFIRE))
|
||||
if(HAS_TRAIT(H, TRAIT_NOFIRE))
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@
|
||||
if(ishuman(H) && !fly)
|
||||
fly = new
|
||||
fly.Grant(H)
|
||||
H.add_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
ADD_TRAIT(H, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
|
||||
/datum/species/angel/on_species_loss(mob/living/carbon/human/H)
|
||||
if(fly)
|
||||
@@ -36,7 +36,7 @@
|
||||
H.dna.species.mutant_bodyparts -= "wings"
|
||||
H.dna.features["wings"] = "None"
|
||||
H.update_body()
|
||||
H.remove_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
REMOVE_TRAIT(H, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
..()
|
||||
|
||||
/datum/species/angel/spec_life(mob/living/carbon/human/H)
|
||||
|
||||
@@ -74,10 +74,10 @@
|
||||
|
||||
/datum/species/golem/adamantine/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
C.add_trait(TRAIT_ANTIMAGIC, SPECIES_TRAIT)
|
||||
ADD_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT)
|
||||
|
||||
/datum/species/golem/adamantine/on_species_loss(mob/living/carbon/C)
|
||||
C.remove_trait(TRAIT_ANTIMAGIC, SPECIES_TRAIT)
|
||||
REMOVE_TRAIT(C, TRAIT_ANTIMAGIC, SPECIES_TRAIT)
|
||||
..()
|
||||
|
||||
//The suicide bombers of golemkind
|
||||
@@ -175,10 +175,10 @@
|
||||
|
||||
/datum/species/golem/silver/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
C.add_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
|
||||
/datum/species/golem/silver/on_species_loss(mob/living/carbon/C)
|
||||
C.remove_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
..()
|
||||
|
||||
//Harder to stun, deals more damage, but it's even slower
|
||||
@@ -698,10 +698,10 @@
|
||||
|
||||
/datum/species/golem/cloth/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
C.add_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
ADD_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
|
||||
/datum/species/golem/cloth/on_species_loss(mob/living/carbon/C)
|
||||
C.remove_trait(TRAIT_HOLY, SPECIES_TRAIT)
|
||||
REMOVE_TRAIT(C, TRAIT_HOLY, SPECIES_TRAIT)
|
||||
..()
|
||||
|
||||
/datum/species/golem/cloth/check_roundstart_eligible()
|
||||
@@ -768,7 +768,7 @@
|
||||
/obj/structure/cloth_pile/proc/revive()
|
||||
if(QDELETED(src) || QDELETED(cloth_golem)) //QDELETED also checks for null, so if no cloth golem is set this won't runtime
|
||||
return
|
||||
if(cloth_golem.suiciding || cloth_golem.has_trait(TRAIT_NOCLONE))
|
||||
if(cloth_golem.suiciding || HAS_TRAIT(cloth_golem, TRAIT_NOCLONE))
|
||||
QDEL_NULL(cloth_golem)
|
||||
return
|
||||
|
||||
|
||||
@@ -594,7 +594,7 @@
|
||||
/datum/species/jelly/stargazer/proc/link_mob(mob/living/M)
|
||||
if(QDELETED(M) || M.stat == DEAD)
|
||||
return FALSE
|
||||
if(M.has_trait(TRAIT_MINDSHIELD)) //mindshield implant, no dice
|
||||
if(HAS_TRAIT(M, TRAIT_MINDSHIELD)) //mindshield implant, no dice
|
||||
return FALSE
|
||||
if(M in linked_mobs)
|
||||
return FALSE
|
||||
|
||||
@@ -97,6 +97,7 @@
|
||||
brutemod = 0.9
|
||||
|
||||
/datum/species/lizard/ashwalker/on_species_gain(mob/living/carbon/human/C, datum/species/old_species)
|
||||
if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines
|
||||
C.dna.features["tail"] = "Smooth"
|
||||
if((C.dna.features["spines"] != "None" ) && (C.dna.features["tail_lizard"] == "None")) //tbh, it's kinda ugly for them not to have a tail yet have floating spines
|
||||
C.dna.features["tail_lizard"] = "Smooth"
|
||||
C.update_body()
|
||||
return ..()
|
||||
|
||||
@@ -33,7 +33,7 @@
|
||||
if((!istype(H.w_uniform, /obj/item/clothing/under/plasmaman) || !istype(H.head, /obj/item/clothing/head/helmet/space/plasmaman)) && !atmos_sealed)
|
||||
if(environment)
|
||||
if(environment.total_moles())
|
||||
if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen][MOLES]) >= 1) //Same threshhold that extinguishes fire
|
||||
if(environment.gases[/datum/gas/oxygen] && (environment.gases[/datum/gas/oxygen]) >= 1) //Same threshhold that extinguishes fire
|
||||
H.adjust_fire_stacks(0.5)
|
||||
if(!H.on_fire && H.fire_stacks > 0)
|
||||
H.visible_message("<span class='danger'>[H]'s body reacts with the atmosphere and bursts into flames!</span>","<span class='userdanger'>Your body reacts with the atmosphere and bursts into flame!</span>")
|
||||
|
||||
@@ -9,12 +9,12 @@
|
||||
|
||||
/mob/living/carbon/human/Unconscious(amount, updating = 1, ignore_canunconscious = 0)
|
||||
amount = dna.species.spec_stun(src,amount)
|
||||
if(has_trait(TRAIT_HEAVY_SLEEPER))
|
||||
if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER))
|
||||
amount *= rand(1.25, 1.3)
|
||||
return ..()
|
||||
|
||||
/mob/living/carbon/human/Sleeping(amount, updating = 1, ignore_sleepimmune = 0)
|
||||
if(has_trait(TRAIT_HEAVY_SLEEPER))
|
||||
if(HAS_TRAIT(src, TRAIT_HEAVY_SLEEPER))
|
||||
amount *= rand(1.25, 1.3)
|
||||
return ..()
|
||||
|
||||
|
||||
@@ -660,8 +660,10 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
. += "-[BP.dmg_overlay_type]"
|
||||
if(BP.body_markings)
|
||||
. += "-[BP.body_markings]"
|
||||
else
|
||||
. += "-no_marking"
|
||||
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
if(HAS_TRAIT(src, TRAIT_HUSK))
|
||||
. += "-husk"
|
||||
|
||||
/mob/living/carbon/human/load_limb_from_cache()
|
||||
@@ -703,7 +705,7 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
add_overlay(HD.get_limb_icon())
|
||||
update_damage_overlays()
|
||||
|
||||
if(HD && !(has_trait(TRAIT_HUSK)))
|
||||
if(HD && !(HAS_TRAIT(src, TRAIT_HUSK)))
|
||||
// lipstick
|
||||
if(lip_style && (LIPS in dna.species.species_traits))
|
||||
var/mutable_appearance/lip_overlay = mutable_appearance('icons/mob/human_face.dmi', "lips_[lip_style]", -BODY_LAYER)
|
||||
|
||||
@@ -116,7 +116,7 @@
|
||||
air_update_turf()
|
||||
|
||||
/mob/living/carbon/proc/has_smoke_protection()
|
||||
if(has_trait(TRAIT_NOBREATH))
|
||||
if(HAS_TRAIT(src, TRAIT_NOBREATH))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
@@ -150,10 +150,9 @@
|
||||
var/breath_pressure = (breath.total_moles()*R_IDEAL_GAS_EQUATION*breath.temperature)/BREATH_VOLUME
|
||||
|
||||
var/list/breath_gases = breath.gases
|
||||
breath.assert_gases(/datum/gas/oxygen, /datum/gas/plasma, /datum/gas/carbon_dioxide, /datum/gas/nitrous_oxide, /datum/gas/bz)
|
||||
var/O2_partialpressure = (breath_gases[/datum/gas/oxygen][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/O2_partialpressure = (breath_gases[/datum/gas/oxygen]/breath.total_moles())*breath_pressure
|
||||
var/Toxins_partialpressure = (breath_gases[/datum/gas/plasma]/breath.total_moles())*breath_pressure
|
||||
var/CO2_partialpressure = (breath_gases[/datum/gas/carbon_dioxide]/breath.total_moles())*breath_pressure
|
||||
|
||||
|
||||
//OXYGEN
|
||||
@@ -177,7 +176,7 @@
|
||||
var/ratio = 1 - O2_partialpressure/safe_oxy_min
|
||||
adjustOxyLoss(min(5*ratio, 3))
|
||||
failed_last_breath = 1
|
||||
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]*ratio
|
||||
oxygen_used = breath_gases[/datum/gas/oxygen]*ratio
|
||||
else
|
||||
adjustOxyLoss(3)
|
||||
failed_last_breath = 1
|
||||
@@ -189,12 +188,12 @@
|
||||
o2overloadtime = 0 //reset our counter for this too
|
||||
if(health >= crit_threshold)
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_used = breath_gases[/datum/gas/oxygen][MOLES]
|
||||
oxygen_used = breath_gases[/datum/gas/oxygen]
|
||||
clear_alert("not_enough_oxy")
|
||||
SEND_SIGNAL(src, COMSIG_CLEAR_MOOD_EVENT, "suffocation")
|
||||
|
||||
breath_gases[/datum/gas/oxygen][MOLES] -= oxygen_used
|
||||
breath_gases[/datum/gas/carbon_dioxide][MOLES] += oxygen_used
|
||||
breath_gases[/datum/gas/oxygen] -= oxygen_used
|
||||
breath_gases[/datum/gas/carbon_dioxide] += oxygen_used
|
||||
|
||||
//CARBON DIOXIDE
|
||||
if(CO2_partialpressure > safe_co2_max)
|
||||
@@ -213,7 +212,7 @@
|
||||
|
||||
//TOXINS/PLASMA
|
||||
if(Toxins_partialpressure > safe_tox_max)
|
||||
var/ratio = (breath_gases[/datum/gas/plasma][MOLES]/safe_tox_max) * 10
|
||||
var/ratio = (breath_gases[/datum/gas/plasma]/safe_tox_max) * 10
|
||||
adjustToxLoss(CLAMP(ratio, MIN_TOXIC_GAS_DAMAGE, MAX_TOXIC_GAS_DAMAGE))
|
||||
throw_alert("too_much_tox", /obj/screen/alert/too_much_tox)
|
||||
else
|
||||
@@ -221,7 +220,7 @@
|
||||
|
||||
//NITROUS OXIDE
|
||||
if(breath_gases[/datum/gas/nitrous_oxide])
|
||||
var/SA_partialpressure = (breath_gases[/datum/gas/nitrous_oxide][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/SA_partialpressure = (breath_gases[/datum/gas/nitrous_oxide]/breath.total_moles())*breath_pressure
|
||||
if(SA_partialpressure > SA_para_min)
|
||||
Unconscious(60)
|
||||
if(SA_partialpressure > SA_sleep_min)
|
||||
@@ -235,7 +234,7 @@
|
||||
|
||||
//BZ (Facepunch port of their Agent B)
|
||||
if(breath_gases[/datum/gas/bz])
|
||||
var/bz_partialpressure = (breath_gases[/datum/gas/bz][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/bz_partialpressure = (breath_gases[/datum/gas/bz]/breath.total_moles())*breath_pressure
|
||||
if(bz_partialpressure > 1)
|
||||
hallucination += 10
|
||||
else if(bz_partialpressure > 0.01)
|
||||
@@ -243,17 +242,17 @@
|
||||
|
||||
//TRITIUM
|
||||
if(breath_gases[/datum/gas/tritium])
|
||||
var/tritium_partialpressure = (breath_gases[/datum/gas/tritium][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/tritium_partialpressure = (breath_gases[/datum/gas/tritium]/breath.total_moles())*breath_pressure
|
||||
radiation += tritium_partialpressure/10
|
||||
|
||||
//NITRYL
|
||||
if(breath_gases[/datum/gas/nitryl])
|
||||
var/nitryl_partialpressure = (breath_gases[/datum/gas/nitryl][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/nitryl_partialpressure = (breath_gases[/datum/gas/nitryl]/breath.total_moles())*breath_pressure
|
||||
adjustFireLoss(nitryl_partialpressure/4)
|
||||
|
||||
//MIASMA
|
||||
if(breath_gases[/datum/gas/miasma])
|
||||
var/miasma_partialpressure = (breath_gases[/datum/gas/miasma][MOLES]/breath.total_moles())*breath_pressure
|
||||
var/miasma_partialpressure = (breath_gases[/datum/gas/miasma]/breath.total_moles())*breath_pressure
|
||||
|
||||
if(prob(1 * miasma_partialpressure))
|
||||
var/datum/disease/advance/miasma_disease = new /datum/disease/advance/random(2,3)
|
||||
@@ -295,7 +294,7 @@
|
||||
|
||||
|
||||
|
||||
breath.garbage_collect()
|
||||
GAS_GARBAGE_COLLECT(breath.gases)
|
||||
|
||||
//BREATH TEMPERATURE
|
||||
handle_breath_temperature(breath)
|
||||
@@ -327,7 +326,7 @@
|
||||
return
|
||||
|
||||
// No decay if formaldehyde in corpse or when the corpse is charred
|
||||
if(reagents.has_reagent("formaldehyde", 15) || has_trait(TRAIT_HUSK))
|
||||
if(reagents.has_reagent("formaldehyde", 15) || HAS_TRAIT(src, TRAIT_HUSK))
|
||||
return
|
||||
|
||||
// Also no decay if corpse chilled or not organic/undead
|
||||
@@ -348,8 +347,7 @@
|
||||
|
||||
var/list/cached_gases = miasma_turf.air.gases
|
||||
|
||||
ASSERT_GAS(/datum/gas/miasma, miasma_turf.air)
|
||||
cached_gases[/datum/gas/miasma][MOLES] += 0.02
|
||||
cached_gases[/datum/gas/miasma] += 0.02
|
||||
|
||||
/mob/living/carbon/proc/handle_blood()
|
||||
return
|
||||
@@ -557,7 +555,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
if(drunkenness >= 6)
|
||||
SEND_SIGNAL(src, COMSIG_ADD_MOOD_EVENT, "drunk", /datum/mood_event/drunk)
|
||||
jitteriness = max(jitteriness - 3, 0)
|
||||
if(has_trait(TRAIT_DRUNK_HEALING))
|
||||
if(HAS_TRAIT(src, TRAIT_DRUNK_HEALING))
|
||||
adjustBruteLoss(-0.12, FALSE)
|
||||
adjustFireLoss(-0.06, FALSE)
|
||||
|
||||
@@ -582,7 +580,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
if(prob(25))
|
||||
confused += 2
|
||||
Dizzy(10)
|
||||
if(has_trait(TRAIT_DRUNK_HEALING)) // effects stack with lower tiers
|
||||
if(HAS_TRAIT(src, TRAIT_DRUNK_HEALING)) // effects stack with lower tiers
|
||||
adjustBruteLoss(-0.3, FALSE)
|
||||
adjustFireLoss(-0.15, FALSE)
|
||||
|
||||
@@ -595,7 +593,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
if(drunkenness >= 61)
|
||||
if(prob(50))
|
||||
blur_eyes(5)
|
||||
if(has_trait(TRAIT_DRUNK_HEALING))
|
||||
if(HAS_TRAIT(src, TRAIT_DRUNK_HEALING))
|
||||
adjustBruteLoss(-0.4, FALSE)
|
||||
adjustFireLoss(-0.2, FALSE)
|
||||
|
||||
@@ -665,7 +663,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
|
||||
/mob/living/carbon/proc/liver_failure()
|
||||
reagents.metabolize(src, can_overdose=FALSE, liverless = TRUE)
|
||||
if(has_trait(TRAIT_STABLEHEART))
|
||||
if(HAS_TRAIT(src, TRAIT_STABLEHEART))
|
||||
return
|
||||
adjustToxLoss(4, TRUE, TRUE)
|
||||
if(prob(30))
|
||||
@@ -701,7 +699,7 @@ GLOBAL_LIST_INIT(ballmer_windows_me_msg, list("Yo man, what if, we like, uh, put
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/proc/needs_heart()
|
||||
if(has_trait(TRAIT_STABLEHEART))
|
||||
if(HAS_TRAIT(src, TRAIT_STABLEHEART))
|
||||
return FALSE
|
||||
if(dna && dna.species && (NOBLOOD in dna.species.species_traits)) //not all carbons have species!
|
||||
return FALSE
|
||||
|
||||
@@ -119,7 +119,7 @@
|
||||
cuff_resist(I)
|
||||
|
||||
/mob/living/carbon/monkey/proc/should_target(var/mob/living/L)
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
return FALSE
|
||||
|
||||
if(enemies[L])
|
||||
@@ -143,7 +143,7 @@
|
||||
pickupTimer = 0
|
||||
else
|
||||
INVOKE_ASYNC(src, .proc/walk2derpless, pickupTarget.loc)
|
||||
if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target
|
||||
if(Adjacent(pickupTarget) || Adjacent(pickupTarget.loc)) // next to target
|
||||
drop_all_held_items() // who cares about these items, i want that one!
|
||||
if(isturf(pickupTarget.loc)) // on floor
|
||||
equip_item(pickupTarget)
|
||||
@@ -167,7 +167,7 @@
|
||||
battle_screech()
|
||||
retaliate(L)
|
||||
return TRUE
|
||||
else
|
||||
else
|
||||
bodyDisposal = locate(/obj/machinery/disposal/) in around
|
||||
if(bodyDisposal)
|
||||
target = L
|
||||
|
||||
@@ -81,7 +81,7 @@
|
||||
adjust_bodytemperature(min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX))
|
||||
|
||||
|
||||
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTHEAT))
|
||||
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTHEAT))
|
||||
switch(bodytemperature)
|
||||
if(360 to 400)
|
||||
throw_alert("temp", /obj/screen/alert/hot, 1)
|
||||
@@ -96,7 +96,7 @@
|
||||
else
|
||||
apply_damage(HEAT_DAMAGE_LEVEL_2, BURN)
|
||||
|
||||
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !has_trait(TRAIT_RESISTCOLD))
|
||||
else if(bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT && !HAS_TRAIT(src, TRAIT_RESISTCOLD))
|
||||
if(!istype(loc, /obj/machinery/atmospherics/components/unary/cryo_cell))
|
||||
switch(bodytemperature)
|
||||
if(200 to 260)
|
||||
|
||||
@@ -147,7 +147,7 @@
|
||||
threatcount += 4 //trigger look_for_perp() since they're nonhuman and very likely hostile
|
||||
|
||||
//mindshield implants imply trustworthyness
|
||||
if(has_trait(TRAIT_MINDSHIELD))
|
||||
if(HAS_TRAIT(src, TRAIT_MINDSHIELD))
|
||||
threatcount -= 1
|
||||
|
||||
return threatcount
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
if(!HD) //Decapitated
|
||||
return
|
||||
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
if(HAS_TRAIT(src, TRAIT_HUSK))
|
||||
return
|
||||
|
||||
var/hair_hidden = 0
|
||||
|
||||
@@ -279,7 +279,7 @@
|
||||
else
|
||||
. += "-robotic"
|
||||
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
if(HAS_TRAIT(src, TRAIT_HUSK))
|
||||
. += "-husk"
|
||||
|
||||
|
||||
|
||||
@@ -101,14 +101,14 @@
|
||||
if(EFFECT_SLUR)
|
||||
slurring = max(slurring,(effect * hit_percent))
|
||||
if(EFFECT_STUTTER)
|
||||
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) // stun is usually associated with stutter
|
||||
if((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) // stun is usually associated with stutter
|
||||
stuttering = max(stuttering,(effect * hit_percent))
|
||||
if(EFFECT_EYE_BLUR)
|
||||
blur_eyes(effect * hit_percent)
|
||||
if(EFFECT_DROWSY)
|
||||
drowsyness = max(drowsyness,(effect * hit_percent))
|
||||
if(EFFECT_JITTER)
|
||||
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE))
|
||||
if((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE))
|
||||
jitteriness = max(jitteriness,(effect * hit_percent))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -109,7 +109,7 @@
|
||||
ExtinguishMob()
|
||||
return
|
||||
var/datum/gas_mixture/G = loc.return_air() // Check if we're standing in an oxygenless environment
|
||||
if(!G.gases[/datum/gas/oxygen] || G.gases[/datum/gas/oxygen][MOLES] < 1)
|
||||
if(G.gases[/datum/gas/oxygen] < 1)
|
||||
ExtinguishMob() //If there's no oxygen in the tile we're on, put out the fire
|
||||
return
|
||||
var/turf/location = get_turf(src)
|
||||
@@ -126,7 +126,7 @@
|
||||
/mob/living/proc/handle_traits()
|
||||
//Eyes
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(!stat && !(has_trait(TRAIT_BLIND)))
|
||||
if(!stat && !(HAS_TRAIT(src, TRAIT_BLIND)))
|
||||
eye_blind = max(eye_blind-1,0)
|
||||
if(client && !eye_blind)
|
||||
clear_alert("blind")
|
||||
|
||||
@@ -170,7 +170,7 @@
|
||||
return 1
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
if(L.has_trait(TRAIT_PUSHIMMUNE))
|
||||
if(HAS_TRAIT(L, TRAIT_PUSHIMMUNE))
|
||||
return 1
|
||||
//If they're a human, and they're not in help intent, block pushing
|
||||
if(ishuman(M) && (M.a_intent != INTENT_HELP))
|
||||
@@ -306,7 +306,7 @@
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
if(incapacitated())
|
||||
return FALSE
|
||||
if(has_trait(TRAIT_DEATHCOMA))
|
||||
if(HAS_TRAIT(src, TRAIT_DEATHCOMA))
|
||||
return FALSE
|
||||
if(!..())
|
||||
return FALSE
|
||||
@@ -889,7 +889,7 @@
|
||||
/mob/living/rad_act(amount)
|
||||
. = ..()
|
||||
|
||||
if(!amount || (amount < RAD_MOB_SKIN_PROTECTION) || has_trait(TRAIT_RADIMMUNE))
|
||||
if(!amount || (amount < RAD_MOB_SKIN_PROTECTION) || HAS_TRAIT(src, TRAIT_RADIMMUNE))
|
||||
return
|
||||
|
||||
amount -= RAD_BACKGROUND_RADIATION // This will always be at least 1 because of how skin protection is calculated
|
||||
@@ -905,7 +905,7 @@
|
||||
. = ..()
|
||||
if(.)
|
||||
return
|
||||
if((magic && has_trait(TRAIT_ANTIMAGIC)) || (holy && has_trait(TRAIT_HOLY)))
|
||||
if((magic && HAS_TRAIT(src, TRAIT_ANTIMAGIC)) || (holy && HAS_TRAIT(src, TRAIT_HOLY)))
|
||||
return src
|
||||
|
||||
/mob/living/proc/fakefireextinguish()
|
||||
@@ -988,7 +988,7 @@
|
||||
//Updates canmove, lying and icons. Could perhaps do with a rename but I can't think of anything to describe it.
|
||||
//Robots, animals and brains have their own version so don't worry about them
|
||||
/mob/living/proc/update_canmove()
|
||||
var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_DEATHCOMA))
|
||||
var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (HAS_TRAIT(src, TRAIT_DEATHCOMA))
|
||||
var/move_and_fall = stat == SOFT_CRIT && !pulledby
|
||||
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
|
||||
var/buckle_lying = !(buckled && !buckled.buckle_lying)
|
||||
@@ -1182,3 +1182,32 @@
|
||||
update_transform()
|
||||
if("lighting_alpha")
|
||||
sync_lighting_plane_alpha()
|
||||
|
||||
/mob/living/proc/do_adrenaline(
|
||||
stamina_boost = 150,
|
||||
put_on_feet = TRUE,
|
||||
clamp_unconscious_to = 0,
|
||||
clamp_immobility_to = 0,
|
||||
reset_misc = TRUE,
|
||||
healing_chems = list("inaprovaline" = 3, "synaptizine" = 10, "omnizine" = 10, "stimulants" = 10),
|
||||
message = "<span class='boldnotice'>You feel a surge of energy!</span>"
|
||||
)
|
||||
if(AmountSleeping() > clamp_unconscious_to)
|
||||
SetSleeping(clamp_unconscious_to)
|
||||
if(AmountUnconscious() > clamp_unconscious_to)
|
||||
SetUnconscious(clamp_unconscious_to)
|
||||
if(AmountStun() > clamp_immobility_to)
|
||||
SetStun(clamp_immobility_to)
|
||||
if(AmountKnockdown() > clamp_immobility_to)
|
||||
SetKnockdown(clamp_immobility_to)
|
||||
adjustStaminaLoss(max(0, -stamina_boost))
|
||||
if(put_on_feet)
|
||||
resting = FALSE
|
||||
lying = FALSE
|
||||
if(reset_misc)
|
||||
stuttering = 0
|
||||
updatehealth()
|
||||
update_stamina()
|
||||
update_canmove()
|
||||
for(var/chem in healing_chems)
|
||||
reagents.add_reagent(chem, healing_chems[chem])
|
||||
|
||||
@@ -1,24 +1,18 @@
|
||||
|
||||
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = null, soften_text = null, armour_penetration, penetrated_text)
|
||||
/mob/living/proc/run_armor_check(def_zone = null, attack_flag = "melee", absorb_text = "Your armor absorbs the blow!", soften_text = "Your armor softens the blow!", armour_penetration, penetrated_text = "Your armor was penetrated!")
|
||||
var/armor = getarmor(def_zone, attack_flag)
|
||||
|
||||
//the if "armor" check is because this is used for everything on /living, including humans
|
||||
if(armor && armour_penetration)
|
||||
armor = max(0, armor - armour_penetration)
|
||||
if(penetrated_text)
|
||||
to_chat(src, "<span class='userdanger'>[penetrated_text]</span>")
|
||||
else
|
||||
to_chat(src, "<span class='userdanger'>Your armor was penetrated!</span>")
|
||||
to_chat(src, "<span class='danger'>[penetrated_text]</span>")
|
||||
else if(armor >= 100)
|
||||
if(absorb_text)
|
||||
to_chat(src, "<span class='userdanger'>[absorb_text]</span>")
|
||||
else
|
||||
to_chat(src, "<span class='userdanger'>Your armor absorbs the blow!</span>")
|
||||
to_chat(src, "<span class='danger'>[absorb_text]</span>")
|
||||
else if(armor > 0)
|
||||
if(soften_text)
|
||||
to_chat(src, "<span class='userdanger'>[soften_text]</span>")
|
||||
else
|
||||
to_chat(src, "<span class='userdanger'>Your armor softens the blow!</span>")
|
||||
to_chat(src, "<span class='danger'>[soften_text]</span>")
|
||||
return armor
|
||||
|
||||
|
||||
@@ -43,7 +37,7 @@
|
||||
return
|
||||
|
||||
/mob/living/bullet_act(obj/item/projectile/P, def_zone)
|
||||
var/armor = run_armor_check(def_zone, P.flag, "","",P.armour_penetration)
|
||||
var/armor = run_armor_check(def_zone, P.flag, null, null, P.armour_penetration, null)
|
||||
if(!P.nodamage)
|
||||
apply_damage(P.damage, P.damage_type, def_zone, armor)
|
||||
if(P.dismemberment)
|
||||
@@ -130,6 +124,18 @@
|
||||
if(user == anchored || !isturf(user.loc))
|
||||
return FALSE
|
||||
|
||||
//pacifist vore check.
|
||||
if(user.pulling && HAS_TRAIT(user, TRAIT_PACIFISM) && user.voremode) //they can only do heals, noisy guts, absorbing (technically not harm)
|
||||
if(ismob(user.pulling))
|
||||
var/mob/P = user.pulling
|
||||
if(src != user)
|
||||
to_chat(user, "<span class='notice'>You can't risk digestion!</span>")
|
||||
return FALSE
|
||||
else
|
||||
user.vore_attack(user, P, user)
|
||||
return
|
||||
|
||||
//normal vore check.
|
||||
if(user.pulling && user.grab_state == GRAB_AGGRESSIVE && user.voremode)
|
||||
if(ismob(user.pulling))
|
||||
var/mob/P = user.pulling
|
||||
@@ -143,11 +149,11 @@
|
||||
user.start_pulling(src, supress_message)
|
||||
return
|
||||
|
||||
if(!(status_flags & CANPUSH) || has_trait(TRAIT_PUSHIMMUNE))
|
||||
if(!(status_flags & CANPUSH) || HAS_TRAIT(src, TRAIT_PUSHIMMUNE))
|
||||
to_chat(user, "<span class='warning'>[src] can't be grabbed more aggressively!</span>")
|
||||
return FALSE
|
||||
|
||||
if(user.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='notice'>You don't want to risk hurting [src]!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -210,7 +216,7 @@
|
||||
M.Feedstop()
|
||||
return // can't attack while eating!
|
||||
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(src, TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -227,7 +233,7 @@
|
||||
M.visible_message("<span class='notice'>\The [M] [M.friendly] [src]!</span>")
|
||||
return FALSE
|
||||
else
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(M, TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -246,7 +252,7 @@
|
||||
return FALSE
|
||||
|
||||
if (M.a_intent == INTENT_HARM)
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(M, TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -272,7 +278,7 @@
|
||||
return FALSE
|
||||
|
||||
else
|
||||
if(L.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(L, TRAIT_PACIFISM))
|
||||
to_chat(L, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return
|
||||
|
||||
@@ -297,7 +303,7 @@
|
||||
grabbedby(M)
|
||||
return FALSE
|
||||
if("harm")
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(M, TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
M.do_attack_animation(src)
|
||||
@@ -321,7 +327,7 @@
|
||||
SEND_SIGNAL(src, COMSIG_LIVING_ELECTROCUTE_ACT, shock_damage)
|
||||
if(tesla_shock && (flags_1 & TESLA_IGNORE_1))
|
||||
return FALSE
|
||||
if(has_trait(TRAIT_SHOCKIMMUNE))
|
||||
if(HAS_TRAIT(src, TRAIT_SHOCKIMMUNE))
|
||||
return FALSE
|
||||
if(shock_damage > 0)
|
||||
if(!illusion)
|
||||
@@ -391,7 +397,7 @@
|
||||
|
||||
//called when the mob receives a bright flash
|
||||
/mob/living/proc/flash_act(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0, type = /obj/screen/fullscreen/flash)
|
||||
if(get_eye_protection() < intensity && (override_blindness_check || !(has_trait(TRAIT_BLIND))))
|
||||
if(get_eye_protection() < intensity && (override_blindness_check || !(HAS_TRAIT(src, TRAIT_BLIND))))
|
||||
overlay_fullscreen("flash", type)
|
||||
addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25)
|
||||
return TRUE
|
||||
|
||||
@@ -33,8 +33,6 @@
|
||||
var/incorporeal_move = FALSE //FALSE is off, INCORPOREAL_MOVE_BASIC is normal, INCORPOREAL_MOVE_SHADOW is for ninjas
|
||||
//and INCORPOREAL_MOVE_JAUNT is blocked by holy water/salt
|
||||
|
||||
var/list/status_traits = list()
|
||||
|
||||
var/list/roundstart_quirks = list()
|
||||
|
||||
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
@@ -302,7 +302,7 @@ GLOBAL_LIST_INIT(department_radio_keys, list(
|
||||
return 1
|
||||
|
||||
/mob/living/proc/can_speak_vocal(message) //Check AFTER handling of xeno and ling channels
|
||||
if(has_trait(TRAIT_MUTE))
|
||||
if(HAS_TRAIT(src, TRAIT_MUTE))
|
||||
return 0
|
||||
|
||||
if(is_muzzled())
|
||||
|
||||
@@ -86,12 +86,13 @@
|
||||
var/datum/action/innate/deploy_last_shell/redeploy_action = new
|
||||
var/chnotify = 0
|
||||
|
||||
|
||||
|
||||
var/multicam_on = FALSE
|
||||
var/obj/screen/movable/pic_in_pic/ai/master_multicam
|
||||
var/list/multicam_screens = list()
|
||||
var/list/all_eyes = list()
|
||||
var/max_multicams = 6
|
||||
var/display_icon_override
|
||||
|
||||
/mob/living/silicon/ai/Initialize(mapload, datum/ai_laws/L, mob/target_ai)
|
||||
. = ..()
|
||||
@@ -127,6 +128,8 @@
|
||||
create_eye()
|
||||
apply_pref_name("ai")
|
||||
|
||||
set_core_display_icon()
|
||||
|
||||
holo_icon = getHologramIcon(icon('icons/mob/ai.dmi',"default"))
|
||||
|
||||
spark_system = new /datum/effect_system/spark_spread()
|
||||
@@ -172,81 +175,34 @@
|
||||
fire_stacks = 0
|
||||
. = ..()
|
||||
|
||||
/mob/living/silicon/ai/proc/set_core_display_icon(input, client/C)
|
||||
if(client && !C)
|
||||
C = client
|
||||
if(!input && !C?.prefs?.preferred_ai_core_display)
|
||||
icon_state = initial(icon_state)
|
||||
else
|
||||
var/preferred_icon = input ? input : C.prefs.preferred_ai_core_display
|
||||
icon_state = resolve_ai_icon(preferred_icon)
|
||||
|
||||
/mob/living/silicon/ai/verb/pick_icon()
|
||||
set category = "AI Commands"
|
||||
set name = "Set AI Core Display"
|
||||
if(incapacitated())
|
||||
return
|
||||
var/list/iconstates = GLOB.ai_core_display_screens
|
||||
for(var/option in iconstates)
|
||||
if(option == "Random")
|
||||
iconstates[option] = image(icon = src.icon, icon_state = "ai-random")
|
||||
continue
|
||||
iconstates[option] = image(icon = src.icon, icon_state = resolve_ai_icon(option))
|
||||
|
||||
var/icontype = input("Please, select a display!", "AI", null/*, null*/) in list("Clown", ":thinking:", "Monochrome", "Blue", "Inverted", "Firewall", "Green", "Red", "Static", "Red October", "House", "Heartline", "Hades", "Helios", "President", "Syndicat Meow", "Alien", "Too Deep", "Triumvirate", "Triumvirate-M", "Text", "Matrix", "Dorf", "Bliss", "Not Malf", "Fuzzy", "Goon", "Database", "Glitchman", "Murica", "Nanotrasen", "Gentoo", "Angel", "TechDemon") //CIT CHANGE - adds 'TechDemon
|
||||
if(icontype == "Clown")
|
||||
icon_state = "ai-clown2"
|
||||
else if (icontype == ":thinking:")
|
||||
icon_state = "ai-:thinking:"
|
||||
else if(icontype == "Monochrome")
|
||||
icon_state = "ai-mono"
|
||||
else if(icontype == "Blue")
|
||||
icon_state = "ai"
|
||||
else if(icontype == "Inverted")
|
||||
icon_state = "ai-u"
|
||||
else if(icontype == "Firewall")
|
||||
icon_state = "ai-magma"
|
||||
else if(icontype == "Green")
|
||||
icon_state = "ai-wierd"
|
||||
else if(icontype == "Red")
|
||||
icon_state = "ai-malf"
|
||||
else if(icontype == "Static")
|
||||
icon_state = "ai-static"
|
||||
else if(icontype == "Red October")
|
||||
icon_state = "ai-redoctober"
|
||||
else if(icontype == "House")
|
||||
icon_state = "ai-house"
|
||||
else if(icontype == "Heartline")
|
||||
icon_state = "ai-heartline"
|
||||
else if(icontype == "Hades")
|
||||
icon_state = "ai-hades"
|
||||
else if(icontype == "Helios")
|
||||
icon_state = "ai-helios"
|
||||
else if(icontype == "President")
|
||||
icon_state = "ai-pres"
|
||||
else if(icontype == "Syndicat Meow")
|
||||
icon_state = "ai-syndicatmeow"
|
||||
else if(icontype == "Alien")
|
||||
icon_state = "ai-alien"
|
||||
else if(icontype == "Too Deep")
|
||||
icon_state = "ai-toodeep"
|
||||
else if(icontype == "Triumvirate")
|
||||
icon_state = "ai-triumvirate"
|
||||
else if(icontype == "Triumvirate-M")
|
||||
icon_state = "ai-triumvirate-malf"
|
||||
else if(icontype == "Text")
|
||||
icon_state = "ai-text"
|
||||
else if(icontype == "Matrix")
|
||||
icon_state = "ai-matrix"
|
||||
else if(icontype == "Dorf")
|
||||
icon_state = "ai-dorf"
|
||||
else if(icontype == "Bliss")
|
||||
icon_state = "ai-bliss"
|
||||
else if(icontype == "Not Malf")
|
||||
icon_state = "ai-notmalf"
|
||||
else if(icontype == "Fuzzy")
|
||||
icon_state = "ai-fuzz"
|
||||
else if(icontype == "Goon")
|
||||
icon_state = "ai-goon"
|
||||
else if(icontype == "Database")
|
||||
icon_state = "ai-database"
|
||||
else if(icontype == "Glitchman")
|
||||
icon_state = "ai-glitchman"
|
||||
else if(icontype == "Murica")
|
||||
icon_state = "ai-murica"
|
||||
else if(icontype == "Nanotrasen")
|
||||
icon_state = "ai-nanotrasen"
|
||||
else if(icontype == "Gentoo")
|
||||
icon_state = "ai-gentoo"
|
||||
else if(icontype == "Angel")
|
||||
icon_state = "ai-angel"
|
||||
else if(icontype == "TechDemon") //CIT CHANGE - adds 'TechDemon
|
||||
icon_state = "ai-techdemon"
|
||||
view_core()
|
||||
var/ai_core_icon = show_radial_menu(src, src , iconstates, radius = 42)
|
||||
|
||||
if(!ai_core_icon || incapacitated())
|
||||
return
|
||||
display_icon_override = ai_core_icon
|
||||
set_core_display_icon(ai_core_icon)
|
||||
|
||||
/mob/living/silicon/ai/Stat()
|
||||
..()
|
||||
@@ -915,9 +871,9 @@
|
||||
clear_fullscreen("remote_view", 0)
|
||||
|
||||
/mob/living/silicon/ai/revive(full_heal = 0, admin_revive = 0)
|
||||
if(..()) //successfully ressuscitated from death
|
||||
icon_state = "ai"
|
||||
. = 1
|
||||
. = ..()
|
||||
if(.) //successfully ressuscitated from death
|
||||
set_core_display_icon(display_icon_override)
|
||||
|
||||
/mob/living/silicon/ai/proc/malfhacked(obj/machinery/power/apc/apc)
|
||||
malfhack = null
|
||||
|
||||
@@ -4,10 +4,13 @@
|
||||
|
||||
. = ..()
|
||||
|
||||
if("[icon_state]_dead" in icon_states(src.icon,1))
|
||||
var/old_icon = icon_state
|
||||
if("[icon_state]_dead" in icon_states(icon))
|
||||
icon_state = "[icon_state]_dead"
|
||||
else
|
||||
icon_state = "ai_dead"
|
||||
if("[old_icon]_death_transition" in icon_states(icon))
|
||||
flick("[old_icon]_death_transition", src)
|
||||
|
||||
cameraFollow = null
|
||||
|
||||
|
||||
@@ -544,9 +544,9 @@
|
||||
|
||||
if (total_moles)
|
||||
for(var/id in env_gases)
|
||||
var/gas_level = env_gases[id][MOLES]/total_moles
|
||||
var/gas_level = env_gases[id]/total_moles
|
||||
if(gas_level > 0.01)
|
||||
dat += "[env_gases[id][GAS_META][META_GAS_NAME]]: [round(gas_level*100)]%<br>"
|
||||
dat += "[GLOB.meta_gas_names[id]]: [round(gas_level*100)]%<br>"
|
||||
dat += "Temperature: [round(environment.temperature-T0C)]°C<br>"
|
||||
dat += "<a href='byond://?src=[REF(src)];software=atmosensor;sub=0'>Refresh Reading</a> <br>"
|
||||
dat += "<br>"
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
grabbedby(M)
|
||||
|
||||
if("harm", "disarm")
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(M, TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt [src]!</span>")
|
||||
return
|
||||
M.do_attack_animation(src, ATTACK_EFFECT_PUNCH)
|
||||
@@ -29,7 +29,7 @@
|
||||
|
||||
/mob/living/simple_animal/attack_hulk(mob/living/carbon/human/user, does_attack_animation = 0)
|
||||
if(user.a_intent == INTENT_HARM)
|
||||
if(user.has_trait(TRAIT_PACIFISM))
|
||||
if(HAS_TRAIT(user, TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='notice'>You don't want to hurt [src]!</span>")
|
||||
return FALSE
|
||||
..(user, 1)
|
||||
|
||||
@@ -343,7 +343,7 @@
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/proc/assess_patient(mob/living/carbon/C)
|
||||
//Time to see if they need medical help!
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
return FALSE //welp too late for them!
|
||||
|
||||
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
|
||||
@@ -421,7 +421,7 @@
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
if(C.stat == DEAD || (HAS_TRAIT(C, TRAIT_FAKEDEATH)))
|
||||
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/medbot/no.ogg',"Live, damnit! LIVE!" = 'sound/voice/medbot/live.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/medbot/lost.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
|
||||
@@ -343,7 +343,7 @@
|
||||
/mob/living/simple_animal/hostile/construct/harvester/AttackingTarget()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.has_trait(TRAIT_NODISMEMBER))
|
||||
if(HAS_TRAIT(C, TRAIT_NODISMEMBER))
|
||||
return ..() //ATTACK!
|
||||
var/list/parts = list()
|
||||
var/undismembermerable_limbs = 0
|
||||
|
||||
@@ -43,7 +43,7 @@
|
||||
// Changeling egg can survive in aliens!
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.stat == DEAD)
|
||||
if(C.has_trait(TRAIT_XENO_HOST))
|
||||
if(HAS_TRAIT(C, TRAIT_XENO_HOST))
|
||||
to_chat(src, "<span class='userdanger'>A foreign presence repels us from this body. Perhaps we should try to infest another?</span>")
|
||||
return
|
||||
Infect(target)
|
||||
|
||||
@@ -558,7 +558,7 @@ Difficulty: Very Hard
|
||||
H.regenerate_limbs()
|
||||
H.regenerate_organs()
|
||||
H.revive(1,0)
|
||||
H.add_trait(TRAIT_NOCLONE, MAGIC_TRAIT) //Free revives, but significantly limits your options for reviving except via the crystal
|
||||
ADD_TRAIT(H, TRAIT_NOCLONE, MAGIC_TRAIT) //Free revives, but significantly limits your options for reviving except via the crystal
|
||||
H.grab_ghost(force = TRUE)
|
||||
|
||||
/obj/machinery/anomalous_crystal/helpers //Lets ghost spawn as helpful creatures that can only heal people slightly. Incredibly fragile and they can't converse with humans
|
||||
@@ -721,7 +721,7 @@ Difficulty: Very Hard
|
||||
if(isliving(A) && holder_animal)
|
||||
var/mob/living/L = A
|
||||
L.notransform = 1
|
||||
L.add_trait(TRAIT_MUTE, STASIS_MUTE)
|
||||
ADD_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
|
||||
L.status_flags |= GODMODE
|
||||
L.mind.transfer_to(holder_animal)
|
||||
var/obj/effect/proc_holder/spell/targeted/exit_possession/P = new /obj/effect/proc_holder/spell/targeted/exit_possession
|
||||
@@ -731,7 +731,7 @@ Difficulty: Very Hard
|
||||
/obj/structure/closet/stasis/dump_contents(var/kill = 1)
|
||||
STOP_PROCESSING(SSobj, src)
|
||||
for(var/mob/living/L in src)
|
||||
L.remove_trait(TRAIT_MUTE, STASIS_MUTE)
|
||||
REMOVE_TRAIT(L, TRAIT_MUTE, STASIS_MUTE)
|
||||
L.status_flags &= ~GODMODE
|
||||
L.notransform = 0
|
||||
if(holder_animal)
|
||||
|
||||
@@ -30,7 +30,7 @@ Cross Blasts and the AoE burst gain additional range as Hierophant loses health,
|
||||
When Hierophant dies, it stops trying to murder you and shrinks into a small form, which, while much weaker, is still quite effective.
|
||||
- The smaller club can place a teleport beacon, allowing the user to teleport themself and their allies to the beacon.
|
||||
|
||||
Difficulty: Hard
|
||||
Difficulty: Normal
|
||||
|
||||
*/
|
||||
|
||||
@@ -47,11 +47,11 @@ Difficulty: Hard
|
||||
icon = 'icons/mob/lavaland/hierophant_new.dmi'
|
||||
faction = list("boss") //asteroid mobs? get that shit out of my beautiful square house
|
||||
speak_emote = list("preaches")
|
||||
armour_penetration = 50
|
||||
armour_penetration = 75
|
||||
melee_damage_lower = 15
|
||||
melee_damage_upper = 15
|
||||
melee_damage_upper = 20
|
||||
speed = 1
|
||||
move_to_delay = 10
|
||||
move_to_delay = 11
|
||||
ranged = 1
|
||||
ranged_cooldown_time = 40
|
||||
aggro_vision_range = 21 //so it can see to one side of the arena to the other
|
||||
|
||||
@@ -1,71 +1,71 @@
|
||||
/mob/living/simple_animal/hostile/tree
|
||||
name = "pine tree"
|
||||
desc = "A pissed off tree-like alien. It seems annoyed with the festivities..."
|
||||
icon = 'icons/obj/flora/pinetrees.dmi'
|
||||
icon_state = "pine_1"
|
||||
icon_living = "pine_1"
|
||||
icon_dead = "pine_1"
|
||||
icon_gib = "pine_1"
|
||||
gender = NEUTER
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
response_help = "brushes"
|
||||
response_disarm = "pushes"
|
||||
response_harm = "hits"
|
||||
speed = 1
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
pixel_x = -16
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 12
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
speak_emote = list("pines")
|
||||
emote_taunt = list("growls")
|
||||
taunt_chance = 20
|
||||
|
||||
atmos_requirements = list("min_oxy" = 2, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 5
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1200
|
||||
|
||||
faction = list("hostile")
|
||||
deathmessage = "is hacked into pieces!"
|
||||
loot = list(/obj/item/stack/sheet/mineral/wood)
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/Life()
|
||||
..()
|
||||
if(isopenturf(loc))
|
||||
var/turf/open/T = src.loc
|
||||
if(T.air && T.air.gases[/datum/gas/carbon_dioxide])
|
||||
var/co2 = T.air.gases[/datum/gas/carbon_dioxide][MOLES]
|
||||
if(co2 > 0)
|
||||
if(prob(25))
|
||||
var/amt = min(co2, 9)
|
||||
T.air.gases[/datum/gas/carbon_dioxide][MOLES] -= amt
|
||||
T.atmos_spawn_air("o2=[amt]")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/AttackingTarget()
|
||||
. = ..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(prob(15))
|
||||
C.Knockdown(60)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/festivus
|
||||
name = "festivus pole"
|
||||
desc = "Serenity now... SERENITY NOW!"
|
||||
icon_state = "festivus_pole"
|
||||
icon_living = "festivus_pole"
|
||||
icon_dead = "festivus_pole"
|
||||
icon_gib = "festivus_pole"
|
||||
loot = list(/obj/item/stack/rods)
|
||||
speak_emote = list("polls")
|
||||
/mob/living/simple_animal/hostile/tree
|
||||
name = "pine tree"
|
||||
desc = "A pissed off tree-like alien. It seems annoyed with the festivities..."
|
||||
icon = 'icons/obj/flora/pinetrees.dmi'
|
||||
icon_state = "pine_1"
|
||||
icon_living = "pine_1"
|
||||
icon_dead = "pine_1"
|
||||
icon_gib = "pine_1"
|
||||
gender = NEUTER
|
||||
speak_chance = 0
|
||||
turns_per_move = 5
|
||||
response_help = "brushes"
|
||||
response_disarm = "pushes"
|
||||
response_harm = "hits"
|
||||
speed = 1
|
||||
maxHealth = 250
|
||||
health = 250
|
||||
mob_size = MOB_SIZE_LARGE
|
||||
|
||||
pixel_x = -16
|
||||
|
||||
harm_intent_damage = 5
|
||||
melee_damage_lower = 8
|
||||
melee_damage_upper = 12
|
||||
attacktext = "bites"
|
||||
attack_sound = 'sound/weapons/bite.ogg'
|
||||
speak_emote = list("pines")
|
||||
emote_taunt = list("growls")
|
||||
taunt_chance = 20
|
||||
|
||||
atmos_requirements = list("min_oxy" = 2, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
unsuitable_atmos_damage = 5
|
||||
minbodytemp = 0
|
||||
maxbodytemp = 1200
|
||||
|
||||
faction = list("hostile")
|
||||
deathmessage = "is hacked into pieces!"
|
||||
loot = list(/obj/item/stack/sheet/mineral/wood)
|
||||
gold_core_spawnable = HOSTILE_SPAWN
|
||||
del_on_death = 1
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/Life()
|
||||
..()
|
||||
if(isopenturf(loc))
|
||||
var/turf/open/T = src.loc
|
||||
if(T.air && T.air.gases[/datum/gas/carbon_dioxide])
|
||||
var/co2 = T.air.gases[/datum/gas/carbon_dioxide]
|
||||
if(co2 > 0)
|
||||
if(prob(25))
|
||||
var/amt = min(co2, 9)
|
||||
T.air.gases[/datum/gas/carbon_dioxide] -= amt
|
||||
T.atmos_spawn_air("o2=[amt]")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/AttackingTarget()
|
||||
. = ..()
|
||||
if(iscarbon(target))
|
||||
var/mob/living/carbon/C = target
|
||||
if(prob(15))
|
||||
C.Knockdown(60)
|
||||
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
|
||||
"<span class='userdanger'>\The [src] knocks you down!</span>")
|
||||
|
||||
/mob/living/simple_animal/hostile/tree/festivus
|
||||
name = "festivus pole"
|
||||
desc = "Serenity now... SERENITY NOW!"
|
||||
icon_state = "festivus_pole"
|
||||
icon_living = "festivus_pole"
|
||||
icon_dead = "festivus_pole"
|
||||
icon_gib = "festivus_pole"
|
||||
loot = list(/obj/item/stack/rods)
|
||||
speak_emote = list("polls")
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
@@ -132,7 +132,7 @@
|
||||
if(stat != DEAD)
|
||||
var/bz_percentage =0
|
||||
if(environment.gases[/datum/gas/bz])
|
||||
bz_percentage = environment.gases[/datum/gas/bz][MOLES] / environment.total_moles()
|
||||
bz_percentage = environment.gases[/datum/gas/bz] / environment.total_moles()
|
||||
var/stasis = (bz_percentage >= 0.05 && bodytemperature < (T0C + 100)) || force_stasis
|
||||
|
||||
if(stat == CONSCIOUS && stasis)
|
||||
|
||||
@@ -15,7 +15,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Stun(amount, updating = TRUE, ignore_canstun = FALSE) //Can't go below remaining duration
|
||||
if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
if(absorb_stun(amount, ignore_canstun))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
@@ -26,7 +26,7 @@
|
||||
return S
|
||||
|
||||
/mob/living/proc/SetStun(amount, updating = TRUE, ignore_canstun = FALSE) //Sets remaining duration
|
||||
if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
if(amount <= 0)
|
||||
if(S)
|
||||
@@ -41,7 +41,7 @@
|
||||
return S
|
||||
|
||||
/mob/living/proc/AdjustStun(amount, updating = TRUE, ignore_canstun = FALSE) //Adds to remaining duration
|
||||
if(((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canstun)
|
||||
if(absorb_stun(amount, ignore_canstun))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/stun/S = IsStun()
|
||||
@@ -63,7 +63,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Knockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Can't go below remaining duration
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
@@ -74,7 +74,7 @@
|
||||
return K
|
||||
|
||||
/mob/living/proc/SetKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Sets remaining duration
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
if(amount <= 0)
|
||||
if(K)
|
||||
@@ -89,7 +89,7 @@
|
||||
return K
|
||||
|
||||
/mob/living/proc/AdjustKnockdown(amount, updating = TRUE, ignore_canknockdown = FALSE) //Adds to remaining duration
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
@@ -140,19 +140,8 @@
|
||||
|
||||
/////////////////////////////////// DISABILITIES ////////////////////////////////////
|
||||
|
||||
/mob/living/proc/add_trait(trait, source)
|
||||
if(!status_traits[trait])
|
||||
status_traits[trait] = list(source)
|
||||
on_add_trait(trait, source)
|
||||
else
|
||||
status_traits[trait] |= list(source)
|
||||
|
||||
/mob/living/proc/on_add_trait(trait, source)
|
||||
if(trait == TRAIT_IGNORESLOWDOWN)
|
||||
update_movespeed(FALSE)
|
||||
|
||||
/mob/living/proc/add_quirk(quirk, spawn_effects) //separate proc due to the way these ones are handled
|
||||
if(has_trait(quirk))
|
||||
if(HAS_TRAIT(src, quirk))
|
||||
return
|
||||
if(!SSquirks || !SSquirks.quirks[quirk])
|
||||
return
|
||||
@@ -160,119 +149,54 @@
|
||||
new T (src, spawn_effects)
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/remove_trait(trait, list/sources, force)
|
||||
if(!status_traits[trait])
|
||||
return
|
||||
|
||||
if(locate(ROUNDSTART_TRAIT) in status_traits[trait] && !force) //mob traits applied through roundstart cannot normally be removed
|
||||
return
|
||||
|
||||
if(!sources) // No defined source cures the trait entirely.
|
||||
status_traits -= trait
|
||||
on_remove_trait(trait, sources, force)
|
||||
return
|
||||
|
||||
if(!islist(sources))
|
||||
sources = list(sources)
|
||||
|
||||
if(LAZYLEN(sources))
|
||||
for(var/S in sources)
|
||||
if(S in status_traits[trait])
|
||||
status_traits[trait] -= S
|
||||
else
|
||||
status_traits[trait] = list()
|
||||
|
||||
if(!LAZYLEN(status_traits[trait]))
|
||||
status_traits -= trait
|
||||
on_remove_trait(trait, sources, force)
|
||||
|
||||
/mob/living/proc/on_remove_trait(trait, list/sources, force)
|
||||
if(trait == TRAIT_IGNORESLOWDOWN)
|
||||
update_movespeed(FALSE)
|
||||
|
||||
/mob/living/proc/remove_quirk(quirk)
|
||||
var/datum/quirk/T = roundstart_quirks[quirk]
|
||||
if(T)
|
||||
qdel(T)
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/has_trait(trait, list/sources)
|
||||
if(!status_traits[trait])
|
||||
return FALSE
|
||||
|
||||
. = FALSE
|
||||
|
||||
if(sources && !islist(sources))
|
||||
sources = list(sources)
|
||||
if(LAZYLEN(sources))
|
||||
for(var/S in sources)
|
||||
if(S in status_traits[trait])
|
||||
return TRUE
|
||||
else if(LAZYLEN(status_traits[trait]))
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/has_quirk(quirk)
|
||||
return roundstart_quirks[quirk]
|
||||
|
||||
/mob/living/proc/remove_all_traits(remove_species_traits = FALSE, remove_organ_traits = FALSE, remove_quirks = FALSE)
|
||||
|
||||
var/list/blacklisted_sources = list()
|
||||
if(!remove_species_traits)
|
||||
blacklisted_sources += SPECIES_TRAIT
|
||||
if(!remove_organ_traits)
|
||||
blacklisted_sources += ORGAN_TRAIT
|
||||
if(!remove_quirks)
|
||||
blacklisted_sources += ROUNDSTART_TRAIT
|
||||
|
||||
for(var/kebab in status_traits)
|
||||
var/skip
|
||||
for(var/S in blacklisted_sources)
|
||||
if(S in status_traits[kebab])
|
||||
skip = TRUE
|
||||
break
|
||||
if(!skip)
|
||||
remove_trait(kebab, null, TRUE)
|
||||
CHECK_TICK
|
||||
|
||||
/////////////////////////////////// TRAIT PROCS ////////////////////////////////////
|
||||
|
||||
/mob/living/proc/cure_blind(list/sources)
|
||||
remove_trait(TRAIT_BLIND, sources)
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
REMOVE_TRAIT(src, TRAIT_BLIND, sources)
|
||||
if(!HAS_TRAIT(src, TRAIT_BLIND))
|
||||
adjust_blindness(-1)
|
||||
|
||||
/mob/living/proc/become_blind(source)
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
if(!HAS_TRAIT(src, TRAIT_BLIND))
|
||||
blind_eyes(1)
|
||||
add_trait(TRAIT_BLIND, source)
|
||||
ADD_TRAIT(src, TRAIT_BLIND, source)
|
||||
|
||||
/mob/living/proc/cure_nearsighted(list/sources)
|
||||
remove_trait(TRAIT_NEARSIGHT, sources)
|
||||
if(!has_trait(TRAIT_NEARSIGHT))
|
||||
REMOVE_TRAIT(src, TRAIT_NEARSIGHT, sources)
|
||||
if(!HAS_TRAIT(src, TRAIT_NEARSIGHT))
|
||||
clear_fullscreen("nearsighted")
|
||||
|
||||
/mob/living/proc/become_nearsighted(source)
|
||||
if(!has_trait(TRAIT_NEARSIGHT))
|
||||
if(!HAS_TRAIT(src, TRAIT_NEARSIGHT))
|
||||
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
|
||||
add_trait(TRAIT_NEARSIGHT, source)
|
||||
ADD_TRAIT(src, TRAIT_NEARSIGHT, source)
|
||||
|
||||
/mob/living/proc/cure_husk(list/sources)
|
||||
remove_trait(TRAIT_HUSK, sources)
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
remove_trait(TRAIT_DISFIGURED, "husk")
|
||||
REMOVE_TRAIT(src, TRAIT_HUSK, sources)
|
||||
if(!HAS_TRAIT(src, TRAIT_HUSK))
|
||||
REMOVE_TRAIT(src, TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/become_husk(source)
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
add_trait(TRAIT_DISFIGURED, "husk")
|
||||
if(!HAS_TRAIT(src, TRAIT_HUSK))
|
||||
ADD_TRAIT(src, TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
. = TRUE
|
||||
add_trait(TRAIT_HUSK, source)
|
||||
ADD_TRAIT(src, TRAIT_HUSK, source)
|
||||
|
||||
/mob/living/proc/cure_fakedeath(list/sources)
|
||||
remove_trait(TRAIT_FAKEDEATH, sources)
|
||||
remove_trait(TRAIT_DEATHCOMA, sources)
|
||||
REMOVE_TRAIT(src, TRAIT_FAKEDEATH, sources)
|
||||
REMOVE_TRAIT(src, TRAIT_DEATHCOMA, sources)
|
||||
if(stat != DEAD)
|
||||
tod = null
|
||||
update_stat()
|
||||
@@ -282,7 +206,15 @@
|
||||
return
|
||||
if(!silent)
|
||||
emote("deathgasp")
|
||||
add_trait(TRAIT_FAKEDEATH, source)
|
||||
add_trait(TRAIT_DEATHCOMA, source)
|
||||
ADD_TRAIT(src, TRAIT_FAKEDEATH, source)
|
||||
ADD_TRAIT(src, TRAIT_DEATHCOMA, source)
|
||||
tod = STATION_TIME_TIMESTAMP("hh:mm:ss")
|
||||
update_stat()
|
||||
update_stat()
|
||||
|
||||
/mob/living/proc/unignore_slowdown(list/sources)
|
||||
REMOVE_TRAIT(src, TRAIT_IGNORESLOWDOWN, sources)
|
||||
update_movespeed(FALSE)
|
||||
|
||||
/mob/living/proc/ignore_slowdown(source)
|
||||
ADD_TRAIT(src, TRAIT_IGNORESLOWDOWN, source)
|
||||
update_movespeed(FALSE)
|
||||
@@ -9,7 +9,7 @@
|
||||
|
||||
/mob/living/carbon/get_taste_sensitivity()
|
||||
var/obj/item/organ/tongue/tongue = getorganslot(ORGAN_SLOT_TONGUE)
|
||||
if(istype(tongue) && !has_trait(TRAIT_AGEUSIA))
|
||||
if(istype(tongue) && !HAS_TRAIT(src, TRAIT_AGEUSIA))
|
||||
. = tongue.taste_sensitivity
|
||||
else
|
||||
. = 101 // can't taste anything without a tongue
|
||||
|
||||
@@ -67,8 +67,8 @@
|
||||
t += "<span class='danger'>Temperature: [environment.temperature] \n</span>"
|
||||
for(var/id in environment.gases)
|
||||
var/gas = environment.gases[id]
|
||||
if(gas[MOLES])
|
||||
t+="<span class='notice'>[gas[GAS_META][META_GAS_NAME]]: [gas[MOLES]] \n</span>"
|
||||
if(gas)
|
||||
t+="<span class='notice'>[GLOB.meta_gas_names[id]]: [gas] \n</span>"
|
||||
|
||||
to_chat(usr, t)
|
||||
|
||||
|
||||
@@ -8,7 +8,7 @@
|
||||
if(ismob(mover))
|
||||
if (mover in buckled_mobs)
|
||||
return TRUE
|
||||
return (!mover.density || !density || lying)
|
||||
return (!mover.density || !density || lying || (mover.throwing && mover.throwing.thrower == src && !ismob(mover)))
|
||||
|
||||
//DO NOT USE THIS UNLESS YOU ABSOLUTELY HAVE TO. THIS IS BEING PHASED OUT FOR THE MOVESPEED MODIFICATION SYSTEM.
|
||||
//See mob_movespeed.dm
|
||||
|
||||
@@ -7,9 +7,9 @@
|
||||
/mob/proc/update_flavor_text()
|
||||
set src in usr
|
||||
if(usr != src)
|
||||
usr << "No."
|
||||
to_chat(usr, "No.")
|
||||
var/msg = stripped_multiline_input(usr, "Set the flavor text in your 'examine' verb. This can also be used for OOC notes and preferences!", "Flavor Text", html_decode(flavor_text), MAX_MESSAGE_LEN*2, TRUE)
|
||||
|
||||
|
||||
if(!isnull(msg))
|
||||
msg = copytext(msg, 1, MAX_MESSAGE_LEN)
|
||||
msg = html_encode(msg)
|
||||
@@ -18,8 +18,8 @@
|
||||
|
||||
/mob/proc/warn_flavor_changed()
|
||||
if(flavor_text && flavor_text != "") // don't spam people that don't use it!
|
||||
src << "<h2 class='alert'>OOC Warning:</h2>"
|
||||
src << "<span class='alert'>Your flavor text is likely out of date! <a href='?src=[REF(src)];flavor_change=1'>Change</a></span>"
|
||||
to_chat(src, "<h2 class='alert'>OOC Warning:</h2>")
|
||||
to_chat(src, "<span class='alert'>Your flavor text is likely out of date! <a href='?src=[REF(src)];flavor_change=1'>Change</a></span>")
|
||||
|
||||
/mob/proc/print_flavor_text()
|
||||
if(flavor_text && flavor_text != "")
|
||||
@@ -117,6 +117,73 @@ proc/get_top_level_mob(var/mob/S)
|
||||
message = null
|
||||
emote_type = EMOTE_VISIBLE
|
||||
|
||||
///////////////// SUBTLE 2: NO GHOST BOOGALOO
|
||||
|
||||
/datum/emote/living/subtler
|
||||
key = "subtler"
|
||||
key_third_person = "subtler"
|
||||
message = null
|
||||
mob_type_blacklist_typecache = list(/mob/living/brain)
|
||||
|
||||
|
||||
/datum/emote/living/subtler/proc/check_invalid(mob/user, input)
|
||||
. = TRUE
|
||||
if(copytext(input,1,5) == "says")
|
||||
to_chat(user, "<span class='danger'>Invalid emote.</span>")
|
||||
else if(copytext(input,1,9) == "exclaims")
|
||||
to_chat(user, "<span class='danger'>Invalid emote.</span>")
|
||||
else if(copytext(input,1,6) == "yells")
|
||||
to_chat(user, "<span class='danger'>Invalid emote.</span>")
|
||||
else if(copytext(input,1,5) == "asks")
|
||||
to_chat(user, "<span class='danger'>Invalid emote.</span>")
|
||||
else
|
||||
. = FALSE
|
||||
|
||||
/datum/emote/living/subtler/run_emote(mob/user, params, type_override = null)
|
||||
if(jobban_isbanned(user, "emote"))
|
||||
to_chat(user, "You cannot send subtle emotes (banned).")
|
||||
return FALSE
|
||||
else if(user.client && user.client.prefs.muted & MUTE_IC)
|
||||
to_chat(user, "You cannot send IC messages (muted).")
|
||||
return FALSE
|
||||
else if(!params)
|
||||
var/subtle_emote = copytext(sanitize(input("Choose an emote to display.") as message|null), 1, MAX_MESSAGE_LEN)
|
||||
if(subtle_emote && !check_invalid(user, subtle_emote))
|
||||
var/type = input("Is this a visible or hearable emote?") as null|anything in list("Visible", "Hearable")
|
||||
switch(type)
|
||||
if("Visible")
|
||||
emote_type = EMOTE_VISIBLE
|
||||
if("Hearable")
|
||||
emote_type = EMOTE_AUDIBLE
|
||||
else
|
||||
alert("Unable to use this emote, must be either hearable or visible.")
|
||||
return
|
||||
message = subtle_emote
|
||||
else
|
||||
return FALSE
|
||||
else
|
||||
message = params
|
||||
if(type_override)
|
||||
emote_type = type_override
|
||||
. = TRUE
|
||||
if(!can_run_emote(user))
|
||||
return FALSE
|
||||
|
||||
user.log_message(message, INDIVIDUAL_EMOTE_LOG)
|
||||
message = "<b>[user]</b> " + "<i>[message]</i>"
|
||||
|
||||
for(var/mob/M)
|
||||
if(M in list(/mob/living))
|
||||
M.show_message(message)
|
||||
|
||||
if(emote_type == EMOTE_AUDIBLE)
|
||||
user.audible_message(message=message,hearing_distance=1)
|
||||
else
|
||||
user.visible_message(message=message,self_message=message,vision_distance=1)
|
||||
log_emote("[key_name(user)] : [message]")
|
||||
|
||||
message = null
|
||||
|
||||
///////////////// VERB CODE
|
||||
/mob/living/verb/subtle()
|
||||
set name = "Subtle"
|
||||
@@ -125,3 +192,12 @@ proc/get_top_level_mob(var/mob/S)
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
usr.emote("subtle")
|
||||
|
||||
///////////////// VERB CODE 2
|
||||
/mob/living/verb/subtler()
|
||||
set name = "Subtler Anti-Ghost"
|
||||
set category = "IC"
|
||||
if(GLOB.say_disabled) //This is here to try to identify lag problems
|
||||
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
|
||||
return
|
||||
usr.emote("subtler")
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Unconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Can't go below remaining duration
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
|
||||
if(U)
|
||||
U.duration = max(world.time + amount, U.duration)
|
||||
@@ -37,7 +37,7 @@
|
||||
return U
|
||||
|
||||
/mob/living/proc/SetUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Sets remaining duration
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
|
||||
if(amount <= 0)
|
||||
if(U)
|
||||
@@ -49,7 +49,7 @@
|
||||
return U
|
||||
|
||||
/mob/living/proc/AdjustUnconscious(amount, updating = TRUE, ignore_canunconscious = FALSE) //Adds to remaining duration
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !HAS_TRAIT(src, TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
|
||||
if(U)
|
||||
U.duration += amount
|
||||
@@ -72,7 +72,7 @@
|
||||
return 0
|
||||
|
||||
/mob/living/proc/Sleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Can't go below remaining duration
|
||||
if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
|
||||
if(S)
|
||||
S.duration = max(world.time + amount, S.duration)
|
||||
@@ -81,7 +81,7 @@
|
||||
return S
|
||||
|
||||
/mob/living/proc/SetSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Sets remaining duration
|
||||
if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
|
||||
if(amount <= 0)
|
||||
if(S)
|
||||
@@ -93,7 +93,7 @@
|
||||
return S
|
||||
|
||||
/mob/living/proc/AdjustSleeping(amount, updating = TRUE, ignore_sleepimmune = FALSE) //Adds to remaining duration
|
||||
if((!has_trait(TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
if((!HAS_TRAIT(src, TRAIT_SLEEPIMMUNE)) || ignore_sleepimmune)
|
||||
var/datum/status_effect/incapacitating/sleeping/S = IsSleeping()
|
||||
if(S)
|
||||
S.duration += amount
|
||||
@@ -170,7 +170,7 @@
|
||||
blind_minimum = 1
|
||||
if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if(L.has_trait(TRAIT_BLIND))
|
||||
if(HAS_TRAIT(L, TRAIT_BLIND))
|
||||
blind_minimum = 1
|
||||
eye_blind = max(eye_blind+amount, blind_minimum)
|
||||
if(!eye_blind)
|
||||
@@ -191,7 +191,7 @@
|
||||
blind_minimum = 1
|
||||
if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if(L.has_trait(TRAIT_BLIND))
|
||||
if(HAS_TRAIT(L, TRAIT_BLIND))
|
||||
blind_minimum = 1
|
||||
eye_blind = blind_minimum
|
||||
if(!eye_blind)
|
||||
|
||||
Reference in New Issue
Block a user