Tg 1 28 sync testing/confirmation (#5178)
* maps, tgui, tools * defines and helpers * onclick and controllers * datums fucking caught that hulk reversal too. * game and shuttle modular * module/admin * oh god they fucking moved antag shit again * haaaaate. Haaaaaaaaaate. * enables moff wings * more modules things * tgstation.dme before I forget something important * some mob stuff * s'more mob/living stuff * some carbon stuff * ayy lmaos and kitchen meat * Human stuff * species things moff wings have a 'none' version too * the rest of the module stuff. * some strings * misc * mob icons * some other icons. * It compiles FUCK BORERS FUCK BORERS
This commit is contained in:
@@ -1401,3 +1401,72 @@
|
||||
|
||||
/datum/sprite_accessory/legs/digitigrade_lizard
|
||||
name = "Digitigrade Legs"
|
||||
|
||||
/datum/sprite_accessory/moth_wings
|
||||
icon = 'icons/mob/wings.dmi'
|
||||
color_src = null
|
||||
|
||||
/datum/sprite_accessory/moth_wings/plain
|
||||
name = "Plain"
|
||||
icon_state = "plain"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/monarch
|
||||
name = "Monarch"
|
||||
icon_state = "monarch"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/luna
|
||||
name = "Luna"
|
||||
icon_state = "luna"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/atlas
|
||||
name = "Atlas"
|
||||
icon_state = "atlas"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/reddish
|
||||
name = "Reddish"
|
||||
icon_state = "redish"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/royal
|
||||
name = "Royal"
|
||||
icon_state = "royal"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/gothic
|
||||
name = "Gothic"
|
||||
icon_state = "gothic"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/lovers
|
||||
name = "Lovers"
|
||||
icon_state = "lovers"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/whitefly
|
||||
name = "White Fly"
|
||||
icon_state = "whitefly"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/punished
|
||||
name = "Burnt Off"
|
||||
icon_state = "punished"
|
||||
locked = TRUE
|
||||
|
||||
/datum/sprite_accessory/moth_wings/firewatch
|
||||
name = "Firewatch"
|
||||
icon_state = "firewatch"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/deathhead
|
||||
name = "Deathshead"
|
||||
icon_state = "deathhead"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/poison
|
||||
name = "Poison"
|
||||
icon_state = "poison"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/ragged
|
||||
name = "Ragged"
|
||||
icon_state = "ragged"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/moonfly
|
||||
name = "Moon Fly"
|
||||
icon_state = "moonfly"
|
||||
|
||||
/datum/sprite_accessory/moth_wings/snow
|
||||
name = "Snow"
|
||||
icon_state = "snow"
|
||||
|
||||
@@ -13,6 +13,10 @@
|
||||
icon = 'icons/mob/mam_bodyparts.dmi'
|
||||
*/
|
||||
|
||||
/datum/sprite_accessory/moth_wings/none
|
||||
name = "None"
|
||||
icon_state = "none"
|
||||
|
||||
/***************** Alphabetical Order please ***************
|
||||
************* Keep it to Ears, Tails, Tails Animated *********/
|
||||
|
||||
|
||||
@@ -16,7 +16,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/monkey/handle_blood()
|
||||
if(bodytemperature >= TCRYO && !(has_disability(DISABILITY_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
if(bodytemperature >= TCRYO && !(has_trait(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_volume += 0.1 // regenerate blood VERY slowly
|
||||
@@ -28,7 +28,7 @@
|
||||
bleed_rate = 0
|
||||
return
|
||||
|
||||
if(bodytemperature >= TCRYO && !(has_disability(DISABILITY_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
if(bodytemperature >= TCRYO && !(has_trait(TRAIT_NOCLONE))) //cryosleep or husked people do not pump the blood.
|
||||
|
||||
//Blood regeneration if there is some space
|
||||
if(blood_volume < BLOOD_VOLUME_NORMAL && !(NOHUNGER in dna.species.species_traits))
|
||||
@@ -84,7 +84,7 @@
|
||||
|
||||
bleed_rate = max(bleed_rate - 0.5, temp_bleed)//if no wounds, other bleed effects (heparin) naturally decreases
|
||||
|
||||
if(bleed_rate && !bleedsuppress && !(status_flags & FAKEDEATH))
|
||||
if(bleed_rate && !bleedsuppress && !(has_trait(TRAIT_FAKEDEATH)))
|
||||
bleed(bleed_rate)
|
||||
|
||||
//Makes a blood drop, leaking amt units of blood from the mob
|
||||
@@ -201,13 +201,13 @@
|
||||
return "blood"
|
||||
|
||||
/mob/living/carbon/monkey/get_blood_id()
|
||||
if(!(has_disability(DISABILITY_NOCLONE)))
|
||||
if(!(has_trait(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_disability(DISABILITY_NOCLONE)))
|
||||
else if((NOBLOOD in dna.species.species_traits) || (has_trait(TRAIT_NOCLONE)))
|
||||
return
|
||||
return "blood"
|
||||
|
||||
|
||||
@@ -25,7 +25,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.status_flags & FAKEDEATH)))
|
||||
if(brainmob && !(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH))))
|
||||
to_chat(brainmob, "<span class = danger>You can't feel your body! You're still just a brain!</span>")
|
||||
forceMove(C)
|
||||
C.update_hair()
|
||||
@@ -79,8 +79,8 @@
|
||||
if(!brainmob.stored_dna)
|
||||
brainmob.stored_dna = new /datum/dna/stored(brainmob)
|
||||
C.dna.copy_dna(brainmob.stored_dna)
|
||||
if(L.has_disability(DISABILITY_NOCLONE))
|
||||
brainmob.disabilities[DISABILITY_NOCLONE] = L.disabilities[DISABILITY_NOCLONE]
|
||||
if(L.has_trait(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)
|
||||
brainmob.set_species(ZI.old_species) //For if the brain is cloned
|
||||
|
||||
@@ -1,8 +1,6 @@
|
||||
|
||||
/mob/living/brain/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
if(!loc)
|
||||
@@ -34,7 +32,7 @@
|
||||
/mob/living/brain/handle_status_effects()
|
||||
return
|
||||
|
||||
/mob/living/brain/handle_disabilities()
|
||||
/mob/living/brain/handle_traits()
|
||||
return
|
||||
|
||||
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness
|
||||
// eye damage, eye_blind, eye_blurry, druggy, DISABILITY_BLIND disability, and DISABILITY_NEARSIGHT disability.
|
||||
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
|
||||
|
||||
/////////////////////////////////// EYE_BLIND ////////////////////////////////////
|
||||
|
||||
|
||||
@@ -110,7 +110,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.status_flags & XENO_HOST)
|
||||
if(L.has_trait(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]")
|
||||
|
||||
@@ -2,8 +2,6 @@
|
||||
|
||||
/mob/living/carbon/alien/larva/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
if(..()) //not dead
|
||||
@@ -20,7 +18,7 @@
|
||||
if(health<= -maxHealth || !getorgan(/obj/item/organ/brain))
|
||||
death()
|
||||
return
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_CRIT)
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (has_trait(TRAIT_FAKEDEATH)) || health <= HEALTH_THRESHOLD_CRIT)
|
||||
if(stat == CONSCIOUS)
|
||||
stat = UNCONSCIOUS
|
||||
blind_eyes(1)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage,
|
||||
// eye damage, eye_blind, eye_blurry, druggy, DISABILITY_BLIND disability, and DISABILITY_NEARSIGHT disability.
|
||||
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
|
||||
|
||||
/////////////////////////////////// STUN ////////////////////////////////////
|
||||
|
||||
|
||||
@@ -157,7 +157,7 @@
|
||||
if(!throwable_mob.buckled)
|
||||
thrown_thing = throwable_mob
|
||||
stop_pulling()
|
||||
if(has_disability(DISABILITY_PACIFISM))
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You gently let go of [throwable_mob].</span>")
|
||||
var/turf/start_T = get_turf(loc) //Get the start and target tile for the descriptors
|
||||
var/turf/end_T = get_turf(target)
|
||||
@@ -170,7 +170,7 @@
|
||||
thrown_thing = I
|
||||
dropItemToGround(I)
|
||||
|
||||
if(has_disability(DISABILITY_PACIFISM) && I.throwforce)
|
||||
if(has_trait(TRAIT_PACIFISM) && I.throwforce)
|
||||
to_chat(src, "<span class='notice'>You set [I] down gently on the ground.</span>")
|
||||
return
|
||||
|
||||
@@ -302,10 +302,10 @@
|
||||
|
||||
|
||||
/mob/living/carbon/proc/cuff_resist(obj/item/I, breakouttime = 600, cuff_break = 0)
|
||||
if(I.being_removed)
|
||||
if(I.item_flags & BEING_REMOVED)
|
||||
to_chat(src, "<span class='warning'>You're already attempting to remove [I]!</span>")
|
||||
return
|
||||
I.being_removed = TRUE
|
||||
I.item_flags |= BEING_REMOVED
|
||||
breakouttime = I.breakouttime
|
||||
if(!cuff_break)
|
||||
visible_message("<span class='warning'>[src] attempts to remove [I]!</span>")
|
||||
@@ -326,7 +326,7 @@
|
||||
|
||||
else if(cuff_break == INSTANT_CUFFBREAK)
|
||||
clear_cuffs(I, cuff_break)
|
||||
I.being_removed = FALSE
|
||||
I.item_flags &= ~BEING_REMOVED
|
||||
|
||||
/mob/living/carbon/proc/uncuff()
|
||||
if (handcuffed)
|
||||
@@ -402,7 +402,7 @@
|
||||
dropItemToGround(I)
|
||||
|
||||
var/modifier = 0
|
||||
if(has_disability(DISABILITY_CLUMSY))
|
||||
if(has_trait(TRAIT_CLUMSY))
|
||||
modifier -= 40 //Clumsy people are more likely to hit themselves -Honk!
|
||||
|
||||
switch(rand(1,100)+modifier) //91-100=Nothing special happens
|
||||
@@ -720,7 +720,7 @@
|
||||
if(health <= HEALTH_THRESHOLD_DEAD)
|
||||
death()
|
||||
return
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (status_flags & FAKEDEATH) || health <= HEALTH_THRESHOLD_FULLCRIT)
|
||||
if(IsUnconscious() || IsSleeping() || getOxyLoss() > 50 || (has_trait(TRAIT_FAKEDEATH)) || health <= HEALTH_THRESHOLD_FULLCRIT)
|
||||
stat = UNCONSCIOUS
|
||||
blind_eyes(1)
|
||||
else
|
||||
@@ -767,7 +767,7 @@
|
||||
reagents.addiction_list = list()
|
||||
cure_all_traumas(TRUE, TRUE)
|
||||
..()
|
||||
// heal ears after healing disabilities, since ears check DISABILITY_DEAF disability
|
||||
// heal ears after healing traits, since ears check TRAIT_DEAF trait
|
||||
// when healing.
|
||||
restoreEars()
|
||||
|
||||
@@ -852,3 +852,6 @@
|
||||
.["Hallucinate"] = "?_src_=vars;[HrefToken()];hallucinate=[REF(src)]"
|
||||
.["Give brain trauma"] = "?_src_=vars;[HrefToken()];givetrauma=[REF(src)]"
|
||||
.["Cure brain traumas"] = "?_src_=vars;[HrefToken()];curetraumas=[REF(src)]"
|
||||
|
||||
/mob/living/carbon/can_resist()
|
||||
return bodyparts.len > 2 && ..()
|
||||
|
||||
@@ -248,7 +248,7 @@
|
||||
to_chat(M, "<span class='warning'>You can't put them out with just your bare hands!</span>")
|
||||
return
|
||||
|
||||
if(health >= 0 && !(status_flags & FAKEDEATH))
|
||||
if(health >= 0 && !(has_trait(TRAIT_FAKEDEATH)))
|
||||
|
||||
if(lying)
|
||||
if(buckled)
|
||||
@@ -305,12 +305,12 @@
|
||||
|
||||
if(eyes.eye_damage > 20)
|
||||
if(prob(eyes.eye_damage - 20))
|
||||
if(!has_disability(DISABILITY_NEARSIGHT))
|
||||
if(!has_trait(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_disability(DISABILITY_BLIND))
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
to_chat(src, "<span class='warning'>You can't see anything!</span>")
|
||||
become_blind(EYE_DAMAGE)
|
||||
|
||||
|
||||
@@ -67,7 +67,7 @@
|
||||
else
|
||||
msg += "<b>[t_He] [t_is] severely deformed!</b>\n"
|
||||
|
||||
if(has_disability(DISABILITY_DUMB))
|
||||
if(has_trait(TRAIT_DUMB))
|
||||
msg += "[t_He] seem[p_s()] to be clumsy and unable to think.\n"
|
||||
|
||||
if(fire_stacks > 0)
|
||||
|
||||
@@ -42,13 +42,13 @@
|
||||
INVOKE_ASYNC(is_devil(src), /datum/antagonist/devil.proc/beginResurrectionCheck, src)
|
||||
|
||||
/mob/living/carbon/human/proc/makeSkeleton()
|
||||
status_flags |= DISFIGURED
|
||||
add_trait(TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
set_species(/datum/species/skeleton)
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/proc/Drain()
|
||||
become_husk(CHANGELING_DRAIN)
|
||||
add_disability(DISABILITY_NOCLONE, CHANGELING_DRAIN)
|
||||
add_trait(TRAIT_NOCLONE, CHANGELING_DRAIN)
|
||||
blood_volume = 0
|
||||
return 1
|
||||
|
||||
@@ -91,7 +91,6 @@
|
||||
if(istype(dicc) && dicc.is_exposed())
|
||||
msg += "[dicc.desc]\n"
|
||||
//END OF CIT CHANGES
|
||||
|
||||
//Status effects
|
||||
msg += status_effect_examines()
|
||||
|
||||
@@ -105,7 +104,7 @@
|
||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
||||
|
||||
var/appears_dead = 0
|
||||
if(stat == DEAD || (status_flags & FAKEDEATH))
|
||||
if(stat == DEAD || (has_trait(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"
|
||||
@@ -251,14 +250,13 @@
|
||||
var/datum/belly/B = vore_organs[I]
|
||||
msg += B.get_examine_msg()
|
||||
|
||||
|
||||
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_disability(DISABILITY_DUMB))
|
||||
if(has_trait(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"
|
||||
@@ -324,7 +322,7 @@
|
||||
msg += "<a href='?src=[REF(src)];hud=s;add_comment=1'>\[Add comment\]</a>\n"
|
||||
if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
|
||||
msg += "[print_flavor_text()]\n"
|
||||
|
||||
|
||||
msg += "*---------*</span>"
|
||||
|
||||
to_chat(user, msg)
|
||||
|
||||
@@ -24,9 +24,9 @@
|
||||
create_internal_organs() //most of it is done in set_species now, this is only for parent call
|
||||
|
||||
handcrafting = new()
|
||||
|
||||
|
||||
. = ..()
|
||||
|
||||
|
||||
AddComponent(/datum/component/redirect, list(COMSIG_COMPONENT_CLEAN_ACT), CALLBACK(src, .proc/clean_blood))
|
||||
|
||||
/mob/living/carbon/human/OpenCraftingMenu()
|
||||
@@ -55,11 +55,7 @@
|
||||
stat("Internal Atmosphere Info", internal.name)
|
||||
stat("Tank Pressure", internal.air_contents.return_pressure())
|
||||
stat("Distribution Pressure", internal.distribute_pressure)
|
||||
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B && B.controlling)
|
||||
stat("Chemicals", B.chemicals)
|
||||
|
||||
// var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(mind)
|
||||
var/datum/antagonist/changeling/changeling = mind.has_antag_datum(/datum/antagonist/changeling)
|
||||
if(changeling)
|
||||
@@ -208,13 +204,13 @@
|
||||
var/obj/item/I = locate(href_list["embedded_object"]) in L.embedded_objects
|
||||
if(!I || I.loc != src) //no item, no limb, or item is not in limb or in the person anymore
|
||||
return
|
||||
var/time_taken = I.embedded_unsafe_removal_time*I.w_class
|
||||
var/time_taken = I.embedding.embedded_unsafe_removal_time*I.w_class
|
||||
usr.visible_message("<span class='warning'>[usr] attempts to remove [I] from their [L.name].</span>","<span class='notice'>You attempt to remove [I] from your [L.name]... (It will take [DisplayTimeText(time_taken)].)</span>")
|
||||
if(do_after(usr, time_taken, needhand = 1, target = src))
|
||||
if(!I || !L || I.loc != src || !(I in L.embedded_objects))
|
||||
return
|
||||
L.embedded_objects -= I
|
||||
L.receive_damage(I.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
|
||||
L.receive_damage(I.embedding.embedded_unsafe_removal_pain_multiplier*I.w_class)//It hurts to rip it out, get surgery you dingus.
|
||||
I.forceMove(get_turf(src))
|
||||
usr.put_in_hands(I)
|
||||
usr.emote("scream")
|
||||
@@ -360,7 +356,7 @@
|
||||
// Checks the user has security clearence before allowing them to change arrest status via hud, comment out to enable all access
|
||||
var/allowed_access = null
|
||||
var/obj/item/clothing/glasses/G = H.glasses
|
||||
if (!G.emagged)
|
||||
if (!(G.obj_flags |= EMAGGED))
|
||||
if(H.wear_id)
|
||||
var/list/access = H.wear_id.GetAccess()
|
||||
if(ACCESS_SEC_DOORS in access)
|
||||
@@ -577,8 +573,8 @@
|
||||
threatcount += 2
|
||||
|
||||
//Check for dresscode violations
|
||||
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard))
|
||||
threatcount += 2
|
||||
if(istype(head, /obj/item/clothing/head/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/wizard) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/syndi) || istype(head, /obj/item/clothing/head/helmet/space/hardsuit/shielded/syndi))
|
||||
threatcount += 6 //fuk u antags <3
|
||||
|
||||
//Check for nonhuman scum
|
||||
if(dna && dna.species.id && !(dna.species.id in list("human" , "lizard", "mammal", "avian", "aquatic", "insect")))
|
||||
@@ -588,9 +584,13 @@
|
||||
if(isloyal())
|
||||
threatcount -= 1
|
||||
|
||||
//Agent cards lower threatlevel.
|
||||
//Agent cards lower threatlevel. But only enough to openly carry without being busted.
|
||||
if(istype(idcard, /obj/item/card/id/syndicate))
|
||||
threatcount -= 5
|
||||
threatcount -= 2
|
||||
|
||||
//CentCom cards lower threat level. Even to emagged bots.
|
||||
if(istype(idcard, /obj/item/card/id/centcom) || istype(idcard, /obj/item/card/id/ert))
|
||||
threatcount -= 10
|
||||
|
||||
return threatcount
|
||||
|
||||
@@ -621,7 +621,7 @@
|
||||
/mob/living/carbon/human/proc/do_cpr(mob/living/carbon/C)
|
||||
CHECK_DNA_AND_SPECIES(C)
|
||||
|
||||
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
to_chat(src, "<span class='warning'>[C.name] is dead!</span>")
|
||||
return
|
||||
if(is_mouth_covered())
|
||||
@@ -1032,3 +1032,17 @@
|
||||
|
||||
/mob/living/carbon/human/species/zombie/krokodil_addict
|
||||
race = /datum/species/krokodil_addict
|
||||
|
||||
//CITADEL EDIT - TODO: Enable people to set custom races
|
||||
/mob/living/carbon/human/species/mammal
|
||||
race = /datum/species/mammal
|
||||
/mob/living/carbon/human/species/avian
|
||||
race = /datum/species/avian
|
||||
/mob/living/carbon/human/species/aquatic
|
||||
race = /datum/species/aquatic
|
||||
/mob/living/carbon/human/species/insect
|
||||
race = /datum/species/insect
|
||||
/mob/living/carbon/human/species/xeno
|
||||
race = /datum/species/xeno
|
||||
/mob/living/carbon/human/species/guilmon
|
||||
race = /datum/species/guilmon
|
||||
|
||||
@@ -28,7 +28,7 @@
|
||||
if(bp && istype(bp , /obj/item/clothing))
|
||||
var/obj/item/clothing/C = bp
|
||||
if(C.body_parts_covered & def_zone.body_part)
|
||||
protection += C.armor[d_type]
|
||||
protection += C.armor.getRating(d_type)
|
||||
return protection
|
||||
|
||||
/mob/living/carbon/human/on_hit(obj/item/projectile/P)
|
||||
@@ -135,13 +135,13 @@
|
||||
else if(I)
|
||||
if(I.throw_speed >= EMBED_THROWSPEED_THRESHOLD)
|
||||
if(can_embed(I))
|
||||
if(prob(I.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits)))
|
||||
if(prob(I.embedding.embed_chance) && !(dna && (PIERCEIMMUNE in dna.species.species_traits)))
|
||||
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
|
||||
var/obj/item/bodypart/L = pick(bodyparts)
|
||||
L.embedded_objects |= I
|
||||
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
|
||||
I.forceMove(src)
|
||||
L.receive_damage(I.w_class*I.embedded_impact_pain_multiplier)
|
||||
L.receive_damage(I.w_class*I.embedding.embedded_impact_pain_multiplier)
|
||||
visible_message("<span class='danger'>[I] embeds itself in [src]'s [L.name]!</span>","<span class='userdanger'>[I] embeds itself in your [L.name]!</span>")
|
||||
hitpush = FALSE
|
||||
skipcatch = TRUE //can't catch the now embedded item
|
||||
@@ -149,7 +149,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_disability(DISABILITY_FAT)) && ismonkey(pulling))
|
||||
if(user == src && pulling && !pulling.anchored && grab_state >= GRAB_AGGRESSIVE && (has_trait(TRAIT_FAT)) && ismonkey(pulling))
|
||||
devour_mob(pulling)
|
||||
else
|
||||
..()
|
||||
@@ -602,7 +602,7 @@
|
||||
facial_hair_style = "Shaved"
|
||||
hair_style = "Bald"
|
||||
update_hair()
|
||||
status_flags |= DISFIGURED
|
||||
add_trait(TRAIT_DISFIGURED, TRAIT_GENERIC)
|
||||
|
||||
update_damage_overlays()
|
||||
|
||||
|
||||
@@ -56,7 +56,7 @@
|
||||
if( head && (head.flags_inv&HIDEFACE) )
|
||||
return if_no_face //Likewise for hats
|
||||
var/obj/item/bodypart/O = get_bodypart("head")
|
||||
if( !O || (status_flags&DISFIGURED) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
|
||||
if( !O || (has_trait(TRAIT_DISFIGURED)) || (O.brutestate+O.burnstate)>2 || cloneloss>50 || !real_name ) //disfigured. use id-name if possible
|
||||
return if_no_face
|
||||
return real_name
|
||||
|
||||
@@ -92,7 +92,7 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/IsAdvancedToolUser()
|
||||
if(has_disability(DISABILITY_MONKEYLIKE))
|
||||
if(has_trait(TRAIT_MONKEYLIKE))
|
||||
return FALSE
|
||||
return TRUE//Humans can use guns and such
|
||||
|
||||
|
||||
@@ -339,7 +339,7 @@
|
||||
if(TRAITS & TRAIT_SMART)
|
||||
smartness = 75
|
||||
else if(TRAITS & TRAIT_DUMB)
|
||||
add_disability(DISABILITY_CLUMSY, GENETIC_MUTATION)
|
||||
add_trait(TRAIT_CLUMSY, GENETIC_MUTATION)
|
||||
smartness = 25
|
||||
|
||||
if(TRAITS & TRAIT_MEAN)
|
||||
@@ -753,7 +753,6 @@
|
||||
timeout++
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/getGoodPath(target,var/maxtries=512)
|
||||
set background = 1
|
||||
var/turf/end = get_turf(target)
|
||||
|
||||
var/turf/current = get_turf(src)
|
||||
@@ -779,7 +778,6 @@
|
||||
return path
|
||||
|
||||
/mob/living/carbon/human/interactive/proc/walk2derpless(target)
|
||||
set background = 1
|
||||
if(!target)
|
||||
return 0
|
||||
|
||||
|
||||
@@ -187,7 +187,7 @@
|
||||
if(G.tint)
|
||||
update_tint()
|
||||
if(G.vision_correction)
|
||||
if(has_disability(DISABILITY_NEARSIGHT))
|
||||
if(has_trait(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))
|
||||
|
||||
@@ -22,15 +22,9 @@
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
|
||||
//citadel code
|
||||
if(stat != DEAD)
|
||||
handle_arousal()
|
||||
|
||||
if(..()) //not dead
|
||||
handle_active_genes()
|
||||
|
||||
@@ -54,15 +48,11 @@
|
||||
/mob/living/carbon/human/calculate_affecting_pressure(pressure)
|
||||
if((wear_suit && (wear_suit.flags_1 & STOPSPRESSUREDMAGE_1)) && (head && (head.flags_1 & STOPSPRESSUREDMAGE_1)))
|
||||
return ONE_ATMOSPHERE
|
||||
if(ismob(loc))
|
||||
return ONE_ATMOSPHERE
|
||||
if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||
return ONE_ATMOSPHERE
|
||||
else
|
||||
return pressure
|
||||
|
||||
|
||||
/mob/living/carbon/human/handle_disabilities()
|
||||
/mob/living/carbon/human/handle_traits()
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(tinttotal >= TINT_BLIND) //covering your eyes heals blurry eyes faster
|
||||
adjust_blindness(-3)
|
||||
@@ -71,7 +61,7 @@
|
||||
else if(eye_blurry) //blurry eyes heal slowly
|
||||
adjust_blurriness(-1)
|
||||
|
||||
if(has_disability(DISABILITY_PACIFISM) && a_intent == INTENT_HARM)
|
||||
if(has_trait(TRAIT_PACIFISM) && a_intent == INTENT_HARM)
|
||||
to_chat(src, "<span class='notice'>You don't feel like harming anybody.</span>")
|
||||
a_intent_change(INTENT_HELP)
|
||||
|
||||
@@ -127,12 +117,12 @@
|
||||
|
||||
/mob/living/carbon/human/proc/get_thermal_protection()
|
||||
var/thermal_protection = 0 //Simple check to estimate how protected we are against multiple temperatures
|
||||
|
||||
//CITADEL EDIT Vore code required overrides
|
||||
if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
if(ismob(loc))
|
||||
return FIRE_IMMUNITY_SUIT_MAX_TEMP_PROTECT
|
||||
|
||||
//END EDIT
|
||||
if(wear_suit)
|
||||
if(wear_suit.max_heat_protection_temperature >= FIRE_SUIT_MAX_TEMP_PROTECT)
|
||||
thermal_protection += (wear_suit.max_heat_protection_temperature*0.7)
|
||||
@@ -242,12 +232,15 @@
|
||||
if(dna.check_mutation(COLDRES))
|
||||
return TRUE //Fully protected from the cold.
|
||||
|
||||
if(RESISTCOLD in dna.species.species_traits)
|
||||
return TRUE
|
||||
|
||||
//CITADEL EDIT Mandatory for vore code.
|
||||
if(istype(loc, /obj/item/device/dogborg/sleeper))
|
||||
return 1 //freezing to death in sleepers ruins fun.
|
||||
if(ismob(loc))
|
||||
return 1 //because lazy and being inside somemone insulates you from space
|
||||
if(RESISTCOLD in dna.species.species_traits)
|
||||
return TRUE
|
||||
//END EDIT
|
||||
|
||||
temperature = max(temperature, 2.7) //There is an occasional bug where the temperature is miscalculated in ares with a small amount of gas on them, so this is necessary to ensure that that bug does not affect this calculation. Space's temperature is 2.7K and most suits that are intended to protect against any cold, protect down to 2.0K.
|
||||
var/thermal_protection_flags = get_cold_protection_flags(temperature)
|
||||
@@ -308,12 +301,12 @@
|
||||
for(var/X in bodyparts)
|
||||
var/obj/item/bodypart/BP = X
|
||||
for(var/obj/item/I in BP.embedded_objects)
|
||||
if(prob(I.embedded_pain_chance))
|
||||
BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
|
||||
if(prob(I.embedding.embedded_pain_chance))
|
||||
BP.receive_damage(I.w_class*I.embedding.embedded_pain_multiplier)
|
||||
to_chat(src, "<span class='userdanger'>[I] embedded in your [BP.name] hurts!</span>")
|
||||
|
||||
if(prob(I.embedded_fall_chance))
|
||||
BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
|
||||
if(prob(I.embedding.embedded_fall_chance))
|
||||
BP.receive_damage(I.w_class*I.embedding.embedded_fall_pain_multiplier)
|
||||
BP.embedded_objects -= I
|
||||
I.forceMove(drop_location())
|
||||
visible_message("<span class='danger'>[I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>[I] falls out of your [BP.name]!</span>")
|
||||
|
||||
@@ -291,12 +291,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
for(var/datum/disease/A in C.viruses)
|
||||
A.cure(FALSE)
|
||||
|
||||
|
||||
//CITADEL EDIT
|
||||
if(NOAROUSAL in species_traits)
|
||||
C.canbearoused = FALSE
|
||||
else
|
||||
if(C.client)
|
||||
C.canbearoused = C.client.prefs.arousable
|
||||
// EDIT ENDS
|
||||
|
||||
/datum/species/proc/on_species_loss(mob/living/carbon/C)
|
||||
if(C.dna.species.exotic_bloodtype)
|
||||
@@ -311,7 +312,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(!HD) //Decapitated
|
||||
return
|
||||
|
||||
if(H.has_disability(DISABILITY_HUSK))
|
||||
if(H.has_trait(TRAIT_HUSK))
|
||||
return
|
||||
var/datum/sprite_accessory/S
|
||||
var/list/standing = list()
|
||||
@@ -452,7 +453,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
|
||||
|
||||
if(HD && !(H.has_disability(DISABILITY_HUSK)))
|
||||
if(HD && !(H.has_trait(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)
|
||||
@@ -463,18 +464,19 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
standing += lip_overlay
|
||||
|
||||
// eyes
|
||||
var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
|
||||
var/mutable_appearance/eye_overlay
|
||||
if(!has_eyes)
|
||||
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
|
||||
else
|
||||
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
|
||||
if((EYECOLOR in species_traits) && has_eyes)
|
||||
eye_overlay.color = "#" + H.eye_color
|
||||
if(OFFSET_FACE in H.dna.species.offset_features)
|
||||
eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
|
||||
eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
|
||||
standing += eye_overlay
|
||||
if(!(NOEYES in species_traits))
|
||||
var/has_eyes = H.getorganslot(ORGAN_SLOT_EYES)
|
||||
var/mutable_appearance/eye_overlay
|
||||
if(!has_eyes)
|
||||
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes_missing", -BODY_LAYER)
|
||||
else
|
||||
eye_overlay = mutable_appearance('icons/mob/human_face.dmi', "eyes", -BODY_LAYER)
|
||||
if((EYECOLOR in species_traits) && has_eyes)
|
||||
eye_overlay.color = "#" + H.eye_color
|
||||
if(OFFSET_FACE in H.dna.species.offset_features)
|
||||
eye_overlay.pixel_x += H.dna.species.offset_features[OFFSET_FACE][1]
|
||||
eye_overlay.pixel_y += H.dna.species.offset_features[OFFSET_FACE][2]
|
||||
standing += eye_overlay
|
||||
|
||||
//Underwear, Undershirts & Socks
|
||||
if(!(NO_UNDERWEAR in species_traits))
|
||||
@@ -504,11 +506,14 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
/datum/species/proc/handle_mutant_bodyparts(mob/living/carbon/human/H, forced_colour)
|
||||
var/list/bodyparts_to_add = mutant_bodyparts.Copy()
|
||||
var/list/relevant_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_TAUR_LAYER)
|
||||
var/list/relevent_layers = list(BODY_BEHIND_LAYER, BODY_ADJ_LAYER, BODY_FRONT_LAYER, BODY_TAUR_LAYER)
|
||||
var/list/standing = list()
|
||||
|
||||
for(var/L in relevant_layers)
|
||||
H.remove_overlay(L)
|
||||
H.remove_overlay(BODY_BEHIND_LAYER)
|
||||
H.remove_overlay(BODY_ADJ_LAYER)
|
||||
H.remove_overlay(BODY_FRONT_LAYER)
|
||||
//CITADEL EDIT - Do not forget to add this to relevent_layers list just above too!
|
||||
H.remove_overlay(BODY_TAUR_LAYER)
|
||||
|
||||
if(!mutant_bodyparts)
|
||||
return
|
||||
@@ -572,6 +577,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else if ("wings" in mutant_bodyparts)
|
||||
bodyparts_to_add -= "wings_open"
|
||||
|
||||
//CITADEL EDIT
|
||||
//Race specific bodyparts:
|
||||
//Xenos
|
||||
if("xenodorsal" in mutant_bodyparts)
|
||||
@@ -602,6 +608,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if("taur" in mutant_bodyparts)
|
||||
if(!H.dna.features["taur"] || H.dna.features["taur"] == "None")
|
||||
bodyparts_to_add -= "taur"
|
||||
//END EDIT
|
||||
|
||||
//Digitigrade legs are stuck in the phantom zone between true limbs and mutant bodyparts. Mainly it just needs more agressive updating than most limbs.
|
||||
var/update_needed = FALSE
|
||||
@@ -634,7 +641,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
var/image/I
|
||||
|
||||
for(var/layer in relevant_layers)
|
||||
for(var/layer in relevent_layers)
|
||||
var/layertext = mutant_bodyparts_layertext(layer)
|
||||
|
||||
for(var/bodypart in bodyparts_to_add)
|
||||
@@ -668,8 +675,10 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
S = GLOB.wings_open_list[H.dna.features["wings"]]
|
||||
if("legs")
|
||||
S = GLOB.legs_list[H.dna.features["legs"]]
|
||||
if("moth_wings")
|
||||
S = GLOB.moth_wings_list[H.dna.features["moth_wings"]]
|
||||
|
||||
//Mammal Bodyparts (Canid/Felid, others maybe in the future)
|
||||
//Mammal Bodyparts
|
||||
if("mam_tail")
|
||||
S = GLOB.mam_tails_list[H.dna.features["mam_tail"]]
|
||||
if("mam_waggingtail")
|
||||
@@ -689,13 +698,6 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if("xenotail")
|
||||
S = GLOB.xeno_tail_list[H.dna.features["xenotail"]]
|
||||
|
||||
//Slimecoon Bodyparts
|
||||
/* if("slimecoontail")
|
||||
S = /datum/sprite_accessory/slimecoon_tail
|
||||
if("slimecoonears")
|
||||
S = /datum/sprite_accessory/slimecoon_ears
|
||||
if("slimecoonsnout")
|
||||
S = /datum/sprite_accessory/slimecoon_snout*/
|
||||
if(!S || S.icon_state == "none")
|
||||
continue
|
||||
|
||||
@@ -723,7 +725,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
if(S.center)
|
||||
accessory_overlay = center_image(accessory_overlay, S.dimension_x, S.dimension_y)
|
||||
|
||||
if(!(H.has_disability(DISABILITY_HUSK)))
|
||||
if(!(H.has_trait(TRAIT_HUSK)))
|
||||
if(!forced_colour)
|
||||
switch(S.color_src)
|
||||
if(MUTCOLORS)
|
||||
@@ -837,12 +839,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
else
|
||||
I.color = "#[H.hair_color]"
|
||||
standing += I
|
||||
|
||||
H.overlays_standing[layer] = standing.Copy()
|
||||
standing = list()
|
||||
|
||||
for(var/L in relevant_layers)
|
||||
H.apply_overlay(L)
|
||||
H.apply_overlay(BODY_BEHIND_LAYER)
|
||||
H.apply_overlay(BODY_ADJ_LAYER)
|
||||
H.apply_overlay(BODY_FRONT_LAYER)
|
||||
H.apply_overlay(BODY_TAUR_LAYER) // CITADEL EDIT
|
||||
|
||||
|
||||
//This exists so sprite accessories can still be per-layer without having to include that layer's
|
||||
@@ -1101,17 +1104,17 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
|
||||
/datum/species/proc/handle_digestion(mob/living/carbon/human/H)
|
||||
|
||||
//The fucking DISABILITY_FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
|
||||
if(H.has_disability(DISABILITY_FAT))//I share your pain, past coder.
|
||||
//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(H.overeatduration < 100)
|
||||
to_chat(H, "<span class='notice'>You feel fit again!</span>")
|
||||
H.remove_disability(DISABILITY_FAT, OBESITY)
|
||||
H.remove_trait(TRAIT_FAT, OBESITY)
|
||||
H.update_inv_w_uniform()
|
||||
H.update_inv_wear_suit()
|
||||
else
|
||||
if(H.overeatduration > 500)
|
||||
to_chat(H, "<span class='danger'>You suddenly feel blubbery!</span>")
|
||||
H.add_disability(DISABILITY_FAT, OBESITY)
|
||||
H.add_trait(TRAIT_FAT, OBESITY)
|
||||
H.update_inv_w_uniform()
|
||||
H.update_inv_wear_suit()
|
||||
|
||||
@@ -1219,13 +1222,13 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
flight = 1
|
||||
|
||||
if(!flightpack) //Check for chemicals and innate speedups and slowdowns if we're moving using our body and not a flying suit
|
||||
if(H.status_flags & GOTTAGOFAST)
|
||||
if(H.has_trait(TRAIT_GOTTAGOFAST))
|
||||
. -= 1
|
||||
if(H.status_flags & GOTTAGOREALLYFAST)
|
||||
if(H.has_trait(TRAIT_GOTTAGOREALLYFAST))
|
||||
. -= 2
|
||||
. += speedmod
|
||||
|
||||
if(H.status_flags & IGNORESLOWDOWN)
|
||||
if(H.has_trait(TRAIT_IGNORESLOWDOWN))
|
||||
ignoreslow = 1
|
||||
|
||||
if(H.has_gravity())
|
||||
@@ -1268,7 +1271,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
. += (health_deficiency / 25)
|
||||
if((hungry >= 70) && !flight) //Being hungry won't stop you from using flightpack controls/flapping your wings although it probably will in the wing case but who cares.
|
||||
. += hungry / 50
|
||||
if(H.has_disability(DISABILITY_FAT))
|
||||
if(H.has_trait(TRAIT_FAT))
|
||||
. += (1.5 - flight)
|
||||
if(H.bodytemperature < BODYTEMP_COLD_DAMAGE_LIMIT)
|
||||
. += (BODYTEMP_COLD_DAMAGE_LIMIT - H.bodytemperature) / COLD_SLOWDOWN_FACTOR
|
||||
@@ -1283,7 +1286,7 @@ 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.status_flags & FAKEDEATH))
|
||||
if(target.health >= 0 && !(target.has_trait(TRAIT_FAKEDEATH)))
|
||||
target.help_shake_act(user)
|
||||
if(target != user)
|
||||
add_logs(user, target, "shaked")
|
||||
@@ -1314,7 +1317,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_disability(DISABILITY_PACIFISM))
|
||||
if(user.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='warning'>You don't want to harm [target]!</span>")
|
||||
return FALSE
|
||||
if(target.check_block())
|
||||
@@ -1369,6 +1372,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
target.forcesay(GLOB.hit_appends)
|
||||
|
||||
/datum/species/proc/disarm(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
|
||||
// CITADEL EDIT slap mouthy gits
|
||||
var/aim_for_mouth = user.zone_selected == "mouth"
|
||||
var/target_on_help_and_unarmed = target.a_intent == INTENT_HELP && !target.get_active_held_item()
|
||||
var/target_aiming_for_mouth = target.zone_selected == "mouth"
|
||||
@@ -1380,7 +1384,7 @@ GLOBAL_LIST_EMPTY(roundstart_races)
|
||||
"You hear a slap.")
|
||||
target.endTailWag()
|
||||
return FALSE
|
||||
else if(target.check_block())
|
||||
else if(target.check_block()) //END EDIT
|
||||
target.visible_message("<span class='warning'>[target] blocks [user]'s disarm attempt!</span>")
|
||||
return 0
|
||||
if(attacker_style && attacker_style.disarm_act(user,target))
|
||||
|
||||
@@ -2,13 +2,13 @@
|
||||
name = "Flyperson"
|
||||
id = "fly"
|
||||
say_mod = "buzzes"
|
||||
species_traits = list(SPECIES_ORGANIC)
|
||||
species_traits = list(SPECIES_ORGANIC, NOEYES)
|
||||
mutanttongue = /obj/item/organ/tongue/fly
|
||||
mutantliver = /obj/item/organ/liver/fly
|
||||
mutantstomach = /obj/item/organ/stomach/fly
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/fly
|
||||
disliked_food = null
|
||||
liked_food = NONE
|
||||
liked_food = GROSS
|
||||
|
||||
/datum/species/fly/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
|
||||
if(chem.id == "pestkiller")
|
||||
|
||||
@@ -67,8 +67,8 @@
|
||||
id = "insect"
|
||||
default_color = "BCAC9B"
|
||||
species_traits = list(MUTCOLORS,EYECOLOR,LIPS,HAIR,SPECIES_ORGANIC)
|
||||
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur")
|
||||
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None")
|
||||
mutant_bodyparts = list("mam_body_markings", "mam_ears", "mam_tail", "taur", "moth_wings")
|
||||
default_features = list("mcolor" = "FFF","mcolor2" = "FFF","mcolor3" = "FFF", "mam_body_markings" = "moth", "mam_tail" = "None", "mam_ears" = "None", "moth_wings" = "None")
|
||||
attack_verb = "flutter" //wat?
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
|
||||
@@ -727,7 +727,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_disability(DISABILITY_NOCLONE))
|
||||
if(cloth_golem.suiciding || cloth_golem.has_trait(TRAIT_NOCLONE))
|
||||
QDEL_NULL(cloth_golem)
|
||||
return
|
||||
|
||||
|
||||
@@ -10,6 +10,9 @@
|
||||
damage_overlay_type = ""
|
||||
var/datum/action/innate/regenerate_limbs/regenerate_limbs
|
||||
liked_food = MEAT
|
||||
coldmod = 6 // = 3x cold damage
|
||||
heatmod = 0.5 // = 1/4x heat damage
|
||||
burnmod = 0.5 // = 1/2x generic burn damage
|
||||
|
||||
/datum/species/jelly/on_species_loss(mob/living/carbon/C)
|
||||
if(regenerate_limbs)
|
||||
@@ -17,6 +20,7 @@
|
||||
C.remove_language(/datum/language/slime, TRUE)
|
||||
C.faction -= "slime"
|
||||
..()
|
||||
C.faction -= "slime"
|
||||
|
||||
/datum/species/jelly/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
@@ -24,6 +28,7 @@
|
||||
if(ishuman(C))
|
||||
regenerate_limbs = new
|
||||
regenerate_limbs.Grant(C)
|
||||
C.faction |= "slime"
|
||||
|
||||
/datum/species/jelly/spec_life(mob/living/carbon/human/H)
|
||||
if(H.stat == DEAD) //can't farm slime jelly from a dead slime/jelly person indefinitely
|
||||
@@ -42,7 +47,8 @@
|
||||
to_chat(H, "<span class='danger'>You feel drained!</span>")
|
||||
if(H.blood_volume < BLOOD_VOLUME_BAD)
|
||||
Cannibalize_Body(H)
|
||||
H.update_action_buttons_icon()
|
||||
if(regenerate_limbs)
|
||||
regenerate_limbs.UpdateButtonIcon()
|
||||
|
||||
/datum/species/jelly/proc/Cannibalize_Body(mob/living/carbon/human/H)
|
||||
var/list/limbs_to_consume = list("r_arm", "l_arm", "r_leg", "l_leg") - H.get_missing_limbs()
|
||||
@@ -97,10 +103,11 @@
|
||||
return
|
||||
to_chat(H, "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to heal!</span>")
|
||||
|
||||
////////////////////////////////////////////////////////SLIME PEOPLE///////////////////////////////////////////////////////////////////
|
||||
////////////////////////////////////////////////////////SLIMEPEOPLE///////////////////////////////////////////////////////////////////
|
||||
|
||||
//Slime people are able to split like slimes, retaining a single mind that can swap between bodies at will, even after death.
|
||||
|
||||
/datum/species/jelly/slime
|
||||
// Humans mutated by slime mutagen, produced from green slimes. They are not targetted by slimes.
|
||||
name = "Slimeperson"
|
||||
id = "slime"
|
||||
default_color = "00FFFF"
|
||||
@@ -109,9 +116,6 @@
|
||||
hair_color = "mutcolor"
|
||||
hair_alpha = 150
|
||||
ignored_by = list(/mob/living/simple_animal/slime)
|
||||
burnmod = 0.5
|
||||
coldmod = 2
|
||||
heatmod = 0.5
|
||||
var/datum/action/innate/split_body/slime_split
|
||||
var/list/mob/living/carbon/bodies
|
||||
var/datum/action/innate/swap_body/swap_body
|
||||
@@ -124,14 +128,13 @@
|
||||
bodies -= C // This means that the other bodies maintain a link
|
||||
// so if someone mindswapped into them, they'd still be shared.
|
||||
bodies = null
|
||||
C.faction -= "slime"
|
||||
C.blood_volume = min(C.blood_volume, BLOOD_VOLUME_NORMAL)
|
||||
..()
|
||||
|
||||
/datum/species/jelly/slime/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
if(ishuman(C))
|
||||
/*slime_split = new
|
||||
/* slime_split = new
|
||||
slime_split.Grant(C)
|
||||
swap_body = new
|
||||
swap_body.Grant(C)*/
|
||||
@@ -140,7 +143,7 @@
|
||||
bodies = list(C)
|
||||
else
|
||||
bodies |= C
|
||||
|
||||
|
||||
/datum/species/jelly/slime/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
if(slime_split)
|
||||
var/datum/mind/M
|
||||
@@ -159,7 +162,7 @@
|
||||
bodies = old_species.bodies
|
||||
|
||||
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H)
|
||||
/*if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
|
||||
/* if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
|
||||
if(prob(5))
|
||||
to_chat(H, "<span class='notice'>You feel very bloated!</span>")*/
|
||||
if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
|
||||
@@ -237,7 +240,7 @@
|
||||
|
||||
/datum/action/innate/swap_body
|
||||
name = "Swap Body"
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
check_flags = NONE
|
||||
button_icon_state = "slimeswap"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
@@ -250,6 +253,7 @@
|
||||
ui_interact(owner)
|
||||
|
||||
/datum/action/innate/swap_body/ui_interact(mob/user, ui_key = "main", datum/tgui/ui = null, force_open = FALSE, datum/tgui/master_ui = null, datum/ui_state/state = GLOB.always_state)
|
||||
|
||||
ui = SStgui.try_update_ui(user, src, ui_key, ui, force_open)
|
||||
if(!ui)
|
||||
ui = new(user, src, ui_key, "slime_swap_body", name, 400, 400, master_ui, state)
|
||||
@@ -334,14 +338,356 @@
|
||||
return
|
||||
if(selected.stat != CONSCIOUS)
|
||||
return
|
||||
|
||||
swap_to_dupe(M, selected)
|
||||
|
||||
/datum/action/innate/swap_body/proc/swap_to_dupe(datum/mind/M, mob/living/carbon/human/dupe)
|
||||
M.current.visible_message("<span class='notice'>[M.current] \
|
||||
stops moving and starts staring vacantly into space.</span>",
|
||||
"<span class='notice'>You stop moving this body...</span>")
|
||||
if(M.current.stat == CONSCIOUS)
|
||||
M.current.visible_message("<span class='notice'>[M.current] \
|
||||
stops moving and starts staring vacantly into space.</span>",
|
||||
"<span class='notice'>You stop moving this body...</span>")
|
||||
else
|
||||
to_chat(M.current, "<span class='notice'>You abandon this body...</span>")
|
||||
M.transfer_to(dupe)
|
||||
dupe.visible_message("<span class='notice'>[dupe] blinks and looks \
|
||||
around.</span>",
|
||||
"<span class='notice'>...and move this one instead.</span>")
|
||||
|
||||
|
||||
///////////////////////////////////LUMINESCENTS//////////////////////////////////////////
|
||||
|
||||
//Luminescents are able to consume and use slime extracts, without them decaying.
|
||||
|
||||
/datum/species/jelly/luminescent
|
||||
name = "Luminescent"
|
||||
id = "lum"
|
||||
say_mod = "says"
|
||||
var/glow_intensity = LUMINESCENT_DEFAULT_GLOW
|
||||
var/obj/effect/dummy/luminescent_glow/glow
|
||||
var/obj/item/slime_extract/current_extract
|
||||
var/datum/action/innate/integrate_extract/integrate_extract
|
||||
var/datum/action/innate/use_extract/extract_minor
|
||||
var/datum/action/innate/use_extract/major/extract_major
|
||||
var/extract_cooldown = 0
|
||||
|
||||
/datum/species/jelly/luminescent/on_species_loss(mob/living/carbon/C)
|
||||
..()
|
||||
if(current_extract)
|
||||
current_extract.forceMove(C.drop_location())
|
||||
current_extract = null
|
||||
qdel(glow)
|
||||
if(integrate_extract)
|
||||
integrate_extract.Remove(C)
|
||||
if(extract_minor)
|
||||
extract_minor.Remove(C)
|
||||
if(extract_major)
|
||||
extract_major.Remove(C)
|
||||
|
||||
/datum/species/jelly/luminescent/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
glow = new(C)
|
||||
update_glow(C)
|
||||
integrate_extract = new(src)
|
||||
integrate_extract.Grant(C)
|
||||
extract_minor = new(src)
|
||||
extract_minor.Grant(C)
|
||||
extract_major = new(src)
|
||||
extract_major.Grant(C)
|
||||
|
||||
/datum/species/jelly/luminescent/proc/update_slime_actions()
|
||||
integrate_extract.update_name()
|
||||
integrate_extract.UpdateButtonIcon()
|
||||
extract_minor.UpdateButtonIcon()
|
||||
extract_major.UpdateButtonIcon()
|
||||
|
||||
/datum/species/jelly/luminescent/proc/update_glow(mob/living/carbon/C, intensity)
|
||||
if(intensity)
|
||||
glow_intensity = intensity
|
||||
glow.set_light(glow_intensity, glow_intensity, C.dna.features["mcolor"])
|
||||
|
||||
/obj/effect/dummy/luminescent_glow
|
||||
name = "luminescent glow"
|
||||
desc = "Tell a coder if you're seeing this."
|
||||
icon_state = "nothing"
|
||||
light_color = "#FFFFFF"
|
||||
light_range = LUMINESCENT_DEFAULT_GLOW
|
||||
|
||||
/obj/effect/dummy/luminescent_glow/Initialize()
|
||||
. = ..()
|
||||
if(!isliving(loc))
|
||||
return INITIALIZE_HINT_QDEL
|
||||
|
||||
/datum/action/innate/integrate_extract
|
||||
name = "Integrate Extract"
|
||||
desc = "Eat a slime extract to use its properties."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "slimeconsume"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
var/datum/species/jelly/luminescent/species
|
||||
|
||||
/datum/action/innate/integrate_extract/New(_species)
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/integrate_extract/proc/update_name()
|
||||
if(!species || !species.current_extract)
|
||||
name = "Integrate Extract"
|
||||
desc = "Eat a slime extract to use its properties."
|
||||
else
|
||||
name = "Eject Extract"
|
||||
desc = "Eject your current slime extract."
|
||||
|
||||
/datum/action/innate/integrate_extract/UpdateButtonIcon(status_only, force)
|
||||
if(!species || !species.current_extract)
|
||||
button_icon_state = "slimeconsume"
|
||||
else
|
||||
button_icon_state = "slimeeject"
|
||||
..()
|
||||
|
||||
/datum/action/innate/integrate_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force)
|
||||
..(current_button, TRUE)
|
||||
if(species && species.current_extract)
|
||||
current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state))
|
||||
|
||||
/datum/action/innate/integrate_extract/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!is_species(H, /datum/species/jelly/luminescent) || !species)
|
||||
return
|
||||
CHECK_DNA_AND_SPECIES(H)
|
||||
|
||||
if(species.current_extract)
|
||||
var/obj/item/slime_extract/S = species.current_extract
|
||||
if(!H.put_in_active_hand(S))
|
||||
S.forceMove(H.drop_location())
|
||||
species.current_extract = null
|
||||
to_chat(H, "<span class='notice'>You eject [S].</span>")
|
||||
species.update_slime_actions()
|
||||
else
|
||||
var/obj/item/I = H.get_active_held_item()
|
||||
if(istype(I, /obj/item/slime_extract))
|
||||
var/obj/item/slime_extract/S = I
|
||||
if(!S.Uses)
|
||||
to_chat(H, "<span class='warning'>[I] is spent! You cannot integrate it.</span>")
|
||||
return
|
||||
if(!H.temporarilyRemoveItemFromInventory(S))
|
||||
return
|
||||
S.forceMove(H)
|
||||
species.current_extract = S
|
||||
to_chat(H, "<span class='notice'>You consume [I], and you feel it pulse within you...</span>")
|
||||
species.update_slime_actions()
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You need to hold an unused slime extract in your active hand!</span>")
|
||||
|
||||
/datum/action/innate/use_extract
|
||||
name = "Extract Minor Activation"
|
||||
desc = "Pulse the slime extract with energized jelly to activate it."
|
||||
check_flags = AB_CHECK_CONSCIOUS
|
||||
button_icon_state = "slimeuse1"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
var/activation_type = SLIME_ACTIVATE_MINOR
|
||||
var/datum/species/jelly/luminescent/species
|
||||
|
||||
/datum/action/innate/use_extract/New(_species)
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/use_extract/IsAvailable()
|
||||
if(..())
|
||||
if(species && species.current_extract && (world.time > species.extract_cooldown))
|
||||
return TRUE
|
||||
return FALSE
|
||||
|
||||
/datum/action/innate/use_extract/ApplyIcon(obj/screen/movable/action_button/current_button, force)
|
||||
..(current_button, TRUE)
|
||||
if(species && species.current_extract)
|
||||
current_button.add_overlay(mutable_appearance(species.current_extract.icon, species.current_extract.icon_state))
|
||||
|
||||
/datum/action/innate/use_extract/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!is_species(H, /datum/species/jelly/luminescent) || !species)
|
||||
return
|
||||
CHECK_DNA_AND_SPECIES(H)
|
||||
|
||||
if(species.current_extract)
|
||||
var/cooldown = species.current_extract.activate(H, species, activation_type)
|
||||
species.extract_cooldown = world.time + cooldown
|
||||
|
||||
/datum/action/innate/use_extract/major
|
||||
name = "Extract Major Activation"
|
||||
desc = "Pulse the slime extract with plasma jelly to activate it."
|
||||
button_icon_state = "slimeuse2"
|
||||
activation_type = SLIME_ACTIVATE_MAJOR
|
||||
|
||||
///////////////////////////////////STARGAZERS//////////////////////////////////////////
|
||||
|
||||
//Stargazers are the telepathic branch of jellypeople, able to project psychic messages and to link minds with willing participants.
|
||||
|
||||
/datum/species/jelly/stargazer
|
||||
name = "Stargazer"
|
||||
id = "stargazer"
|
||||
var/datum/action/innate/project_thought/project_thought
|
||||
var/datum/action/innate/link_minds/link_minds
|
||||
var/list/mob/living/linked_mobs = list()
|
||||
var/list/datum/action/innate/linked_speech/linked_actions = list()
|
||||
var/mob/living/carbon/human/slimelink_owner
|
||||
var/current_link_id = 0
|
||||
|
||||
/datum/species/jelly/stargazer/on_species_loss(mob/living/carbon/C)
|
||||
..()
|
||||
for(var/M in linked_mobs)
|
||||
unlink_mob(M)
|
||||
if(project_thought)
|
||||
project_thought.Remove(C)
|
||||
if(link_minds)
|
||||
link_minds.Remove(C)
|
||||
|
||||
/datum/species/jelly/stargazer/spec_death(gibbed, mob/living/carbon/human/H)
|
||||
..()
|
||||
for(var/M in linked_mobs)
|
||||
unlink_mob(M)
|
||||
|
||||
/datum/species/jelly/stargazer/on_species_gain(mob/living/carbon/C, datum/species/old_species)
|
||||
..()
|
||||
project_thought = new(src)
|
||||
project_thought.Grant(C)
|
||||
link_minds = new(src)
|
||||
link_minds.Grant(C)
|
||||
slimelink_owner = C
|
||||
link_mob(C)
|
||||
|
||||
/datum/species/jelly/stargazer/proc/link_mob(mob/living/M)
|
||||
if(QDELETED(M) || M.stat == DEAD)
|
||||
return FALSE
|
||||
if(M.isloyal()) //mindshield implant, no dice
|
||||
return FALSE
|
||||
if(M in linked_mobs)
|
||||
return FALSE
|
||||
linked_mobs.Add(M)
|
||||
to_chat(M, "<span class='notice'>You are now connected to [slimelink_owner.real_name]'s Slime Link.</span>")
|
||||
var/datum/action/innate/linked_speech/action = new(src)
|
||||
linked_actions.Add(action)
|
||||
action.Grant(M)
|
||||
return TRUE
|
||||
|
||||
/datum/species/jelly/stargazer/proc/unlink_mob(mob/living/M)
|
||||
var/link_id = linked_mobs.Find(M)
|
||||
if(!(link_id))
|
||||
return
|
||||
var/datum/action/innate/linked_speech/action = linked_actions[link_id]
|
||||
action.Remove(M)
|
||||
to_chat(M, "<span class='notice'>You are no longer connected to [slimelink_owner.real_name]'s Slime Link.</span>")
|
||||
linked_mobs[link_id] = null
|
||||
linked_actions[link_id] = null
|
||||
|
||||
/datum/action/innate/linked_speech
|
||||
name = "Slimelink"
|
||||
desc = "Send a psychic message to everyone connected to your slime link."
|
||||
button_icon_state = "link_speech"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
var/datum/species/jelly/stargazer/species
|
||||
|
||||
/datum/action/innate/linked_speech/New(_species)
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/linked_speech/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!species || !(H in species.linked_mobs))
|
||||
to_chat(H, "<span class='warning'>The link seems to have been severed...</span>")
|
||||
Remove(H)
|
||||
return
|
||||
|
||||
var/message = sanitize(input("Message:", "Slime Telepathy") as text|null)
|
||||
|
||||
if(!species || !(H in species.linked_mobs))
|
||||
to_chat(H, "<span class='warning'>The link seems to have been severed...</span>")
|
||||
Remove(H)
|
||||
return
|
||||
|
||||
if(QDELETED(H) || H.stat == DEAD)
|
||||
species.unlink_mob(H)
|
||||
return
|
||||
|
||||
if(message)
|
||||
var/msg = "<i><font color=#008CA2>\[[species.slimelink_owner.real_name]'s Slime Link\] <b>[H]:</b> [message]</font></i>"
|
||||
log_talk(H,"SlimeLink: [key_name(H)] : [msg]",LOGSAY)
|
||||
for(var/X in species.linked_mobs)
|
||||
var/mob/living/M = X
|
||||
if(QDELETED(M) || M.stat == DEAD)
|
||||
species.unlink_mob(M)
|
||||
continue
|
||||
to_chat(M, msg)
|
||||
|
||||
for(var/X in GLOB.dead_mob_list)
|
||||
var/mob/M = X
|
||||
var/link = FOLLOW_LINK(M, H)
|
||||
to_chat(M, "[link] [msg]")
|
||||
|
||||
/datum/action/innate/project_thought
|
||||
name = "Send Thought"
|
||||
desc = "Send a private psychic message to someone you can see."
|
||||
button_icon_state = "send_mind"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
|
||||
/datum/action/innate/project_thought/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!is_species(H, /datum/species/jelly/stargazer))
|
||||
return
|
||||
CHECK_DNA_AND_SPECIES(H)
|
||||
|
||||
var/list/options = list()
|
||||
for(var/mob/living/Ms in oview(H))
|
||||
options += Ms
|
||||
var/mob/living/M = input("Select who to send your message to:","Send thought to?",null) as null|mob in options
|
||||
if(!M)
|
||||
return
|
||||
|
||||
var/msg = sanitize(input("Message:", "Telepathy") as text|null)
|
||||
if(msg)
|
||||
log_talk(H,"SlimeTelepathy: [key_name(H)]->[M.key] : [msg]",LOGSAY)
|
||||
to_chat(M, "<span class='notice'>You hear an alien voice in your head... </span><font color=#008CA2>[msg]</font>")
|
||||
to_chat(H, "<span class='notice'>You telepathically said: \"[msg]\" to [M]</span>")
|
||||
for(var/dead in GLOB.dead_mob_list)
|
||||
if(!isobserver(dead))
|
||||
continue
|
||||
var/follow_link_user = FOLLOW_LINK(dead, H)
|
||||
var/follow_link_target = FOLLOW_LINK(dead, M)
|
||||
to_chat(dead, "[follow_link_user] <span class='name'>[H]</span> <span class='alertalien'>Slime Telepathy --> </span> [follow_link_target] <span class='name'>[M]</span> <span class='noticealien'>[msg]</span>")
|
||||
|
||||
/datum/action/innate/link_minds
|
||||
name = "Link Minds"
|
||||
desc = "Link someone's mind to your Slime Link, allowing them to communicate telepathically with other linked minds."
|
||||
button_icon_state = "mindlink"
|
||||
icon_icon = 'icons/mob/actions/actions_slime.dmi'
|
||||
background_icon_state = "bg_alien"
|
||||
var/datum/species/jelly/stargazer/species
|
||||
|
||||
/datum/action/innate/link_minds/New(_species)
|
||||
..()
|
||||
species = _species
|
||||
|
||||
/datum/action/innate/link_minds/Activate()
|
||||
var/mob/living/carbon/human/H = owner
|
||||
if(!is_species(H, /datum/species/jelly/stargazer))
|
||||
return
|
||||
CHECK_DNA_AND_SPECIES(H)
|
||||
|
||||
if(!H.pulling || !isliving(H.pulling) || H.grab_state < GRAB_AGGRESSIVE)
|
||||
to_chat(H, "<span class='warning'>You need to aggressively grab someone to link minds!</span>")
|
||||
return
|
||||
|
||||
var/mob/living/target = H.pulling
|
||||
|
||||
to_chat(H, "<span class='notice'>You begin linking [target]'s mind to yours...</span>")
|
||||
to_chat(target, "<span class='warning'>You feel a foreign presence within your mind...</span>")
|
||||
if(do_after(H, 60, target = target))
|
||||
if(H.pulling != target || H.grab_state < GRAB_AGGRESSIVE)
|
||||
return
|
||||
if(species.link_mob(target))
|
||||
to_chat(H, "<span class='notice'>You connect [target]'s mind to your slime link!</span>")
|
||||
else
|
||||
to_chat(H, "<span class='warning'>You can't seem to link [target]'s mind...</span>")
|
||||
to_chat(target, "<span class='warning'>The foreign presence leaves your mind.</span>")
|
||||
|
||||
@@ -0,0 +1,60 @@
|
||||
/datum/species/moth
|
||||
name = "Mothmen"
|
||||
id = "moth"
|
||||
say_mod = "flutters"
|
||||
default_color = "00FF00"
|
||||
species_traits = list(LIPS, SPECIES_ORGANIC, NOEYES)
|
||||
mutant_bodyparts = list("moth_wings")
|
||||
default_features = list("moth_wings" = "Plain")
|
||||
attack_verb = "slash"
|
||||
attack_sound = 'sound/weapons/slash.ogg'
|
||||
miss_sound = 'sound/weapons/slashmiss.ogg'
|
||||
meat = /obj/item/reagent_containers/food/snacks/meat/slab/human/mutant/moth
|
||||
liked_food = VEGETABLES | DAIRY
|
||||
disliked_food = FRUIT | GROSS
|
||||
toxic_food = MEAT | RAW
|
||||
mutanteyes = /obj/item/organ/eyes/moth
|
||||
|
||||
/datum/species/moth/on_species_gain(mob/living/carbon/C)
|
||||
. = ..()
|
||||
if(ishuman(C))
|
||||
var/mob/living/carbon/human/H = C
|
||||
if(!H.dna.features["moth_wings"])
|
||||
H.dna.features["moth_wings"] = "[(H.client && H.client.prefs && LAZYLEN(H.client.prefs.features) && H.client.prefs.features["moth_wings"]) ? H.client.prefs.features["moth_wings"] : "Plain"]"
|
||||
handle_mutant_bodyparts(H)
|
||||
|
||||
/datum/species/moth/random_name(gender,unique,lastname)
|
||||
if(unique)
|
||||
return random_unique_moth_name()
|
||||
|
||||
var/randname = moth_name()
|
||||
|
||||
if(lastname)
|
||||
randname += " [lastname]"
|
||||
|
||||
return randname
|
||||
|
||||
/datum/species/moth/handle_fire(mob/living/carbon/human/H, no_protection = FALSE)
|
||||
..()
|
||||
if(H.dna.features["moth_wings"] != "Burnt Off" && H.bodytemperature >= 800 && H.fire_stacks > 0) //do not go into the extremely hot light. you will not survive
|
||||
to_chat(H, "<span class='danger'>Your precious wings burn to a crisp!</span>")
|
||||
H.dna.features["moth_wings"] = "Burnt Off"
|
||||
handle_mutant_bodyparts(H)
|
||||
|
||||
/datum/species/moth/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(chem.id == "pestkiller")
|
||||
H.adjustToxLoss(3)
|
||||
H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
|
||||
|
||||
/datum/species/moth/check_weakness(obj/item/weapon, mob/living/attacker)
|
||||
if(istype(weapon, /obj/item/melee/flyswatter))
|
||||
return 9 //flyswatters deal 10x damage to moths
|
||||
return 0
|
||||
|
||||
/datum/species/moth/space_move(mob/living/carbon/human/H)
|
||||
. = ..()
|
||||
if(H.loc && !isspaceturf(H.loc) && H.dna.features["moth_wings"] != "Burnt Off" || "None")
|
||||
var/datum/gas_mixture/current = H.loc.return_air()
|
||||
if(current && (current.return_pressure() >= ONE_ATMOSPHERE*0.85)) //as long as there's reasonable pressure and no gravity, flight is possible
|
||||
return TRUE
|
||||
@@ -10,9 +10,9 @@
|
||||
mutanttongue = /obj/item/organ/tongue/bone
|
||||
damage_overlay_type = ""//let's not show bloody wounds or burns over bones.
|
||||
disliked_food = NONE
|
||||
liked_food = NONE
|
||||
liked_food = GROSS | MEAT | RAW
|
||||
|
||||
/datum/species/skeleton/check_roundstart_eligible()
|
||||
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
|
||||
return TRUE
|
||||
return ..()
|
||||
return ..()
|
||||
@@ -12,7 +12,7 @@
|
||||
mutanttongue = /obj/item/organ/tongue/zombie
|
||||
var/static/list/spooks = list('sound/hallucinations/growl1.ogg','sound/hallucinations/growl2.ogg','sound/hallucinations/growl3.ogg','sound/hallucinations/veryfar_noise.ogg','sound/hallucinations/wail.ogg')
|
||||
disliked_food = NONE
|
||||
liked_food = NONE
|
||||
liked_food = GROSS | MEAT | RAW
|
||||
|
||||
/datum/species/zombie/check_roundstart_eligible()
|
||||
if(SSevents.holidays && SSevents.holidays[HALLOWEEN])
|
||||
|
||||
@@ -610,7 +610,7 @@ generate/load female uniform sprites matching all previously decided variables
|
||||
if(BP.dmg_overlay_type)
|
||||
. += "-[BP.dmg_overlay_type]"
|
||||
|
||||
if(has_disability(DISABILITY_HUSK))
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
. += "-husk"
|
||||
|
||||
/mob/living/carbon/human/load_limb_from_cache()
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/carbon/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if(notransform)
|
||||
return
|
||||
|
||||
@@ -122,7 +122,7 @@
|
||||
if(L == src)
|
||||
return FALSE
|
||||
|
||||
if(has_disability(DISABILITY_PACIFISM))
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
return FALSE
|
||||
|
||||
if(enemies[L])
|
||||
|
||||
@@ -5,7 +5,6 @@
|
||||
|
||||
/mob/living/carbon/monkey/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (notransform)
|
||||
return
|
||||
@@ -74,6 +73,7 @@
|
||||
else
|
||||
bodytemperature += min((loc_temp - bodytemperature) / BODYTEMP_HEAT_DIVISOR, BODYTEMP_HEATING_MAX)
|
||||
|
||||
|
||||
if(bodytemperature > BODYTEMP_HEAT_DAMAGE_LIMIT)
|
||||
switch(bodytemperature)
|
||||
if(360 to 400)
|
||||
|
||||
@@ -19,7 +19,7 @@
|
||||
if(!HD) //Decapitated
|
||||
return
|
||||
|
||||
if(has_disability(DISABILITY_HUSK))
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
return
|
||||
|
||||
var/hair_hidden = 0
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage,
|
||||
// eye damage, eye_blind, eye_blurry, druggy, DISABILITY_BLIND disability, DISABILITY_NEARSIGHT disability, and DISABILITY_HUSK disability.
|
||||
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, TRAIT_NEARSIGHT trait, and TRAIT_HUSK trait.
|
||||
|
||||
/mob/living/carbon/damage_eyes(amount)
|
||||
var/obj/item/organ/eyes/eyes = getorganslot(ORGAN_SLOT_EYES)
|
||||
|
||||
@@ -290,7 +290,7 @@
|
||||
else
|
||||
. += "-robotic"
|
||||
|
||||
if(has_disability(DISABILITY_HUSK))
|
||||
if(has_trait(TRAIT_HUSK))
|
||||
. += "-husk"
|
||||
|
||||
|
||||
|
||||
@@ -113,14 +113,14 @@
|
||||
if(SLUR)
|
||||
slurring = max(slurring,(effect * hit_percent))
|
||||
if(STUTTER)
|
||||
if(status_flags & CANSTUN) // stun is usually associated with stutter
|
||||
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE)) // stun is usually associated with stutter
|
||||
stuttering = max(stuttering,(effect * hit_percent))
|
||||
if(EYE_BLUR)
|
||||
blur_eyes(effect * hit_percent)
|
||||
if(DROWSY)
|
||||
drowsyness = max(drowsyness,(effect * hit_percent))
|
||||
if(JITTER)
|
||||
if(status_flags & CANSTUN)
|
||||
if((status_flags & CANSTUN) && !has_trait(TRAIT_STUNIMMUNE))
|
||||
jitteriness = max(jitteriness,(effect * hit_percent))
|
||||
return 1
|
||||
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
/mob/living/Life(seconds, times_fired)
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if(digitalinvis)
|
||||
handle_diginvis() //AI becomes unable to see mob
|
||||
@@ -55,9 +54,9 @@
|
||||
|
||||
handle_fire()
|
||||
|
||||
// Vore code for belly processes
|
||||
// Citadel Vore code for belly processes
|
||||
handle_internal_contents()
|
||||
|
||||
|
||||
//stuff in the stomach
|
||||
handle_stomach()
|
||||
|
||||
@@ -67,7 +66,7 @@
|
||||
machine.check_eye(src)
|
||||
|
||||
if(stat != DEAD)
|
||||
handle_disabilities() // eye, ear, brain damages
|
||||
handle_traits() // eye, ear, brain damages
|
||||
if(stat != DEAD)
|
||||
handle_status_effects() //all special effects, stun, knockdown, jitteryness, hallucination, sleeping, etc
|
||||
|
||||
@@ -123,10 +122,10 @@
|
||||
if(confused)
|
||||
confused = max(0, confused - 1)
|
||||
|
||||
/mob/living/proc/handle_disabilities()
|
||||
/mob/living/proc/handle_traits()
|
||||
//Eyes
|
||||
if(eye_blind) //blindness, heals slowly over time
|
||||
if(!stat && !(has_disability(DISABILITY_BLIND)))
|
||||
if(!stat && !(has_trait(TRAIT_BLIND)))
|
||||
eye_blind = max(eye_blind-1,0)
|
||||
if(client && !eye_blind)
|
||||
clear_alert("blind")
|
||||
@@ -137,7 +136,7 @@
|
||||
eye_blurry = max(eye_blurry-1, 0)
|
||||
if(client && !eye_blurry)
|
||||
clear_fullscreen("blurry")
|
||||
if(has_disability(DISABILITY_PACIFISM) && a_intent == INTENT_HARM)
|
||||
if(has_trait(TRAIT_PACIFISM) && a_intent == INTENT_HARM)
|
||||
to_chat(src, "<span class='notice'>You don't feel like harming anybody.</span>")
|
||||
a_intent_change(INTENT_HELP)
|
||||
|
||||
|
||||
@@ -183,6 +183,10 @@
|
||||
//not if he's not CANPUSH of course
|
||||
if(!(M.status_flags & CANPUSH))
|
||||
return 1
|
||||
if(isliving(M))
|
||||
var/mob/living/L = M
|
||||
if(L.has_trait(TRAIT_PUSHIMMUNE))
|
||||
return 1
|
||||
//anti-riot equipment is also anti-push
|
||||
for(var/obj/item/I in M.held_items)
|
||||
if(!istype(M, /obj/item/clothing))
|
||||
@@ -235,7 +239,7 @@
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
if(incapacitated())
|
||||
return 0
|
||||
if(src.status_flags & FAKEDEATH)
|
||||
if(src.has_trait(TRAIT_FAKEDEATH))
|
||||
return 0
|
||||
if(!..())
|
||||
return 0
|
||||
@@ -578,7 +582,7 @@
|
||||
|
||||
// climbing out of a gut
|
||||
if(attempt_vr(src,"vore_process_resist",args)) return TRUE
|
||||
|
||||
|
||||
//Breaking out of a container (Locker, sleeper, cryo...)
|
||||
else if(isobj(loc))
|
||||
var/obj/C = loc
|
||||
@@ -794,7 +798,7 @@
|
||||
if(G.trigger_guard != TRIGGER_GUARD_ALLOW_ALL && !IsAdvancedToolUser())
|
||||
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return FALSE
|
||||
if(has_disability(DISABILITY_PACIFISM))
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
to_chat(src, "<span class='notice'>You don't want to risk harming anyone!</span>")
|
||||
return FALSE
|
||||
return TRUE
|
||||
@@ -950,7 +954,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)) || (status_flags & FAKEDEATH)
|
||||
var/ko = IsKnockdown() || IsUnconscious() || (stat && (stat != SOFT_CRIT || pulledby)) || (has_trait(TRAIT_FAKEDEATH))
|
||||
var/move_and_fall = stat == SOFT_CRIT && !pulledby
|
||||
var/chokehold = pulledby && pulledby.grab_state >= GRAB_NECK
|
||||
var/buckle_lying = !(buckled && !buckled.buckle_lying)
|
||||
|
||||
@@ -132,11 +132,11 @@
|
||||
user.start_pulling(src, supress_message)
|
||||
return
|
||||
|
||||
if(!(status_flags & CANPUSH))
|
||||
if(!(status_flags & CANPUSH) || has_trait(TRAIT_PUSHIMMUNE))
|
||||
to_chat(user, "<span class='warning'>[src] can't be grabbed more aggressively!</span>")
|
||||
return FALSE
|
||||
|
||||
if(user.has_disability(DISABILITY_PACIFISM))
|
||||
if(user.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(user, "<span class='notice'>You don't want to risk hurting [src]!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -193,7 +193,7 @@
|
||||
M.Feedstop()
|
||||
return // can't attack while eating!
|
||||
|
||||
if(has_disability(DISABILITY_PACIFISM))
|
||||
if(has_trait(TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -210,7 +210,7 @@
|
||||
M.visible_message("<span class='notice'>\The [M] [M.friendly] [src]!</span>")
|
||||
return FALSE
|
||||
else
|
||||
if(M.has_disability(DISABILITY_PACIFISM))
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -229,7 +229,7 @@
|
||||
return FALSE
|
||||
|
||||
if (M.a_intent == INTENT_HARM)
|
||||
if(M.has_disability(DISABILITY_PACIFISM))
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
|
||||
@@ -255,7 +255,7 @@
|
||||
return FALSE
|
||||
|
||||
else
|
||||
if(L.has_disability(DISABILITY_PACIFISM))
|
||||
if(L.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(L, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return
|
||||
|
||||
@@ -280,7 +280,7 @@
|
||||
grabbedby(M)
|
||||
return FALSE
|
||||
if("harm")
|
||||
if(M.has_disability(DISABILITY_PACIFISM))
|
||||
if(M.has_trait(TRAIT_PACIFISM))
|
||||
to_chat(M, "<span class='notice'>You don't want to hurt anyone!</span>")
|
||||
return FALSE
|
||||
M.do_attack_animation(src)
|
||||
@@ -370,7 +370,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_disability(DISABILITY_BLIND))))
|
||||
if(get_eye_protection() < intensity && (override_blindness_check || !(has_trait(TRAIT_BLIND))))
|
||||
overlay_fullscreen("flash", type)
|
||||
addtimer(CALLBACK(src, .proc/clear_fullscreen, "flash", 25), 25)
|
||||
return TRUE
|
||||
|
||||
@@ -32,7 +32,7 @@
|
||||
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/disabilities = list()
|
||||
var/list/status_traits = list()
|
||||
|
||||
var/list/surgeries = list() //a list of surgery datums. generally empty, they're added when the player wants them.
|
||||
|
||||
|
||||
@@ -273,7 +273,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_disability(DISABILITY_MUTE))
|
||||
if(has_trait(TRAIT_MUTE))
|
||||
return 0
|
||||
|
||||
if(is_muzzled())
|
||||
|
||||
@@ -60,9 +60,6 @@
|
||||
// The actual updating. It gathers the visible turfs from cameras and puts them into the appropiate lists.
|
||||
|
||||
/datum/camerachunk/proc/update()
|
||||
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
var/list/newVisibleTurfs = list()
|
||||
|
||||
for(var/camera in cameras)
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
/mob/living/silicon/robot/Life()
|
||||
set invisibility = 0
|
||||
set background = BACKGROUND_ENABLED
|
||||
|
||||
if (src.notransform)
|
||||
return
|
||||
|
||||
|
||||
@@ -226,7 +226,6 @@
|
||||
return //we use a different hud
|
||||
|
||||
/mob/living/simple_animal/bot/handle_automated_action() //Master process which handles code common across most bots.
|
||||
set background = BACKGROUND_ENABLED
|
||||
diag_hud_set_botmode()
|
||||
|
||||
if (ignorelistcleanuptimer % 300 == 0) // Every 300 actions, clean up the ignore list from old junk
|
||||
|
||||
@@ -367,7 +367,7 @@ Auto Patrol[]"},
|
||||
continue
|
||||
|
||||
/mob/living/simple_animal/bot/ed209/proc/check_for_weapons(var/obj/item/slot_item)
|
||||
if(slot_item && slot_item.needs_permit)
|
||||
if(slot_item && (slot_item.item_flags & NEEDS_PERMIT))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
|
||||
@@ -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.status_flags & FAKEDEATH))
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
return FALSE //welp too late for them!
|
||||
|
||||
if(!(loc == C.loc) && !(isturf(C.loc) && isturf(loc)))
|
||||
@@ -418,7 +418,7 @@
|
||||
soft_reset()
|
||||
return
|
||||
|
||||
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
|
||||
if(C.stat == DEAD || (C.has_trait(TRAIT_FAKEDEATH)))
|
||||
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg',"Live, damnit! LIVE!" = 'sound/voice/mlive.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
|
||||
var/message = pick(messagevoice)
|
||||
speak(message)
|
||||
|
||||
@@ -392,7 +392,7 @@ Auto Patrol: []"},
|
||||
else
|
||||
continue
|
||||
/mob/living/simple_animal/bot/secbot/proc/check_for_weapons(var/obj/item/slot_item)
|
||||
if(slot_item && slot_item.needs_permit)
|
||||
if(slot_item && (slot_item.item_flags & NEEDS_PERMIT))
|
||||
return 1
|
||||
return 0
|
||||
|
||||
@@ -424,7 +424,7 @@ Auto Patrol: []"},
|
||||
mode = BOT_HUNT
|
||||
|
||||
/mob/living/simple_animal/bot/secbot/Crossed(atom/movable/AM)
|
||||
if(ismob(AM) && target)
|
||||
if(has_gravity() && ismob(AM) && target)
|
||||
var/mob/living/carbon/C = AM
|
||||
if(!istype(C) || !C || in_range(src, target))
|
||||
return
|
||||
|
||||
@@ -87,16 +87,16 @@
|
||||
if(def_zone)
|
||||
if(def_zone == "head")
|
||||
if(inventory_head)
|
||||
armorval = inventory_head.armor[type]
|
||||
armorval = inventory_head.armor.getRating(type)
|
||||
else
|
||||
if(inventory_back)
|
||||
armorval = inventory_back.armor[type]
|
||||
armorval = inventory_back.armor.getRating(type)
|
||||
return armorval
|
||||
else
|
||||
if(inventory_head)
|
||||
armorval += inventory_head.armor[type]
|
||||
armorval += inventory_head.armor.getRating(type)
|
||||
if(inventory_back)
|
||||
armorval += inventory_back.armor[type]
|
||||
armorval += inventory_back.armor.getRating(type)
|
||||
return armorval*0.5
|
||||
|
||||
/mob/living/simple_animal/pet/dog/corgi/attackby(obj/item/O, mob/user, params)
|
||||
|
||||
@@ -61,4 +61,4 @@
|
||||
D.equip_to_slot_or_del(new_hat, slot_head)
|
||||
D.admin_spawned = admin_spawned
|
||||
D.key = user.key
|
||||
qdel(src)
|
||||
qdel(src)
|
||||
|
||||
@@ -105,7 +105,7 @@
|
||||
var/armorval = 0
|
||||
|
||||
if(head)
|
||||
armorval = head.armor[type]
|
||||
armorval = head.armor.getRating(type)
|
||||
return (armorval * get_armor_effectiveness()) //armor is reduced for tiny fragile drones
|
||||
|
||||
/mob/living/simple_animal/drone/proc/get_armor_effectiveness()
|
||||
|
||||
@@ -0,0 +1,61 @@
|
||||
/mob/living/simple_animal/hostile/retaliate/poison
|
||||
var/poison_per_bite = 0
|
||||
var/poison_type = "toxin"
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/AttackingTarget()
|
||||
. = ..()
|
||||
if(. && isliving(target))
|
||||
var/mob/living/L = target
|
||||
if(L.reagents && !poison_per_bite == 0)
|
||||
L.reagents.add_reagent(poison_type, poison_per_bite)
|
||||
return .
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake
|
||||
name = "snake"
|
||||
desc = "A slithery snake. These legless reptiles are the bane of mice and adventurers alike."
|
||||
icon_state = "snake"
|
||||
icon_living = "snake"
|
||||
icon_dead = "snake_dead"
|
||||
speak_emote = list("hisses")
|
||||
health = 20
|
||||
maxHealth = 20
|
||||
attacktext = "bites"
|
||||
melee_damage_lower = 5
|
||||
melee_damage_upper = 6
|
||||
response_help = "pets"
|
||||
response_disarm = "shoos"
|
||||
response_harm = "steps on"
|
||||
faction = list("hostile")
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
density = FALSE
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
gold_core_spawnable = FRIENDLY_SPAWN
|
||||
obj_damage = 0
|
||||
environment_smash = ENVIRONMENT_SMASH_NONE
|
||||
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/ListTargets(atom/the_target)
|
||||
. = oview(vision_range, targets_from) //get list of things in vision range
|
||||
var/list/living_mobs = list()
|
||||
var/list/mice = list()
|
||||
for (var/HM in .)
|
||||
//Yum a tasty mouse
|
||||
if(istype(HM, /mob/living/simple_animal/mouse))
|
||||
mice += HM
|
||||
if(isliving(HM))
|
||||
living_mobs += HM
|
||||
|
||||
// if no tasty mice to chase, lets chase any living mob enemies in our vision range
|
||||
if(length(mice) == 0)
|
||||
//Filter living mobs (in range mobs) by those we consider enemies (retaliate behaviour)
|
||||
return living_mobs & enemies
|
||||
return mice
|
||||
|
||||
/mob/living/simple_animal/hostile/retaliate/poison/snake/AttackingTarget()
|
||||
if(istype(target, /mob/living/simple_animal/mouse))
|
||||
visible_message("<span class='notice'>[name] consumes [target] in a single gulp!</span>", "<span class='notice'>You consume [target] in a single gulp!</span>")
|
||||
QDEL_NULL(target)
|
||||
adjustBruteLoss(-2)
|
||||
else
|
||||
return ..()
|
||||
@@ -22,7 +22,7 @@
|
||||
ventcrawler = VENTCRAWLER_ALWAYS
|
||||
var/datum/mind/origin
|
||||
var/egg_lain = 0
|
||||
// gold_core_spawnable = HOSTILE_SPAWN //are you sure about this??
|
||||
//gold_core_spawnable = HOSTILE_SPAWN //are you sure about this??
|
||||
|
||||
/mob/living/simple_animal/hostile/headcrab/proc/Infect(mob/living/carbon/victim)
|
||||
var/obj/item/organ/body_egg/changeling_egg/egg = new(victim)
|
||||
@@ -43,7 +43,7 @@
|
||||
// Changeling egg can survive in aliens!
|
||||
var/mob/living/carbon/C = target
|
||||
if(C.stat == DEAD)
|
||||
if(C.status_flags & XENO_HOST)
|
||||
if(C.has_trait(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_disability(DISABILITY_NOCLONE, MAGIC_DISABILITY) //Free revives, but significantly limits your options for reviving except via the crystal
|
||||
H.add_trait(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
|
||||
@@ -719,7 +719,7 @@ Difficulty: Very Hard
|
||||
if(isliving(A) && holder_animal)
|
||||
var/mob/living/L = A
|
||||
L.notransform = 1
|
||||
L.add_disability(DISABILITY_MUTE, STASIS_MUTE)
|
||||
L.add_trait(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
|
||||
@@ -729,7 +729,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_disability(DISABILITY_MUTE, STASIS_MUTE)
|
||||
L.remove_trait(TRAIT_MUTE, STASIS_MUTE)
|
||||
L.status_flags &= ~GODMODE
|
||||
L.notransform = 0
|
||||
if(holder_animal)
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness,
|
||||
// eye damage, eye_blind, eye_blurry, druggy, DISABILITY_BLIND disability, and DISABILITY_NEARSIGHT disability.
|
||||
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
|
||||
|
||||
|
||||
////////////////////////////// STUN ////////////////////////////////////
|
||||
@@ -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) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !has_trait(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) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !has_trait(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) || ignore_canstun)
|
||||
if(((status_flags & CANSTUN) && !has_trait(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) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(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) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(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) || ignore_canknockdown)
|
||||
if(((status_flags & CANKNOCKDOWN) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canknockdown)
|
||||
if(absorb_stun(amount, ignore_canknockdown))
|
||||
return
|
||||
var/datum/status_effect/incapacitating/knockdown/K = IsKnockdown()
|
||||
@@ -140,18 +140,18 @@
|
||||
|
||||
/////////////////////////////////// DISABILITIES ////////////////////////////////////
|
||||
|
||||
/mob/living/proc/add_disability(disability, source)
|
||||
if(!disabilities[disability])
|
||||
disabilities[disability] = list(source)
|
||||
/mob/living/proc/add_trait(trait, source)
|
||||
if(!status_traits[trait])
|
||||
status_traits[trait] = list(source)
|
||||
else
|
||||
disabilities[disability] |= list(source)
|
||||
status_traits[trait] |= list(source)
|
||||
|
||||
/mob/living/proc/remove_disability(disability, list/sources)
|
||||
if(!disabilities[disability])
|
||||
/mob/living/proc/remove_trait(trait, list/sources)
|
||||
if(!status_traits[trait])
|
||||
return
|
||||
|
||||
if(!sources) // No defined source cures the disability entirely.
|
||||
disabilities -= disability
|
||||
if(!sources) // No defined source cures the trait entirely.
|
||||
status_traits -= trait
|
||||
return
|
||||
|
||||
if(!islist(sources))
|
||||
@@ -159,61 +159,74 @@
|
||||
|
||||
if(LAZYLEN(sources))
|
||||
for(var/S in sources)
|
||||
if(S in disabilities[disability])
|
||||
disabilities[disability] -= S
|
||||
if(S in status_traits[trait])
|
||||
status_traits[trait] -= S
|
||||
else
|
||||
disabilities[disability] = list()
|
||||
status_traits[trait] = list()
|
||||
|
||||
if(!LAZYLEN(disabilities[disability]))
|
||||
disabilities -= disability
|
||||
if(!LAZYLEN(status_traits[trait]))
|
||||
status_traits -= trait
|
||||
|
||||
/mob/living/proc/has_disability(disability, list/sources)
|
||||
if(!disabilities[disability])
|
||||
/mob/living/proc/has_trait(trait, list/sources)
|
||||
if(!status_traits[trait])
|
||||
return FALSE
|
||||
|
||||
. = FALSE
|
||||
|
||||
if(LAZYLEN(sources))
|
||||
for(var/S in sources)
|
||||
if(S in disabilities[disability])
|
||||
if(S in status_traits[trait])
|
||||
return TRUE
|
||||
else
|
||||
if(LAZYLEN(disabilities[disability]))
|
||||
if(LAZYLEN(status_traits[trait]))
|
||||
return TRUE
|
||||
|
||||
/mob/living/proc/remove_all_disabilities()
|
||||
disabilities = list()
|
||||
/mob/living/proc/remove_all_traits()
|
||||
status_traits = list()
|
||||
|
||||
/////////////////////////////////// DISABILITY PROCS ////////////////////////////////////
|
||||
/////////////////////////////////// TRAIT PROCS ////////////////////////////////////
|
||||
|
||||
/mob/living/proc/cure_blind(list/sources)
|
||||
remove_disability(DISABILITY_BLIND, sources)
|
||||
if(!has_disability(DISABILITY_BLIND))
|
||||
remove_trait(TRAIT_BLIND, sources)
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
adjust_blindness(-1)
|
||||
|
||||
/mob/living/proc/become_blind(source)
|
||||
if(!has_disability(DISABILITY_BLIND))
|
||||
if(!has_trait(TRAIT_BLIND))
|
||||
blind_eyes(1)
|
||||
add_disability(DISABILITY_BLIND, source)
|
||||
add_trait(TRAIT_BLIND, source)
|
||||
|
||||
/mob/living/proc/cure_nearsighted(list/sources)
|
||||
remove_disability(DISABILITY_NEARSIGHT, sources)
|
||||
if(!has_disability(DISABILITY_NEARSIGHT))
|
||||
remove_trait(TRAIT_NEARSIGHT, sources)
|
||||
if(!has_trait(TRAIT_NEARSIGHT))
|
||||
clear_fullscreen("nearsighted")
|
||||
|
||||
/mob/living/proc/become_nearsighted(source)
|
||||
if(!has_disability(DISABILITY_NEARSIGHT))
|
||||
if(!has_trait(TRAIT_NEARSIGHT))
|
||||
overlay_fullscreen("nearsighted", /obj/screen/fullscreen/impaired, 1)
|
||||
add_disability(DISABILITY_NEARSIGHT, source)
|
||||
add_trait(TRAIT_NEARSIGHT, source)
|
||||
|
||||
/mob/living/proc/cure_husk(list/sources)
|
||||
remove_disability(DISABILITY_HUSK, sources)
|
||||
if(!has_disability(DISABILITY_HUSK))
|
||||
status_flags &= ~DISFIGURED
|
||||
remove_trait(TRAIT_HUSK, sources)
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
remove_trait(TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
|
||||
/mob/living/proc/become_husk(source)
|
||||
if(!has_disability(DISABILITY_HUSK))
|
||||
status_flags |= DISFIGURED //makes them unknown
|
||||
if(!has_trait(TRAIT_HUSK))
|
||||
add_trait(TRAIT_DISFIGURED, "husk")
|
||||
update_body()
|
||||
add_disability(DISABILITY_HUSK, source)
|
||||
add_trait(TRAIT_HUSK, source)
|
||||
|
||||
/mob/living/proc/cure_fakedeath(list/sources)
|
||||
remove_trait(TRAIT_FAKEDEATH, sources)
|
||||
if(stat != DEAD)
|
||||
tod = null
|
||||
update_stat()
|
||||
|
||||
/mob/living/proc/fakedeath(source)
|
||||
if(stat == DEAD)
|
||||
return
|
||||
add_trait(TRAIT_FAKEDEATH, source)
|
||||
tod = worldtime2text()
|
||||
update_stat()
|
||||
@@ -1,5 +0,0 @@
|
||||
//Methods that need to be cleaned.
|
||||
/* INFORMATION
|
||||
Put (mob/proc)s here that are in dire need of a code cleanup.
|
||||
*/
|
||||
|
||||
@@ -372,9 +372,6 @@ It's fairly easy to fix if dealing with single letters but not so much with comp
|
||||
if("monkey")
|
||||
if(M.viruses && (locate(/datum/disease/transformation/jungle_fever) in M.viruses))
|
||||
return 2
|
||||
if("abductor")
|
||||
if(M.mind in SSticker.mode.abductors)
|
||||
return 2
|
||||
return TRUE
|
||||
if(M.mind && LAZYLEN(M.mind.antag_datums)) //they have an antag datum!
|
||||
return TRUE
|
||||
|
||||
@@ -82,4 +82,4 @@
|
||||
return 0
|
||||
|
||||
/mob/proc/lingcheck()
|
||||
return LINGHIVE_NONE
|
||||
return LINGHIVE_NONE
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
|
||||
//Here are the procs used to modify status effects of a mob.
|
||||
//The effects include: stun, knockdown, unconscious, sleeping, resting, jitteriness, dizziness, ear damage,
|
||||
// eye damage, eye_blind, eye_blurry, druggy, DISABILITY_BLIND disability, and DISABILITY_NEARSIGHT disability.
|
||||
// eye damage, eye_blind, eye_blurry, druggy, TRAIT_BLIND trait, and TRAIT_NEARSIGHT trait.
|
||||
|
||||
/////////////////////////////////// STUN ////////////////////////////////////
|
||||
|
||||
@@ -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) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(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) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(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) || ignore_canunconscious)
|
||||
if(((status_flags & CANUNCONSCIOUS) && !has_trait(TRAIT_STUNIMMUNE)) || ignore_canunconscious)
|
||||
var/datum/status_effect/incapacitating/unconscious/U = IsUnconscious()
|
||||
if(U)
|
||||
U.duration += amount
|
||||
@@ -164,7 +164,7 @@
|
||||
blind_minimum = 1
|
||||
if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if(L.has_disability(DISABILITY_BLIND))
|
||||
if(L.has_trait(TRAIT_BLIND))
|
||||
blind_minimum = 1
|
||||
eye_blind = max(eye_blind+amount, blind_minimum)
|
||||
if(!eye_blind)
|
||||
@@ -185,7 +185,7 @@
|
||||
blind_minimum = 1
|
||||
if(isliving(src))
|
||||
var/mob/living/L = src
|
||||
if(L.has_disability(DISABILITY_BLIND))
|
||||
if(L.has_trait(TRAIT_BLIND))
|
||||
blind_minimum = 1
|
||||
eye_blind = blind_minimum
|
||||
if(!eye_blind)
|
||||
|
||||
Reference in New Issue
Block a user