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:
Poojawa
2018-01-29 04:42:29 -06:00
committed by GitHub
parent 89fa4b0f28
commit 03086dfa91
666 changed files with 27177 additions and 35945 deletions
@@ -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 *********/
+5 -5
View File
@@ -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"
+3 -3
View File
@@ -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 -3
View File
@@ -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 ////////////////////////////////////
+11 -8
View File
@@ -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)
+1 -1
View File
@@ -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)
+29 -15
View File
@@ -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))
+13 -20
View File
@@ -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>")
+46 -42
View File
@@ -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
View File
@@ -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"
+2 -2
View File
@@ -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
+6 -7
View File
@@ -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)
+8 -4
View File
@@ -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)
+8 -8
View File
@@ -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
+1 -1
View File
@@ -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.
+1 -1
View File
@@ -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)
+54 -41
View File
@@ -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()
-5
View File
@@ -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.
*/
-3
View File
@@ -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
+1 -1
View File
@@ -82,4 +82,4 @@
return 0
/mob/proc/lingcheck()
return LINGHIVE_NONE
return LINGHIVE_NONE
+6 -6
View File
@@ -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)