mirror of
https://github.com/ParadiseSS13/Paradise.git
synced 2026-08-23 12:07:27 +01:00
Merge remote-tracking branch 'upstream/master' into removes-cryobags
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,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
|
||||
|
||||
@@ -216,15 +216,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,16 +239,17 @@
|
||||
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>")
|
||||
@@ -297,7 +301,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)
|
||||
@@ -317,15 +323,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)
|
||||
@@ -887,11 +893,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,
|
||||
@@ -930,7 +936,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)))
|
||||
@@ -944,10 +950,10 @@ var/list/ventcrawl_machinery = list(/obj/machinery/atmospherics/unary/vent_pump,
|
||||
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
|
||||
|
||||
@@ -971,7 +977,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
|
||||
|
||||
@@ -1024,7 +1030,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
|
||||
@@ -1033,6 +1039,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)
|
||||
|
||||
@@ -8,8 +8,6 @@
|
||||
|
||||
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.
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,80 +202,32 @@
|
||||
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"
|
||||
|
||||
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>")
|
||||
|
||||
msg += "<span class='warning'>"
|
||||
if(fire_stacks > 0)
|
||||
msg += "[t_He] [t_is] covered in something flammable.\n"
|
||||
if(fire_stacks < 0)
|
||||
msg += "[t_He] looks a little soaked.\n"
|
||||
|
||||
switch(wetlevel)
|
||||
if(1)
|
||||
msg += "[t_He] looks a bit damp.\n"
|
||||
if(2)
|
||||
msg += "[t_He] looks a little bit wet.\n"
|
||||
if(3)
|
||||
msg += "[t_He] looks wet.\n"
|
||||
if(4)
|
||||
msg += "[t_He] looks very wet.\n"
|
||||
if(5)
|
||||
msg += "[t_He] looks absolutely soaked.\n"
|
||||
|
||||
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
|
||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
||||
else if(nutrition >= NUTRITION_LEVEL_FAT)
|
||||
if(user.nutrition < NUTRITION_LEVEL_STARVING - 50)
|
||||
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] quite chubby.\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(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"
|
||||
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(!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)
|
||||
@@ -296,89 +238,17 @@
|
||||
|
||||
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"
|
||||
wound_flavor_text["[organ_tag]"] = "<B>[t_He] [t_is] missing [t_his] [organ_descriptor].</B>\n"
|
||||
else
|
||||
continue
|
||||
if(!isSynthetic())
|
||||
if(E.status & ORGAN_ROBOT)
|
||||
wound_flavor_text["[E.limb_name]"] = "[t_He] [t_has] a robotic [E.name]!\n"
|
||||
|
||||
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.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]"] = ""
|
||||
else
|
||||
wound_flavor_text["[temp.limb_name]"] = ""
|
||||
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 temp.embedded_objects)
|
||||
msg += "<B>[t_He] [t_has] \a [bicon(I)] [I] embedded in [t_his] [temp.name]!</B>\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.
|
||||
@@ -405,6 +275,55 @@
|
||||
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)
|
||||
msg += "[t_He] looks a little soaked.\n"
|
||||
|
||||
switch(wetlevel)
|
||||
if(1)
|
||||
msg += "[t_He] looks a bit damp.\n"
|
||||
if(2)
|
||||
msg += "[t_He] looks a little bit wet.\n"
|
||||
if(3)
|
||||
msg += "[t_He] looks wet.\n"
|
||||
if(4)
|
||||
msg += "[t_He] looks very wet.\n"
|
||||
if(5)
|
||||
msg += "[t_He] looks absolutely soaked.\n"
|
||||
|
||||
if(nutrition < NUTRITION_LEVEL_STARVING - 50)
|
||||
msg += "[t_He] [t_is] severely malnourished.\n"
|
||||
else if(nutrition >= NUTRITION_LEVEL_FAT)
|
||||
if(user.nutrition < NUTRITION_LEVEL_STARVING - 50)
|
||||
msg += "[t_He] [t_is] plump and delicious looking - Like a fat little piggy. A tasty piggy.\n"
|
||||
else
|
||||
msg += "[t_He] [t_is] quite chubby.\n"
|
||||
|
||||
if(blood_volume < BLOOD_VOLUME_SAFE)
|
||||
msg += "[t_He] [t_has] pale skin.\n"
|
||||
|
||||
@@ -416,10 +335,38 @@
|
||||
else
|
||||
msg += "<B>[t_He] [t_is] bleeding!</B>\n"
|
||||
|
||||
if(digitalcamo)
|
||||
msg += "[t_He] [t_is] repulsively uncanny!\n"
|
||||
if(reagents.has_reagent("teslium"))
|
||||
msg += "[t_He] is emitting a gentle blue glow!\n"
|
||||
|
||||
msg += "</span>"
|
||||
|
||||
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(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(digitalcamo)
|
||||
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\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)
|
||||
|
||||
@@ -607,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
|
||||
|
||||
@@ -1206,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.
|
||||
|
||||
@@ -1596,7 +1588,7 @@
|
||||
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
|
||||
|
||||
@@ -2056,3 +2048,9 @@
|
||||
update_icons()
|
||||
|
||||
..()
|
||||
|
||||
mob/living/carbon/human/get_taste_sensitivity()
|
||||
if(species)
|
||||
return species.taste_sensitivity
|
||||
else
|
||||
return 1
|
||||
|
||||
@@ -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>")
|
||||
|
||||
@@ -52,9 +52,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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -468,7 +469,7 @@
|
||||
// Other return values will cause weird badness
|
||||
/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_MAXIMUM)
|
||||
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
|
||||
|
||||
@@ -114,6 +114,7 @@
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
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"
|
||||
@@ -164,6 +165,7 @@
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
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"
|
||||
@@ -215,6 +217,7 @@
|
||||
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.
|
||||
@@ -643,12 +646,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
|
||||
|
||||
@@ -674,21 +677,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.
|
||||
@@ -804,6 +803,7 @@
|
||||
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
|
||||
|
||||
@@ -911,6 +911,7 @@
|
||||
clothing_flags = HAS_UNDERWEAR | HAS_UNDERSHIRT | HAS_SOCKS
|
||||
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.
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -241,7 +234,7 @@ var/global/list/damage_icon_parts = list()
|
||||
|
||||
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]": ""]"
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
@@ -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>")
|
||||
|
||||
@@ -260,8 +260,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
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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////////////
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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,38 @@
|
||||
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"))
|
||||
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"))
|
||||
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.
|
||||
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")
|
||||
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)
|
||||
|
||||
@@ -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