mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-07-19 19:13:30 +01:00
Merge remote-tracking branch 'upstream/master' into HUNKE
This commit is contained in:
@@ -657,7 +657,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
|
||||
|
||||
return FALSE
|
||||
|
||||
/mob/dead/observer/incapacitated()
|
||||
/mob/dead/observer/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
|
||||
return TRUE
|
||||
|
||||
//this is a mob verb instead of atom for performance reasons
|
||||
|
||||
@@ -91,6 +91,10 @@
|
||||
desc = "It's a small maintenance robot."
|
||||
icon_state = "drone"
|
||||
|
||||
/obj/item/weapon/holder/drone/emagged
|
||||
name = "maintenance drone"
|
||||
icon_state = "drone-emagged"
|
||||
|
||||
/obj/item/weapon/holder/pai
|
||||
name = "pAI"
|
||||
desc = "It's a little robot."
|
||||
|
||||
@@ -153,14 +153,10 @@
|
||||
return has_fine_manipulation
|
||||
|
||||
/mob/living/carbon/alien/Stat()
|
||||
|
||||
..()
|
||||
statpanel("Status")
|
||||
stat(null, "Intent: [a_intent]")
|
||||
stat(null, "Move Mode: [m_intent]")
|
||||
|
||||
..()
|
||||
|
||||
|
||||
show_stat_emergency_shuttle_eta()
|
||||
|
||||
/mob/living/carbon/alien/SetStunned(amount, updating = 1, force = 0)
|
||||
|
||||
@@ -1,11 +1,8 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/alien/humanoid
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
fire_alert = 0
|
||||
pass_flags = PASSTABLE
|
||||
var/temperature_alert = 0
|
||||
|
||||
|
||||
/mob/living/carbon/alien/humanoid/Life()
|
||||
|
||||
@@ -1,8 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/alien/larva
|
||||
var/temperature_alert = 0
|
||||
|
||||
/mob/living/carbon/alien/larva/Life()
|
||||
if(..()) //still breathing
|
||||
// GROW!
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
//TODO: Make these simple_animals
|
||||
|
||||
var/const/MIN_IMPREGNATION_TIME = 100 //time it takes to impregnate someone
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/obj/item/device/mmi
|
||||
name = "Man-Machine Interface"
|
||||
desc = "The Warrior's bland acronym, MMI, obscures the true horror of this monstrosity."
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/brain
|
||||
var/obj/item/container = null
|
||||
var/timeofhostdeath = 0
|
||||
|
||||
@@ -25,12 +25,14 @@
|
||||
to_chat(user, "<span class='notice'>You carefully locate the manual activation switch and start the positronic brain's boot process.</span>")
|
||||
icon_state = "posibrain-searching"
|
||||
ghost_volunteers.Cut()
|
||||
src.searching = 1
|
||||
src.request_player()
|
||||
searching = 1
|
||||
request_player()
|
||||
spawn(600)
|
||||
if(ghost_volunteers.len)
|
||||
var/mob/dead/observer/O = pick(ghost_volunteers)
|
||||
if(check_observer(O))
|
||||
var/mob/dead/observer/O
|
||||
while(!istype(O) && ghost_volunteers.len)
|
||||
O = pick_n_take(ghost_volunteers)
|
||||
if(istype(O) && check_observer(O))
|
||||
transfer_personality(O)
|
||||
reset_search()
|
||||
else
|
||||
|
||||
@@ -19,6 +19,10 @@
|
||||
/mob/living/carbon/Destroy()
|
||||
QDEL_LIST(internal_organs)
|
||||
QDEL_LIST(stomach_contents)
|
||||
var/mob/living/simple_animal/borer/B = has_brain_worms()
|
||||
if(B)
|
||||
B.leave_host()
|
||||
qdel(B)
|
||||
remove_from_all_data_huds()
|
||||
return ..()
|
||||
|
||||
@@ -216,15 +220,18 @@
|
||||
"<span class='notice'>You check yourself for injuries.</span>" \
|
||||
)
|
||||
|
||||
for(var/obj/item/organ/external/org in H.bodyparts)
|
||||
var/list/missing = list("head", "chest", "groin", "l_arm", "r_arm", "l_hand", "r_hand", "l_leg", "r_leg", "l_foot", "r_foot")
|
||||
for(var/X in H.bodyparts)
|
||||
var/obj/item/organ/external/LB = X
|
||||
missing -= LB.limb_name
|
||||
var/status = ""
|
||||
var/brutedamage = org.brute_dam
|
||||
var/burndamage = org.burn_dam
|
||||
var/brutedamage = LB.brute_dam
|
||||
var/burndamage = LB.burn_dam
|
||||
|
||||
if(brutedamage > 0)
|
||||
status = "bruised"
|
||||
if(brutedamage > 20)
|
||||
status = "bleeding"
|
||||
status = "battered"
|
||||
if(brutedamage > 40)
|
||||
status = "mangled"
|
||||
if(brutedamage > 0 && burndamage > 0)
|
||||
@@ -236,17 +243,20 @@
|
||||
status += "blistered"
|
||||
else if(burndamage > 0)
|
||||
status += "numb"
|
||||
if(org.status & ORGAN_DESTROYED)
|
||||
status = "MISSING!"
|
||||
if(org.status & ORGAN_MUTATED)
|
||||
if(LB.status & ORGAN_MUTATED)
|
||||
status = "weirdly shapen."
|
||||
if(status == "")
|
||||
status = "OK"
|
||||
src.show_message(text("\t []My [] is [].",status=="OK"?"<span class='notice'></span>":"<span class='warning'></span>",org.name,status),1)
|
||||
to_chat(src, "\t <span class='[status == "OK" ? "notice" : "warning"]'>Your [LB.name] is [status].</span>")
|
||||
|
||||
for(var/obj/item/I in org.embedded_objects)
|
||||
to_chat(src, "\t <a href='byond://?src=[UID()];embedded_object=[I.UID()];embedded_limb=[org.UID()]' class='warning'>There is \a [I] embedded in your [org.name]!</a>")
|
||||
for(var/obj/item/I in LB.embedded_objects)
|
||||
to_chat(src, "\t <a href='byond://?src=[UID()];embedded_object=[I.UID()];embedded_limb=[LB.UID()]' class='warning'>There is \a [I] embedded in your [LB.name]!</a>")
|
||||
|
||||
for(var/t in missing)
|
||||
to_chat(src, "<span class='boldannounce'>Your [parse_zone(t)] is missing!</span>")
|
||||
|
||||
if(H.bleed_rate)
|
||||
to_chat(src, "<span class='danger'>You are bleeding!</span>")
|
||||
if(staminaloss)
|
||||
if(staminaloss > 30)
|
||||
to_chat(src, "<span class='info'>You're completely exhausted.</span>")
|
||||
@@ -295,7 +305,9 @@
|
||||
)
|
||||
if(istype(src,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.w_uniform)
|
||||
if(H.wear_suit)
|
||||
H.wear_suit.add_fingerprint(M)
|
||||
else if(H.w_uniform)
|
||||
H.w_uniform.add_fingerprint(M)
|
||||
|
||||
/mob/living/carbon/flash_eyes(intensity = 1, override_blindness_check = 0, affect_silicon = 0, visual = 0)
|
||||
@@ -315,15 +327,15 @@
|
||||
if(1)
|
||||
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
|
||||
if(prob(40)) //waiting on carbon organs
|
||||
E.damage += 1
|
||||
E.take_damage(1, 1)
|
||||
|
||||
if(2)
|
||||
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
|
||||
E.damage += rand(2, 4)
|
||||
E.take_damage(rand(2, 4), 1)
|
||||
|
||||
else
|
||||
to_chat(src, "Your eyes itch and burn severely!</span>")
|
||||
E.damage += rand(12, 16)
|
||||
E.take_damage(rand(12, 16), 1)
|
||||
|
||||
if(E.damage > E.min_bruised_damage)
|
||||
AdjustEyeBlind(damage)
|
||||
@@ -885,11 +897,11 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
..()
|
||||
|
||||
/mob/living/carbon/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
var/obj/item/organ/internal/xenos/plasmavessel/vessel = get_int_organ(/obj/item/organ/internal/xenos/plasmavessel)
|
||||
if(vessel)
|
||||
stat(null, "Plasma Stored: [vessel.stored_plasma]/[vessel.max_plasma]")
|
||||
..()
|
||||
|
||||
/mob/living/carbon/get_all_slots()
|
||||
return list(l_hand,
|
||||
@@ -928,7 +940,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
W.plane = initial(W.plane)
|
||||
|
||||
|
||||
/mob/living/carbon/proc/slip(var/description, var/stun, var/weaken, var/tilesSlipped, var/walkSafely, var/slipAny)
|
||||
/mob/living/carbon/proc/slip(description, stun, weaken, tilesSlipped, walkSafely, slipAny, slipVerb = "slip")
|
||||
if(flying || buckled || (walkSafely && m_intent == MOVE_INTENT_WALK))
|
||||
return 0
|
||||
if((lying) && (!(tilesSlipped)))
|
||||
@@ -936,16 +948,16 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
if(!(slipAny))
|
||||
if(istype(src, /mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if((isobj(H.shoes) && H.shoes.flags & NOSLIP) || H.species.bodyflags & FEET_NOSLIP)
|
||||
if(isobj(H.shoes) && H.shoes.flags & NOSLIP)
|
||||
return 0
|
||||
if(tilesSlipped)
|
||||
for(var/t = 0, t<=tilesSlipped, t++)
|
||||
spawn (t) step(src, src.dir)
|
||||
stop_pulling()
|
||||
to_chat(src, "<span class='notice'>You slipped on [description]!</span>")
|
||||
to_chat(src, "<span class='notice'>You [slipVerb]ped on [description]!</span>")
|
||||
playsound(src.loc, 'sound/misc/slip.ogg', 50, 1, -3)
|
||||
if(stun)
|
||||
Stun(stun)
|
||||
// Something something don't run with scissors
|
||||
Stun(stun)
|
||||
Weaken(weaken)
|
||||
return 1
|
||||
|
||||
@@ -969,7 +981,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
else
|
||||
if(!forceFed(toEat, user, fullness))
|
||||
return 0
|
||||
consume(toEat, bitesize_override)
|
||||
consume(toEat, bitesize_override, taste = toEat.taste)
|
||||
score_foodeaten++
|
||||
return 1
|
||||
|
||||
@@ -1022,7 +1034,7 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
|
||||
/*TO DO - If/when stomach organs are introduced, override this at the human level sending the item to the stomach
|
||||
so that different stomachs can handle things in different ways VB*/
|
||||
/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat, var/bitesize_override)
|
||||
/mob/living/carbon/proc/consume(var/obj/item/weapon/reagent_containers/food/toEat, var/bitesize_override, var/taste = TRUE)
|
||||
var/this_bite = bitesize_override ? bitesize_override : toEat.bitesize
|
||||
if(!toEat.reagents)
|
||||
return
|
||||
@@ -1031,6 +1043,8 @@ so that different stomachs can handle things in different ways VB*/
|
||||
if(toEat.consume_sound)
|
||||
playsound(loc, toEat.consume_sound, rand(10,50), 1)
|
||||
if(toEat.reagents.total_volume)
|
||||
if(taste)
|
||||
taste_reagents(toEat.reagents)
|
||||
var/fraction = min(this_bite/toEat.reagents.total_volume, 1)
|
||||
toEat.reagents.reaction(src, toEat.apply_type, fraction)
|
||||
toEat.reagents.trans_to(src, this_bite*toEat.transfer_efficiency)
|
||||
|
||||
@@ -40,3 +40,7 @@
|
||||
if(D.IsSpreadByTouch())
|
||||
ContractDisease(D)
|
||||
return 0
|
||||
|
||||
/mob/living/carbon/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
|
||||
if((!mask_only && head && (head.flags_cover & HEADCOVERSMOUTH)) || (!head_only && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH)))
|
||||
return TRUE
|
||||
@@ -8,14 +8,14 @@
|
||||
|
||||
var/life_tick = 0 // The amount of life ticks that have processed on this mob.
|
||||
|
||||
// total amount of wounds on mob, used to spread out healing and the like over all wounds
|
||||
var/number_wounds = 0
|
||||
var/obj/item/handcuffed = null //Whether or not the mob is handcuffed
|
||||
var/obj/item/legcuffed = null //Same as handcuffs but for legs. Bear traps use this.
|
||||
|
||||
var/obj/item/head = null
|
||||
var/obj/item/clothing/suit/wear_suit = null //TODO: necessary? Are they even used? ~Carn
|
||||
|
||||
var/mob/living/simple_animal/borer/borer = null
|
||||
|
||||
//Active emote/pose
|
||||
var/pose = null
|
||||
|
||||
|
||||
@@ -210,19 +210,14 @@
|
||||
H.ha_style = "None"
|
||||
update_head_accessory()
|
||||
|
||||
/mob/living/carbon/human/proc/change_eye_color(var/red, var/green, var/blue, update_dna = 1)
|
||||
/mob/living/carbon/human/proc/change_eye_color(var/colour = "#000000", update_dna = 1)
|
||||
// Update the main DNA datum, then sync the change across the organs
|
||||
var/obj/item/organ/internal/eyes/eyes_organ = get_int_organ(/obj/item/organ/internal/eyes)
|
||||
if(eyes_organ)
|
||||
var/eyes_red = eyes_organ.eye_colour[1]
|
||||
var/eyes_green = eyes_organ.eye_colour[2]
|
||||
var/eyes_blue = eyes_organ.eye_colour[3]
|
||||
if(red == eyes_red && green == eyes_green && blue == eyes_blue)
|
||||
if(colour == eyes_organ.eye_colour)
|
||||
return
|
||||
|
||||
eyes_organ.eye_colour[1] = red
|
||||
eyes_organ.eye_colour[2] = green
|
||||
eyes_organ.eye_colour[3] = blue
|
||||
eyes_organ.eye_colour = colour
|
||||
dna.eye_color_to_dna(eyes_organ)
|
||||
eyes_organ.set_dna(dna)
|
||||
|
||||
@@ -233,68 +228,58 @@
|
||||
update_body()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_hair_color(var/red, var/green, var/blue, var/secondary)
|
||||
/mob/living/carbon/human/proc/change_hair_color(var/colour = "#000000", var/secondary)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!H)
|
||||
return
|
||||
|
||||
if(!secondary)
|
||||
if(red == H.r_hair && green == H.g_hair && blue == H.b_hair)
|
||||
if(colour == H.hair_colour)
|
||||
return
|
||||
|
||||
H.r_hair = red
|
||||
H.g_hair = green
|
||||
H.b_hair = blue
|
||||
H.hair_colour = colour
|
||||
else
|
||||
if(red == H.r_hair_sec && green == H.g_hair_sec && blue == H.b_hair_sec)
|
||||
if(colour == H.sec_hair_colour)
|
||||
return
|
||||
|
||||
H.r_hair_sec = red
|
||||
H.g_hair_sec = green
|
||||
H.b_hair_sec = blue
|
||||
H.sec_hair_colour = colour
|
||||
|
||||
update_hair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_facial_hair_color(var/red, var/green, var/blue, var/secondary)
|
||||
/mob/living/carbon/human/proc/change_facial_hair_color(var/colour = "#000000", var/secondary)
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!H)
|
||||
return
|
||||
|
||||
if(!secondary)
|
||||
if(red == H.r_facial && green == H.g_facial && blue == H.b_facial)
|
||||
if(colour == H.facial_colour)
|
||||
return
|
||||
|
||||
H.r_facial = red
|
||||
H.g_facial = green
|
||||
H.b_facial = blue
|
||||
H.facial_colour = colour
|
||||
else
|
||||
if(red == H.r_facial_sec && green == H.g_facial_sec && blue == H.b_facial_sec)
|
||||
if(colour == H.sec_facial_colour)
|
||||
return
|
||||
|
||||
H.r_facial_sec = red
|
||||
H.g_facial_sec = green
|
||||
H.b_facial_sec = blue
|
||||
H.sec_facial_colour = colour
|
||||
|
||||
update_fhair()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_head_accessory_color(var/red, var/green, var/blue)
|
||||
/mob/living/carbon/human/proc/change_head_accessory_color(var/colour = "#000000")
|
||||
var/obj/item/organ/external/head/H = get_organ("head")
|
||||
if(!H)
|
||||
return
|
||||
|
||||
if(red == H.r_headacc && green == H.g_headacc && blue == H.b_headacc)
|
||||
if(colour == H.headacc_colour)
|
||||
return
|
||||
|
||||
H.r_headacc = red
|
||||
H.g_headacc = green
|
||||
H.b_headacc = blue
|
||||
H.headacc_colour = colour
|
||||
|
||||
update_head_accessory()
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/change_marking_color(var/colour, var/location = "body")
|
||||
/mob/living/carbon/human/proc/change_marking_color(var/colour = "#000000", var/location = "body")
|
||||
if(colour == m_colours[location])
|
||||
return
|
||||
|
||||
@@ -307,13 +292,11 @@
|
||||
return 1
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/change_skin_color(var/red, var/green, var/blue)
|
||||
if(red == r_skin && green == g_skin && blue == b_skin || !(species.bodyflags & HAS_SKIN_COLOR))
|
||||
/mob/living/carbon/human/proc/change_skin_color(var/colour = "#000000")
|
||||
if(colour == skin_colour || !(species.bodyflags & HAS_SKIN_COLOR))
|
||||
return
|
||||
|
||||
r_skin = red
|
||||
g_skin = green
|
||||
b_skin = blue
|
||||
skin_colour = colour
|
||||
|
||||
force_update_limbs()
|
||||
update_body()
|
||||
@@ -343,7 +326,7 @@
|
||||
continue
|
||||
if(blacklist.len && (current_species_name in blacklist))
|
||||
continue
|
||||
if((current_species.flags & IS_WHITELISTED) && !is_alien_whitelisted(src, current_species_name))
|
||||
if((IS_WHITELISTED in current_species.species_traits) && !is_alien_whitelisted(src, current_species_name))
|
||||
continue
|
||||
|
||||
valid_species += current_species_name
|
||||
@@ -364,7 +347,7 @@
|
||||
continue
|
||||
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
|
||||
continue
|
||||
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
|
||||
valid_hairstyles += hairstyle //Give them their hairstyles if they do.
|
||||
@@ -392,7 +375,7 @@
|
||||
continue
|
||||
if((H.gender == MALE && S.gender == FEMALE) || (H.gender == FEMALE && S.gender == MALE))
|
||||
continue
|
||||
if(H.species.flags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
if(H.species.bodyflags & ALL_RPARTS) //If the user is a species who can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(H.species.name in S.species_allowed) //If this is a facial hair style native to the user's species...
|
||||
if((H.species.name in S.species_allowed) && robohead.is_monitor && ((S.models_allowed && (robohead.company in S.models_allowed)) || !S.models_allowed)) //If this is a facial hair style native to the user's species, check to see if they have a head with an ipc-style screen and that the head's company is in the screen style's allowed models list.
|
||||
@@ -446,7 +429,7 @@
|
||||
continue
|
||||
if(location == "head")
|
||||
var/datum/sprite_accessory/body_markings/head/M = marking_styles_list[S.name]
|
||||
if(H.species.flags & ALL_RPARTS)//If the user is a species that can have a robotic head...
|
||||
if(H.species.bodyflags & ALL_RPARTS)//If the user is a species that can have a robotic head...
|
||||
var/datum/robolimb/robohead = all_robolimbs[H.model]
|
||||
if(!(S.models_allowed && (robohead.company in S.models_allowed))) //Make sure they don't get markings incompatible with their head.
|
||||
continue
|
||||
|
||||
@@ -37,7 +37,7 @@
|
||||
if(species.name == "Drask") //Only Drask can make whale noises
|
||||
on_CD = handle_emote_CD() //proc located in code\modules\mob\emote.dm
|
||||
else
|
||||
return
|
||||
return
|
||||
if("howl", "howls")
|
||||
if (species.name == "Vulpkanin") //Only Vulpkanin can howl
|
||||
on_CD = handle_emote_CD(100)
|
||||
@@ -47,7 +47,7 @@
|
||||
if (species.name == "Vulpkanin") //Only Vulpkanin can growl
|
||||
on_CD = handle_emote_CD()
|
||||
else
|
||||
return
|
||||
return
|
||||
if("squish", "squishes")
|
||||
var/found_slime_bodypart = 0
|
||||
|
||||
@@ -101,7 +101,7 @@
|
||||
if("me") //OKAY SO RANT TIME, THIS FUCKING HAS TO BE HERE OR A SHITLOAD OF THINGS BREAK
|
||||
return custom_emote(m_type, message) //DO YOU KNOW WHY SHIT BREAKS? BECAUSE SO MUCH OLDCODE CALLS mob.emote("me",1,"whatever_the_fuck_it_wants_to_emote")
|
||||
//WHO THE FUCK THOUGHT THAT WAS A GOOD FUCKING IDEA!?!?
|
||||
|
||||
|
||||
if("howl", "howls")
|
||||
var/M = handle_emote_param(param) //Check to see if the param is valid (mob with the param name is in view).
|
||||
message = "<B>[src]</B> howls[M ? " at [M]" : ""]!"
|
||||
@@ -113,7 +113,7 @@
|
||||
message = "<B>[src]</B> growls[M ? " at [M]" : ""]."
|
||||
playsound(loc, "growls", 80, 0)
|
||||
m_type = 2
|
||||
|
||||
|
||||
if("ping", "pings")
|
||||
var/M = handle_emote_param(param)
|
||||
|
||||
@@ -734,9 +734,9 @@
|
||||
message = "<B>[src]</B> [species.scream_verb][M ? " at [M]" : ""]!"
|
||||
m_type = 2
|
||||
if(gender == FEMALE)
|
||||
playsound(loc, "[species.female_scream_sound]", 80, 1, 0, pitch = get_age_pitch())
|
||||
playsound(loc, "[species.female_scream_sound]", 80, 1, frequency = get_age_pitch())
|
||||
else
|
||||
playsound(loc, "[species.male_scream_sound]", 80, 1, 0, pitch = get_age_pitch()) //default to male screams if no gender is present.
|
||||
playsound(loc, "[species.male_scream_sound]", 80, 1, frequency = get_age_pitch()) //default to male screams if no gender is present.
|
||||
|
||||
else
|
||||
message = "<B>[src]</B> makes a very loud noise[M ? " at [M]" : ""]."
|
||||
@@ -750,9 +750,9 @@
|
||||
var/obj/item/organ/external/R = H.get_organ("r_hand")
|
||||
var/left_hand_good = 0
|
||||
var/right_hand_good = 0
|
||||
if(L && (!(L.status & ORGAN_DESTROYED)) && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
|
||||
if(L && (!(L.status & ORGAN_SPLINTED)) && (!(L.status & ORGAN_BROKEN)))
|
||||
left_hand_good = 1
|
||||
if(R && (!(R.status & ORGAN_DESTROYED)) && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
|
||||
if(R && (!(R.status & ORGAN_SPLINTED)) && (!(R.status & ORGAN_BROKEN)))
|
||||
right_hand_good = 1
|
||||
|
||||
if(!left_hand_good && !right_hand_good)
|
||||
|
||||
@@ -191,16 +191,6 @@
|
||||
|
||||
//ID
|
||||
if(wear_id)
|
||||
/*var/id
|
||||
if(istype(wear_id, /obj/item/device/pda))
|
||||
var/obj/item/device/pda/pda = wear_id
|
||||
id = pda.owner
|
||||
else if(istype(wear_id, /obj/item/weapon/card/id)) //just in case something other than a PDA/ID card somehow gets in the ID slot :[
|
||||
var/obj/item/weapon/card/id/idcard = wear_id
|
||||
id = idcard.registered_name
|
||||
if(id && (id != real_name) && (get_dist(src, user) <= 1) && prob(10))
|
||||
msg += "<span class='warning'>[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id] yet something doesn't seem right...</span>\n"
|
||||
else*/
|
||||
msg += "[t_He] [t_is] wearing [bicon(wear_id)] \a [wear_id].\n"
|
||||
|
||||
//Jitters
|
||||
@@ -212,36 +202,103 @@
|
||||
if(100 to 200)
|
||||
msg += "<span class='warning'>[t_He] [t_is] twitching ever so slightly.</span>\n"
|
||||
|
||||
//splints
|
||||
for(var/organ in list("l_leg","r_leg","l_arm","r_arm"))
|
||||
var/obj/item/organ/external/o = get_organ(organ)
|
||||
if(o && o.status & ORGAN_SPLINTED)
|
||||
msg += "<span class='warning'>[t_He] [t_has] a splint on his [o.name]!</span>\n"
|
||||
|
||||
if(suiciding)
|
||||
msg += "<span class='warning'>[t_He] appears to have commited suicide... there is no hope of recovery.</span>\n"
|
||||
var/appears_dead = FALSE
|
||||
if(stat == DEAD || (status_flags & FAKEDEATH))
|
||||
appears_dead = TRUE
|
||||
if(suiciding)
|
||||
msg += "<span class='warning'>[t_He] appears to have committed suicide... there is no hope of recovery.</span>\n"
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] limp and unresponsive; there are no signs of life"
|
||||
if(get_int_organ(/obj/item/organ/internal/brain))
|
||||
if(!key)
|
||||
var/foundghost = FALSE
|
||||
if(mind)
|
||||
for(var/mob/dead/observer/G in player_list)
|
||||
if(G.mind == mind)
|
||||
foundghost = TRUE
|
||||
if(G.can_reenter_corpse == 0)
|
||||
foundghost = FALSE
|
||||
break
|
||||
if(!foundghost)
|
||||
msg += " and [t_his] soul has departed"
|
||||
msg += "...</span>\n"
|
||||
|
||||
if(DWARF in mutations)
|
||||
msg += "[t_He] [t_is] a halfling!\n"
|
||||
|
||||
var/distance = get_dist(user,src)
|
||||
if(istype(user, /mob/dead/observer) || user.stat == 2) // ghosts can see anything
|
||||
distance = 1
|
||||
if(src.stat)
|
||||
msg += "<span class='warning'>[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.</span>\n"
|
||||
if((stat == 2 || src.health <= config.health_threshold_crit) && distance <= 3)
|
||||
msg += "<span class='warning'>[t_He] does not appear to be breathing.</span>\n"
|
||||
if(istype(user, /mob/living/carbon/human) && !user.stat && distance <= 1)
|
||||
for(var/mob/O in viewers(user.loc, null))
|
||||
O.show_message("[user] checks [src]'s pulse.", 1)
|
||||
spawn(15)
|
||||
if(distance <= 1 && user.stat != 1)
|
||||
if(pulse == PULSE_NONE)
|
||||
to_chat(user, "<span class='deadsay'>[t_He] has no pulse[src.client ? "" : " and [t_his] soul has departed"]...</span>")
|
||||
else
|
||||
to_chat(user, "<span class='deadsay'>[t_He] has a pulse!</span>")
|
||||
if(!get_int_organ(/obj/item/organ/internal/brain))
|
||||
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
|
||||
|
||||
msg += "<span class='warning'>"
|
||||
|
||||
var/list/wound_flavor_text = list()
|
||||
var/list/is_destroyed = list()
|
||||
for(var/organ_tag in species.has_limbs)
|
||||
|
||||
var/list/organ_data = species.has_limbs[organ_tag]
|
||||
var/organ_descriptor = organ_data["descriptor"]
|
||||
is_destroyed["[organ_data["descriptor"]]"] = 1
|
||||
|
||||
var/obj/item/organ/external/E = bodyparts_by_name[organ_tag]
|
||||
if(!E)
|
||||
wound_flavor_text["[organ_tag]"] = "<B>[t_He] [t_is] missing [t_his] [organ_descriptor].</B>\n"
|
||||
else
|
||||
if(!isSynthetic())
|
||||
if(E.status & ORGAN_ROBOT)
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
|
||||
|
||||
else if(E.status & ORGAN_SPLINTED)
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a splint on his [E.name]!\n"
|
||||
|
||||
for(var/obj/item/I in E.embedded_objects)
|
||||
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [E.name]!</B>\n"
|
||||
|
||||
//Handles the text strings being added to the actual description.
|
||||
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
||||
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
|
||||
msg += wound_flavor_text["head"]
|
||||
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||
msg += wound_flavor_text["chest"]
|
||||
if(wound_flavor_text["l_arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["l_arm"]
|
||||
if(wound_flavor_text["l_hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["l_hand"]
|
||||
if(wound_flavor_text["r_arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["r_arm"]
|
||||
if(wound_flavor_text["r_hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["r_hand"]
|
||||
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["groin"]
|
||||
if(wound_flavor_text["l_leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["l_leg"]
|
||||
if(wound_flavor_text["l_foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["l_foot"]
|
||||
if(wound_flavor_text["r_leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["r_leg"]
|
||||
if(wound_flavor_text["r_foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["r_foot"]
|
||||
|
||||
var/temp = getBruteLoss() //no need to calculate each of these twice
|
||||
|
||||
if(temp)
|
||||
var/brute_message = !isSynthetic() ? "bruising" : "denting"
|
||||
if(temp < 30)
|
||||
msg += "[t_He] [t_has] minor [brute_message ].\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_has] severe [brute_message ]!</B>\n"
|
||||
|
||||
temp = getFireLoss()
|
||||
if(temp)
|
||||
if(temp < 30)
|
||||
msg += "[t_He] [t_has] minor burns.\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_has] severe burns!</B>\n"
|
||||
|
||||
temp = getCloneLoss()
|
||||
if(temp)
|
||||
if(temp < 30)
|
||||
msg += "[t_He] [t_has] minor cellular damage.\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_has] severe cellular damage.</B>\n"
|
||||
|
||||
|
||||
if(fire_stacks > 0)
|
||||
msg += "[t_He] [t_is] covered in something flammable.\n"
|
||||
if(fire_stacks < 0)
|
||||
@@ -267,189 +324,49 @@
|
||||
else
|
||||
msg += "[t_He] [t_is] quite chubby.\n"
|
||||
|
||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||
msg += "[t_He] [t_has] pale skin.\n"
|
||||
|
||||
if(bleedsuppress)
|
||||
msg += "[t_He] [t_is] bandaged with something.\n"
|
||||
else if(bleed_rate)
|
||||
if(reagents.has_reagent("heparin"))
|
||||
msg += "<B>[t_He] [t_is] bleeding uncontrollably!</B>\n"
|
||||
else
|
||||
msg += "<B>[t_He] [t_is] bleeding!</B>\n"
|
||||
|
||||
if(reagents.has_reagent("teslium"))
|
||||
msg += "[t_He] is emitting a gentle blue glow!\n"
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
if(getBrainLoss() >= 60)
|
||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||
if(!appears_dead)
|
||||
if(stat == UNCONSCIOUS)
|
||||
msg += "[t_He] [t_is]n't responding to anything around [t_him] and seems to be asleep.\n"
|
||||
else if(getBrainLoss() >= 60)
|
||||
msg += "[t_He] [t_has] a stupid expression on [t_his] face.\n"
|
||||
|
||||
if(species.show_ssd && (!species.has_organ["brain"] || get_int_organ(/obj/item/organ/internal/brain)) && stat != DEAD)
|
||||
if(istype(src, /mob/living/carbon/human/interactive))
|
||||
msg += "<span class='deadsay'>[t_He] appears to be some sort of sick automaton: [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
|
||||
else if(!key)
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] fast asleep. It doesn't look like they are waking up anytime soon.</span>\n"
|
||||
else if(!client)
|
||||
msg += "[t_He] [t_has] suddenly fallen asleep, suffering from Space Sleep Disorder.\n"
|
||||
if(get_int_organ(/obj/item/organ/internal/brain))
|
||||
if(istype(src, /mob/living/carbon/human/interactive))
|
||||
var/mob/living/carbon/human/interactive/auto = src
|
||||
if(auto.showexaminetext)
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] appears to be some sort of sick automaton, [t_his] eyes are glazed over and [t_his] mouth is slightly agape.</span>\n"
|
||||
if(auto.debugexamine)
|
||||
var/dodebug = auto.doing2string(auto.doing)
|
||||
var/interestdebug = auto.interest2string(auto.interest)
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] appears to be [interestdebug] and [dodebug].</span>\n"
|
||||
else if(species.show_ssd)
|
||||
if(!key)
|
||||
msg += "<span class='deadsay'>[t_He] [t_is] totally catatonic. The stresses of life in deep-space must have been too much for [t_him]. Any recovery is unlikely.</span>\n"
|
||||
else if(!client)
|
||||
msg += "[t_He] [t_has] suddenly fallen asleep, suffering from Space Sleep Disorder. [t_He] may wake up soon.\n"
|
||||
|
||||
if(!get_int_organ(/obj/item/organ/internal/brain))
|
||||
msg += "<span class='deadsay'>It appears that [t_his] brain is missing...</span>\n"
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
|
||||
|
||||
var/list/wound_flavor_text = list()
|
||||
var/list/is_destroyed = list()
|
||||
var/list/is_bleeding = list()
|
||||
for(var/organ_tag in species.has_limbs)
|
||||
|
||||
var/list/organ_data = species.has_limbs[organ_tag]
|
||||
var/organ_descriptor = organ_data["descriptor"]
|
||||
is_destroyed["[organ_data["descriptor"]]"] = 1
|
||||
|
||||
var/obj/item/organ/external/E = bodyparts_by_name[organ_tag]
|
||||
if(!E)
|
||||
wound_flavor_text["[organ_tag]"] = "<span class='warning'><b>[t_He] [t_is] missing [t_his] [organ_descriptor].</b></span>\n"
|
||||
else if(E.is_stump())
|
||||
wound_flavor_text["[organ_tag]"] = "<span class='warning'><b>[t_He] [t_has] a stump where [t_his] [organ_descriptor] should be.</b></span>\n"
|
||||
else
|
||||
continue
|
||||
|
||||
for(var/obj/item/organ/external/temp in bodyparts)
|
||||
if(temp && !temp.is_stump())
|
||||
if(temp.status & ORGAN_ROBOT)
|
||||
if(!(temp.brute_dam + temp.burn_dam))
|
||||
if(!isSynthetic())
|
||||
wound_flavor_text["[temp.limb_name]"] = "<span class='warning'>[t_He] [t_has] a robotic [temp.name]!</span>\n"
|
||||
continue
|
||||
else
|
||||
wound_flavor_text["[temp.limb_name]"] = "<span class='warning'>[t_He] [t_has] a robotic [temp.name]. It has"
|
||||
if(temp.brute_dam) switch(temp.brute_dam)
|
||||
if(0 to 20)
|
||||
wound_flavor_text["[temp.limb_name]"] += " some dents"
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.limb_name]"] += pick(" a lot of dents"," severe denting")
|
||||
if(temp.brute_dam && temp.burn_dam)
|
||||
wound_flavor_text["[temp.limb_name]"] += " and"
|
||||
if(temp.burn_dam) switch(temp.burn_dam)
|
||||
if(0 to 20)
|
||||
wound_flavor_text["[temp.limb_name]"] += " some burns"
|
||||
if(21 to INFINITY)
|
||||
wound_flavor_text["[temp.limb_name]"] += pick(" a lot of burns"," severe melting")
|
||||
if(wound_flavor_text["[temp.limb_name]"])
|
||||
wound_flavor_text["[temp.limb_name]"] += "!</span>\n"
|
||||
else if(temp.wounds.len > 0)
|
||||
var/list/wound_descriptors = list()
|
||||
for(var/datum/wound/W in temp.wounds)
|
||||
if(W.internal && !temp.open) continue // can't see internal wounds
|
||||
var/this_wound_desc = W.desc
|
||||
if(W.damage_type == BURN && W.salved) this_wound_desc = "salved [this_wound_desc]"
|
||||
if(W.bleeding()) this_wound_desc = "bleeding [this_wound_desc]"
|
||||
else if(W.bandaged) this_wound_desc = "bandaged [this_wound_desc]"
|
||||
if(W.germ_level > 600) this_wound_desc = "badly infected [this_wound_desc]"
|
||||
else if(W.germ_level > 330) this_wound_desc = "lightly infected [this_wound_desc]"
|
||||
if(this_wound_desc in wound_descriptors)
|
||||
wound_descriptors[this_wound_desc] += W.amount
|
||||
continue
|
||||
wound_descriptors[this_wound_desc] = W.amount
|
||||
if(wound_descriptors.len)
|
||||
var/list/flavor_text = list()
|
||||
var/list/no_exclude = list("gaping wound", "big gaping wound", "massive wound", "large bruise",\
|
||||
"huge bruise", "massive bruise", "severe burn", "large burn", "deep burn", "carbonised area")
|
||||
for(var/wound in wound_descriptors)
|
||||
switch(wound_descriptors[wound])
|
||||
if(1)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
|
||||
else
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a [wound]"
|
||||
if(2)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] [t_has][prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
|
||||
else
|
||||
flavor_text += "[prob(10) && !(wound in no_exclude) ? " what might be" : ""] a pair of [wound]s"
|
||||
if(3 to 5)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] [t_has] several [wound]s"
|
||||
else
|
||||
flavor_text += " several [wound]s"
|
||||
if(6 to INFINITY)
|
||||
if(!flavor_text.len)
|
||||
flavor_text += "<span class='warning'>[t_He] [t_has] a bunch of [wound]s"
|
||||
else
|
||||
flavor_text += " a ton of [wound]\s"
|
||||
var/flavor_text_string = ""
|
||||
for(var/text = 1, text <= flavor_text.len, text++)
|
||||
if(text == flavor_text.len && flavor_text.len > 1)
|
||||
flavor_text_string += ", and"
|
||||
else if(flavor_text.len > 1 && text > 1)
|
||||
flavor_text_string += ","
|
||||
flavor_text_string += flavor_text[text]
|
||||
flavor_text_string += " on [t_his] [temp.name].</span><br>"
|
||||
wound_flavor_text["[temp.limb_name]"] = flavor_text_string
|
||||
else
|
||||
wound_flavor_text["[temp.limb_name]"] = ""
|
||||
if(temp.status & ORGAN_BLEEDING)
|
||||
is_bleeding["[temp.limb_name]"] = 1
|
||||
else
|
||||
wound_flavor_text["[temp.limb_name]"] = ""
|
||||
|
||||
for(var/obj/item/I in temp.embedded_objects)
|
||||
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!</B>\n"
|
||||
|
||||
//Handles the text strings being added to the actual description.
|
||||
//If they have something that covers the limb, and it is not missing, put flavortext. If it is covered but bleeding, add other flavortext.
|
||||
var/display_chest = 0
|
||||
var/display_shoes = 0
|
||||
var/display_gloves = 0
|
||||
if(wound_flavor_text["head"] && (is_destroyed["head"] || (!skipmask && !(wear_mask && istype(wear_mask, /obj/item/clothing/mask/gas)))))
|
||||
msg += wound_flavor_text["head"]
|
||||
else if(is_bleeding["head"])
|
||||
msg += "<span class='warning'>[src] has blood running down [t_his] face!</span>\n"
|
||||
if(wound_flavor_text["chest"] && !w_uniform && !skipjumpsuit) //No need. A missing chest gibs you.
|
||||
msg += wound_flavor_text["chest"]
|
||||
else if(is_bleeding["chest"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["l_arm"] && (is_destroyed["left arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["l_arm"]
|
||||
else if(is_bleeding["l_arm"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["l_hand"] && (is_destroyed["left hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["l_hand"]
|
||||
else if(is_bleeding["l_hand"])
|
||||
display_gloves = 1
|
||||
if(wound_flavor_text["r_arm"] && (is_destroyed["right arm"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["r_arm"]
|
||||
else if(is_bleeding["r_arm"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["r_hand"] && (is_destroyed["right hand"] || (!gloves && !skipgloves)))
|
||||
msg += wound_flavor_text["r_hand"]
|
||||
else if(is_bleeding["r_hand"])
|
||||
display_gloves = 1
|
||||
if(wound_flavor_text["groin"] && (is_destroyed["groin"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["groin"]
|
||||
else if(is_bleeding["groin"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["l_leg"] && (is_destroyed["left leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["l_leg"]
|
||||
else if(is_bleeding["l_leg"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["l_foot"]&& (is_destroyed["left foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["l_foot"]
|
||||
else if(is_bleeding["l_foot"])
|
||||
display_shoes = 1
|
||||
if(wound_flavor_text["r_leg"] && (is_destroyed["right leg"] || (!w_uniform && !skipjumpsuit)))
|
||||
msg += wound_flavor_text["r_leg"]
|
||||
else if(is_bleeding["r_leg"])
|
||||
display_chest = 1
|
||||
if(wound_flavor_text["r_foot"]&& (is_destroyed["right foot"] || (!shoes && !skipshoes)))
|
||||
msg += wound_flavor_text["r_foot"]
|
||||
else if(is_bleeding["r_foot"])
|
||||
display_shoes = 1
|
||||
if(display_chest)
|
||||
msg += "<span class='warning'><b>[src] has blood soaking through from under [t_his] clothing!</b></span>\n"
|
||||
if(display_shoes)
|
||||
msg += "<span class='warning'><b>[src] has blood running from [t_his] shoes!</b></span>\n"
|
||||
if(display_gloves)
|
||||
msg += "<span class='warning'><b>[src] has blood running from under [t_his] gloves!</b></span>\n"
|
||||
|
||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||
msg += "[t_He] [t_has] pale skin.\n"
|
||||
if(bleedsuppress)
|
||||
msg += "[t_He] [t_is] bandaged with something.\n"
|
||||
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] repulsively uncanny!\n"
|
||||
if(!(skipface || ( wear_mask && ( wear_mask.flags_inv & HIDEFACE || wear_mask.flags_cover & MASKCOVERSMOUTH) ) ) && is_thrall(src) && in_range(user,src))
|
||||
msg += "Their features seem unnaturally tight and drawn.\n"
|
||||
|
||||
if(decaylevel == 1)
|
||||
msg += "[t_He] [t_is] starting to smell.\n"
|
||||
if(decaylevel == 2)
|
||||
|
||||
@@ -32,8 +32,6 @@
|
||||
|
||||
create_reagents(330)
|
||||
|
||||
prev_gender = gender // Debug for plural genders
|
||||
|
||||
martial_art = default_martial_art
|
||||
|
||||
handcrafting = new()
|
||||
@@ -609,7 +607,7 @@
|
||||
//Returns "Unknown" if facially disfigured and real_name if not. Useful for setting name when polyacided or when updating a human's name variable
|
||||
/mob/living/carbon/human/proc/get_face_name()
|
||||
var/obj/item/organ/external/head = get_organ("head")
|
||||
if( !head || head.disfigured || (head.status & ORGAN_DESTROYED) || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
||||
if( !head || head.disfigured || !real_name || (HUSK in mutations) ) //disfigured. use id-name if possible
|
||||
return "Unknown"
|
||||
return real_name
|
||||
|
||||
@@ -1208,18 +1206,10 @@
|
||||
for(var/obj/item/organ/internal/I in H.internal_organs)
|
||||
types_of_int_organs |= I.type //Compiling the list of organ types. It is possible for organs to be missing from this list if they are absent from the mob.
|
||||
|
||||
//Removing stumps.
|
||||
for(var/obj/item/organ/organ in H.contents)
|
||||
if(istype(organ, /obj/item/organ/external/stump)) //Get rid of all stumps.
|
||||
qdel(organ)
|
||||
H.contents -= organ //Making sure the list entry is removed.
|
||||
for(var/obj/item/organ/organ in H.bodyparts)
|
||||
if(istype(organ, /obj/item/organ/external/stump))
|
||||
qdel(organ)
|
||||
H.bodyparts -= organ //Making sure the list entry is removed.
|
||||
//Clean up limbs
|
||||
for(var/organ_name in H.bodyparts_by_name)
|
||||
var/obj/item/organ/organ = H.bodyparts_by_name[organ_name]
|
||||
if(istype(organ, /obj/item/organ/external/stump) || !organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
|
||||
if(!organ) //The !organ check is to account for mechanical limb (prostheses) losses, since those are handled in a way that leaves indexed but null list entries instead of stumps.
|
||||
qdel(organ)
|
||||
H.bodyparts_by_name -= organ_name //Making sure the list entry is removed.
|
||||
|
||||
@@ -1441,13 +1431,9 @@
|
||||
|
||||
if(species.base_color && default_colour)
|
||||
//Apply colour.
|
||||
r_skin = color2R(species.base_color)
|
||||
g_skin = color2G(species.base_color)
|
||||
b_skin = color2B(species.base_color)
|
||||
skin_colour = species.base_color
|
||||
else
|
||||
r_skin = 0
|
||||
g_skin = 0
|
||||
b_skin = 0
|
||||
skin_colour = "#000000"
|
||||
|
||||
if(!(species.bodyflags & HAS_SKIN_TONE))
|
||||
s_tone = 0
|
||||
@@ -1471,29 +1457,17 @@
|
||||
|
||||
if(species.default_hair_colour)
|
||||
//Apply colour.
|
||||
H.r_hair = color2R(species.default_hair_colour)
|
||||
H.g_hair = color2G(species.default_hair_colour)
|
||||
H.b_hair = color2B(species.default_hair_colour)
|
||||
H.hair_colour = species.default_hair_colour
|
||||
else
|
||||
H.r_hair = 0
|
||||
H.g_hair = 0
|
||||
H.b_hair = 0
|
||||
H.hair_colour = "#000000"
|
||||
if(species.default_fhair_colour)
|
||||
H.r_facial = color2R(species.default_fhair_colour)
|
||||
H.g_facial = color2G(species.default_fhair_colour)
|
||||
H.b_facial = color2B(species.default_fhair_colour)
|
||||
H.facial_colour = species.default_fhair_colour
|
||||
else
|
||||
H.r_facial = 0
|
||||
H.g_facial = 0
|
||||
H.b_facial = 0
|
||||
H.facial_colour = "#000000"
|
||||
if(species.default_headacc_colour)
|
||||
H.r_headacc = color2R(species.default_headacc_colour)
|
||||
H.g_headacc = color2G(species.default_headacc_colour)
|
||||
H.b_headacc = color2B(species.default_headacc_colour)
|
||||
H.headacc_colour = species.default_headacc_colour
|
||||
else
|
||||
H.r_headacc = 0
|
||||
H.g_headacc = 0
|
||||
H.b_headacc = 0
|
||||
H.headacc_colour = "#000000"
|
||||
|
||||
m_styles = DEFAULT_MARKING_STYLES //Wipes out markings, setting them all to "None".
|
||||
m_colours = DEFAULT_MARKING_COLOURS //Defaults colour to #00000 for all markings.
|
||||
@@ -1598,11 +1572,11 @@
|
||||
return
|
||||
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED)) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
|
||||
if(!head_organ) //If the rock'em-sock'em robot's head came off during a fight, they shouldn't be able to change their screen/optics.
|
||||
to_chat(src, "<span class='warning'>Where's your head at? Can't change your monitor/display without one.</span>")
|
||||
return
|
||||
|
||||
if(species.flags & ALL_RPARTS) //If they can have a fully cybernetic body...
|
||||
if(species.bodyflags & ALL_RPARTS) //If they can have a fully cybernetic body...
|
||||
var/datum/robolimb/robohead = all_robolimbs[head_organ.model]
|
||||
if(!head_organ)
|
||||
return
|
||||
@@ -1936,7 +1910,7 @@
|
||||
. |= A.GetAccess()
|
||||
|
||||
/mob/living/carbon/human/is_mechanical()
|
||||
return ..() || (species.flags & ALL_RPARTS) != 0
|
||||
return ..() || (species.bodyflags & ALL_RPARTS) != 0
|
||||
|
||||
/mob/living/carbon/human/can_use_guns(var/obj/item/weapon/gun/G)
|
||||
. = ..()
|
||||
@@ -1945,7 +1919,7 @@
|
||||
if(HULK in mutations)
|
||||
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
|
||||
return 0
|
||||
if(species.flags & NOGUNS)
|
||||
if(NOGUNS in species.species_traits)
|
||||
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
|
||||
return 0
|
||||
|
||||
@@ -2059,6 +2033,12 @@
|
||||
|
||||
..()
|
||||
|
||||
mob/living/carbon/human/get_taste_sensitivity()
|
||||
if(species)
|
||||
return species.taste_sensitivity
|
||||
else
|
||||
return 1
|
||||
|
||||
/mob/living/carbon/human/proc/special_post_clone_handling()
|
||||
if(mind && mind.assigned_role == "Cluwne") //HUNKE your suffering never stops
|
||||
makeCluwne()
|
||||
@@ -109,16 +109,16 @@
|
||||
if(INTENT_HARM)
|
||||
//Vampire code
|
||||
if(M.mind && M.mind.vampire && (M.mind in ticker.mode.vampires) && !M.mind.vampire.draining && M.zone_sel && M.zone_sel.selecting == "head" && src != M)
|
||||
if(species && species.flags & NO_BLOOD)//why this hell were we never checkinf for this?
|
||||
if((NO_BLOOD in species.species_traits) || species.exotic_blood || !blood_volume)
|
||||
to_chat(M, "<span class='warning'>They have no blood!</span>")
|
||||
return
|
||||
if(mind && mind.vampire && (mind in ticker.mode.vampires))
|
||||
to_chat(M, "<span class='warning'>Your fangs fail to pierce [src.name]'s cold flesh</span>")
|
||||
to_chat(M, "<span class='warning'>Your fangs fail to pierce [name]'s cold flesh</span>")
|
||||
return
|
||||
if(SKELETON in mutations)
|
||||
to_chat(M, "<span class='warning'>There is no blood in a skeleton!</span>")
|
||||
return
|
||||
if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okey, monkeys are not.
|
||||
if(issmall(src) && !ckey) //Monkeyized humans are okay, humanized monkeys are okay, NPC monkeys are not.
|
||||
to_chat(M, "<span class='warning'>Blood from a monkey is useless!</span>")
|
||||
return
|
||||
//we're good to suck the blood, blaah
|
||||
|
||||
@@ -201,10 +201,10 @@ emp_act
|
||||
qdel(src)
|
||||
|
||||
var/obj/item/organ/external/affecting = get_organ(ran_zone(user.zone_sel.selecting))
|
||||
if(!affecting || affecting.is_stump() || (affecting.status & ORGAN_DESTROYED))
|
||||
if(!affecting)
|
||||
to_chat(user, "<span class='danger'>They are missing that limb!</span>")
|
||||
return 1
|
||||
var/hit_area = affecting.name
|
||||
var/hit_area = parse_zone(affecting.limb_name)
|
||||
|
||||
if(user != src)
|
||||
user.do_attack_animation(src)
|
||||
@@ -270,7 +270,7 @@ emp_act
|
||||
update_inv_glasses(0)
|
||||
|
||||
|
||||
if("upper body")//Easier to score a stun but lasts less time
|
||||
if("chest")//Easier to score a stun but lasts less time
|
||||
if(stat == CONSCIOUS && I.force && prob(I.force + 10))
|
||||
visible_message("<span class='combat danger'>[src] has been knocked down!</span>", \
|
||||
"<span class='combat userdanger'>[src] has been knocked down!</span>")
|
||||
@@ -309,7 +309,7 @@ emp_act
|
||||
throw_alert("embeddedobject", /obj/screen/alert/embeddedobject)
|
||||
var/obj/item/organ/external/L = pick(bodyparts)
|
||||
L.embedded_objects |= I
|
||||
// I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
|
||||
I.add_mob_blood(src)//it embedded itself in you, of course it's bloody!
|
||||
I.forceMove(src)
|
||||
L.take_damage(I.w_class*I.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>")
|
||||
@@ -393,3 +393,10 @@ emp_act
|
||||
..()
|
||||
species.water_act(src,volume,temperature,source)
|
||||
|
||||
/mob/living/carbon/human/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
|
||||
if(check_glasses && glasses && (glasses.flags_cover & GLASSESCOVERSEYES))
|
||||
return TRUE
|
||||
if(check_head && head && (head.flags_cover & HEADCOVERSEYES))
|
||||
return TRUE
|
||||
if(check_mask && wear_mask && (wear_mask.flags_cover & MASKCOVERSMOUTH))
|
||||
return TRUE
|
||||
@@ -10,9 +10,7 @@ var/global/default_martial_art = new/datum/martial_art
|
||||
var/s_tone = 0 //Skin tone
|
||||
|
||||
//Skin colour
|
||||
var/r_skin = 0
|
||||
var/g_skin = 0
|
||||
var/b_skin = 0
|
||||
var/skin_colour = "#000000"
|
||||
|
||||
var/lip_style = null //no lipstick by default- arguably misleading, as it could be used for general makeup
|
||||
var/lip_color = "white"
|
||||
@@ -52,9 +50,6 @@ var/global/default_martial_art = new/datum/martial_art
|
||||
|
||||
var/special_voice = "" // For changing our voice. Used by a symptom.
|
||||
|
||||
var/last_dam = -1 //Used for determining if we need to process all organs or just some or even none.
|
||||
var/list/bad_external_organs = list()// organs we check until they are good.
|
||||
|
||||
var/hand_blood_color
|
||||
|
||||
var/name_override //For temporary visible name changes
|
||||
@@ -70,6 +65,8 @@ var/global/default_martial_art = new/datum/martial_art
|
||||
|
||||
var/check_mutations=0 // Check mutations on next life tick
|
||||
|
||||
var/heartbeat = 0
|
||||
|
||||
var/fire_dmi = 'icons/mob/OnFire.dmi'
|
||||
var/fire_sprite = "Standing"
|
||||
|
||||
|
||||
@@ -45,7 +45,7 @@
|
||||
var/obj/item/organ/external/l_foot = get_organ("l_foot")
|
||||
var/obj/item/organ/external/r_foot = get_organ("r_foot")
|
||||
var/hasfeet = 1
|
||||
if((!l_foot || l_foot.status & ORGAN_DESTROYED) && (!r_foot || r_foot.status & ORGAN_DESTROYED))
|
||||
if(!l_foot && !r_foot)
|
||||
hasfeet = 0
|
||||
|
||||
if(shoes)
|
||||
@@ -56,13 +56,7 @@
|
||||
else
|
||||
//No oldFP or it's a different kind of blood
|
||||
S.bloody_shoes[S.blood_state] = max(0, S.bloody_shoes[S.blood_state] - BLOOD_LOSS_PER_STEP)
|
||||
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
|
||||
FP.blood_state = S.blood_state
|
||||
FP.entered_dirs |= dir
|
||||
FP.bloodiness = S.bloody_shoes[S.blood_state]
|
||||
FP.blood_DNA = S.blood_DNA
|
||||
FP.basecolor = S.blood_color
|
||||
FP.update_icon()
|
||||
createFootprintsFrom(shoes, dir, T)
|
||||
update_inv_shoes()
|
||||
else if(hasfeet)
|
||||
if(bloody_feet && bloody_feet[blood_state])
|
||||
@@ -71,12 +65,7 @@
|
||||
return
|
||||
else
|
||||
bloody_feet[blood_state] = max(0, bloody_feet[blood_state] - BLOOD_LOSS_PER_STEP)
|
||||
var/obj/effect/decal/cleanable/blood/footprints/FP = new /obj/effect/decal/cleanable/blood/footprints(T)
|
||||
FP.blood_state = blood_state
|
||||
FP.entered_dirs |= dir
|
||||
FP.bloodiness = bloody_feet[blood_state]
|
||||
FP.basecolor = feet_blood_color
|
||||
FP.update_icon()
|
||||
createFootprintsFrom(src, dir, T)
|
||||
update_inv_shoes()
|
||||
//End bloody footprints
|
||||
if(S)
|
||||
|
||||
@@ -9,52 +9,24 @@
|
||||
|
||||
// Takes care of organ related updates, such as broken and missing limbs
|
||||
/mob/living/carbon/human/proc/handle_organs()
|
||||
|
||||
number_wounds = 0
|
||||
var/force_process = 0
|
||||
var/damage_this_tick = getBruteLoss() + getFireLoss() + getToxLoss()
|
||||
if(damage_this_tick > last_dam)
|
||||
force_process = 1
|
||||
last_dam = damage_this_tick
|
||||
if(force_process)
|
||||
bad_external_organs.Cut()
|
||||
for(var/obj/item/organ/external/Ex in bodyparts)
|
||||
bad_external_organs |= Ex
|
||||
|
||||
//processing internal organs is pretty cheap, do that first.
|
||||
for(var/obj/item/organ/internal/I in internal_organs)
|
||||
I.process()
|
||||
|
||||
for(var/obj/item/organ/external/E in bodyparts)
|
||||
E.process()
|
||||
|
||||
if(!lying && world.time - l_move_time < 15)
|
||||
//Moving around with fractured ribs won't do you any good
|
||||
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
|
||||
var/obj/item/organ/internal/I = pick(E.internal_organs)
|
||||
custom_pain("You feel broken bones moving in your [E.name]!", 1)
|
||||
I.take_damage(rand(3,5))
|
||||
|
||||
//handle_stance()
|
||||
handle_grasp()
|
||||
handle_stance()
|
||||
|
||||
if(!force_process && !bad_external_organs.len)
|
||||
return
|
||||
|
||||
for(var/obj/item/organ/external/E in bad_external_organs)
|
||||
if(!E)
|
||||
continue
|
||||
if(!E.need_process())
|
||||
bad_external_organs -= E
|
||||
continue
|
||||
else
|
||||
E.process()
|
||||
number_wounds += E.number_wounds
|
||||
|
||||
if(!lying && world.time - l_move_time < 15)
|
||||
//Moving around with fractured ribs won't do you any good
|
||||
if(E.is_broken() && E.internal_organs && E.internal_organs.len && prob(15))
|
||||
var/obj/item/organ/internal/I = pick(E.internal_organs)
|
||||
custom_pain("You feel broken bones moving in your [E.name]!", 1)
|
||||
I.take_damage(rand(3,5))
|
||||
|
||||
//Moving makes open wounds get infected much faster
|
||||
if(E.wounds.len)
|
||||
for(var/datum/wound/W in E.wounds)
|
||||
if(W.infection_check())
|
||||
W.germ_level += 1
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_stance()
|
||||
// Don't need to process any of this if they aren't standing anyways
|
||||
@@ -71,7 +43,7 @@
|
||||
|
||||
for(var/limb_tag in list("l_leg","r_leg","l_foot","r_foot"))
|
||||
var/obj/item/organ/external/E = bodyparts_by_name[limb_tag]
|
||||
if(!E || (E.status & (ORGAN_DESTROYED|ORGAN_DEAD)) || E.is_malfunctioning())
|
||||
if(!E || (E.status & ORGAN_DEAD) || E.is_malfunctioning())
|
||||
stance_damage += 2 // let it fail even if just foot&leg. Also malfunctioning happens sporadically so it should impact more when it procs
|
||||
else if(E.is_broken() || !E.is_usable())
|
||||
stance_damage += 1
|
||||
@@ -90,7 +62,7 @@
|
||||
// standing is poor
|
||||
if(stance_damage >= 8)
|
||||
if(!(lying || resting))
|
||||
if(species && !(species.flags & NO_PAIN))
|
||||
if(!(NO_PAIN in species.species_traits))
|
||||
emote("scream")
|
||||
custom_emote(1, "collapses!")
|
||||
Weaken(5) //can't emote while weakened, apparently.
|
||||
@@ -118,7 +90,7 @@
|
||||
continue
|
||||
|
||||
var/emote_scream = pick("screams in pain and ", "lets out a sharp cry and ", "cries out and ")
|
||||
custom_emote(1, "[(species.flags & NO_PAIN) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
custom_emote(1, "[(NO_PAIN in species.species_traits) ? "" : emote_scream ]drops what they were holding in their [E.name]!")
|
||||
|
||||
else if(E.is_malfunctioning())
|
||||
|
||||
|
||||
@@ -72,6 +72,8 @@
|
||||
var/forceProcess = 0
|
||||
var/processTime = 10
|
||||
var/speak_file = "npc_chatter.json"
|
||||
var/debugexamine = FALSE //If we show debug info in our examine
|
||||
var/showexaminetext = TRUE //If we show our telltale examine text
|
||||
|
||||
var/list/knownStrings = list()
|
||||
|
||||
|
||||
@@ -24,8 +24,7 @@
|
||||
|
||||
/mob/living/carbon/human/proc/has_organ(name)
|
||||
var/obj/item/organ/external/O = bodyparts_by_name[name]
|
||||
|
||||
return (O && !(O.status & ORGAN_DESTROYED) && !O.is_stump())
|
||||
return O
|
||||
|
||||
/mob/living/carbon/human/proc/has_organ_for_slot(slot)
|
||||
switch(slot)
|
||||
|
||||
@@ -1,29 +1,10 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:32
|
||||
|
||||
/mob/living/carbon/human
|
||||
|
||||
var/pressure_alert = 0
|
||||
var/prev_gender = null // Debug for plural genders
|
||||
var/temperature_alert = 0
|
||||
var/in_stasis = 0
|
||||
var/exposedtimenow = 0
|
||||
var/firstexposed = 0
|
||||
var/heartbeat = 0
|
||||
|
||||
/mob/living/carbon/human/Life()
|
||||
fire_alert = 0 //Reset this here, because both breathe() and handle_environment() have a chance to set it.
|
||||
life_tick++
|
||||
|
||||
in_stasis = 0
|
||||
if(istype(loc, /obj/structure/closet/body_bag/cryobag))
|
||||
var/obj/structure/closet/body_bag/cryobag/loc_as_cryobag = loc
|
||||
if(!loc_as_cryobag.opened)
|
||||
loc_as_cryobag.used++
|
||||
in_stasis = 1
|
||||
|
||||
voice = GetVoice()
|
||||
|
||||
if(..() && !in_stasis)
|
||||
if(..())
|
||||
|
||||
if(check_mutations)
|
||||
domutcheck(src,null)
|
||||
@@ -47,8 +28,6 @@
|
||||
if(stat == DEAD)
|
||||
handle_decay()
|
||||
|
||||
handle_stasis_bag()
|
||||
|
||||
if(life_tick > 5 && timeofdeath && (timeofdeath < 5 || world.time - timeofdeath > 6000)) //We are long dead, or we're junk mobs spawned like the clowns on the clown shuttle
|
||||
return //We go ahead and process them 5 times for HUD images and other stuff though.
|
||||
|
||||
@@ -158,16 +137,6 @@
|
||||
visible_message("<span class='alert'><B>[src]</B> goes limp, their facial expression utterly blank.</span>")
|
||||
death()
|
||||
|
||||
/mob/living/carbon/human/proc/handle_stasis_bag()
|
||||
// Handle side effects from stasis bag
|
||||
if(in_stasis)
|
||||
// First off, there's no oxygen supply, so the mob will slowly take brain damage
|
||||
adjustBrainLoss(0.1)
|
||||
|
||||
// Next, the method to induce stasis has some adverse side-effects, manifesting
|
||||
// as cloneloss
|
||||
adjustCloneLoss(0.1)
|
||||
|
||||
/mob/living/carbon/human/handle_mutations_and_radiation()
|
||||
for(var/datum/dna/gene/gene in dna_genes)
|
||||
if(!gene.block)
|
||||
@@ -193,7 +162,7 @@
|
||||
if(gene_stability < GENETIC_DAMAGE_STAGE_3)
|
||||
gib()
|
||||
|
||||
if(!(species.flags & RADIMMUNE))
|
||||
if(!(RADIMMUNE in species.species_traits))
|
||||
if(radiation)
|
||||
radiation = Clamp(radiation, 0, 200)
|
||||
|
||||
@@ -254,7 +223,7 @@
|
||||
|
||||
/mob/living/carbon/human/breathe()
|
||||
|
||||
if((NO_BREATH in mutations) || (species && (species.flags & NO_BREATHE)) || reagents.has_reagent("lexorin"))
|
||||
if((NO_BREATH in mutations) || (NO_BREATHE in species.species_traits) || reagents.has_reagent("lexorin"))
|
||||
adjustOxyLoss(-5)
|
||||
oxygen_alert = 0
|
||||
toxins_alert = 0
|
||||
@@ -658,7 +627,7 @@
|
||||
return 0 //godmode
|
||||
|
||||
//The fucking FAT mutation is the greatest shit ever. It makes everyone so hot and bothered.
|
||||
if(species.flags & CAN_BE_FAT)
|
||||
if(CAN_BE_FAT in species.species_traits)
|
||||
if(FAT in mutations)
|
||||
if(overeatduration < 100)
|
||||
becomeSlim()
|
||||
@@ -722,7 +691,8 @@
|
||||
AdjustDizzy(-3)
|
||||
AdjustJitter(-3)
|
||||
|
||||
if(species && species.flags & NO_INTORGANS) return
|
||||
if(NO_INTORGANS in species.species_traits)
|
||||
return
|
||||
|
||||
handle_trace_chems()
|
||||
|
||||
@@ -891,8 +861,7 @@
|
||||
if(gloves && germ_level > gloves.germ_level && prob(10))
|
||||
gloves.germ_level += 1
|
||||
|
||||
if(!in_stasis)
|
||||
handle_organs()
|
||||
handle_organs()
|
||||
|
||||
|
||||
else //dead
|
||||
@@ -971,64 +940,13 @@
|
||||
if(hud_used)
|
||||
hud_used.lingchemdisplay.invisibility = 101
|
||||
|
||||
/mob/living/carbon/human/handle_shock()
|
||||
..()
|
||||
if(status_flags & GODMODE)
|
||||
return 0 //godmode
|
||||
if(species && species.flags & NO_PAIN)
|
||||
return
|
||||
|
||||
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
|
||||
shock_stage = max(shock_stage, 61)
|
||||
|
||||
if(traumatic_shock >= 100)
|
||||
shock_stage += 1
|
||||
else
|
||||
shock_stage = min(shock_stage, 160)
|
||||
shock_stage = max(shock_stage-1, 0)
|
||||
return
|
||||
|
||||
if(shock_stage == 10)
|
||||
to_chat(src, "<font color='red'><b>"+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!"))
|
||||
|
||||
if(shock_stage >= 30)
|
||||
if(shock_stage == 30) custom_emote(1,"is having trouble keeping their eyes open.")
|
||||
EyeBlurry(2)
|
||||
Stuttering(5)
|
||||
|
||||
if(shock_stage == 40)
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
|
||||
if(shock_stage >=60)
|
||||
if(shock_stage == 60) custom_emote(1,"falls limp.")
|
||||
if(prob(2))
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 80)
|
||||
if(prob(5))
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 120)
|
||||
if(prob(2))
|
||||
to_chat(src, "<font color='red'><b>"+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
|
||||
Paralyse(5)
|
||||
|
||||
if(shock_stage == 150)
|
||||
custom_emote(1,"can no longer stand, collapsing!")
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 150)
|
||||
Weaken(20)
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/handle_pulse()
|
||||
|
||||
if(mob_master.current_cycle % 5)
|
||||
return pulse //update pulse every 5 life ticks (~1 tick/sec, depending on server load)
|
||||
|
||||
if(species && species.flags & NO_BLOOD)
|
||||
if(NO_BLOOD in species.species_traits)
|
||||
return PULSE_NONE //No blood, no pulse.
|
||||
|
||||
if(stat == DEAD)
|
||||
@@ -1090,15 +1008,15 @@
|
||||
makeSkeleton()
|
||||
return //No puking over skeletons, they don't smell at all!
|
||||
|
||||
if(!isturf(loc))
|
||||
return
|
||||
|
||||
for(var/mob/living/carbon/human/H in range(decaylevel, src))
|
||||
if(prob(2))
|
||||
if(istype(loc,/obj/item/bodybag))
|
||||
return
|
||||
var/obj/item/clothing/mask/M = H.wear_mask
|
||||
if(M && (M.flags_cover & MASKCOVERSMOUTH))
|
||||
return
|
||||
if(H.species && H.species.flags & NO_BREATHE)
|
||||
if(NO_BREATHE in species.species_traits)
|
||||
return //no puking if you can't smell!
|
||||
// Humans can lack a mind datum, y'know
|
||||
if(H.mind && (H.mind.assigned_role == "Detective" || H.mind.assigned_role == "Coroner"))
|
||||
@@ -1123,7 +1041,7 @@
|
||||
|
||||
if(heartbeat >= rate)
|
||||
heartbeat = 0
|
||||
src << sound('sound/effects/electheart.ogg',0,0,0,30)//Credit to GhostHack (www.ghosthack.de) for sound.
|
||||
src << sound('sound/effects/electheart.ogg',0,0,CHANNEL_HEARTBEAT,30)//Credit to GhostHack (www.ghosthack.de) for sound.
|
||||
|
||||
else
|
||||
heartbeat++
|
||||
@@ -1142,9 +1060,9 @@
|
||||
if(heartbeat >= rate)
|
||||
heartbeat = 0
|
||||
if(H.status & ORGAN_ASSISTED)
|
||||
src << sound('sound/effects/pacemakebeat.ogg',0,0,0,50)
|
||||
src << sound('sound/effects/pacemakebeat.ogg',0,0,CHANNEL_HEARTBEAT,50)
|
||||
else
|
||||
src << sound('sound/effects/singlebeat.ogg',0,0,0,50)
|
||||
src << sound('sound/effects/singlebeat.ogg',0,0,CHANNEL_HEARTBEAT,50)
|
||||
else
|
||||
heartbeat++
|
||||
|
||||
@@ -1178,7 +1096,9 @@
|
||||
|
||||
|
||||
/mob/living/carbon/human/proc/can_heartattack()
|
||||
if(species.flags & (NO_BLOOD|NO_INTORGANS))
|
||||
if(NO_BLOOD in species.species_traits)
|
||||
return FALSE
|
||||
if(NO_INTORGANS in species.species_traits)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
@@ -1186,8 +1106,11 @@
|
||||
if(!can_heartattack())
|
||||
return FALSE
|
||||
var/obj/item/organ/internal/heart/heart = get_int_organ(/obj/item/organ/internal/heart)
|
||||
if(istype(heart) && heart.beating)
|
||||
return FALSE
|
||||
if(istype(heart))
|
||||
if(heart.status & ORGAN_DEAD)
|
||||
return TRUE
|
||||
if(heart.beating)
|
||||
return FALSE
|
||||
return TRUE
|
||||
|
||||
/mob/living/carbon/human/proc/set_heartattack(status)
|
||||
|
||||
@@ -0,0 +1,75 @@
|
||||
/mob/living/carbon/human/var/traumatic_shock = 0
|
||||
/mob/living/carbon/human/var/shock_stage = 0
|
||||
|
||||
// proc to find out in how much pain the mob is at the moment
|
||||
/mob/living/carbon/human/proc/updateshock()
|
||||
traumatic_shock = getOxyLoss() + getToxLoss() + getFireLoss() + getBruteLoss() + getCloneLoss()
|
||||
|
||||
// broken or ripped off organs will add quite a bit of pain
|
||||
for(var/thing in bodyparts)
|
||||
var/obj/item/organ/external/BP = thing
|
||||
if(BP.status & ORGAN_BROKEN && !(BP.status & ORGAN_SPLINTED) || BP.open)
|
||||
traumatic_shock += 15
|
||||
|
||||
if(reagents)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.shock_reduction)
|
||||
traumatic_shock = max(0, traumatic_shock - R.shock_reduction) // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
|
||||
if(drunk)
|
||||
traumatic_shock = max(0, traumatic_shock - 10)
|
||||
|
||||
return traumatic_shock
|
||||
|
||||
/mob/living/carbon/human/proc/handle_shock()
|
||||
if(status_flags & GODMODE) //godmode
|
||||
return
|
||||
if(NO_PAIN in species.species_traits)
|
||||
return
|
||||
|
||||
updateshock()
|
||||
|
||||
if(health <= config.health_threshold_softcrit)// health 0 makes you immediately collapse
|
||||
shock_stage = max(shock_stage, 61)
|
||||
|
||||
if(traumatic_shock >= 100)
|
||||
shock_stage += 1
|
||||
else
|
||||
shock_stage = min(shock_stage, 160)
|
||||
shock_stage = max(shock_stage-1, 0)
|
||||
return
|
||||
|
||||
if(shock_stage == 10)
|
||||
to_chat(src, "<font color='red'><b>"+pick("It hurts so much!", "You really need some painkillers..", "Dear god, the pain!"))
|
||||
|
||||
if(shock_stage >= 30)
|
||||
if(shock_stage == 30)
|
||||
custom_emote(1,"is having trouble keeping their eyes open.")
|
||||
EyeBlurry(2)
|
||||
Stuttering(5)
|
||||
|
||||
if(shock_stage == 40)
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
|
||||
if(shock_stage >=60)
|
||||
if(shock_stage == 60)
|
||||
custom_emote(1,"falls limp.")
|
||||
if(prob(2))
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 80)
|
||||
if(prob(5))
|
||||
to_chat(src, "<font color='red'><b>"+pick("The pain is excrutiating!", "Please, just end the pain!", "Your whole body is going numb!"))
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 120)
|
||||
if(prob(2))
|
||||
to_chat(src, "<font color='red'><b>"+pick("You black out!", "You feel like you could die any moment now.", "You're about to lose consciousness."))
|
||||
Paralyse(5)
|
||||
|
||||
if(shock_stage == 150)
|
||||
custom_emote(1,"can no longer stand, collapsing!")
|
||||
Weaken(20)
|
||||
|
||||
if(shock_stage >= 150)
|
||||
Weaken(20)
|
||||
@@ -18,11 +18,10 @@
|
||||
"eyes" = /obj/item/organ/internal/eyes/abductor //3 darksight.
|
||||
)
|
||||
|
||||
flags = HAS_LIPS | NO_BLOOD | NO_BREATHE | NOGUNS
|
||||
species_traits = list(NO_BLOOD, NO_BREATHE, VIRUSIMMUNE, NOGUNS)
|
||||
|
||||
oxy_mod = 0
|
||||
|
||||
virus_immune = 1
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
@@ -36,7 +36,7 @@
|
||||
"antennae" = /obj/item/organ/internal/wryn/hivenode
|
||||
)
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS | NO_BREATHE | HAS_SKIN_COLOR | NO_SCAN | HIVEMIND
|
||||
species_traits = list(IS_WHITELISTED, NO_BREATHE, HAS_SKIN_COLOR, NO_SCAN, HIVEMIND)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
dietflags = DIET_HERB //bees feed off nectar, so bee people feed off plants too
|
||||
|
||||
@@ -99,7 +99,7 @@
|
||||
burn_mod = 4 // holy shite, poor guys wont survive half a second cooking smores
|
||||
brute_mod = 2 // damn, double wham, double dam
|
||||
oxy_mod = 0
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_BLOOD | NO_PAIN | HAS_LIPS | NO_SCAN | RADIMMUNE
|
||||
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_BLOOD, NO_PAIN, NO_SCAN, RADIMMUNE)
|
||||
dietflags = DIET_OMNI //still human at their core, so they maintain their eating habits and diet
|
||||
|
||||
//Default styles for created mobs.
|
||||
|
||||
@@ -6,11 +6,10 @@
|
||||
deform = 'icons/mob/human_races/r_golem.dmi'
|
||||
|
||||
default_language = "Galactic Common"
|
||||
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE | NOGUNS
|
||||
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE, NOGUNS)
|
||||
|
||||
oxy_mod = 0
|
||||
|
||||
virus_immune = 1
|
||||
dietflags = DIET_OMNI //golems can eat anything because they are magic or something
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
|
||||
@@ -24,7 +24,7 @@
|
||||
female_scream_sound = 'sound/goonstation/voice/monkey_scream.ogg'
|
||||
|
||||
tail = "chimptail"
|
||||
bodyflags = FEET_PADDED | HAS_TAIL
|
||||
bodyflags = HAS_TAIL
|
||||
reagent_tag = PROCESS_ORG
|
||||
//Has standard darksight of 2.
|
||||
|
||||
@@ -155,9 +155,6 @@
|
||||
reagent_tag = PROCESS_ORG
|
||||
tail = null
|
||||
|
||||
bodyflags = FEET_PADDED
|
||||
|
||||
|
||||
/datum/species/monkey/unathi
|
||||
name = "Stok"
|
||||
name_plural = "Stok"
|
||||
@@ -172,4 +169,4 @@
|
||||
base_color = "#000000"
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
bodyflags = FEET_CLAWS | HAS_TAIL
|
||||
bodyflags = HAS_TAIL
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
//language = "Clatter"
|
||||
unarmed_type = /datum/unarmed_attack/punch
|
||||
|
||||
flags = IS_WHITELISTED | NO_BLOOD | NOTRANSSTING
|
||||
species_traits = list(IS_WHITELISTED, NO_BLOOD, NOTRANSSTING)
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
|
||||
@@ -17,12 +17,10 @@
|
||||
"eyes" = /obj/item/organ/internal/eyes/shadow //8 darksight.
|
||||
)
|
||||
|
||||
flags = NO_BLOOD | NO_BREATHE | RADIMMUNE
|
||||
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
|
||||
|
||||
oxy_mod = 0
|
||||
|
||||
virus_immune = 1
|
||||
|
||||
dietflags = DIET_OMNI //the mutation process allowed you to now digest all foods regardless of initial race
|
||||
reagent_tag = PROCESS_ORG
|
||||
suicide_messages = list(
|
||||
|
||||
@@ -13,11 +13,10 @@
|
||||
blood_color = "#FFFFFF"
|
||||
flesh_color = "#E6E6C6"
|
||||
|
||||
flags = NO_BREATHE | NO_BLOOD | RADIMMUNE
|
||||
species_traits = list(NO_BREATHE, NO_BLOOD, RADIMMUNE, VIRUSIMMUNE)
|
||||
|
||||
oxy_mod = 0
|
||||
|
||||
virus_immune = 1 //why is this a var and not a flag?
|
||||
dietflags = DIET_OMNI
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
|
||||
@@ -45,6 +45,7 @@
|
||||
var/reagent_tag //Used for metabolizing reagents.
|
||||
var/hunger_drain = HUNGER_FACTOR
|
||||
var/digestion_ratio = 1 //How quickly the species digests/absorbs reagents.
|
||||
var/taste_sensitivity = TASTE_SENSITIVITY_NORMAL //the most widely used factor; humans use a different one
|
||||
|
||||
var/siemens_coeff = 1 //base electrocution coefficient
|
||||
|
||||
@@ -76,6 +77,8 @@
|
||||
var/brain_mod = 1 // Brain damage damage reduction/amplification
|
||||
var/stun_mod = 1 // If a species is more/less impacated by stuns/weakens/paralysis
|
||||
|
||||
var/blood_damage_type = OXY //What type of damage does this species take if it's low on blood?
|
||||
|
||||
var/total_health = 100
|
||||
var/punchdamagelow = 0 //lowest possible punch damage
|
||||
var/punchdamagehigh = 9 //highest possible punch damage
|
||||
@@ -89,7 +92,8 @@
|
||||
|
||||
var/list/allowed_consumed_mobs = list() //If a species can consume mobs, put the type of mobs it can consume here.
|
||||
|
||||
var/flags = 0 // Various specific features.
|
||||
var/list/species_traits = list()
|
||||
|
||||
var/clothing_flags = 0 // Underwear and socks.
|
||||
var/exotic_blood
|
||||
var/bodyflags = 0
|
||||
@@ -108,7 +112,6 @@
|
||||
var/icon/icon_template
|
||||
var/is_small
|
||||
var/show_ssd = 1
|
||||
var/virus_immune
|
||||
var/can_revive_by_healing // Determines whether or not this species can be revived by simply healing them
|
||||
var/has_gender = TRUE
|
||||
|
||||
@@ -464,7 +467,11 @@
|
||||
// Return 1 if it should do normal processing too
|
||||
// Return 0 if it shouldn't deplete and do its normal effect
|
||||
// Other return values will cause weird badness
|
||||
/datum/species/proc/handle_reagents(var/mob/living/carbon/human/H, var/datum/reagent/R)
|
||||
/datum/species/proc/handle_reagents(mob/living/carbon/human/H, datum/reagent/R)
|
||||
if(R.id == exotic_blood)
|
||||
H.blood_volume = min(H.blood_volume + round(R.volume, 0.1), BLOOD_VOLUME_NORMAL)
|
||||
H.reagents.del_reagent(R.id)
|
||||
return 0
|
||||
return 1
|
||||
|
||||
// For special snowflake species effects
|
||||
@@ -579,7 +586,7 @@
|
||||
if(SCREWYHUD_DEAD) H.healths.icon_state = "health7"
|
||||
if(SCREWYHUD_HEALTHY) H.healths.icon_state = "health0"
|
||||
else
|
||||
switch(100 - ((flags & NO_PAIN) ? 0 : H.traumatic_shock) - H.staminaloss)
|
||||
switch(100 - ((NO_PAIN in species_traits) ? 0 : H.traumatic_shock) - H.staminaloss)
|
||||
if(100 to INFINITY) H.healths.icon_state = "health0"
|
||||
if(80 to 100) H.healths.icon_state = "health1"
|
||||
if(60 to 80) H.healths.icon_state = "health2"
|
||||
|
||||
@@ -6,7 +6,7 @@
|
||||
primitive_form = "Monkey"
|
||||
path = /mob/living/carbon/human/human
|
||||
language = "Sol Common"
|
||||
flags = HAS_LIPS | CAN_BE_FAT
|
||||
species_traits = list(LIPS, CAN_BE_FAT)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
|
||||
dietflags = DIET_OMNI
|
||||
@@ -38,9 +38,9 @@
|
||||
else, frequently even their own lives. They prefer warmer temperatures than most species and \
|
||||
their native tongue is a heavy hissing laungage called Sinta'Unathi."
|
||||
|
||||
flags = HAS_LIPS
|
||||
species_traits = list(LIPS)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_CLAWS | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
|
||||
bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_BODY_MARKINGS | HAS_HEAD_MARKINGS | HAS_SKIN_COLOR | HAS_ALT_HEADS | TAIL_WAGGING
|
||||
dietflags = DIET_CARN
|
||||
|
||||
cold_level_1 = 280 //Default 260 - Lower is better
|
||||
@@ -110,10 +110,11 @@
|
||||
|
||||
primitive_form = "Farwa"
|
||||
|
||||
flags = HAS_LIPS | CAN_BE_FAT
|
||||
species_traits = list(LIPS, CAN_BE_FAT)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING | HAS_FUR
|
||||
bodyflags = HAS_TAIL | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS | HAS_SKIN_COLOR | TAIL_WAGGING
|
||||
dietflags = DIET_OMNI
|
||||
taste_sensitivity = TASTE_SENSITIVITY_SHARP
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#AFA59E"
|
||||
base_color = "#424242"
|
||||
@@ -160,10 +161,11 @@
|
||||
to the degree it can cause conflict with more rigorous and strict authorities. They speak a guttural language known as 'Canilunzt' \
|
||||
which has a heavy emphasis on utilizing tail positioning and ear twitches to communicate intent."
|
||||
|
||||
flags = HAS_LIPS
|
||||
species_traits = list(LIPS)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_PADDED | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR | HAS_FUR
|
||||
bodyflags = HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_HEAD_ACCESSORY | HAS_MARKINGS | HAS_SKIN_COLOR
|
||||
dietflags = DIET_OMNI
|
||||
taste_sensitivity = TASTE_SENSITIVITY_SHARP
|
||||
reagent_tag = PROCESS_ORG
|
||||
flesh_color = "#966464"
|
||||
base_color = "#CF4D2F"
|
||||
@@ -211,10 +213,11 @@
|
||||
herbivores on the whole and tend to be co-operative with the other species of the galaxy, although they rarely reveal \
|
||||
the secrets of their empire to their allies."
|
||||
|
||||
flags = HAS_LIPS
|
||||
species_traits = list(LIPS)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR | HAS_BODY_MARKINGS
|
||||
dietflags = DIET_HERB
|
||||
taste_sensitivity = TASTE_SENSITIVITY_DULL
|
||||
flesh_color = "#8CD7A3"
|
||||
blood_color = "#1D2CBF"
|
||||
base_color = "#38b661" //RGB: 56, 182, 97.
|
||||
@@ -291,7 +294,7 @@
|
||||
breath_type = "nitrogen"
|
||||
poison_type = "oxygen"
|
||||
|
||||
flags = NO_SCAN | IS_WHITELISTED | NOTRANSSTING
|
||||
species_traits = list(NO_SCAN, IS_WHITELISTED, NOTRANSSTING)
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = DIET_OMNI
|
||||
bodyflags = HAS_ICON_SKIN_TONE | HAS_TAIL | TAIL_WAGGING | TAIL_OVERLAPPED | HAS_BODY_MARKINGS | HAS_TAIL_MARKINGS
|
||||
@@ -444,7 +447,7 @@
|
||||
breath_type = "nitrogen"
|
||||
poison_type = "oxygen"
|
||||
|
||||
flags = NO_SCAN | NO_BLOOD | NO_PAIN | IS_WHITELISTED
|
||||
species_traits = list(NO_SCAN, NO_BLOOD, NO_PAIN, IS_WHITELISTED)
|
||||
bodyflags = HAS_TAIL
|
||||
dietflags = DIET_OMNI //should inherit this from vox, this is here just in case
|
||||
|
||||
@@ -488,9 +491,9 @@
|
||||
|
||||
brute_mod = 0.8
|
||||
|
||||
flags = IS_WHITELISTED
|
||||
species_traits = list(IS_WHITELISTED)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = FEET_CLAWS | HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
|
||||
bodyflags = HAS_HEAD_ACCESSORY | HAS_HEAD_MARKINGS | HAS_BODY_MARKINGS
|
||||
eyes = "kidan_eyes_s"
|
||||
dietflags = DIET_HERB
|
||||
blood_color = "#FB9800"
|
||||
@@ -543,14 +546,16 @@
|
||||
male_cough_sounds = list('sound/effects/slime_squish.ogg')
|
||||
female_cough_sounds = list('sound/effects/slime_squish.ogg')
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | HAS_LIPS | NO_INTORGANS | NO_SCAN
|
||||
species_traits = list(LIPS, IS_WHITELISTED, NO_BREATHE, NO_INTORGANS, NO_SCAN)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR | NO_EYES
|
||||
dietflags = DIET_CARN
|
||||
reagent_tag = PROCESS_ORG
|
||||
|
||||
blood_color = "#0064C8"
|
||||
exotic_blood = "water"
|
||||
//ventcrawler = 1 //ventcrawling commented out
|
||||
blood_damage_type = TOX
|
||||
|
||||
butt_sprite = "slime"
|
||||
//Has default darksight of 2.
|
||||
|
||||
@@ -579,11 +584,8 @@
|
||||
if((H in recolor_list) && H.reagents.total_volume > SLIMEPERSON_COLOR_SHIFT_TRIGGER)
|
||||
var/blood_amount = H.blood_volume
|
||||
var/r_color = mix_color_from_reagents(H.reagents.reagent_list)
|
||||
var/new_body_color = BlendRGB(r_color, rgb(H.r_skin, H.g_skin, H.b_skin), (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume)))
|
||||
var/list/new_color_list = ReadRGB(new_body_color)
|
||||
H.r_skin = new_color_list[1]
|
||||
H.g_skin = new_color_list[2]
|
||||
H.b_skin = new_color_list[3]
|
||||
var/new_body_color = BlendRGB(r_color, H.skin_colour, (blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)/((blood_amount*SLIMEPERSON_BLOOD_SCALING_FACTOR)+(H.reagents.total_volume)))
|
||||
H.skin_colour = new_body_color
|
||||
if(world.time % SLIMEPERSON_ICON_UPDATE_PERIOD > SLIMEPERSON_ICON_UPDATE_PERIOD - 20) // The 20 is because this gets called every 2 seconds, from the mob controller
|
||||
for(var/organname in H.bodyparts_by_name)
|
||||
var/obj/item/organ/external/E = H.bodyparts_by_name[organname]
|
||||
@@ -641,12 +643,12 @@
|
||||
var/list/missing_limbs = list()
|
||||
for(var/l in bodyparts_by_name)
|
||||
var/obj/item/organ/external/E = bodyparts_by_name[l]
|
||||
if(!istype(E) || istype(E, /obj/item/organ/external/stump))
|
||||
if(!istype(E))
|
||||
var/list/limblist = species.has_limbs[l]
|
||||
var/obj/item/organ/external/limb = limblist["path"]
|
||||
var/parent_organ = initial(limb.parent_organ)
|
||||
var/obj/item/organ/external/parentLimb = bodyparts_by_name[parent_organ]
|
||||
if(!istype(parentLimb) || parentLimb.is_stump())
|
||||
if(!istype(parentLimb))
|
||||
continue
|
||||
missing_limbs[initial(limb.name)] = l
|
||||
|
||||
@@ -672,21 +674,17 @@
|
||||
var/stored_brute = 0
|
||||
var/stored_burn = 0
|
||||
if(istype(O))
|
||||
if(!O.is_stump())
|
||||
to_chat(src, "<span class='warning'>Your limb has already been replaced in some way!</span>")
|
||||
return
|
||||
else
|
||||
to_chat(src, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
|
||||
var/obj/item/organ/external/doomedStump = O
|
||||
stored_brute = doomedStump.brute_dam
|
||||
stored_burn = doomedStump.burn_dam
|
||||
qdel(O)
|
||||
to_chat(src, "<span class='warning'>You distribute the damaged tissue around your body, out of the way of your new pseudopod!</span>")
|
||||
var/obj/item/organ/external/doomedStump = O
|
||||
stored_brute = doomedStump.brute_dam
|
||||
stored_burn = doomedStump.burn_dam
|
||||
qdel(O)
|
||||
|
||||
var/limb_list = species.has_limbs[chosen_limb]
|
||||
var/obj/item/organ/external/limb_path = limb_list["path"]
|
||||
// Parent check
|
||||
var/obj/item/organ/external/potential_parent = bodyparts_by_name[initial(limb_path.parent_organ)]
|
||||
if(!istype(potential_parent) || potential_parent.is_stump())
|
||||
if(!istype(potential_parent))
|
||||
to_chat(src, "<span class='danger'>You've lost the organ that you've been growing your new part on!</span>")
|
||||
return // No rayman for you
|
||||
// Grah this line will leave a "not used" warning, in spite of the fact that the new() proc WILL do the thing.
|
||||
@@ -739,7 +737,7 @@
|
||||
default_genes = list(REMOTE_TALK)
|
||||
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS | CAN_BE_FAT
|
||||
species_traits = list(LIPS, IS_WHITELISTED, CAN_BE_FAT)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_BODY_MARKINGS
|
||||
dietflags = DIET_HERB
|
||||
@@ -799,9 +797,10 @@
|
||||
even the simplest concepts of other minds. Their alien physiology allows them survive happily off a diet of nothing but light, \
|
||||
water and other radiation."
|
||||
|
||||
flags = NO_BREATHE | RADIMMUNE | IS_PLANT | NO_BLOOD | NO_PAIN
|
||||
species_traits = list(NO_BREATHE, RADIMMUNE, IS_PLANT, NO_BLOOD, NO_PAIN)
|
||||
clothing_flags = HAS_SOCKS
|
||||
dietflags = 0 //Diona regenerate nutrition in light, no diet necessary
|
||||
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
|
||||
|
||||
oxy_mod = 0
|
||||
|
||||
@@ -864,7 +863,6 @@
|
||||
var/turf/T = H.loc
|
||||
light_amount = min(T.get_lumcount() * 10, 5) //hardcapped so it's not abused by having a ton of flashlights
|
||||
H.nutrition = min(H.nutrition+light_amount, NUTRITION_LEVEL_WELL_FED+10)
|
||||
H.traumatic_shock -= light_amount
|
||||
|
||||
if(light_amount > 0)
|
||||
H.clear_alert("nolight")
|
||||
@@ -877,7 +875,6 @@
|
||||
H.adjustFireLoss(-(light_amount/4))
|
||||
if(H.nutrition < NUTRITION_LEVEL_STARVING+50)
|
||||
H.take_overall_damage(10,0)
|
||||
H.traumatic_shock++
|
||||
|
||||
/datum/species/machine
|
||||
name = "Machine"
|
||||
@@ -905,15 +902,15 @@
|
||||
oxy_mod = 0
|
||||
death_message = "gives one shrill beep before falling limp, their monitor flashing blue before completely shutting off..."
|
||||
|
||||
flags = IS_WHITELISTED | NO_BREATHE | NO_SCAN | NO_BLOOD | NO_PAIN | NO_DNA | RADIMMUNE | ALL_RPARTS | NOTRANSSTING
|
||||
species_traits = list(IS_WHITELISTED, NO_BREATHE, NO_SCAN, NO_BLOOD, NO_PAIN, NO_DNA, RADIMMUNE, VIRUSIMMUNE, NOTRANSSTING)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY
|
||||
bodyflags = HAS_SKIN_COLOR | HAS_HEAD_MARKINGS | HAS_HEAD_ACCESSORY | ALL_RPARTS
|
||||
dietflags = 0 //IPCs can't eat, so no diet
|
||||
taste_sensitivity = TASTE_SENSITIVITY_NO_TASTE
|
||||
blood_color = "#1F181F"
|
||||
flesh_color = "#AAAAAA"
|
||||
//Default styles for created mobs.
|
||||
default_hair = "Blue IPC Screen"
|
||||
virus_immune = 1
|
||||
can_revive_by_healing = 1
|
||||
has_gender = FALSE
|
||||
reagent_tag = PROCESS_SYN
|
||||
@@ -1005,9 +1002,9 @@
|
||||
"is sucking in warm air!",
|
||||
"is holding their breath!")
|
||||
|
||||
flags = IS_WHITELISTED | HAS_LIPS
|
||||
species_traits = list(LIPS, IS_WHITELISTED)
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT
|
||||
bodyflags = FEET_CLAWS | HAS_SKIN_TONE | HAS_BODY_MARKINGS
|
||||
bodyflags = HAS_SKIN_TONE | HAS_BODY_MARKINGS
|
||||
dietflags = DIET_OMNI
|
||||
|
||||
cold_level_1 = -1 //Default 260 - Lower is better
|
||||
|
||||
@@ -172,11 +172,7 @@ var/global/list/damage_icon_parts = list()
|
||||
var/damage_appearance = ""
|
||||
|
||||
for(var/obj/item/organ/external/O in bodyparts)
|
||||
if(O.is_stump())
|
||||
continue
|
||||
if(O.status & ORGAN_DESTROYED) damage_appearance += "d"
|
||||
else
|
||||
damage_appearance += O.damage_state
|
||||
damage_appearance += O.damage_state
|
||||
|
||||
if(damage_appearance == previous_damage_appearance)
|
||||
// nothing to do here
|
||||
@@ -190,22 +186,19 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
// blend the individual damage states with our icons
|
||||
for(var/obj/item/organ/external/O in bodyparts)
|
||||
if(O.is_stump())
|
||||
continue
|
||||
if(!(O.status & ORGAN_DESTROYED))
|
||||
O.update_icon()
|
||||
if(O.damage_state == "00") continue
|
||||
var/icon/DI
|
||||
var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
|
||||
O.update_icon()
|
||||
if(O.damage_state == "00") continue
|
||||
var/icon/DI
|
||||
var/cache_index = "[O.damage_state]/[O.icon_name]/[species.blood_color]/[species.name]"
|
||||
|
||||
if(damage_icon_parts[cache_index] == null)
|
||||
DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
DI.Blend(species.blood_color, ICON_MULTIPLY)
|
||||
damage_icon_parts[cache_index] = DI
|
||||
else
|
||||
DI = damage_icon_parts[cache_index]
|
||||
standing_image.overlays += DI
|
||||
if(damage_icon_parts[cache_index] == null)
|
||||
DI = new /icon(species.damage_overlays, O.damage_state) // the damage icon for whole human
|
||||
DI.Blend(new /icon(species.damage_mask, O.icon_name), ICON_MULTIPLY) // mask with this organ's pixels
|
||||
DI.Blend(species.blood_color, ICON_MULTIPLY)
|
||||
damage_icon_parts[cache_index] = DI
|
||||
else
|
||||
DI = damage_icon_parts[cache_index]
|
||||
standing_image.overlays += DI
|
||||
|
||||
overlays_standing[DAMAGE_LAYER] = standing_image
|
||||
|
||||
@@ -235,13 +228,13 @@ var/global/list/damage_icon_parts = list()
|
||||
var/obj/item/organ/internal/eyes/eyes = get_int_organ(/obj/item/organ/internal/eyes)
|
||||
|
||||
if(eyes)
|
||||
icon_key += "[rgb(eyes.eye_colour[1], eyes.eye_colour[2], eyes.eye_colour[3])]"
|
||||
icon_key += "[eyes.eye_colour]"
|
||||
else
|
||||
icon_key += "#000000"
|
||||
|
||||
for(var/organ_tag in species.has_limbs)
|
||||
var/obj/item/organ/external/part = bodyparts_by_name[organ_tag]
|
||||
if(isnull(part) || part.is_stump() || (part.status & ORGAN_DESTROYED))
|
||||
if(isnull(part))
|
||||
icon_key += "0"
|
||||
else if(part.status & ORGAN_ROBOT)
|
||||
icon_key += "2[part.model ? "-[part.model]": ""]"
|
||||
@@ -255,7 +248,7 @@ var/global/list/damage_icon_parts = list()
|
||||
icon_key += "[part.dna.GetUIState(DNA_UI_GENDER)]"
|
||||
icon_key += "[part.dna.GetUIValue(DNA_UI_SKIN_TONE)]"
|
||||
if(part.s_col)
|
||||
icon_key += "[rgb(part.s_col[1], part.s_col[2], part.s_col[3])]"
|
||||
icon_key += "[part.s_col]"
|
||||
if(part.s_tone)
|
||||
icon_key += "[part.s_tone]"
|
||||
|
||||
@@ -341,7 +334,7 @@ var/global/list/damage_icon_parts = list()
|
||||
if(update_icons)
|
||||
update_icons()
|
||||
|
||||
if(lip_style && species && species.flags & HAS_LIPS)
|
||||
if(lip_style && (LIPS in species.species_traits))
|
||||
var/icon/lips = icon("icon"='icons/mob/human_face.dmi', "icon_state"="lips_[lip_style]_s")
|
||||
lips.Blend(lip_color, ICON_ADD)
|
||||
|
||||
@@ -368,7 +361,7 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
//Body markings.
|
||||
var/obj/item/organ/external/chest/chest_organ = get_organ("chest")
|
||||
if(chest_organ && !chest_organ.is_stump() && !(chest_organ.status & ORGAN_DESTROYED) && m_styles["body"])
|
||||
if(chest_organ && m_styles["body"])
|
||||
var/body_marking = m_styles["body"]
|
||||
var/datum/sprite_accessory/body_marking_style = marking_styles_list[body_marking]
|
||||
if(body_marking_style && body_marking_style.species_allowed && (species.name in body_marking_style.species_allowed))
|
||||
@@ -378,7 +371,7 @@ var/global/list/damage_icon_parts = list()
|
||||
markings_standing.Blend(b_marking_s, ICON_OVERLAY)
|
||||
//Head markings.
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
if(head_organ && !head_organ.is_stump() && !(head_organ.status & ORGAN_DESTROYED) && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
|
||||
if(head_organ && m_styles["head"]) //If the head is destroyed, forget the head markings. This prevents floating optical markings on decapitated IPCs, for example.
|
||||
var/head_marking = m_styles["head"]
|
||||
var/datum/sprite_accessory/head_marking_style = marking_styles_list[head_marking]
|
||||
if(head_marking_style && head_marking_style.species_allowed && (head_organ.species.name in head_marking_style.species_allowed))
|
||||
@@ -398,7 +391,7 @@ var/global/list/damage_icon_parts = list()
|
||||
overlays_standing[HEAD_ACC_OVER_LAYER] = null
|
||||
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED) )
|
||||
if(!head_organ)
|
||||
if(update_icons) update_icons()
|
||||
return
|
||||
|
||||
@@ -415,7 +408,7 @@ var/global/list/damage_icon_parts = list()
|
||||
if(head_organ.species.name in head_accessory_style.species_allowed)
|
||||
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
|
||||
if(head_accessory_style.do_colouration)
|
||||
head_accessory_s.Blend(rgb(head_organ.r_headacc, head_organ.g_headacc, head_organ.b_headacc), ICON_ADD)
|
||||
head_accessory_s.Blend(head_organ.headacc_colour, ICON_ADD)
|
||||
head_accessory_standing = head_accessory_s //head_accessory_standing.Blend(head_accessory_s, ICON_OVERLAY)
|
||||
//Having it this way preserves animations. Useful for animated antennae.
|
||||
|
||||
@@ -435,7 +428,7 @@ var/global/list/damage_icon_parts = list()
|
||||
overlays_standing[HAIR_LAYER] = null
|
||||
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
|
||||
if(!head_organ)
|
||||
if(update_icons) update_icons()
|
||||
return
|
||||
|
||||
@@ -453,17 +446,17 @@ var/global/list/damage_icon_parts = list()
|
||||
//if(!src.get_int_organ(/obj/item/organ/internal/brain) && src.get_species() != "Machine" )//make it obvious we have NO BRAIN
|
||||
// hair_standing.Blend(debrained_s, ICON_OVERLAY)
|
||||
if(hair_style && hair_style.species_allowed)
|
||||
if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
if((head_organ.species.name in hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
if(head_organ.species.name == "Slime People") // I am el worstos
|
||||
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
hair_s.Blend("[skin_colour]A0", ICON_AND)
|
||||
else if(hair_style.do_colouration)
|
||||
hair_s.Blend(rgb(head_organ.r_hair, head_organ.g_hair, head_organ.b_hair), ICON_ADD)
|
||||
hair_s.Blend(head_organ.hair_colour, ICON_ADD)
|
||||
|
||||
if(hair_style.secondary_theme)
|
||||
var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
|
||||
if(!hair_style.no_sec_colour)
|
||||
hair_secondary_s.Blend(rgb(head_organ.r_hair_sec, head_organ.g_hair_sec, head_organ.b_hair_sec), ICON_ADD)
|
||||
hair_secondary_s.Blend(head_organ.sec_hair_colour, ICON_ADD)
|
||||
hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
|
||||
|
||||
hair_standing = hair_s //hair_standing.Blend(hair_s, ICON_OVERLAY)
|
||||
@@ -484,7 +477,7 @@ var/global/list/damage_icon_parts = list()
|
||||
overlays_standing[FHAIR_OVER_LAYER] = null
|
||||
|
||||
var/obj/item/organ/external/head/head_organ = get_organ("head")
|
||||
if(!head_organ || head_organ.is_stump() || (head_organ.status & ORGAN_DESTROYED))
|
||||
if(!head_organ)
|
||||
if(update_icons) update_icons()
|
||||
return
|
||||
|
||||
@@ -499,17 +492,17 @@ var/global/list/damage_icon_parts = list()
|
||||
if(head_organ.f_style)
|
||||
var/datum/sprite_accessory/facial_hair/facial_hair_style = facial_hair_styles_list[head_organ.f_style]
|
||||
if(facial_hair_style && facial_hair_style.species_allowed)
|
||||
if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.flags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
if((head_organ.species.name in facial_hair_style.species_allowed) || (head_organ.species.bodyflags & ALL_RPARTS)) //If the head's species is in the list of allowed species for the hairstyle, or the head's species is one flagged to have bodies comprised wholly of cybernetics...
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
if(head_organ.species.name == "Slime People") // I am el worstos
|
||||
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_AND)
|
||||
facial_s.Blend("[skin_colour]A0", ICON_AND)
|
||||
else if(facial_hair_style.do_colouration)
|
||||
facial_s.Blend(rgb(head_organ.r_facial, head_organ.g_facial, head_organ.b_facial), ICON_ADD)
|
||||
facial_s.Blend(head_organ.facial_colour, ICON_ADD)
|
||||
|
||||
if(facial_hair_style.secondary_theme)
|
||||
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
|
||||
if(!facial_hair_style.no_sec_colour)
|
||||
facial_secondary_s.Blend(rgb(head_organ.r_facial_sec, head_organ.g_facial_sec, head_organ.b_facial_sec), ICON_ADD)
|
||||
facial_secondary_s.Blend(head_organ.sec_facial_colour, ICON_ADD)
|
||||
facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
|
||||
|
||||
face_standing.Blend(facial_s, ICON_OVERLAY)
|
||||
@@ -1175,7 +1168,7 @@ var/global/list/damage_icon_parts = list()
|
||||
if(body_accessory.try_restrictions(src))
|
||||
var/icon/accessory_s = new/icon("icon" = body_accessory.icon, "icon_state" = body_accessory.icon_state)
|
||||
if(species.bodyflags & HAS_SKIN_COLOR)
|
||||
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
|
||||
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
|
||||
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
|
||||
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
|
||||
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
|
||||
@@ -1200,7 +1193,7 @@ var/global/list/damage_icon_parts = list()
|
||||
if(!wear_suit || !(wear_suit.flags_inv & HIDETAIL) && !istype(wear_suit, /obj/item/clothing/suit/space))
|
||||
var/icon/tail_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]_s")
|
||||
if(species.bodyflags & HAS_SKIN_COLOR)
|
||||
tail_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
tail_s.Blend(skin_colour, ICON_ADD)
|
||||
if(tail_marking_icon && !tail_marking_style.tails_allowed)
|
||||
tail_s.Blend(tail_marking_icon, ICON_OVERLAY)
|
||||
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
|
||||
@@ -1241,7 +1234,7 @@ var/global/list/damage_icon_parts = list()
|
||||
if(body_accessory)
|
||||
var/icon/accessory_s = new/icon("icon" = body_accessory.get_animated_icon(), "icon_state" = body_accessory.get_animated_icon_state())
|
||||
if(species.bodyflags & HAS_SKIN_COLOR)
|
||||
accessory_s.Blend(rgb(r_skin, g_skin, b_skin), body_accessory.blend_mode)
|
||||
accessory_s.Blend(skin_colour, body_accessory.blend_mode)
|
||||
if(tail_marking_icon && (body_accessory.name in tail_marking_style.tails_allowed))
|
||||
accessory_s.Blend(tail_marking_icon, ICON_OVERLAY)
|
||||
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
|
||||
@@ -1268,7 +1261,7 @@ var/global/list/damage_icon_parts = list()
|
||||
else if(tail && species.bodyflags & HAS_TAIL)
|
||||
var/icon/tailw_s = new/icon("icon" = 'icons/effects/species.dmi', "icon_state" = "[tail]w_s")
|
||||
if(species.bodyflags & HAS_SKIN_COLOR)
|
||||
tailw_s.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
tailw_s.Blend(skin_colour, ICON_ADD)
|
||||
if(tail_marking_icon && !tail_marking_style.tails_allowed)
|
||||
tailw_s.Blend(tail_marking_icon, ICON_OVERLAY)
|
||||
if((!body_accessory || istype(body_accessory, /datum/body_accessory/tail)) && species.bodyflags & TAIL_OVERLAPPED) // If the player has a species whose tail is overlapped by limbs... (having a non-tail body accessory like the snake body will override this)
|
||||
|
||||
@@ -1,38 +0,0 @@
|
||||
/mob/living/var/traumatic_shock = 0
|
||||
/mob/living/carbon/var/shock_stage = 0
|
||||
|
||||
// proc to find out in how much pain the mob is at the moment
|
||||
/mob/living/carbon/proc/updateshock()
|
||||
src.traumatic_shock = \
|
||||
1 * src.getOxyLoss() + \
|
||||
1 * src.getToxLoss() + \
|
||||
1 * src.getFireLoss() + \
|
||||
1 * src.getBruteLoss() + \
|
||||
1 * src.getCloneLoss()
|
||||
|
||||
if(reagents)
|
||||
for(var/datum/reagent/R in reagents.reagent_list)
|
||||
if(R.shock_reduction)
|
||||
src.traumatic_shock -= R.shock_reduction // now you too can varedit cyanide to reduce shock by 1000 - Iamgoofball
|
||||
if(src.slurring)
|
||||
src.traumatic_shock -= 10
|
||||
|
||||
// broken or ripped off organs will add quite a bit of pain
|
||||
if(istype(src,/mob/living/carbon/human))
|
||||
var/mob/living/carbon/human/M = src
|
||||
for(var/obj/item/organ/external/organ in M.bodyparts)
|
||||
if(!organ)
|
||||
continue
|
||||
else if(organ.status & ORGAN_BROKEN || organ.open)
|
||||
src.traumatic_shock += 15
|
||||
if(organ.status & ORGAN_SPLINTED)
|
||||
src.traumatic_shock -= 15
|
||||
|
||||
if(src.traumatic_shock < 0)
|
||||
src.traumatic_shock = 0
|
||||
|
||||
return src.traumatic_shock
|
||||
|
||||
|
||||
/mob/living/carbon/proc/handle_shock()
|
||||
updateshock()
|
||||
@@ -27,6 +27,22 @@
|
||||
updatehealth()
|
||||
return 1
|
||||
|
||||
/mob/living/proc/apply_damage_type(damage = 0, damagetype = BRUTE) //like apply damage except it always uses the damage procs
|
||||
switch(damagetype)
|
||||
if(BRUTE)
|
||||
return adjustBruteLoss(damage)
|
||||
if(BURN)
|
||||
return adjustFireLoss(damage)
|
||||
if(TOX)
|
||||
return adjustToxLoss(damage)
|
||||
if(OXY)
|
||||
return adjustOxyLoss(damage)
|
||||
if(CLONE)
|
||||
return adjustCloneLoss(damage)
|
||||
if(STAMINA)
|
||||
return adjustStaminaLoss(damage)
|
||||
if(BRAIN)
|
||||
return adjustBrainLoss(damage)
|
||||
|
||||
/mob/living/proc/apply_damages(var/brute = 0, var/burn = 0, var/tox = 0, var/oxy = 0, var/clone = 0, var/def_zone = null, var/blocked = 0, var/stamina = 0)
|
||||
if(blocked >= 100) return 0
|
||||
|
||||
@@ -168,23 +168,23 @@
|
||||
|
||||
//same as above
|
||||
/mob/living/pointed(atom/A as mob|obj|turf in view())
|
||||
if(incapacitated())
|
||||
return 0
|
||||
if(incapacitated(ignore_lying = TRUE))
|
||||
return FALSE
|
||||
if(status_flags & FAKEDEATH)
|
||||
return 0
|
||||
return FALSE
|
||||
if(!..())
|
||||
return 0
|
||||
return FALSE
|
||||
var/obj/item/hand_item = get_active_hand()
|
||||
if(istype(hand_item, /obj/item/weapon/gun) && A != hand_item)
|
||||
if(a_intent == INTENT_HELP || !ismob(A))
|
||||
visible_message("<b>[src]</b> points to [A] with [hand_item]")
|
||||
return 1
|
||||
return TRUE
|
||||
A.visible_message("<span class='danger'>[src] points [hand_item] at [A]!</span>",
|
||||
"<span class='userdanger'>[src] points [hand_item] at you!</span>")
|
||||
A << 'sound/weapons/TargetOn.ogg'
|
||||
return 1
|
||||
return TRUE
|
||||
visible_message("<b>[src]</b> points to [A]")
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/verb/succumb()
|
||||
set hidden = 1
|
||||
@@ -641,7 +641,7 @@
|
||||
|
||||
/mob/living/carbon/human/makeTrail(turf/T)
|
||||
|
||||
if((species.flags & NO_BLOOD) || species.exotic_blood || !bleed_rate || bleedsuppress)
|
||||
if((NO_BLOOD in species.species_traits) || species.exotic_blood || !bleed_rate || bleedsuppress)
|
||||
return
|
||||
..()
|
||||
|
||||
@@ -1002,3 +1002,41 @@
|
||||
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
|
||||
return 0
|
||||
return 1
|
||||
|
||||
/mob/living/proc/get_taste_sensitivity()
|
||||
return 1
|
||||
|
||||
/mob/living/proc/taste_reagents(datum/reagents/tastes)
|
||||
if(!get_taste_sensitivity())//this also works for IPCs and stuff that returns 0 here
|
||||
return
|
||||
|
||||
var/do_not_taste_at_all = 1//so we don't spam with recent tastes
|
||||
|
||||
var/taste_sum = 0
|
||||
var/list/taste_list = list()//associative list so we can stack stuff that tastes the same
|
||||
var/list/final_taste_list = list()//final list of taste strings
|
||||
|
||||
for(var/datum/reagent/R in tastes.reagent_list)
|
||||
taste_sum += R.volume * R.taste_strength
|
||||
if(!R.taste_message)//set to null; no taste, like water
|
||||
continue
|
||||
taste_list[R.taste_message] += R.volume * R.taste_strength
|
||||
|
||||
for(var/R in taste_list)
|
||||
if(recent_tastes[R] && (world.time - recent_tastes[R] < 12 SECONDS))
|
||||
continue
|
||||
|
||||
do_not_taste_at_all = 0//something was fresh enough to taste; could still be bland enough to be unrecognizable
|
||||
|
||||
if(taste_list[R] / taste_sum >= 0.15 / get_taste_sensitivity())//we return earlier if the proc returns a 0; won't break the universe
|
||||
final_taste_list += R
|
||||
recent_tastes[R] = world.time
|
||||
|
||||
if(do_not_taste_at_all)
|
||||
return //no message spam
|
||||
|
||||
if(final_taste_list.len == 0)//too many reagents - none meet their thresholds
|
||||
to_chat(src, "<span class='notice'>You you can't really make out what you're tasting...</span>")
|
||||
return
|
||||
|
||||
to_chat(src, "<span class='notice'>You can taste [english_list(final_taste_list)].</span>")
|
||||
|
||||
@@ -37,6 +37,11 @@
|
||||
/mob/living/proc/getarmor(var/def_zone, var/type)
|
||||
return 0
|
||||
|
||||
/mob/living/proc/is_mouth_covered(head_only = FALSE, mask_only = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/proc/is_eyes_covered(check_glasses = TRUE, check_head = TRUE, check_mask = TRUE)
|
||||
return FALSE
|
||||
|
||||
/mob/living/bullet_act(var/obj/item/projectile/P, var/def_zone)
|
||||
//Armor
|
||||
@@ -260,8 +265,4 @@
|
||||
if(!supress_message)
|
||||
visible_message("<span class='warning'>[user] has grabbed [src] passively!</span>")
|
||||
|
||||
return G
|
||||
|
||||
/mob/living/incapacitated()
|
||||
if(stat || paralysis || stunned || weakened || restrained())
|
||||
return 1
|
||||
return G
|
||||
@@ -60,4 +60,5 @@
|
||||
|
||||
var/list/say_log = list() //a log of what we've said, plain text, no spans or junk, essentially just each individual "message"
|
||||
|
||||
var/list/recent_tastes = list()
|
||||
var/blood_volume = 0 //how much blood the mob has
|
||||
|
||||
@@ -706,7 +706,19 @@ var/list/ai_verbs_default = list(
|
||||
visible_message("<span class='danger'><B>[M]</B> [M.attacktext] [src]!")
|
||||
add_logs(M, src, "attacked", admin=0, print_attack_log = 0)
|
||||
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
|
||||
adjustBruteLoss(damage)
|
||||
switch(M.melee_damage_type)
|
||||
if(BRUTE)
|
||||
adjustBruteLoss(damage)
|
||||
if(BURN)
|
||||
adjustFireLoss(damage)
|
||||
if(TOX)
|
||||
adjustToxLoss(damage)
|
||||
if(OXY)
|
||||
adjustOxyLoss(damage)
|
||||
if(CLONE)
|
||||
adjustCloneLoss(damage)
|
||||
if(STAMINA)
|
||||
adjustStaminaLoss(damage)
|
||||
updatehealth()
|
||||
|
||||
/mob/living/silicon/ai/reset_perspective(atom/A)
|
||||
|
||||
@@ -66,7 +66,6 @@
|
||||
*/
|
||||
|
||||
var/announcing_vox = 0 // Stores the time of the last announcement
|
||||
var/const/VOX_CHANNEL = 200
|
||||
var/const/VOX_DELAY = 100
|
||||
var/const/VOX_PATH = "sound/vox_fem/"
|
||||
|
||||
@@ -136,11 +135,14 @@ var/const/VOX_PATH = "sound/vox_fem/"
|
||||
play_vox_word(word, src.z, null)
|
||||
|
||||
|
||||
/proc/play_vox_word(var/word, var/z_level, var/mob/only_listener)
|
||||
/proc/play_vox_word(word, z_level, mob/only_listener)
|
||||
|
||||
word = lowertext(word)
|
||||
|
||||
if(vox_sounds[word])
|
||||
|
||||
var/sound_file = vox_sounds[word]
|
||||
var/sound/voice = sound(sound_file, wait = 1, channel = VOX_CHANNEL)
|
||||
var/sound/voice = sound(sound_file, wait = 1, channel = CHANNEL_VOX)
|
||||
voice.status = SOUND_STREAM
|
||||
|
||||
// If there is no single listener, broadcast to everyone in the same z level
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
||||
|
||||
// Recruiting observers to play as pAIs
|
||||
|
||||
var/datum/paiController/paiController // Global handler for pAI candidates
|
||||
|
||||
@@ -188,6 +188,9 @@
|
||||
lawchanges.Add("[time] <B>:</B> [H.name]([H.key]) emagged [name]([key])")
|
||||
|
||||
emagged = 1
|
||||
icon_state = "repairbot-emagged"
|
||||
holder_type = /obj/item/weapon/holder/drone/emagged
|
||||
update_icons()
|
||||
lawupdate = 0
|
||||
connected_ai = null
|
||||
clear_supplied_laws()
|
||||
|
||||
@@ -91,6 +91,9 @@
|
||||
H.righthand_file = 'icons/mob/custom_synthetic/custom_righthand.dmi'
|
||||
H.icon_state = "[icon_state]"
|
||||
H.item_state = "[icon_state]_hand"
|
||||
else if(emagged)
|
||||
H.icon_state = "drone-emagged"
|
||||
H.item_state = "drone-emagged"
|
||||
else
|
||||
H.icon_state = "drone"
|
||||
H.item_state = "drone"
|
||||
|
||||
@@ -161,8 +161,8 @@
|
||||
|
||||
name = "matter decompiler"
|
||||
desc = "Eating trash, bits of glass, or other debris will replenish your stores."
|
||||
icon = 'icons/obj/device.dmi'
|
||||
icon_state = "decompiler"
|
||||
icon = 'icons/obj/toy.dmi'
|
||||
icon_state = "minigibber"
|
||||
|
||||
//Metal, glass, wood, plastic.
|
||||
var/list/stored_comms = list(
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
// No args for restraints because robots don't have those
|
||||
/mob/living/silicon/robot/incapacitated()
|
||||
/mob/living/silicon/robot/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
|
||||
if(stat || lockcharge || weakened || stunned || paralysis || !is_component_functioning("actuator"))
|
||||
return 1
|
||||
return TRUE
|
||||
|
||||
/mob/living/silicon/robot/update_stat()
|
||||
if(status_flags & GODMODE)
|
||||
|
||||
@@ -144,11 +144,11 @@
|
||||
|
||||
// This adds the basic clock, shuttle recall timer, and malf_ai info to all silicon lifeforms
|
||||
/mob/living/silicon/Stat()
|
||||
..()
|
||||
if(statpanel("Status"))
|
||||
show_stat_station_time()
|
||||
show_stat_emergency_shuttle_eta()
|
||||
show_system_integrity()
|
||||
..()
|
||||
|
||||
//Silicon mob language procs
|
||||
|
||||
|
||||
@@ -429,6 +429,7 @@
|
||||
chemscan(src, A)
|
||||
|
||||
/mob/living/simple_animal/bot/medbot/proc/medicate_patient(mob/living/carbon/C)
|
||||
var/inject_beaker = FALSE
|
||||
if(!on)
|
||||
return
|
||||
|
||||
@@ -484,7 +485,8 @@
|
||||
if(reagent_id && use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
|
||||
for(var/datum/reagent/R in reagent_glass.reagents.reagent_list)
|
||||
if(!C.reagents.has_reagent(R.id))
|
||||
reagent_id = "internal_beaker"
|
||||
reagent_id = R.id
|
||||
inject_beaker = TRUE
|
||||
break
|
||||
|
||||
if(!reagent_id) //If they don't need any of that they're probably cured!
|
||||
@@ -501,7 +503,7 @@
|
||||
|
||||
spawn(30)//replace with do mob
|
||||
if((get_dist(src, patient) <= 1) && on && assess_patient(patient))
|
||||
if(reagent_id == "internal_beaker")
|
||||
if(inject_beaker)
|
||||
if(use_beaker && reagent_glass && reagent_glass.reagents.total_volume)
|
||||
var/fraction = min(injection_amount/reagent_glass.reagents.total_volume, 1)
|
||||
reagent_glass.reagents.reaction(patient, INGEST, fraction)
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:31
|
||||
|
||||
// Mulebot - carries crates around for Quartermaster
|
||||
// Navigates via floor navbeacons
|
||||
// Remote Controlled from QM's PDA
|
||||
|
||||
@@ -22,12 +22,13 @@
|
||||
see_in_dark = 5
|
||||
childtype = /mob/living/simple_animal/pet/corgi/puppy
|
||||
simplespecies = /mob/living/simple_animal/pet/corgi
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
var/shaved = 0
|
||||
var/obj/item/inventory_head
|
||||
var/obj/item/inventory_back
|
||||
var/facehugger
|
||||
var/default_atmos_requirements = 0
|
||||
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
|
||||
var/last_eaten = 0
|
||||
|
||||
/mob/living/simple_animal/pet/corgi/New()
|
||||
..()
|
||||
|
||||
@@ -13,6 +13,8 @@
|
||||
pass_flags = PASSTABLE | PASSMOB
|
||||
mob_size = MOB_SIZE_SMALL
|
||||
ventcrawler = 2
|
||||
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
|
||||
minbodytemp = 0
|
||||
|
||||
maxHealth = 50
|
||||
health = 50
|
||||
@@ -176,7 +178,7 @@
|
||||
if(!M || !src)
|
||||
return
|
||||
|
||||
if(M.species.flags & NO_BLOOD)
|
||||
if(NO_BLOOD in M.species.species_traits)
|
||||
to_chat(src, "<span class='warning'>That donor has no blood to take.</span>")
|
||||
return
|
||||
|
||||
|
||||
@@ -9,6 +9,7 @@
|
||||
universal_speak = 1
|
||||
health = 40
|
||||
maxHealth = 40
|
||||
pass_flags = PASSTABLE
|
||||
|
||||
melee_damage_lower = 2
|
||||
melee_damage_upper = 2
|
||||
@@ -172,4 +173,4 @@
|
||||
mind.transfer_to(mmi.brainmob)
|
||||
mmi = null
|
||||
name = "Spider-bot"
|
||||
update_icon()
|
||||
update_icon()
|
||||
|
||||
@@ -26,6 +26,7 @@
|
||||
/obj/item/weapon/melee/energy/sword/pirate)
|
||||
del_on_death = 1
|
||||
faction = list("pirate")
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
|
||||
/mob/living/simple_animal/hostile/pirate/ranged
|
||||
name = "Pirate Gunner"
|
||||
|
||||
@@ -25,7 +25,7 @@
|
||||
loot = list(/obj/effect/landmark/mobcorpse/russian,
|
||||
/obj/item/weapon/kitchen/knife)
|
||||
del_on_death = 1
|
||||
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
|
||||
/mob/living/simple_animal/hostile/russian/ranged
|
||||
icon_state = "russianranged"
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
status_flags = CANPUSH
|
||||
loot = list(/obj/effect/landmark/mobcorpse/syndicatesoldier)
|
||||
del_on_death = 1
|
||||
sentience_type = SENTIENCE_OTHER
|
||||
|
||||
///////////////Sword and shield////////////
|
||||
|
||||
|
||||
@@ -82,7 +82,7 @@
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/black)
|
||||
S.spider_myqueen = spider_myqueen
|
||||
if(prob(sbpc))
|
||||
S.stillborn = 1
|
||||
S.stillborn = TRUE
|
||||
if(spider_growinstantly)
|
||||
S.amount_grown = 250
|
||||
|
||||
@@ -94,7 +94,7 @@
|
||||
for(var/obj/structure/spider/eggcluster/terror_eggcluster/T in ts_egg_list)
|
||||
qdel(T)
|
||||
for(var/obj/structure/spider/spiderling/terror_spiderling/T in ts_spiderling_list)
|
||||
T.stillborn = 1
|
||||
T.stillborn = TRUE
|
||||
to_chat(src, "<span class='userdanger'>All Terror Spiders, except yourself, will die off shortly.</span>")
|
||||
|
||||
|
||||
|
||||
@@ -33,12 +33,15 @@
|
||||
ventsmash_action.Grant(src)
|
||||
|
||||
/mob/living/simple_animal/hostile/poison/terror_spider/mother/death(gibbed)
|
||||
var/always_stillborn = FALSE
|
||||
if(spider_awaymission && !is_away_level(z))
|
||||
always_stillborn = TRUE
|
||||
if(canspawn)
|
||||
canspawn = 0
|
||||
for(var/i in 0 to 30)
|
||||
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
|
||||
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/red, /mob/living/simple_animal/hostile/poison/terror_spider/gray)
|
||||
if(prob(66))
|
||||
if(always_stillborn || prob(66))
|
||||
S.stillborn = 1
|
||||
else if(prob(10))
|
||||
S.grow_as = pick(/mob/living/simple_animal/hostile/poison/terror_spider/black, /mob/living/simple_animal/hostile/poison/terror_spider/green)
|
||||
|
||||
@@ -333,7 +333,7 @@
|
||||
for(var/i in 1 to numlings)
|
||||
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
|
||||
S.grow_as = /mob/living/simple_animal/hostile/poison/terror_spider/red
|
||||
S.stillborn = 1
|
||||
S.stillborn = TRUE
|
||||
S.name = "Evil-Looking Spiderling"
|
||||
S.desc = "It moves very quickly, hisses loudly for its size... and has disproportionately large fangs. Hopefully it does not grow up..."
|
||||
if(!spider_can_fakelings)
|
||||
|
||||
@@ -10,16 +10,19 @@
|
||||
anchored = 0
|
||||
layer = 2.75
|
||||
health = 3
|
||||
var/stillborn = 0
|
||||
var/stillborn = FALSE
|
||||
faction = list("terrorspiders")
|
||||
var/spider_myqueen = null
|
||||
var/use_vents = 1
|
||||
var/list/enemies = list()
|
||||
var/immediate_ventcrawl = 0
|
||||
var/spider_awaymission = FALSE
|
||||
|
||||
/obj/structure/spider/spiderling/terror_spiderling/New()
|
||||
..()
|
||||
ts_spiderling_list += src
|
||||
if(is_away_level(z))
|
||||
spider_awaymission = TRUE
|
||||
|
||||
/obj/structure/spider/spiderling/terror_spiderling/Destroy()
|
||||
ts_spiderling_list -= src
|
||||
@@ -85,6 +88,8 @@
|
||||
if(isturf(loc))
|
||||
amount_grown += rand(0,2)
|
||||
if(amount_grown >= 100)
|
||||
if(spider_awaymission && !is_away_level(z))
|
||||
stillborn = TRUE
|
||||
if(stillborn)
|
||||
die()
|
||||
else
|
||||
@@ -174,6 +179,6 @@
|
||||
var/rnum = 5 - spiderling_number
|
||||
for(var/i=0, i<rnum, i++)
|
||||
var/obj/structure/spider/spiderling/terror_spiderling/S = new /obj/structure/spider/spiderling/terror_spiderling(get_turf(src))
|
||||
S.stillborn = 1
|
||||
S.stillborn = TRUE
|
||||
// every set of eggs always spawn 5 spiderlings, but most are decoys
|
||||
qdel(src)
|
||||
@@ -330,6 +330,8 @@
|
||||
SetParalysis(max(paralysis, amount), updating, force)
|
||||
|
||||
/mob/living/SetParalysis(amount, updating = 1, force = 0)
|
||||
if((!!amount) == (!!paralysis)) // We're not changing from + to 0 or vice versa
|
||||
updating = FALSE
|
||||
if(status_flags & CANPARALYSE || force)
|
||||
paralysis = max(amount, 0)
|
||||
if(updating)
|
||||
@@ -358,9 +360,11 @@
|
||||
SetSleeping(max(sleeping, amount), updating, no_alert)
|
||||
|
||||
/mob/living/SetSleeping(amount, updating = 1, no_alert = FALSE)
|
||||
if((!!amount) == (!!sleeping)) // We're not changing from + to 0 or vice versa
|
||||
updating = FALSE
|
||||
sleeping = max(amount, 0)
|
||||
update_sleeping_effects(no_alert)
|
||||
if(updating)
|
||||
update_sleeping_effects(no_alert)
|
||||
update_stat()
|
||||
update_canmove()
|
||||
|
||||
@@ -410,6 +414,8 @@
|
||||
SetStunned(max(stunned, amount), updating, force)
|
||||
|
||||
/mob/living/SetStunned(amount, updating = 1, force = 0) //if you REALLY need to set stun to a set amount without the whole "can't go below current stunned"
|
||||
if((!!amount) == (!!stunned)) // We're not changing from + to 0 or vice versa
|
||||
updating = FALSE
|
||||
if(status_flags & CANSTUN || force)
|
||||
stunned = max(amount, 0)
|
||||
if(updating)
|
||||
@@ -440,6 +446,8 @@
|
||||
SetWeakened(max(weakened, amount), updating, force)
|
||||
|
||||
/mob/living/SetWeakened(amount, updating = 1, force = 0)
|
||||
if((!!amount) == (!!weakened)) // We're not changing from + to 0 or vice versa
|
||||
updating = FALSE
|
||||
if(status_flags & CANWEAKEN || force)
|
||||
weakened = max(amount, 0)
|
||||
if(updating)
|
||||
|
||||
@@ -56,9 +56,9 @@
|
||||
return !(weakened || paralysis || stat || (status_flags & FAKEDEATH))
|
||||
|
||||
// Whether the mob is capable of actions or not
|
||||
/mob/living/incapacitated(ignore_restraints = 0, ignore_grab = 0, ignore_lying = 0)
|
||||
if(stat || paralysis || stunned || (weakened && lying) || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
|
||||
return 1
|
||||
/mob/living/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
|
||||
if(stat || paralysis || stunned || weakened || (!ignore_restraints && restrained()) || (!ignore_lying && lying))
|
||||
return TRUE
|
||||
|
||||
// wonderful proc names, I know - used to check whether the blur overlay
|
||||
// should show or not
|
||||
|
||||
@@ -867,19 +867,6 @@ var/list/slot_equipment_priority = list( \
|
||||
/mob/proc/stripPanelEquip(obj/item/what, mob/who)
|
||||
return
|
||||
|
||||
|
||||
/mob/proc/pull_damage()
|
||||
if(ishuman(src))
|
||||
var/mob/living/carbon/human/H = src
|
||||
if(H.health <= config.health_threshold_softcrit)
|
||||
for(var/name in H.bodyparts_by_name)
|
||||
var/obj/item/organ/external/e = H.bodyparts_by_name[name]
|
||||
if(e && H.lying)
|
||||
if(((e.status & ORGAN_BROKEN && !(e.status & ORGAN_SPLINTED)) || e.status & ORGAN_BLEEDING) && (H.getBruteLoss() + H.getFireLoss() >= 100))
|
||||
return 1
|
||||
break
|
||||
return 0
|
||||
|
||||
/mob/MouseDrop(mob/M as mob)
|
||||
..()
|
||||
if(M != usr) return
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
//This file was auto-corrected by findeclaration.exe on 25.5.2012 20:42:33
|
||||
|
||||
/mob/new_player
|
||||
var/ready = 0
|
||||
var/spawning = 0//Referenced when you want to delete the new_player later on in the code.
|
||||
@@ -67,9 +65,9 @@
|
||||
return
|
||||
|
||||
/mob/new_player/Stat()
|
||||
..()
|
||||
if((!ticker) || ticker.current_state == GAME_STATE_PREGAME)
|
||||
statpanel("Lobby") // First tab during pre-game.
|
||||
..()
|
||||
|
||||
statpanel("Status")
|
||||
if(client.statpanel == "Status" && ticker)
|
||||
@@ -125,7 +123,7 @@
|
||||
var/mob/dead/observer/observer = new()
|
||||
src << browse(null, "window=playersetup")
|
||||
spawning = 1
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
|
||||
stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
|
||||
|
||||
observer.started_as_observer = 1
|
||||
@@ -453,7 +451,7 @@
|
||||
client.prefs.real_name = random_name(client.prefs.gender)
|
||||
client.prefs.copy_to(new_character)
|
||||
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// MAD JAMS cant last forever yo
|
||||
stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
|
||||
|
||||
if(mind)
|
||||
@@ -516,7 +514,7 @@
|
||||
|
||||
/mob/new_player/proc/is_species_whitelisted(datum/species/S)
|
||||
if(!S) return 1
|
||||
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(S.flags & IS_WHITELISTED)
|
||||
return is_alien_whitelisted(src, S.name) || !config.usealienwhitelist || !(IS_WHITELISTED in S.species_traits)
|
||||
|
||||
/mob/new_player/get_species()
|
||||
var/datum/species/chosen_species
|
||||
|
||||
@@ -1,8 +1,13 @@
|
||||
/datum/preferences
|
||||
//The mob should have a gender you want before running this proc. Will run fine without H
|
||||
/datum/preferences/proc/random_character(gender_override)
|
||||
var/datum/species/S = all_species[species]
|
||||
if(!istype(S)) //The species was invalid. Set the species to the default, fetch the datum for that species and generate a random character.
|
||||
species = initial(species)
|
||||
S = all_species[species]
|
||||
var/datum/robolimb/robohead
|
||||
if(species == "Machine")
|
||||
|
||||
if(S.bodyflags & ALL_RPARTS)
|
||||
var/head_model = "[!rlimb_data["head"] ? "Morpheus Cyberkinetics" : rlimb_data["head"]]"
|
||||
robohead = all_robolimbs[head_model]
|
||||
if(gender_override)
|
||||
@@ -12,38 +17,32 @@
|
||||
underwear = random_underwear(gender, species)
|
||||
undershirt = random_undershirt(gender, species)
|
||||
socks = random_socks(gender, species)
|
||||
if(species == "Vulpkanin")
|
||||
if(body_accessory_by_species[species])
|
||||
body_accessory = random_body_accessory(species)
|
||||
if(body_accessory == "None") //Required to prevent a bug where the information/icons in the character preferences screen wouldn't update despite the data being changed.
|
||||
body_accessory = null
|
||||
if(species in list("Human", "Drask", "Vox"))
|
||||
if(S.bodyflags & (HAS_SKIN_TONE|HAS_ICON_SKIN_TONE))
|
||||
s_tone = random_skin_tone(species)
|
||||
h_style = random_hair_style(gender, species, robohead)
|
||||
f_style = random_facial_hair_style(gender, species, robohead)
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Vulpkanin", "Vox"))
|
||||
if(species in list("Human", "Unathi", "Tajaran", "Skrell", "Machine", "Wryn", "Vulpkanin", "Vox"))
|
||||
randomize_hair_color("hair")
|
||||
randomize_hair_color("facial")
|
||||
if(species in list("Unathi", "Vulpkanin", "Tajaran", "Machine"))
|
||||
if(S.bodyflags & HAS_HEAD_ACCESSORY)
|
||||
ha_style = random_head_accessory(species)
|
||||
var/list/colours = randomize_skin_color(1)
|
||||
r_headacc = colours["red"]
|
||||
g_headacc = colours["green"]
|
||||
b_headacc = colours["blue"]
|
||||
if(species in list("Machine", "Tajaran", "Unathi", "Vulpkanin"))
|
||||
hacc_colour = randomize_skin_color(1)
|
||||
if(S.bodyflags & HAS_HEAD_MARKINGS)
|
||||
m_styles["head"] = random_marking_style("head", species, robohead, null, alt_head)
|
||||
var/list/colours = randomize_skin_color(1)
|
||||
m_colours["head"] = rgb(colours["red"], colours["green"], colours["blue"])
|
||||
if(species in list("Human", "Unathi", "Grey", "Vulpkanin", "Tajaran", "Skrell", "Vox", "Drask"))
|
||||
m_colours["head"] = randomize_skin_color(1)
|
||||
if(S.bodyflags & HAS_BODY_MARKINGS)
|
||||
m_styles["body"] = random_marking_style("body", species)
|
||||
var/list/colours = randomize_skin_color(1)
|
||||
m_colours["body"] = rgb(colours["red"], colours["green"], colours["blue"])
|
||||
if(species in list("Vox", "Vulpkanin")) //Species with tail markings.
|
||||
m_colours["body"] = randomize_skin_color(1)
|
||||
if(S.bodyflags & HAS_TAIL_MARKINGS) //Species with tail markings.
|
||||
m_styles["tail"] = random_marking_style("tail", species, null, body_accessory)
|
||||
var/list/colours = randomize_skin_color(1)
|
||||
m_colours["tail"] = rgb(colours["red"], colours["green"], colours["blue"])
|
||||
if(species != "Machine")
|
||||
m_colours["tail"] = randomize_skin_color(1)
|
||||
if(!(S.bodyflags & ALL_RPARTS))
|
||||
randomize_eyes_color()
|
||||
if(species in list("Unathi", "Tajaran", "Skrell", "Vulpkanin"))
|
||||
if(S.bodyflags & HAS_SKIN_COLOR)
|
||||
randomize_skin_color()
|
||||
backbag = 2
|
||||
age = rand(AGE_MIN, AGE_MAX)
|
||||
@@ -51,9 +50,7 @@
|
||||
|
||||
/datum/preferences/proc/randomize_hair_color(var/target = "hair")
|
||||
if(prob (75) && target == "facial") // Chance to inherit hair color
|
||||
r_facial = r_hair
|
||||
g_facial = g_hair
|
||||
b_facial = b_hair
|
||||
f_colour = h_colour
|
||||
return
|
||||
|
||||
var/red
|
||||
@@ -101,13 +98,9 @@
|
||||
|
||||
switch(target)
|
||||
if("hair")
|
||||
r_hair = red
|
||||
g_hair = green
|
||||
b_hair = blue
|
||||
h_colour = rgb(red, green, blue)
|
||||
if("facial")
|
||||
r_facial = red
|
||||
g_facial = green
|
||||
b_facial = blue
|
||||
f_colour = rgb(red, green, blue)
|
||||
|
||||
/datum/preferences/proc/randomize_eyes_color()
|
||||
var/red
|
||||
@@ -153,11 +146,9 @@
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
r_eyes = red
|
||||
g_eyes = green
|
||||
b_eyes = blue
|
||||
e_colour = rgb(red, green, blue)
|
||||
|
||||
/datum/preferences/proc/randomize_skin_color(var/pass_to_list)
|
||||
/datum/preferences/proc/randomize_skin_color(var/pass_on)
|
||||
var/red
|
||||
var/green
|
||||
var/blue
|
||||
@@ -201,17 +192,10 @@
|
||||
green = max(min(green + rand (-25, 25), 255), 0)
|
||||
blue = max(min(blue + rand (-25, 25), 255), 0)
|
||||
|
||||
if(pass_to_list)
|
||||
var/list/colours = list(
|
||||
"red" = red,
|
||||
"blue" = blue,
|
||||
"green" = green
|
||||
)
|
||||
return colours
|
||||
if(pass_on)
|
||||
return rgb(red, green, blue)
|
||||
else
|
||||
r_skin = red
|
||||
g_skin = green
|
||||
b_skin = blue
|
||||
s_colour = rgb(red, green, blue)
|
||||
|
||||
/datum/preferences/proc/blend_backpack(var/icon/clothes_s,var/backbag,var/satchel,var/backpack="backpack")
|
||||
switch(backbag)
|
||||
@@ -254,7 +238,7 @@
|
||||
icobase = 'icons/mob/human_races/r_human.dmi'
|
||||
|
||||
var/fat=""
|
||||
if(disabilities & DISABILITY_FLAG_FAT && current_species.flags & CAN_BE_FAT)
|
||||
if(disabilities & DISABILITY_FLAG_FAT && (CAN_BE_FAT in current_species.species_traits))
|
||||
fat="_fat"
|
||||
preview_icon = new /icon(icobase, "torso_[g][fat]")
|
||||
preview_icon.Blend(new /icon(icobase, "groin_[g]"), ICON_OVERLAY)
|
||||
@@ -279,7 +263,7 @@
|
||||
|
||||
// Skin color
|
||||
if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
|
||||
preview_icon.Blend(rgb(r_skin, g_skin, b_skin), ICON_ADD)
|
||||
preview_icon.Blend(s_colour, ICON_ADD)
|
||||
|
||||
// Skin tone
|
||||
if(current_species && (current_species.bodyflags & HAS_SKIN_TONE))
|
||||
@@ -320,7 +304,7 @@
|
||||
temp.Shift(NORTH, tail_shift_y)
|
||||
|
||||
if(current_species && (current_species.bodyflags & HAS_SKIN_COLOR))
|
||||
temp.Blend(rgb(r_skin, g_skin, b_skin), blend_mode)
|
||||
temp.Blend(s_colour, blend_mode)
|
||||
|
||||
if(current_species && (current_species.bodyflags & HAS_TAIL_MARKINGS))
|
||||
var/tail_marking = m_styles["tail"]
|
||||
@@ -353,7 +337,7 @@
|
||||
var/icon/face_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = "bald_s")
|
||||
if(!(current_species.bodyflags & NO_EYES))
|
||||
var/icon/eyes_s = new/icon("icon" = 'icons/mob/human_face.dmi', "icon_state" = current_species ? current_species.eyes : "eyes_s")
|
||||
eyes_s.Blend(rgb(r_eyes, g_eyes, b_eyes), ICON_ADD)
|
||||
eyes_s.Blend(e_colour, ICON_ADD)
|
||||
face_s.Blend(eyes_s, ICON_OVERLAY)
|
||||
|
||||
|
||||
@@ -361,14 +345,14 @@
|
||||
if(hair_style)
|
||||
var/icon/hair_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_s")
|
||||
if(current_species.name == "Slime People") // whee I am part of the problem
|
||||
hair_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
|
||||
hair_s.Blend("[s_colour]A0", ICON_ADD)
|
||||
else
|
||||
hair_s.Blend(rgb(r_hair, g_hair, b_hair), ICON_ADD)
|
||||
hair_s.Blend(h_colour, ICON_ADD)
|
||||
|
||||
if(hair_style.secondary_theme)
|
||||
var/icon/hair_secondary_s = new/icon("icon" = hair_style.icon, "icon_state" = "[hair_style.icon_state]_[hair_style.secondary_theme]_s")
|
||||
if(!hair_style.no_sec_colour)
|
||||
hair_secondary_s.Blend(rgb(r_hair_sec, g_hair_sec, b_hair_sec), ICON_ADD)
|
||||
hair_secondary_s.Blend(h_sec_colour, ICON_ADD)
|
||||
hair_s.Blend(hair_secondary_s, ICON_OVERLAY)
|
||||
|
||||
face_s.Blend(hair_s, ICON_OVERLAY)
|
||||
@@ -378,21 +362,21 @@
|
||||
var/datum/sprite_accessory/head_accessory_style = head_accessory_styles_list[ha_style]
|
||||
if(head_accessory_style && head_accessory_style.species_allowed)
|
||||
var/icon/head_accessory_s = new/icon("icon" = head_accessory_style.icon, "icon_state" = "[head_accessory_style.icon_state]_s")
|
||||
head_accessory_s.Blend(rgb(r_headacc, g_headacc, b_headacc), ICON_ADD)
|
||||
head_accessory_s.Blend(hacc_colour, ICON_ADD)
|
||||
face_s.Blend(head_accessory_s, ICON_OVERLAY)
|
||||
|
||||
var/datum/sprite_accessory/facial_hair_style = facial_hair_styles_list[f_style]
|
||||
if(facial_hair_style && facial_hair_style.species_allowed)
|
||||
var/icon/facial_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_s")
|
||||
if(current_species.name == "Slime People") // whee I am part of the problem
|
||||
facial_s.Blend(rgb(r_skin, g_skin, b_skin, 160), ICON_ADD)
|
||||
facial_s.Blend("[s_colour]A0", ICON_ADD)
|
||||
else
|
||||
facial_s.Blend(rgb(r_facial, g_facial, b_facial), ICON_ADD)
|
||||
facial_s.Blend(f_colour, ICON_ADD)
|
||||
|
||||
if(facial_hair_style.secondary_theme)
|
||||
var/icon/facial_secondary_s = new/icon("icon" = facial_hair_style.icon, "icon_state" = "[facial_hair_style.icon_state]_[facial_hair_style.secondary_theme]_s")
|
||||
if(!facial_hair_style.no_sec_colour)
|
||||
facial_secondary_s.Blend(rgb(r_facial_sec, g_facial_sec, b_facial_sec), ICON_ADD)
|
||||
facial_secondary_s.Blend(f_sec_colour, ICON_ADD)
|
||||
facial_s.Blend(facial_secondary_s, ICON_OVERLAY)
|
||||
|
||||
face_s.Blend(facial_s, ICON_OVERLAY)
|
||||
|
||||
@@ -20,7 +20,7 @@
|
||||
|
||||
/mob/proc/AIize()
|
||||
if(client)
|
||||
src << sound(null, repeat = 0, wait = 0, volume = 85, channel = 1)// stop the jams for AIs
|
||||
stop_sound_channel(CHANNEL_LOBBYMUSIC)
|
||||
|
||||
var/mob/living/silicon/ai/O = new (loc,,,1)//No MMI but safety is in effect.
|
||||
O.invisibility = 0
|
||||
|
||||
@@ -43,8 +43,8 @@
|
||||
/mob/proc/can_speak()
|
||||
return 1
|
||||
|
||||
/mob/proc/incapacitated(ignore_restraints, ignore_grab)
|
||||
return 0
|
||||
/mob/proc/incapacitated(ignore_restraints = FALSE, ignore_grab = FALSE, ignore_lying = FALSE)
|
||||
return FALSE
|
||||
|
||||
/mob/proc/restrained(ignore_grab)
|
||||
// All are created free
|
||||
|
||||
Reference in New Issue
Block a user