Bleeding edgy refresh (#303)

* not code stuff

* other things

* global vars, defines, helpers

* onclick hud stuff, orphans, world.dm

* controllers and datums

* game folder

* everything not client/mobs in modules

* client folder

* stage 1 mob stuff

* simple animal things

* silicons

* carbon things

* ayylmaos and monkeys

* hyoomahn

* icons n shit

* sprite fixes

* compile fixes

* some fixes I cherrypicked.

* qdel fixes

* forgot brain refractors
This commit is contained in:
Poojawa
2017-03-21 11:44:10 -05:00
committed by GitHub
parent 099a6c8764
commit f67e9f6d87
1476 changed files with 344416 additions and 40694 deletions
@@ -34,7 +34,7 @@
var/static/regex/alien_name_regex = new("alien (larva|sentinel|drone|hunter|praetorian|queen)( \\(\\d+\\))?")
/mob/living/carbon/alien/New()
/mob/living/carbon/alien/Initialize()
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
@@ -138,7 +138,7 @@ Des: Removes all infected images from the alien.
return initial(pixel_y)
/mob/living/carbon/alien/proc/alien_evolve(mob/living/carbon/alien/new_xeno)
src << "<span class='noticealien'>You begin to evolve!</span>"
to_chat(src, "<span class='noticealien'>You begin to evolve!</span>")
visible_message("<span class='alertalien'>[src] begins to twist and contort!</span>")
new_xeno.setDir(dir)
if(!alien_name_regex.Find(name))
@@ -15,7 +15,7 @@ In all, this is a lot like the monkey code. /N
*/
/mob/living/carbon/alien/attack_alien(mob/living/carbon/alien/M)
if(isturf(loc) && istype(loc.loc, /area/start))
M << "No attacking people at spawn, you jackass."
to_chat(M, "No attacking people at spawn, you jackass.")
return
switch(M.a_intent)
@@ -41,7 +41,7 @@ In all, this is a lot like the monkey code. /N
add_logs(M, src, "attacked")
updatehealth()
else
M << "<span class='warning'>[name] is too injured for that.</span>"
to_chat(M, "<span class='warning'>[name] is too injured for that.</span>")
/mob/living/carbon/alien/attack_larva(mob/living/carbon/alien/larva/L)
@@ -1,18 +1,10 @@
/mob/living/carbon/alien/getToxLoss()
return 0
/mob/living/carbon/alien/adjustToxLoss(amount, updating_health = TRUE, forced = FALSE) //alien immune to tox damage
return FALSE
/mob/living/carbon/alien/adjustFireLoss(amount, updating_health = TRUE, forced = FALSE) // Weak to Fire
if(amount > 0)
amount *= 2
. = ..()
//aliens are immune to stamina damage.
/mob/living/carbon/alien/adjustStaminaLoss(amount, updating_stamina = 1)
return
@@ -42,15 +42,15 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/proc/cost_check(check_turf=0,mob/living/carbon/user,silent = 0)
if(user.stat)
if(!silent)
user << "<span class='noticealien'>You must be conscious to do this.</span>"
to_chat(user, "<span class='noticealien'>You must be conscious to do this.</span>")
return 0
if(user.getPlasma() < plasma_cost)
if(!silent)
user << "<span class='noticealien'>Not enough plasma stored.</span>"
to_chat(user, "<span class='noticealien'>Not enough plasma stored.</span>")
return 0
if(check_turf && (!isturf(user.loc) || isspaceturf(user.loc)))
if(!silent)
user << "<span class='noticealien'>Bad place for a garden!</span>"
to_chat(user, "<span class='noticealien'>Bad place for a garden!</span>")
return 0
return 1
@@ -63,7 +63,7 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/plant/fire(mob/living/carbon/user)
if(locate(/obj/structure/alien/weeds/node) in get_turf(user))
user << "There's already a weed node here."
to_chat(user, "There's already a weed node here.")
return 0
user.visible_message("<span class='alertalien'>[user] has planted some alien weeds!</span>")
new/obj/structure/alien/weeds/node(user.loc)
@@ -85,19 +85,14 @@ Doesn't work on other aliens/AI.*/
var/msg = sanitize(input("Message:", "Alien Whisper") as text|null)
if(msg)
log_say("AlienWhisper: [key_name(user)]->[M.key] : [msg]")
M << "<span class='noticealien'>You hear a strange, alien voice in your head...</span>[msg]"
user << "<span class='noticealien'>You said: \"[msg]\" to [M]</span>"
to_chat(M, "<span class='noticealien'>You hear a strange, alien voice in your head...</span>[msg]")
to_chat(user, "<span class='noticealien'>You said: \"[msg]\" to [M]</span>")
for(var/ded in dead_mob_list)
if(!isobserver(ded))
continue
var/follow_link_user = FOLLOW_LINK(ded, user)
var/follow_link_whispee = FOLLOW_LINK(ded, M)
ded << "[follow_link_user] \
<span class='name'>[user]</span> \
<span class='alertalien'>Alien Whisper --> </span> \
[follow_link_whispee] \
<span class='name'>[M]</span> \
<span class='noticealien'>[msg]</span>"
to_chat(ded, "[follow_link_user] <span class='name'>[user]</span> <span class='alertalien'>Alien Whisper --> </span> [follow_link_whispee] <span class='name'>[M]</span> <span class='noticealien'>[msg]</span>")
else
return 0
return 1
@@ -122,10 +117,10 @@ Doesn't work on other aliens/AI.*/
if (get_dist(user,M) <= 1)
M.adjustPlasma(amount)
user.adjustPlasma(-amount)
M << "<span class='noticealien'>[user] has transferred [amount] plasma to you.</span>"
user << "<span class='noticealien'>You transfer [amount] plasma to [M]</span>"
to_chat(M, "<span class='noticealien'>[user] has transferred [amount] plasma to you.</span>")
to_chat(user, "<span class='noticealien'>You transfer [amount] plasma to [M]</span>")
else
user << "<span class='noticealien'>You need to be closer!</span>"
to_chat(user, "<span class='noticealien'>You need to be closer!</span>")
return
/obj/effect/proc_holder/alien/acid
@@ -146,12 +141,12 @@ Doesn't work on other aliens/AI.*/
user.visible_message("<span class='alertalien'>[user] vomits globs of vile stuff all over [target]. It begins to sizzle and melt under the bubbling mess of acid!</span>")
return 1
else
user << "<span class='noticealien'>You cannot dissolve this object.</span>"
to_chat(user, "<span class='noticealien'>You cannot dissolve this object.</span>")
return 0
else
src << "<span class='noticealien'>Target is too far away.</span>"
to_chat(src, "<span class='noticealien'>Target is too far away.</span>")
return 0
@@ -204,7 +199,7 @@ Doesn't work on other aliens/AI.*/
var/mob/living/carbon/user = ranged_ability_user
if(user.getPlasma() < p_cost)
user << "<span class='warning'>You need at least [p_cost] plasma to spit.</span>"
to_chat(user, "<span class='warning'>You need at least [p_cost] plasma to spit.</span>")
remove_ranged_ability()
return
@@ -255,14 +250,14 @@ Doesn't work on other aliens/AI.*/
/obj/effect/proc_holder/alien/resin/fire(mob/living/carbon/user)
if(locate(/obj/structure/alien/resin) in user.loc)
user << "<span class='danger'>There is already a resin structure there.</span>"
to_chat(user, "<span class='danger'>There is already a resin structure there.</span>")
return 0
var/choice = input("Choose what you wish to shape.","Resin building") as null|anything in structures
if(!choice)
return 0
if (!cost_check(check_turf,user))
return 0
user << "<span class='notice'>You shape a [choice].</span>"
to_chat(user, "<span class='notice'>You shape a [choice].</span>")
user.visible_message("<span class='notice'>[user] vomits up a thick purple substance and begins to shape it.</span>")
choice = structures[choice]
@@ -298,12 +293,12 @@ Doesn't work on other aliens/AI.*/
user.alpha = 75 //Still easy to see in lit areas with bright tiles, almost invisible on resin.
user.sneaking = 1
active = 1
user << "<span class='noticealien'>You blend into the shadows...</span>"
to_chat(user, "<span class='noticealien'>You blend into the shadows...</span>")
else
user.alpha = initial(user.alpha)
user.sneaking = 0
active = 0
user << "<span class='noticealien'>You reveal yourself!</span>"
to_chat(user, "<span class='noticealien'>You reveal yourself!</span>")
/mob/living/carbon/proc/getPlasma()
@@ -6,7 +6,7 @@
icon_state = "aliend"
/mob/living/carbon/alien/humanoid/drone/New()
/mob/living/carbon/alien/humanoid/drone/Initialize()
AddAbility(new/obj/effect/proc_holder/alien/evolve(null))
..()
@@ -30,19 +30,19 @@
/obj/effect/proc_holder/alien/evolve/fire(mob/living/carbon/alien/humanoid/user)
var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode)
if(!node) //Players are Murphy's Law. We may not expect there to ever be a living xeno with no hivenode, but they _WILL_ make it happen.
user << "<span class='danger'>Without the hivemind, you can't possibly hold the responsibility of leadership!</span>"
to_chat(user, "<span class='danger'>Without the hivemind, you can't possibly hold the responsibility of leadership!</span>")
return 0
if(node.recent_queen_death)
user << "<span class='danger'>Your thoughts are still too scattered to take up the position of leadership.</span>"
to_chat(user, "<span class='danger'>Your thoughts are still too scattered to take up the position of leadership.</span>")
return 0
if(!isturf(user.loc))
user << "<span class='notice'>You can't evolve here!</span>"
to_chat(user, "<span class='notice'>You can't evolve here!</span>")
return 0
if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal))
var/mob/living/carbon/alien/humanoid/royal/praetorian/new_xeno = new (user.loc)
user.alien_evolve(new_xeno)
return 1
else
user << "<span class='notice'>We already have a living royal!</span>"
to_chat(user, "<span class='notice'>We already have a living royal!</span>")
return 0
@@ -22,7 +22,7 @@
leap_icon.icon_state = "leap_[leap_on_click ? "on":"off"]"
update_icons()
if(message)
src << "<span class='noticealien'>You will now [leap_on_click ? "leap at":"slash at"] enemies!</span>"
to_chat(src, "<span class='noticealien'>You will now [leap_on_click ? "leap at":"slash at"] enemies!</span>")
else
return
@@ -39,14 +39,14 @@
/mob/living/carbon/alien/humanoid/hunter/proc/leap_at(atom/A)
if(pounce_cooldown)
src << "<span class='alertalien'>You are too fatigued to pounce right now!</span>"
to_chat(src, "<span class='alertalien'>You are too fatigued to pounce right now!</span>")
return
if(leaping || stat || buckled || lying)
return
if(!has_gravity() || !A.has_gravity())
src << "<span class='alertalien'>It is unsafe to leap without gravity!</span>"
to_chat(src, "<span class='alertalien'>It is unsafe to leap without gravity!</span>")
//It's also extremely buggy visually, so it's balance+bugfix
return
@@ -7,7 +7,7 @@
/mob/living/carbon/alien/humanoid/royal/praetorian/New()
/mob/living/carbon/alien/humanoid/royal/praetorian/Initialize()
real_name = name
@@ -37,10 +37,10 @@
/obj/effect/proc_holder/alien/royal/praetorian/evolve/fire(mob/living/carbon/alien/humanoid/user)
var/obj/item/organ/alien/hivenode/node = user.getorgan(/obj/item/organ/alien/hivenode)
if(!node) //Just in case this particular Praetorian gets violated and kept by the RD as a replacement for Lamarr.
user << "<span class='danger'>Without the hivemind, you would be unfit to rule as queen!</span>"
to_chat(user, "<span class='danger'>Without the hivemind, you would be unfit to rule as queen!</span>")
return 0
if(node.recent_queen_death)
user << "<span class='danger'>You are still too burdened with guilt to evolve into a queen.</span>"
to_chat(user, "<span class='danger'>You are still too burdened with guilt to evolve into a queen.</span>")
return 0
if(!get_alien_type(/mob/living/carbon/alien/humanoid/royal/queen))
var/mob/living/carbon/alien/humanoid/royal/queen/new_xeno = new (user.loc)
@@ -50,5 +50,5 @@
M.Grant(new_xeno)
return 1
else
user << "<span class='notice'>We already have an alive queen.</span>"
to_chat(user, "<span class='notice'>We already have an alive queen.</span>")
return 0
@@ -6,7 +6,7 @@
icon_state = "aliens"
/mob/living/carbon/alien/humanoid/sentinel/New()
/mob/living/carbon/alien/humanoid/sentinel/Initialize()
AddAbility(new /obj/effect/proc_holder/alien/sneak)
..()
@@ -21,7 +21,7 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/humanoid/New()
/mob/living/carbon/alien/humanoid/Initialize()
AddAbility(new/obj/effect/proc_holder/alien/regurgitate(null))
..()
@@ -33,7 +33,7 @@
/datum/action/small_sprite/Trigger()
..()
if(!small)
var/image/I = image(icon = 'icons/mob/alien.dmi' , icon_state = "alienq_running", loc = owner)
var/image/I = image(icon = 'icons/mob/alien.dmi' , icon_state = "alienq", loc = owner)
I.override = 1
I.pixel_x -= owner.pixel_x
I.pixel_y -= owner.pixel_y
@@ -44,7 +44,7 @@
owner.remove_alt_appearance("smallqueen")
small = 0
/mob/living/carbon/alien/humanoid/royal/queen/New()
/mob/living/carbon/alien/humanoid/royal/queen/Initialize()
//there should only be one queen
for(var/mob/living/carbon/alien/humanoid/royal/queen/Q in living_mob_list)
if(Q == src)
@@ -84,7 +84,7 @@
/obj/effect/proc_holder/alien/lay_egg/fire(mob/living/carbon/user)
if(locate(/obj/structure/alien/egg) in get_turf(user))
user << "There's already an egg here."
to_chat(user, "There's already an egg here.")
return 0
user.visible_message("<span class='alertalien'>[user] has laid an egg!</span>")
new /obj/structure/alien/egg(user.loc)
@@ -103,20 +103,20 @@
/obj/effect/proc_holder/alien/royal/queen/promote/fire(mob/living/carbon/alien/user)
var/obj/item/queenpromote/prom
if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/))
user << "<span class='noticealien'>You already have a Praetorian!</span>"
to_chat(user, "<span class='noticealien'>You already have a Praetorian!</span>")
return 0
else
for(prom in user)
user << "<span class='noticealien'>You discard [prom].</span>"
to_chat(user, "<span class='noticealien'>You discard [prom].</span>")
qdel(prom)
return 0
prom = new (user.loc)
if(!user.put_in_active_hand(prom, 1))
user << "<span class='warning'>You must empty your hands before preparing the parasite.</span>"
to_chat(user, "<span class='warning'>You must empty your hands before preparing the parasite.</span>")
return 0
else //Just in case telling the player only once is not enough!
user << "<span class='noticealien'>Use the royal parasite on one of your children to promote her to Praetorian!</span>"
to_chat(user, "<span class='noticealien'>Use the royal parasite on one of your children to promote her to Praetorian!</span>")
return 0
/obj/item/queenpromote
@@ -128,19 +128,19 @@
/obj/item/queenpromote/attack(mob/living/M, mob/living/carbon/alien/humanoid/user)
if(!isalienadult(M) || istype(M, /mob/living/carbon/alien/humanoid/royal))
user << "<span class='noticealien'>You may only use this with your adult, non-royal children!</span>"
to_chat(user, "<span class='noticealien'>You may only use this with your adult, non-royal children!</span>")
return
if(get_alien_type(/mob/living/carbon/alien/humanoid/royal/praetorian/))
user << "<span class='noticealien'>You already have a Praetorian!</span>"
to_chat(user, "<span class='noticealien'>You already have a Praetorian!</span>")
return
var/mob/living/carbon/alien/humanoid/A = M
if(A.stat == CONSCIOUS && A.mind && A.key)
if(!user.usePlasma(500))
user << "<span class='noticealien'>You must have 500 plasma stored to use this!</span>"
to_chat(user, "<span class='noticealien'>You must have 500 plasma stored to use this!</span>")
return
A << "<span class='noticealien'>The queen has granted you a promotion to Praetorian!</span>"
to_chat(A, "<span class='noticealien'>The queen has granted you a promotion to Praetorian!</span>")
user.visible_message("<span class='alertalien'>[A] begins to expand, twist and contort!</span>")
var/mob/living/carbon/alien/humanoid/royal/praetorian/new_prae = new (A.loc)
A.mind.transfer_to(new_prae)
@@ -148,10 +148,10 @@
qdel(src)
return
else
user << "<span class='warning'>This child must be alert and responsive to become a Praetorian!</span>"
to_chat(user, "<span class='warning'>This child must be alert and responsive to become a Praetorian!</span>")
/obj/item/queenpromote/attack_self(mob/user)
user << "<span class='noticealien'>You discard [src].</span>"
to_chat(user, "<span class='noticealien'>You discard [src].</span>")
qdel(src)
//:^)
@@ -18,7 +18,7 @@
//This is fine right now, if we're adding organ specific damage this needs to be updated
/mob/living/carbon/alien/larva/New()
/mob/living/carbon/alien/larva/Initialize()
AddAbility(new/obj/effect/proc_holder/alien/hide(null))
AddAbility(new/obj/effect/proc_holder/alien/larva_evolve(null))
@@ -60,9 +60,9 @@
return
/mob/living/carbon/alien/larva/stripPanelUnequip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
/mob/living/carbon/alien/larva/stripPanelEquip(obj/item/what, mob/who)
src << "<span class='warning'>You don't have the dexterity to do this!</span>"
to_chat(src, "<span class='warning'>You don't have the dexterity to do this!</span>")
return
@@ -33,14 +33,14 @@
var/mob/living/carbon/alien/larva/L = user
if(L.handcuffed || L.legcuffed) // Cuffing larvas ? Eh ?
user << "<span class='danger'>You cannot evolve when you are cuffed.</span>"
to_chat(user, "<span class='danger'>You cannot evolve when you are cuffed.</span>")
if(L.amount_grown >= L.max_grown) //TODO ~Carn
L << "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>"
L << "<span class='info'>There are three to choose from:"
L << "<span class='name'>Hunters</span> <span class='info'>are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.</span>"
L << "<span class='name'>Sentinels</span> <span class='info'>are tasked with protecting the hive. With their ranged spit, invisibility, and high health, they make formidable guardians and acceptable secondhand hunters.</span>"
L << "<span class='name'>Drones</span> <span class='info'>are the weakest and slowest of the castes, but can grow into a praetorian and then queen if no queen exists, and are vital to maintaining a hive with their resin secretion abilities.</span>"
to_chat(L, "<span class='name'>You are growing into a beautiful alien! It is time to choose a caste.</span>")
to_chat(L, "<span class='info'>There are three to choose from:")
to_chat(L, "<span class='name'>Hunters</span> <span class='info'>are the most agile caste, tasked with hunting for hosts. They are faster than a human and can even pounce, but are not much tougher than a drone.</span>")
to_chat(L, "<span class='name'>Sentinels</span> <span class='info'>are tasked with protecting the hive. With their ranged spit, invisibility, and high health, they make formidable guardians and acceptable secondhand hunters.</span>")
to_chat(L, "<span class='name'>Drones</span> <span class='info'>are the weakest and slowest of the castes, but can grow into a praetorian and then queen if no queen exists, and are vital to maintaining a hive with their resin secretion abilities.</span>")
var/alien_caste = alert(L, "Please choose which alien caste you shall belong to.",,"Hunter","Sentinel","Drone")
if(user.incapacitated()) //something happened to us while we were choosing.
@@ -58,5 +58,5 @@
L.alien_evolve(new_xeno)
return 0
else
user << "<span class='danger'>You are not fully grown.</span>"
to_chat(user, "<span class='danger'>You are not fully grown.</span>")
return 0
@@ -124,13 +124,13 @@
if(!owner|| owner.stat == DEAD)
return
if(isalien(owner)) //Different effects for aliens than humans
owner << "<span class='userdanger'>Your Queen has been struck down!</span>"
owner << "<span class='danger'>You are struck with overwhelming agony! You feel confused, and your connection to the hivemind is severed."
to_chat(owner, "<span class='userdanger'>Your Queen has been struck down!</span>")
to_chat(owner, "<span class='danger'>You are struck with overwhelming agony! You feel confused, and your connection to the hivemind is severed.")
owner.emote("roar")
owner.Stun(10) //Actually just slows them down a bit.
else if(ishuman(owner)) //Humans, being more fragile, are more overwhelmed by the mental backlash.
owner << "<span class='danger'>You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!"
to_chat(owner, "<span class='danger'>You feel a splitting pain in your head, and are struck with a wave of nausea. You cannot hear the hivemind anymore!")
owner.emote("scream")
owner.Weaken(5)
@@ -146,7 +146,7 @@
recent_queen_death = 0
if(!owner) //In case the xeno is butchered or subjected to surgery after death.
return
owner << "<span class='noticealien'>The pain of the queen's death is easing. You begin to hear the hivemind again.</span>"
to_chat(owner, "<span class='noticealien'>The pain of the queen's death is easing. You begin to hear the hivemind again.</span>")
owner.clear_alert("alien_noqueen")
+2 -2
View File
@@ -7,10 +7,10 @@
var/rendered = "<i><span class='alien'>Hivemind, <span class='name'>[shown_name]</span> <span class='message'>[message_a]</span></span></i>"
for(var/mob/S in player_list)
if(!S.stat && S.hivecheck())
S << rendered
to_chat(S, rendered)
if(S in dead_mob_list)
var/link = FOLLOW_LINK(S, src)
S << "[link] [rendered]"
to_chat(S, "[link] [rendered]")
/mob/living/carbon/alien/humanoid/royal/queen/alien_talk(message, shown_name = name)
shown_name = "<FONT size = 3>[shown_name]</FONT>"
@@ -1,19 +1,18 @@
// This is to replace the previous datum/disease/alien_embryo for slightly improved handling and maintainability
// It functions almost identically (see code/datums/diseases/alien_embryo.dm)
var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
/obj/item/organ/body_egg/alien_embryo
name = "alien embryo"
icon = 'icons/mob/alien.dmi'
icon_state = "larva0_dead"
var/stage = 0
var/bursting = FALSE
/obj/item/organ/body_egg/alien_embryo/on_find(mob/living/finder)
..()
if(stage < 4)
finder << "It's small and weak, barely the size of a foetus."
to_chat(finder, "It's small and weak, barely the size of a foetus.")
else
finder << "It's grown quite large, and writhes slightly as you look at it."
to_chat(finder, "It's grown quite large, and writhes slightly as you look at it.")
if(prob(10))
AttemptGrow(0)
@@ -30,31 +29,30 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
if(prob(2))
owner.emote("cough")
if(prob(2))
owner << "<span class='danger'>Your throat feels sore.</span>"
to_chat(owner, "<span class='danger'>Your throat feels sore.</span>")
if(prob(2))
owner << "<span class='danger'>Mucous runs down the back of your throat.</span>"
to_chat(owner, "<span class='danger'>Mucous runs down the back of your throat.</span>")
if(4)
if(prob(2))
owner.emote("sneeze")
if(prob(2))
owner.emote("cough")
if(prob(4))
owner << "<span class='danger'>Your muscles ache.</span>"
to_chat(owner, "<span class='danger'>Your muscles ache.</span>")
if(prob(20))
owner.take_bodypart_damage(1)
if(prob(4))
owner << "<span class='danger'>Your stomach hurts.</span>"
to_chat(owner, "<span class='danger'>Your stomach hurts.</span>")
if(prob(20))
owner.adjustToxLoss(1)
if(5)
owner << "<span class='danger'>You feel something tearing its way out of your stomach...</span>"
to_chat(owner, "<span class='danger'>You feel something tearing its way out of your stomach...</span>")
owner.adjustToxLoss(10)
/obj/item/organ/body_egg/alien_embryo/egg_process()
if(stage < 5 && prob(3))
stage++
spawn(0)
RefreshInfectionImage()
INVOKE_ASYNC(src, .proc/RefreshInfectionImage)
if(stage == 5 && prob(50))
for(var/datum/surgery/S in owner.surgeries)
@@ -65,45 +63,53 @@ var/const/ALIEN_AFK_BRACKET = 450 // 45 seconds
/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success = 1)
if(!owner) return
var/list/candidates = get_candidates(ROLE_ALIEN, ALIEN_AFK_BRACKET, "alien candidate")
var/client/C = null
// To stop clientless larva, we will check that our host has a client
// if we find no ghosts to become the alien. If the host has a client
// he will become the alien but if he doesn't then we will set the stage
// to 4, so we don't do a process heavy check everytime.
if(candidates.len)
C = pick(candidates)
else if(owner.client && !(jobban_isbanned(owner, "alien candidate") || jobban_isbanned(owner, "Syndicate")))
C = owner.client
else
stage = 4 // Let's try again later.
/obj/item/organ/body_egg/alien_embryo/proc/AttemptGrow(gib_on_success=TRUE)
if(!owner || bursting)
return
bursting = TRUE
var/list/candidates = pollCandidates("Do you want to play as an alien larva that will burst out of [owner]?", ROLE_ALIEN, null, ROLE_ALIEN, 100, POLL_IGNORE_ALIEN_LARVA)
if(QDELETED(src) || QDELETED(owner))
return
if(!candidates.len || !owner)
bursting = FALSE
stage = 4
return
var/mob/dead/observer/ghost = pick(candidates)
var/overlay = image('icons/mob/alien.dmi', loc = owner, icon_state = "burst_lie")
owner.add_overlay(overlay)
var/atom/xeno_loc = get_turf(owner)
var/mob/living/carbon/alien/larva/new_xeno = new(xeno_loc)
new_xeno.key = C.key
new_xeno.key = ghost.key
new_xeno << sound('sound/voice/hiss5.ogg',0,0,0,100) //To get the player's attention
new_xeno.canmove = 0 //so we don't move during the bursting animation
new_xeno.notransform = 1
new_xeno.invisibility = INVISIBILITY_MAXIMUM
spawn(6)
if(new_xeno)
new_xeno.canmove = 1
new_xeno.notransform = 0
new_xeno.invisibility = 0
if(gib_on_success)
owner.gib(TRUE)
else
owner.adjustBruteLoss(40)
owner.cut_overlay(overlay)
qdel(src)
sleep(6)
if(QDELETED(src) || QDELETED(owner))
return
if(new_xeno)
new_xeno.canmove = 1
new_xeno.notransform = 0
new_xeno.invisibility = 0
if(gib_on_success)
new_xeno.visible_message("<span class='danger'>[new_xeno] bursts out of [owner] in a shower of gore!</span>", "<span class='userdanger'>You exit [owner], your previous host.</span>", "<span class='italics'>You hear organic matter ripping and tearing!</span>")
owner.gib(TRUE)
else
new_xeno.visible_message("<span class='danger'>[new_xeno] wriggles out of [owner]!</span>", "<span class='userdanger'>You exit [owner], your previous host.</span>")
owner.adjustBruteLoss(40)
owner.cut_overlay(overlay)
qdel(src)
/*----------------------------------------
@@ -64,11 +64,11 @@ var/const/MAX_ACTIVE_TIME = 400
return
switch(stat)
if(DEAD,UNCONSCIOUS)
user << "<span class='boldannounce'>[src] is not moving.</span>"
to_chat(user, "<span class='boldannounce'>[src] is not moving.</span>")
if(CONSCIOUS)
user << "<span class='boldannounce'>[src] seems to be active!</span>"
to_chat(user, "<span class='boldannounce'>[src] seems to be active!</span>")
if (sterile)
user << "<span class='boldannounce'>It looks like the proboscis has been removed.</span>"
to_chat(user, "<span class='boldannounce'>It looks like the proboscis has been removed.</span>")
/obj/item/clothing/mask/facehugger/attackby(obj/item/O,mob/m, params)
if(O.force)
+9 -9
View File
@@ -1,7 +1,7 @@
/mob/living/carbon
blood_volume = BLOOD_VOLUME_NORMAL
/mob/living/carbon/New()
/mob/living/carbon/Initialize()
create_reagents(1000)
update_body_parts() //to update the carbon's new bodyparts appearance
..()
@@ -53,7 +53,7 @@
if(item_in_hand) //this segment checks if the item in your hand is twohanded.
if(istype(item_in_hand,/obj/item/weapon/twohanded))
if(item_in_hand:wielded == 1)
usr << "<span class='warning'>Your other hand is too busy holding the [item_in_hand.name]</span>"
to_chat(usr, "<span class='warning'>Your other hand is too busy holding the [item_in_hand.name]</span>")
return
var/oindex = active_hand_index
active_hand_index = held_index
@@ -252,7 +252,7 @@
buckled.user_unbuckle_mob(src,src)
else
if(src && buckled)
src << "<span class='warning'>You fail to unbuckle yourself!</span>"
to_chat(src, "<span class='warning'>You fail to unbuckle yourself!</span>")
else
buckled.user_unbuckle_mob(src,src)
@@ -293,20 +293,20 @@
var/displaytime = breakouttime / 600
if(!cuff_break)
visible_message("<span class='warning'>[src] attempts to remove [I]!</span>")
src << "<span class='notice'>You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)</span>"
to_chat(src, "<span class='notice'>You attempt to remove [I]... (This will take around [displaytime] minutes and you need to stand still.)</span>")
if(do_after(src, breakouttime, 0, target = src))
clear_cuffs(I, cuff_break)
else
src << "<span class='warning'>You fail to remove [I]!</span>"
to_chat(src, "<span class='warning'>You fail to remove [I]!</span>")
else if(cuff_break == FAST_CUFFBREAK)
breakouttime = 50
visible_message("<span class='warning'>[src] is trying to break [I]!</span>")
src << "<span class='notice'>You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)</span>"
to_chat(src, "<span class='notice'>You attempt to break [I]... (This will take around 5 seconds and you need to stand still.)</span>")
if(do_after(src, breakouttime, 0, target = src))
clear_cuffs(I, cuff_break)
else
src << "<span class='warning'>You fail to break [I]!</span>"
to_chat(src, "<span class='warning'>You fail to break [I]!</span>")
else if(cuff_break == INSTANT_CUFFBREAK)
clear_cuffs(I, cuff_break)
@@ -343,7 +343,7 @@
if(!I.loc || buckled)
return
visible_message("<span class='danger'>[src] manages to [cuff_break ? "break" : "remove"] [I]!</span>")
src << "<span class='notice'>You successfully [cuff_break ? "break" : "remove"] [I].</span>"
to_chat(src, "<span class='notice'>You successfully [cuff_break ? "break" : "remove"] [I].</span>")
if(cuff_break)
qdel(I)
@@ -731,7 +731,7 @@
O.Remove(src)
O.loc = get_turf(src)
if(organs_amt)
user << "<span class='notice'>You retrieve some of [src]\'s internal organs!</span>"
to_chat(user, "<span class='notice'>You retrieve some of [src]\'s internal organs!</span>")
..()
@@ -10,7 +10,7 @@
return number
/mob/living/carbon/get_ear_protection()
if(head && (head.flags & HEADBANGPROTECT))
if(head && HAS_SECONDARY_FLAG(head, BANG_PROTECT))
return 1
/mob/living/carbon/check_projectile_dismemberment(obj/item/projectile/P, def_zone)
@@ -204,7 +204,7 @@
/mob/living/carbon/proc/help_shake_act(mob/living/carbon/M)
if(on_fire)
M << "<span class='warning'>You can't put them out with just your bare hands!"
to_chat(M, "<span class='warning'>You can't put them out with just your bare hands!")
return
if(health >= 0 && !(status_flags & FAKEDEATH))
@@ -212,7 +212,6 @@
if(lying)
M.visible_message("<span class='notice'>[M] shakes [src] trying to get [p_them()] up!</span>", \
"<span class='notice'>You shake [src] trying to get [p_them()] up!</span>")
else if(check_zone(M.zone_selected) == "head")
M.visible_message("<span class='notice'>[M] gives [src] a pat on the head to make [p_them()] feel better!</span>", \
"<span class='notice'>You give [src] a pat on the head to make [p_them()] feel better!</span>")
@@ -241,16 +240,16 @@
return
if (damage == 1)
src << "<span class='warning'>Your eyes sting a little.</span>"
to_chat(src, "<span class='warning'>Your eyes sting a little.</span>")
if(prob(40))
adjust_eye_damage(1)
else if (damage == 2)
src << "<span class='warning'>Your eyes burn.</span>"
to_chat(src, "<span class='warning'>Your eyes burn.</span>")
adjust_eye_damage(rand(2, 4))
else if( damage > 3)
src << "<span class='warning'>Your eyes itch and burn severely!</span>"
to_chat(src, "<span class='warning'>Your eyes itch and burn severely!</span>")
adjust_eye_damage(rand(12, 16))
if(eye_damage > 10)
@@ -260,18 +259,18 @@
if(eye_damage > 20)
if(prob(eye_damage - 20))
if(become_nearsighted())
src << "<span class='warning'>Your eyes start to burn badly!</span>"
to_chat(src, "<span class='warning'>Your eyes start to burn badly!</span>")
else if(prob(eye_damage - 25))
if(become_blind())
src << "<span class='warning'>You can't see anything!</span>"
to_chat(src, "<span class='warning'>You can't see anything!</span>")
else
src << "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>"
to_chat(src, "<span class='warning'>Your eyes are really starting to hurt. This can't be good for you!</span>")
if(has_bane(BANE_LIGHT))
mind.disrupt_spells(-500)
return 1
else if(damage == 0) // just enough protection
if(prob(20))
src << "<span class='notice'>Something bright flashes in the corner of your vision!</span>"
to_chat(src, "<span class='notice'>Something bright flashes in the corner of your vision!</span>")
if(has_bane(BANE_LIGHT))
mind.disrupt_spells(0)
@@ -287,12 +286,12 @@
if(deafen_pwr || damage_pwr)
setEarDamage(ear_damage + damage_pwr*effect_amount, max(ear_deaf, deafen_pwr*effect_amount))
if (ear_damage >= 15)
src << "<span class='warning'>Your ears start to ring badly!</span>"
to_chat(src, "<span class='warning'>Your ears start to ring badly!</span>")
if(prob(ear_damage - 5))
src << "<span class='warning'>You can't hear anything!</span>"
to_chat(src, "<span class='warning'>You can't hear anything!</span>")
disabilities |= DEAF
else if(ear_damage >= 5)
src << "<span class='warning'>Your ears start to ring!</span>"
to_chat(src, "<span class='warning'>Your ears start to ring!</span>")
src << sound('sound/weapons/flash_ring.ogg',0,1,0,250)
return effect_amount //how soundbanged we are
+1 -1
View File
@@ -87,4 +87,4 @@
msg += "*---------*</span>"
user << msg
to_chat(user, msg)
@@ -257,7 +257,6 @@
msg += "[t_He] looks like a drunken mess.\n"
if(91.01 to INFINITY)
msg += "[t_He] [t_is] a shitfaced, slobbering wreck.\n"
for (var/I in src.vore_organs)
var/datum/belly/B = vore_organs[I]
msg += B.get_examine_msg()
@@ -282,7 +281,7 @@
else 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] a vacant, braindead stare...\n"
msg += "[t_He] [t_has] a blank, absent-minded stare and appears completely unresponsive to anything. [t_He] may snap out of it soon.\n"
if(digitalcamo)
msg += "[t_He] [t_is] moving [t_his] body in an unnatural and blatantly inhuman manner.\n"
@@ -330,11 +329,9 @@
msg += "<a href='?src=\ref[src];hud=s;add_crime=1'>\[Add crime\]</a> "
msg += "<a href='?src=\ref[src];hud=s;view_comment=1'>\[View comment log\]</a> "
msg += "<a href='?src=\ref[src];hud=s;add_comment=1'>\[Add comment\]</a>\n"
if(print_flavor_text() && get_visible_name() != "Unknown")//Are we sure we know who this is? Don't show flavor text unless we can recognize them. Prevents certain metagaming with impersonation.
msg += "[print_flavor_text()]\n"
msg += "*---------*</span>"
user << msg
to_chat(user, msg)
+58 -56
View File
@@ -11,9 +11,13 @@
real_name = "Test Dummy"
status_flags = GODMODE|CANPUSH
/mob/living/carbon/human/dummy/New(loc)
..()
if(!initialized)
args[1] = FALSE
Initialize(arglist(args))
/mob/living/carbon/human/New()
/mob/living/carbon/human/Initialize()
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
@@ -246,7 +250,7 @@
if(href_list["item"])
var/slot = text2num(href_list["item"])
if(slot in check_obscured_slots())
usr << "<span class='warning'>You can't reach that! Something is covering it.</span>"
to_chat(usr, "<span class='warning'>You can't reach that! Something is covering it.</span>")
return
if(href_list["pockets"])
@@ -258,10 +262,10 @@
var/delay_denominator = 1
if(pocket_item && !(pocket_item.flags&ABSTRACT))
if(pocket_item.flags & NODROP)
usr << "<span class='warning'>You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!</span>"
usr << "<span class='notice'>You try to empty [src]'s [pocket_side] pocket.</span>"
to_chat(usr, "<span class='warning'>You try to empty [src]'s [pocket_side] pocket, it seems to be stuck!</span>")
to_chat(usr, "<span class='notice'>You try to empty [src]'s [pocket_side] pocket.</span>")
else if(place_item && place_item.mob_can_equip(src, usr, pocket_id, 1) && !(place_item.flags&ABSTRACT))
usr << "<span class='notice'>You try to place [place_item] into [src]'s [pocket_side] pocket.</span>"
to_chat(usr, "<span class='notice'>You try to place [place_item] into [src]'s [pocket_side] pocket.</span>")
delay_denominator = 4
else
return
@@ -282,7 +286,7 @@
show_inv(usr)
else
// Display a warning if the user mocks up
src << "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>"
to_chat(src, "<span class='warning'>You feel your [pocket_side] pocket being fumbled with!</span>")
..()
@@ -332,12 +336,12 @@
return
if(href_list["evaluation"])
if(!getBruteLoss() && !getFireLoss() && !getOxyLoss() && getToxLoss() < 20)
usr << "<span class='notice'>No external injuries detected.</span><br>"
to_chat(usr, "<span class='notice'>No external injuries detected.</span><br>")
return
var/span = "notice"
var/status = ""
if(getBruteLoss())
usr << "<b>Physical trauma analysis:</b>"
to_chat(usr, "<b>Physical trauma analysis:</b>")
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
var/brutedamage = BP.brute_dam
@@ -351,9 +355,9 @@
status = "sustained major trauma!"
span = "userdanger"
if(brutedamage)
usr << "<span class='[span]'>[BP] appears to have [status]</span>"
to_chat(usr, "<span class='[span]'>[BP] appears to have [status]</span>")
if(getFireLoss())
usr << "<b>Analysis of skin burns:</b>"
to_chat(usr, "<b>Analysis of skin burns:</b>")
for(var/X in bodyparts)
var/obj/item/bodypart/BP = X
var/burndamage = BP.burn_dam
@@ -367,11 +371,11 @@
status = "major burns!"
span = "userdanger"
if(burndamage)
usr << "<span class='[span]'>[BP] appears to have [status]</span>"
to_chat(usr, "<span class='[span]'>[BP] appears to have [status]</span>")
if(getOxyLoss())
usr << "<span class='danger'>Patient has signs of suffocation, emergency treatment may be required!</span>"
to_chat(usr, "<span class='danger'>Patient has signs of suffocation, emergency treatment may be required!</span>")
if(getToxLoss() > 20)
usr << "<span class='danger'>Gathered data is inconsistent with the analysis, possible cause: poisoning.</span>"
to_chat(usr, "<span class='danger'>Gathered data is inconsistent with the analysis, possible cause: poisoning.</span>")
if(href_list["hud"] == "s")
if(istype(H.glasses, /obj/item/clothing/glasses/hud/security) || istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
@@ -390,7 +394,7 @@
if(!allowed_access)
H << "<span class='warning'>ERROR: Invalid Access</span>"
to_chat(H, "<span class='warning'>ERROR: Invalid Access</span>")
return
if(perpname)
@@ -413,20 +417,20 @@
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
return
usr << "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]"
usr << "<b>Minor Crimes:</b>"
to_chat(usr, "<b>Name:</b> [R.fields["name"]] <b>Criminal Status:</b> [R.fields["criminal"]]")
to_chat(usr, "<b>Minor Crimes:</b>")
for(var/datum/data/crime/c in R.fields["mi_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Major Crimes:</b>"
to_chat(usr, "<b>Crime:</b> [c.crimeName]")
to_chat(usr, "<b>Details:</b> [c.crimeDetails]")
to_chat(usr, "Added by [c.author] at [c.time]")
to_chat(usr, "----------")
to_chat(usr, "<b>Major Crimes:</b>")
for(var/datum/data/crime/c in R.fields["ma_crim"])
usr << "<b>Crime:</b> [c.crimeName]"
usr << "<b>Details:</b> [c.crimeDetails]"
usr << "Added by [c.author] at [c.time]"
usr << "----------"
usr << "<b>Notes:</b> [R.fields["notes"]]"
to_chat(usr, "<b>Crime:</b> [c.crimeName]")
to_chat(usr, "<b>Details:</b> [c.crimeDetails]")
to_chat(usr, "Added by [c.author] at [c.time]")
to_chat(usr, "----------")
to_chat(usr, "<b>Notes:</b> [R.fields["notes"]]")
return
if(href_list["add_crime"])
@@ -444,7 +448,7 @@
return
var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
data_core.addMinorCrime(R.fields["id"], crime)
usr << "<span class='notice'>Successfully added a minor crime.</span>"
to_chat(usr, "<span class='notice'>Successfully added a minor crime.</span>")
return
if("Major Crime")
if(R)
@@ -459,7 +463,7 @@
return
var/crime = data_core.createCrimeEntry(t1, t2, allowed_access, worldtime2text())
data_core.addMajorCrime(R.fields["id"], crime)
usr << "<span class='notice'>Successfully added a major crime.</span>"
to_chat(usr, "<span class='notice'>Successfully added a major crime.</span>")
return
if(href_list["view_comment"])
@@ -468,11 +472,11 @@
return
else if(!istype(H.glasses, /obj/item/clothing/glasses/hud/security) && !istype(H.getorganslot("eye_hud"), /obj/item/organ/cyberimp/eyes/hud/security))
return
usr << "<b>Comments/Log:</b>"
to_chat(usr, "<b>Comments/Log:</b>")
var/counter = 1
while(R.fields[text("com_[]", counter)])
usr << R.fields[text("com_[]", counter)]
usr << "----------"
to_chat(usr, R.fields[text("com_[]", counter)])
to_chat(usr, "----------")
counter++
return
@@ -490,9 +494,9 @@
while(R.fields[text("com_[]", counter)])
counter++
R.fields[text("com_[]", counter)] = text("Made by [] on [] [], []<BR>[]", allowed_access, worldtime2text(), time2text(world.realtime, "MMM DD"), year_integer+540, t1)
usr << "<span class='notice'>Successfully added comment.</span>"
to_chat(usr, "<span class='notice'>Successfully added comment.</span>")
return
usr << "<span class='warning'>Unable to locate a data core entry for this person.</span>"
to_chat(usr, "<span class='warning'>Unable to locate a data core entry for this person.</span>")
/mob/living/carbon/human/proc/canUseHUD()
return !(src.stat || src.weakened || src.stunned || src.restrained())
@@ -513,7 +517,7 @@
. = 0
if(!. && error_msg && user)
// Might need re-wording.
user << "<span class='alert'>There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].</span>"
to_chat(user, "<span class='alert'>There is no exposed flesh or thin material [above_neck(target_zone) ? "on [p_their()] head" : "on [p_their()] body"].</span>")
/mob/living/carbon/human/proc/check_obscured_slots()
var/list/obscured = list()
@@ -601,7 +605,7 @@
threatcount += 5
//Check for nonhuman scum
if(dna && dna.species.id && dna.species.id != "human" || "lizard" || "canine" || "felid" || "avian" || "shark" || "moth")
if(dna && dna.species.id && dna.species.id != "human" || "lizard" || "mammal" || "avian" || "aquatic" || "insect")
threatcount += 1
//mindshield implants imply trustworthyness
@@ -631,7 +635,7 @@
for(var/obj/item/hand in held_items)
if(prob(current_size * 5) && hand.w_class >= ((11-current_size)/2) && dropItemToGround(hand))
step_towards(hand, src)
src << "<span class='warning'>\The [S] pulls \the [hand] from your grip!</span>"
to_chat(src, "<span class='warning'>\The [S] pulls \the [hand] from your grip!</span>")
rad_act(current_size * 3)
if(mob_negates_gravity())
return
@@ -641,20 +645,20 @@
CHECK_DNA_AND_SPECIES(C)
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
src << "<span class='warning'>[C.name] is dead!</span>"
to_chat(src, "<span class='warning'>[C.name] is dead!</span>")
return
if(is_mouth_covered())
src << "<span class='warning'>Remove your mask first!</span>"
to_chat(src, "<span class='warning'>Remove your mask first!</span>")
return 0
if(C.is_mouth_covered())
src << "<span class='warning'>Remove [p_their()] mask first!</span>"
to_chat(src, "<span class='warning'>Remove [p_their()] mask first!</span>")
return 0
if(C.cpr_time < world.time + 30)
visible_message("<span class='notice'>[src] is trying to perform CPR on [C.name]!</span>", \
"<span class='notice'>You try to perform CPR on [C.name]... Hold still!</span>")
if(!do_mob(src, C))
src << "<span class='warning'>You fail to perform CPR on [C]!</span>"
to_chat(src, "<span class='warning'>You fail to perform CPR on [C]!</span>")
return 0
var/they_breathe = (!(NOBREATH in C.dna.species.species_traits))
@@ -671,13 +675,11 @@
var/suff = min(C.getOxyLoss(), 7)
C.adjustOxyLoss(-suff)
C.updatehealth()
C << "<span class='unconscious'>You feel a breath of fresh air enter your lungs... It feels good...</span>"
to_chat(C, "<span class='unconscious'>You feel a breath of fresh air enter your lungs... It feels good...</span>")
else if(they_breathe && !they_lung)
C << "<span class='unconscious'>You feel a breath of fresh air... \
but you don't feel any better...</span>"
to_chat(C, "<span class='unconscious'>You feel a breath of fresh air... but you don't feel any better...</span>")
else
C << "<span class='unconscious'>You feel a breath of fresh air... \
which is a sensation you don't recognise...</span>"
to_chat(C, "<span class='unconscious'>You feel a breath of fresh air... which is a sensation you don't recognise...</span>")
/mob/living/carbon/human/generateStaticOverlay()
var/image/staticOverlay = image(icon('icons/effects/effects.dmi', "static"), loc = src)
@@ -781,11 +783,11 @@
var/health_amount = health - staminaloss
if(..(health_amount)) //not dead
switch(hal_screwyhud)
if(1)
if(SCREWYHUD_CRIT)
hud_used.healths.icon_state = "health6"
if(2)
if(SCREWYHUD_DEAD)
hud_used.healths.icon_state = "health7"
if(5)
if(SCREWYHUD_HEALTHY)
hud_used.healths.icon_state = "health0"
if(hud_used.healthdoll)
hud_used.healthdoll.cut_overlays()
@@ -806,7 +808,7 @@
icon_num = 4
if(damage > (comparison*4))
icon_num = 5
if(hal_screwyhud == 5)
if(hal_screwyhud == SCREWYHUD_HEALTHY)
icon_num = 0
if(icon_num)
hud_used.healthdoll.add_overlay(image('icons/mob/screen_gen.dmi',"[BP.body_zone][icon_num]"))
@@ -898,14 +900,14 @@
.["Toggle Purrbation"] = "?_src_=vars;purrbation=\ref[src]"
/mob/living/carbon/human/MouseDrop_T(mob/living/target, mob/living/user)
if((target != pulling) || (grab_state < GRAB_AGGRESSIVE) || (user != target) || !isliving(target) || !isliving(user)) //Get consent first :^)
if((target != pulling) || (grab_state < GRAB_AGGRESSIVE) || (user != target) || !isliving(user) || stat || user.stat)//Get consent first :^)
. = ..()
return
buckle_mob(target, FALSE, TRUE, TRUE)
buckle_mob(target, TRUE, TRUE)
. = ..()
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE, yes = FALSE)
if(!yes)
/mob/living/carbon/human/buckle_mob(mob/living/M, force = FALSE, check_loc = TRUE)
if(!force)//humans are only meant to be ridden through piggybacking and special cases
return
if(!is_type_in_typecache(M, can_ride_typecache))
M.visible_message("<span class='warning'>[M] really can't seem to mount [src]...</span>")
@@ -925,9 +927,9 @@
. = ..(M, force, check_loc)
stop_pulling()
/mob/living/carbon/human/unbuckle_mob(mob/living/M)
/mob/living/carbon/human/unbuckle_mob(mob/living/M, force=FALSE)
if(iscarbon(M))
if(riding_datum)
riding_datum.unequip_buckle_inhands(M)
riding_datum.restore_position(M)
. = ..(M)
. = ..(M, force)
@@ -47,7 +47,7 @@
return number
/mob/living/carbon/human/get_ear_protection()
if((ears && (ears.flags & EARBANGPROTECT)) || (head && (head.flags & HEADBANGPROTECT)))
if((ears && HAS_SECONDARY_FLAG(ears, BANG_PROTECT)) || (head && HAS_SECONDARY_FLAG(head, BANG_PROTECT)))
return 1
/mob/living/carbon/human/on_hit(obj/item/projectile/P)
@@ -198,13 +198,15 @@
damage_clothes(15, BRUTE, "melee")
return 1
/mob/living/carbon/human/attack_hand(mob/living/carbon/human/M)
/mob/living/carbon/human/attack_hand(mob/user)
if(..()) //to allow surgery to return properly.
return
if(M.a_intent == INTENT_DISARM)
if(M.buckled_mobs && (src in M.buckled_mobs) && M.riding_datum)
M.riding_datum.force_dismount(src)
dna.species.spec_attack_hand(M, src)
if(ishuman(user))
var/mob/living/carbon/human/H = user
if(H.a_intent == INTENT_DISARM)
if(H.buckled_mobs && (src in H.buckled_mobs) && H.riding_datum)
H.riding_datum.force_dismount(src)
dna.species.spec_attack_hand(H, src)
/mob/living/carbon/human/attack_paw(mob/living/carbon/monkey/M)
@@ -401,7 +403,7 @@
damage_clothes(200 - bomb_armor, BRUTE, "bomb")
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(30, 120)
if (prob(70))
if (prob(max(70 - (bomb_armor * 0.5), 0)))
Paralyse(10)
if(3)
@@ -411,7 +413,7 @@
damage_clothes(max(50 - bomb_armor, 0), BRUTE, "bomb")
if (!istype(ears, /obj/item/clothing/ears/earmuffs))
adjustEarDamage(15,60)
if (prob(50))
if (prob(max(50 - (bomb_armor * 0.5), 0)))
Paralyse(8)
take_overall_damage(b_loss,f_loss)
@@ -466,7 +468,7 @@
var/obj/item/organ/heart/heart = getorganslot("heart")
heart.beating = TRUE
if(stat == CONSCIOUS)
src << "<span class='notice'>You feel your heart beating again!</span>"
to_chat(src, "<span class='notice'>You feel your heart beating again!</span>")
. = ..(shock_damage,source,siemens_coeff,safety,override,tesla_shock, illusion, stun)
if(.)
electrocution_animation(40)
@@ -477,7 +479,7 @@
for(var/obj/item/bodypart/L in src.bodyparts)
if(L.status == BODYPART_ROBOTIC)
if(!informed)
src << "<span class='userdanger'>You feel a sharp pain as your robotic limbs overload.</span>"
to_chat(src, "<span class='userdanger'>You feel a sharp pain as your robotic limbs overload.</span>")
informed = 1
switch(severity)
if(1)
@@ -511,7 +513,7 @@
update_inv_neck()
update_inv_head()
else
src << "<span class='notice'>Your [head_clothes.name] protects your head and face from the acid!</span>"
to_chat(src, "<span class='notice'>Your [head_clothes.name] protects your head and face from the acid!</span>")
else
. = get_bodypart("head")
if(.)
@@ -532,7 +534,7 @@
update_inv_w_uniform()
update_inv_wear_suit()
else
src << "<span class='notice'>Your [chest_clothes.name] protects your body from the acid!</span>"
to_chat(src, "<span class='notice'>Your [chest_clothes.name] protects your body from the acid!</span>")
else
. = get_bodypart("chest")
if(.)
@@ -564,7 +566,7 @@
update_inv_w_uniform()
update_inv_wear_suit()
else
src << "<span class='notice'>Your [arm_clothes.name] protects your arms and hands from the acid!</span>"
to_chat(src, "<span class='notice'>Your [arm_clothes.name] protects your arms and hands from the acid!</span>")
else
. = get_bodypart("r_arm")
if(.)
@@ -590,7 +592,7 @@
update_inv_w_uniform()
update_inv_wear_suit()
else
src << "<span class='notice'>Your [leg_clothes.name] protects your legs and feet from the acid!</span>"
to_chat(src, "<span class='notice'>Your [leg_clothes.name] protects your legs and feet from the acid!</span>")
else
. = get_bodypart("r_leg")
if(.)
@@ -679,21 +681,21 @@
status += "numb"
if(status == "")
status = "OK"
src << "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status]."
to_chat(src, "\t [status == "OK" ? "\blue" : "\red"] Your [LB.name] is [status].")
for(var/obj/item/I in LB.embedded_objects)
src << "\t <a href='byond://?src=\ref[src];embedded_object=\ref[I];embedded_limb=\ref[LB]'>\red There is \a [I] embedded in your [LB.name]!</a>"
to_chat(src, "\t <a href='byond://?src=\ref[src];embedded_object=\ref[I];embedded_limb=\ref[LB]'>\red There is \a [I] embedded in your [LB.name]!</a>")
for(var/t in missing)
src << "<span class='boldannounce'>Your [parse_zone(t)] is missing!</span>"
to_chat(src, "<span class='boldannounce'>Your [parse_zone(t)] is missing!</span>")
if(bleed_rate)
src << "<span class='danger'>You are bleeding!</span>"
to_chat(src, "<span class='danger'>You are bleeding!</span>")
if(staminaloss)
if(staminaloss > 30)
src << "<span class='info'>You're completely exhausted.</span>"
to_chat(src, "<span class='info'>You're completely exhausted.</span>")
else
src << "<span class='info'>You feel fatigued.</span>"
to_chat(src, "<span class='info'>You feel fatigued.</span>")
else
if(wear_suit)
wear_suit.add_fingerprint(M)
@@ -50,4 +50,4 @@ var/global/default_martial_art = new/datum/martial_art
var/datum/personal_crafting/handcrafting
can_buckle = TRUE
buckle_lying = FALSE
can_ride_typecache = list(/mob/living/carbon/human)
can_ride_typecache = list(/mob/living/carbon/human, /mob/living/simple_animal/slime)
@@ -139,14 +139,14 @@
if(G.trigger_guard == TRIGGER_GUARD_NORMAL)
if(src.dna.check_mutation(HULK))
src << "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>"
to_chat(src, "<span class='warning'>Your meaty finger is much too large for the trigger guard!</span>")
return 0
if(NOGUNS in src.dna.species.species_traits)
src << "<span class='warning'>Your fingers don't fit in the trigger guard!</span>"
to_chat(src, "<span class='warning'>Your fingers don't fit in the trigger guard!</span>")
return 0
if(martial_art && martial_art.no_guns) //great dishonor to famiry
src << "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>"
to_chat(src, "<span class='warning'>Use of ranged weaponry would bring dishonor to the clan.</span>")
return 0
return .
@@ -55,6 +55,7 @@
//End bloody footprints
S.step_action()
/mob/living/carbon/human/Moved()
. = ..()
if(buckled_mobs && buckled_mobs.len && riding_datum)
@@ -133,7 +133,7 @@
s_store = I
update_inv_s_store()
else
src << "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>"
to_chat(src, "<span class='danger'>You are trying to equip this item to an unsupported inventory slot. Report this to a coder!</span>")
//Item is handled and in slot, valid to call callback, for this proc should always be true
if(!not_handled)
+6 -5
View File
@@ -28,6 +28,7 @@
if (notransform)
return
//citadel code
if(stat != DEAD)
handle_arousal()
@@ -325,13 +326,13 @@
for(var/obj/item/I in BP.embedded_objects)
if(prob(I.embedded_pain_chance))
BP.receive_damage(I.w_class*I.embedded_pain_multiplier)
src << "<span class='userdanger'>\the [I] embedded in your [BP.name] hurts!</span>"
to_chat(src, "<span class='userdanger'>[I] embedded in your [BP.name] hurts!</span>")
if(prob(I.embedded_fall_chance))
BP.receive_damage(I.w_class*I.embedded_fall_pain_multiplier)
BP.embedded_objects -= I
I.loc = get_turf(src)
visible_message("<span class='danger'>\the [I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>\the [I] falls out of your [BP.name]!</span>")
visible_message("<span class='danger'>[I] falls out of [name]'s [BP.name]!</span>","<span class='userdanger'>[I] falls out of your [BP.name]!</span>")
if(!has_embedded_objects())
clear_alert("embeddedobject")
@@ -436,15 +437,15 @@ All effects don't start immediately, but rather get worse over time; the rate is
if(drunkenness >= 81)
adjustToxLoss(0.2)
if(prob(5) && !stat)
src << "<span class='warning'>Maybe you should lie down for a bit...</span>"
to_chat(src, "<span class='warning'>Maybe you should lie down for a bit...</span>")
if(drunkenness >= 91)
adjustBrainLoss(0.4)
if(prob(20) && !stat)
if(SSshuttle.emergency.mode == SHUTTLE_DOCKED && z == ZLEVEL_STATION) //QoL mainly
src << "<span class='warning'>You're so tired... but you can't miss that shuttle...</span>"
to_chat(src, "<span class='warning'>You're so tired... but you can't miss that shuttle...</span>")
else
src << "<span class='warning'>Just a quick nap...</span>"
to_chat(src, "<span class='warning'>Just a quick nap...</span>")
Sleeping(45)
if(drunkenness >= 101)
+92 -44
View File
@@ -61,6 +61,9 @@
//Flight and floating
var/override_float = 0
//Eyes
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
//Citadel snowflake
var/fixed_mut_color2 = ""
var/fixed_mut_color3 = ""
@@ -69,8 +72,6 @@
var/lang_spoken = HUMAN
var/lang_understood = HUMAN
//Eyes
var/obj/item/organ/eyes/mutanteyes = /obj/item/organ/eyes
///////////
// PROCS //
///////////
@@ -117,7 +118,7 @@
var/obj/item/organ/heart/heart = C.getorganslot("heart")
var/obj/item/organ/lungs/lungs = C.getorganslot("lungs")
var/obj/item/organ/appendix/appendix = C.getorganslot("appendix")
var/obj/item/organ/eyes/eyes = C.getorganslot("eyes")
var/obj/item/organ/eyes/eyes = C.getorganslot("eye_sight")
if((NOBLOOD in species_traits) && heart)
heart.Remove(C)
@@ -133,7 +134,7 @@
if(eyes)
qdel(eyes)
eyes = new mutanteyes
mutanteyes.Insert(C)
eyes.Insert(C)
if((!(NOBREATH in species_traits)) && !lungs)
if(mutantlungs)
@@ -176,22 +177,49 @@
return
var/datum/sprite_accessory/S
var/list/standing = list()
var/hair_hidden = 0
var/facialhair_hidden = 0
var/hair_hidden = FALSE //ignored if the matching dynamic_X_suffix is non-empty
var/facialhair_hidden = FALSE // ^
var/dynamic_hair_suffix = "" //if this is non-null, and hair+suffix matches an iconstate, then we render that hair instead
var/dynamic_fhair_suffix = ""
//we check if our hat or helmet hides our facial hair.
if(H.head)
var/obj/item/I = H.head
if(istype(I, /obj/item/clothing))
var/obj/item/clothing/C = I
dynamic_fhair_suffix = C.dynamic_fhair_suffix
if(I.flags_inv & HIDEFACIALHAIR)
facialhair_hidden = 1
facialhair_hidden = TRUE
if(H.wear_mask)
var/obj/item/clothing/mask/M = H.wear_mask
dynamic_fhair_suffix = M.dynamic_fhair_suffix //mask > head in terms of facial hair
if(M.flags_inv & HIDEFACIALHAIR)
facialhair_hidden = 1
facialhair_hidden = TRUE
if(H.facial_hair_style && (FACEHAIR in species_traits) && !facialhair_hidden)
if(H.facial_hair_style && (FACEHAIR in species_traits) && (!facialhair_hidden || dynamic_fhair_suffix))
S = facial_hair_styles_list[H.facial_hair_style]
if(S)
var/image/img_facial = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER)
//List of all valid dynamic_fhair_suffixes
var/static/list/fextensions
if(!fextensions)
var/icon/fhair_extensions = icon('icons/mob/facialhair_extensions.dmi')
fextensions = list()
for(var/s in fhair_extensions.IconStates(1))
fextensions[s] = TRUE
qdel(fhair_extensions)
//Is hair+dynamic_fhair_suffix a valid iconstate?
var/fhair_state = S.icon_state
var/fhair_file = S.icon
if(fextensions[fhair_state+dynamic_fhair_suffix])
fhair_state += dynamic_fhair_suffix
fhair_file = 'icons/mob/facialhair_extensions.dmi'
var/image/img_facial = image("icon" = fhair_file, "icon_state" = fhair_state, "layer" = -HAIR_LAYER)
if(!forced_colour)
if(hair_color)
@@ -208,24 +236,47 @@
standing += img_facial
//we check if our hat or helmet hides our hair.
if(H.head)
var/obj/item/I = H.head
if(istype(I, /obj/item/clothing))
var/obj/item/clothing/C = I
dynamic_hair_suffix = C.dynamic_hair_suffix
if(I.flags_inv & HIDEHAIR)
hair_hidden = 1
hair_hidden = TRUE
if(H.wear_mask)
var/obj/item/clothing/mask/M = H.wear_mask
if(!dynamic_hair_suffix) //head > mask in terms of head hair
dynamic_hair_suffix = M.dynamic_hair_suffix
if(M.flags_inv & HIDEHAIR)
hair_hidden = 1
if(!hair_hidden)
if(!H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
hair_hidden = TRUE
if(!hair_hidden || dynamic_hair_suffix)
if(!hair_hidden && !H.getorgan(/obj/item/organ/brain)) //Applies the debrained overlay if there is no brain
if(!(NOBLOOD in species_traits))
standing += image("icon"='icons/mob/human_face.dmi', "icon_state" = "debrained", "layer" = -HAIR_LAYER)
else if(H.hair_style && (HAIR in species_traits))
S = hair_styles_list[H.hair_style]
if(S)
var/image/img_hair = image("icon" = S.icon, "icon_state" = "[S.icon_state]", "layer" = -HAIR_LAYER)
//List of all valid dynamic_hair_suffixes
var/static/list/extensions
if(!extensions)
var/icon/hair_extensions = icon('icons/mob/hair_extensions.dmi') //hehe
extensions = list()
for(var/s in hair_extensions.IconStates(1))
extensions[s] = TRUE
qdel(hair_extensions)
//Is hair+dynamic_hair_suffix a valid iconstate?
var/hair_state = S.icon_state
var/hair_file = S.icon
if(extensions[hair_state+dynamic_hair_suffix])
hair_state += dynamic_hair_suffix
hair_file = 'icons/mob/hair_extensions.dmi'
var/image/img_hair = image("icon" = hair_file, "icon_state" = hair_state, "layer" = -HAIR_LAYER)
if(!forced_colour)
if(hair_color)
@@ -317,22 +368,22 @@
var/obj/item/bodypart/head/HD = H.get_bodypart("head")
if("tail_lizard" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || !H.dna.features["taur"] == "None")
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (!H.dna.features["taur"] == "None"))
bodyparts_to_add -= "tail_lizard"
if("waggingtail_lizard" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || !H.dna.features["taur"] == "None")
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (!H.dna.features["taur"] == "None"))
bodyparts_to_add -= "waggingtail_lizard"
else if ("tail_lizard" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail_lizard"
if("tail_human" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || !H.dna.features["taur"] == "None")
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (!H.dna.features["taur"] == "None"))
bodyparts_to_add -= "tail_human"
if("waggingtail_human" in mutant_bodyparts)
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || !H.dna.features["taur"] == "None")
if(H.wear_suit && (H.wear_suit.flags_inv & HIDEJUMPSUIT) || (!H.dna.features["taur"] == "None"))
bodyparts_to_add -= "waggingtail_human"
else if ("tail_human" in mutant_bodyparts)
bodyparts_to_add -= "waggingtail_human"
@@ -497,7 +548,6 @@
S = /datum/sprite_accessory/slimecoon_ears
if("slimecoonsnout")
S = /datum/sprite_accessory/slimecoon_snout*/
if(!S || S.icon_state == "none")
continue
@@ -568,7 +618,6 @@
I = center_image(I,S.dimension_x,S.dimension_y)
standing += I
if(S.extra) //apply the extra overlay, if there is one
if(S.gender_specific)
icon_string = "[g]_[bodypart]_extra_[S.icon_state]_[layertext]"
@@ -733,7 +782,7 @@
return 0
if(DIGITIGRADE in species_traits)
if(!disable_warning)
H << "<span class='warning'>The footwear around here isn't compatible with your feet!</span>"
to_chat(H, "<span class='warning'>The footwear around here isn't compatible with your feet!</span>")
return 0
return 1
if(slot_belt)
@@ -741,7 +790,7 @@
return 0
if(!H.w_uniform && !nojumpsuit)
if(!disable_warning)
H << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
return 0
if( !(I.slot_flags & SLOT_BELT) )
return
@@ -781,7 +830,7 @@
return 0
if(!H.w_uniform && !nojumpsuit)
if(!disable_warning)
H << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
return 0
if( !(I.slot_flags & SLOT_ID) )
return 0
@@ -793,7 +842,7 @@
return 0
if(!H.w_uniform && !nojumpsuit)
if(!disable_warning)
H << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return
@@ -806,7 +855,7 @@
return 0
if(!H.w_uniform && !nojumpsuit)
if(!disable_warning)
H << "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>"
to_chat(H, "<span class='warning'>You need a jumpsuit before you can attach this [I.name]!</span>")
return 0
if(I.slot_flags & SLOT_DENYPOCKET)
return 0
@@ -820,15 +869,15 @@
return 0
if(!H.wear_suit)
if(!disable_warning)
H << "<span class='warning'>You need a suit before you can attach this [I.name]!</span>"
to_chat(H, "<span class='warning'>You need a suit before you can attach this [I.name]!</span>")
return 0
if(!H.wear_suit.allowed)
if(!disable_warning)
H << "You somehow have a suit with no defined allowed items for suit storage, stop that."
to_chat(H, "You somehow have a suit with no defined allowed items for suit storage, stop that.")
return 0
if(I.w_class > WEIGHT_CLASS_BULKY)
if(!disable_warning)
H << "The [I.name] is too big to attach." //should be src?
to_chat(H, "The [I.name] is too big to attach.") //should be src?
return 0
if( istype(I, /obj/item/device/pda) || istype(I, /obj/item/weapon/pen) || is_type_in_list(I, H.wear_suit.allowed) )
return 1
@@ -889,13 +938,13 @@
//The fucking FAT mutation is the dumbest shit ever. It makes the code so difficult to work with
if(H.disabilities & FAT)
if(H.overeatduration < 100)
H << "<span class='notice'>You feel fit again!</span>"
to_chat(H, "<span class='notice'>You feel fit again!</span>")
H.disabilities &= ~FAT
H.update_inv_w_uniform()
H.update_inv_wear_suit()
else
if(H.overeatduration > 500)
H << "<span class='danger'>You suddenly feel blubbery!</span>"
to_chat(H, "<span class='danger'>You suddenly feel blubbery!</span>")
H.disabilities |= FAT
H.update_inv_w_uniform()
H.update_inv_wear_suit()
@@ -927,15 +976,15 @@
H.metabolism_efficiency = 1
else if(H.nutrition > NUTRITION_LEVEL_FED && H.satiety > 80)
if(H.metabolism_efficiency != 1.25 && (H.dna && H.dna.species && !(NOHUNGER in H.dna.species.species_traits)))
H << "<span class='notice'>You feel vigorous.</span>"
to_chat(H, "<span class='notice'>You feel vigorous.</span>")
H.metabolism_efficiency = 1.25
else if(H.nutrition < NUTRITION_LEVEL_STARVING + 50)
if(H.metabolism_efficiency != 0.8)
H << "<span class='notice'>You feel sluggish.</span>"
to_chat(H, "<span class='notice'>You feel sluggish.</span>")
H.metabolism_efficiency = 0.8
else
if(H.metabolism_efficiency == 1.25)
H << "<span class='notice'>You no longer feel vigorous.</span>"
to_chat(H, "<span class='notice'>You no longer feel vigorous.</span>")
H.metabolism_efficiency = 1
switch(H.nutrition)
@@ -959,24 +1008,23 @@
if(!H.weakened)
H.emote("collapse")
H.Weaken(10)
H << "<span class='danger'>You feel weak.</span>"
to_chat(H, "<span class='danger'>You feel weak.</span>")
switch(H.radiation)
if(50 to 75)
if(prob(5))
if(!H.weakened)
H.emote("collapse")
H.Weaken(3)
H << "<span class='danger'>You feel weak.</span>"
to_chat(H, "<span class='danger'>You feel weak.</span>")
if(prob(15))
if(!( H.hair_style == "Shaved") || !(H.hair_style == "Bald") || (HAIR in species_traits))
H << "<span class='danger'>Your hair starts to \
fall out in clumps...<span>"
to_chat(H, "<span class='danger'>Your hair starts to fall out in clumps...<span>")
addtimer(CALLBACK(src, .proc/go_bald, H), 50)
if(75 to 100)
if(prob(1))
H << "<span class='danger'>You mutate!</span>"
to_chat(H, "<span class='danger'>You mutate!</span>")
H.randmutb()
H.emote("gasp")
H.domutcheck()
@@ -1044,7 +1092,7 @@
if(H.back)
. += H.back.slowdown
for(var/obj/item/I in H.held_items)
if(I.flags & HANDSLOW)
if(HAS_SECONDARY_FLAG(I, SLOWS_WHILE_IN_HAND))
. += I.slowdown
var/health_deficiency = (100 - H.health + H.staminaloss)
var/hungry = (500 - H.nutrition) / 5 // So overeat would be 100 and default level would be 80
@@ -1082,9 +1130,9 @@
if(we_breathe && we_lung)
user.do_cpr(target)
else if(we_breathe && !we_lung)
user << "<span class='warning'>You have no lungs to breathe with, so you cannot peform CPR.</span>"
to_chat(user, "<span class='warning'>You have no lungs to breathe with, so you cannot peform CPR.</span>")
else
user << "<span class='notice'>You do not breathe, so you cannot perform CPR.</span>"
to_chat(user, "<span class='notice'>You do not breathe, so you cannot perform CPR.</span>")
/datum/species/proc/grab(mob/living/carbon/human/user, mob/living/carbon/human/target, datum/martial_art/attacker_style)
if(target.check_block())
@@ -1192,7 +1240,7 @@
if(randn <= 60)
//BubbleWrap: Disarming breaks a pull
if(target.pulling)
target << "<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>"
to_chat(target, "<span class='warning'>[user] has broken [target]'s grip on [target.pulling]!</span>")
talked = 1
target.stop_pulling()
//End BubbleWrap
@@ -50,7 +50,7 @@
if(H.stat || H.stunned || H.weakened)
return 0
if(H.wear_suit && ((H.wear_suit.flags_inv & HIDEJUMPSUIT) && (!H.wear_suit.species_exception || !is_type_in_list(src, H.wear_suit.species_exception)))) //Jumpsuits have tail holes, so it makes sense they have wing holes too
H << "Your suit blocks your wings from extending!"
to_chat(H, "Your suit blocks your wings from extending!")
return 0
var/turf/T = get_turf(H)
if(!T)
@@ -58,7 +58,7 @@
var/datum/gas_mixture/environment = T.return_air()
if(environment && !(environment.return_pressure() > 30))
H << "<span class='warning'>The atmosphere is too thin for you to fly!</span>"
to_chat(H, "<span class='warning'>The atmosphere is too thin for you to fly!</span>")
return 0
else
return 1
@@ -73,11 +73,11 @@
var/datum/species/angel/A = H.dna.species
if(A.CanFly(H))
if(H.movement_type & FLYING)
H << "<span class='notice'>You settle gently back onto the ground...</span>"
to_chat(H, "<span class='notice'>You settle gently back onto the ground...</span>")
A.ToggleFlight(H,0)
H.update_canmove()
else
H << "<span class='notice'>You beat your wings and begin to hover gently above the ground...</span>"
to_chat(H, "<span class='notice'>You beat your wings and begin to hover gently above the ground...</span>")
H.resting = 0
A.ToggleFlight(H,1)
H.update_canmove()
@@ -87,7 +87,7 @@
if(H.buckled)
buckled_obj = H.buckled
H << "<span class='notice'>Your wings spazz out and launch you!</span>"
to_chat(H, "<span class='notice'>Your wings spazz out and launch you!</span>")
playsound(H.loc, 'sound/misc/slip.ogg', 50, 1, -3)
@@ -32,7 +32,7 @@
var/datum/species/golem/golem_type = pick(golem_types)
var/mob/living/carbon/human/H = C
H.set_species(golem_type)
H << "[initial(golem_type.info_text)]"
to_chat(H, "[initial(golem_type.info_text)]")
/datum/species/golem/adamantine
name = "Adamantine Golem"
@@ -183,11 +183,11 @@
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(10,T.get_lumcount()) - 5
H.nutrition += light_amount
light_amount = min(1,T.get_lumcount()) - 0.5
H.nutrition += light_amount * 10
if(H.nutrition > NUTRITION_LEVEL_FULL)
H.nutrition = NUTRITION_LEVEL_FULL
if(light_amount > 2) //if there's enough light, heal
if(light_amount > 0.2) //if there's enough light, heal
H.heal_overall_damage(1,1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
@@ -444,4 +444,48 @@
playsound(get_turf(H), 'sound/misc/sadtrombone.ogg', 70, 0)
/datum/species/golem/bananium/get_spans()
return list(SPAN_CLOWN)
return list(SPAN_CLOWN)
/datum/species/golem/runic
name = "Runic Golem"
id = "runic"
limbs_id = "cultgolem"
sexes = FALSE
info_text = "As a <span class='danger'>Runic Golem</span>, you possess eldritch powers granted by the Elder God Nar'Sie."
species_traits = list(NOBREATH,RESISTHOT,RESISTCOLD,RESISTPRESSURE,NOFIRE,NOGUNS,NOBLOOD,RADIMMUNE,VIRUSIMMUNE,PIERCEIMMUNE,NODISMEMBER) //no mutcolors
var/obj/effect/proc_holder/spell/targeted/ethereal_jaunt/shift/golem/phase_shift
var/obj/effect/proc_holder/spell/targeted/abyssal_gaze/abyssal_gaze
var/obj/effect/proc_holder/spell/targeted/dominate/dominate
/datum/species/golem/runic/on_species_gain(mob/living/carbon/C, datum/species/old_species)
. = ..()
C.faction |= "cult"
phase_shift = new
C.AddSpell(phase_shift)
abyssal_gaze = new
C.AddSpell(abyssal_gaze)
dominate = new
C.AddSpell(dominate)
/datum/species/golem/runic/on_species_loss(mob/living/carbon/C)
. = ..()
C.faction -= "cult"
if(phase_shift)
C.RemoveSpell(phase_shift)
if(abyssal_gaze)
C.RemoveSpell(abyssal_gaze)
if(dominate)
C.RemoveSpell(dominate)
/datum/species/golem/runic/handle_chemicals(datum/reagent/chem, mob/living/carbon/human/H)
if(chem.id == "holywater")
H.adjustFireLoss(4)
H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
if(chem.id == "unholywater")
H.adjustBruteLoss(-4)
H.adjustFireLoss(-4)
H.reagents.remove_reagent(chem.id, REAGENTS_METABOLISM)
@@ -26,7 +26,7 @@
if(!H.blood_volume)
H.blood_volume += 5
H.adjustBruteLoss(5)
H << "<span class='danger'>You feel empty!</span>"
to_chat(H, "<span class='danger'>You feel empty!</span>")
if(H.blood_volume < BLOOD_VOLUME_NORMAL)
if(H.nutrition >= NUTRITION_LEVEL_STARVING)
@@ -34,7 +34,7 @@
H.nutrition -= 2.5
if(H.blood_volume < BLOOD_VOLUME_OKAY)
if(prob(5))
H << "<span class='danger'>You feel drained!</span>"
to_chat(H, "<span class='danger'>You feel drained!</span>")
if(H.blood_volume < BLOOD_VOLUME_BAD)
Cannibalize_Body(H)
H.update_action_buttons_icon()
@@ -49,7 +49,7 @@
limbs_to_consume -= list("r_arm", "l_arm")
consumed_limb = H.get_bodypart(pick(limbs_to_consume))
consumed_limb.drop_limb()
H << "<span class='userdanger'>Your [consumed_limb] is drawn back into your body, unable to maintain its shape!</span>"
to_chat(H, "<span class='userdanger'>Your [consumed_limb] is drawn back into your body, unable to maintain its shape!</span>")
qdel(consumed_limb)
H.blood_volume += 20
@@ -73,13 +73,13 @@
var/mob/living/carbon/human/H = owner
var/list/limbs_to_heal = H.get_missing_limbs()
if(limbs_to_heal.len < 1)
H << "<span class='notice'>You feel intact enough as it is.</span>"
to_chat(H, "<span class='notice'>You feel intact enough as it is.</span>")
return
H << "<span class='notice'>You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...</span>"
to_chat(H, "<span class='notice'>You focus intently on your missing [limbs_to_heal.len >= 2 ? "limbs" : "limb"]...</span>")
if(H.blood_volume >= 40*limbs_to_heal.len+BLOOD_VOLUME_OKAY)
H.regenerate_limbs()
H.blood_volume -= 40*limbs_to_heal.len
H << "<span class='notice'>...and after a moment you finish reforming!</span>"
to_chat(H, "<span class='notice'>...and after a moment you finish reforming!</span>")
return
else if(H.blood_volume >= 40)//We can partially heal some limbs
while(H.blood_volume >= BLOOD_VOLUME_OKAY+40)
@@ -87,9 +87,9 @@
H.regenerate_limb(healed_limb)
limbs_to_heal -= healed_limb
H.blood_volume -= 40
H << "<span class='warning'>...but there is not enough of you to fix everything! You must attain more mass to heal completely!</span>"
to_chat(H, "<span class='warning'>...but there is not enough of you to fix everything! You must attain more mass to heal completely!</span>")
return
H << "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to heal!</span>"
to_chat(H, "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to heal!</span>")
////////////////////////////////////////////////////////SLIME PEOPLE///////////////////////////////////////////////////////////////////
@@ -128,8 +128,8 @@
/* slime_split = new
slime_split.Grant(C)
swap_body = new
swap_body.Grant(C)
*/
swap_body.Grant(C) */
if(!bodies || !bodies.len)
bodies = list(C)
else
@@ -140,7 +140,7 @@
/datum/species/jelly/slime/spec_life(mob/living/carbon/human/H)
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
if(prob(5))
H << "<span class='notice'>You feel very bloated!</span>"
to_chat(H, "<span class='notice'>You feel very bloated!</span>")
else if(H.nutrition >= NUTRITION_LEVEL_WELL_FED)
H.blood_volume += 3
H.nutrition -= 2.5
@@ -176,11 +176,9 @@
if(H.blood_volume >= BLOOD_VOLUME_SLIME_SPLIT)
make_dupe()
else
H << "<span class='warning'>...but there is not enough of you to \
go around! You must attain more mass to split!</span>"
to_chat(H, "<span class='warning'>...but there is not enough of you to go around! You must attain more mass to split!</span>")
else
H << "<span class='warning'>...but fail to stand perfectly still!\
</span>"
to_chat(H, "<span class='warning'>...but fail to stand perfectly still!</span>")
H.notransform = FALSE
@@ -223,7 +221,7 @@
/datum/action/innate/swap_body/Activate()
if(!isslimeperson(owner))
owner << "<span class='warning'>You are not a slimeperson.</span>"
to_chat(owner, "<span class='warning'>You are not a slimeperson.</span>")
Remove(owner)
else
ui_interact(owner)
@@ -27,11 +27,11 @@
var/light_amount = 0 //how much light there is in the place, affects receiving nutrition and healing
if(isturf(H.loc)) //else, there's considered to be no light
var/turf/T = H.loc
light_amount = min(10,T.get_lumcount()) - 5
H.nutrition += light_amount
light_amount = min(1,T.get_lumcount()) - 0.5
H.nutrition += light_amount * 10
if(H.nutrition > NUTRITION_LEVEL_FULL)
H.nutrition = NUTRITION_LEVEL_FULL
if(light_amount > 2) //if there's enough light, heal
if(light_amount > 0.2) //if there's enough light, heal
H.heal_overall_damage(1,1)
H.adjustToxLoss(-1)
H.adjustOxyLoss(-1)
@@ -61,4 +61,4 @@
H.adjustFireLoss(rand(5,15))
H.show_message("<span class='userdanger'>The radiation beam singes you!</span>")
if(/obj/item/projectile/energy/florayield)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
H.nutrition = min(H.nutrition+30, NUTRITION_LEVEL_FULL)
@@ -17,7 +17,7 @@
var/turf/T = H.loc
light_amount = T.get_lumcount()
if(light_amount > 2) //if there's enough light, start dying
if(light_amount > 0.2) //if there's enough light, start dying
H.take_overall_damage(1,1)
else if (light_amount < 2) //heal in the dark
H.heal_overall_damage(1,1)
else if (light_amount < 0.2) //heal in the dark
H.heal_overall_damage(1,1)
@@ -6,7 +6,11 @@
/mob/living/carbon/human/Weaken(amount, updating = 1, ignore_canstun = 0)
amount = dna.species.spec_stun(src,amount)
return ..()
/mob/living/carbon/human/Paralyse(amount, updating = 1, ignore_canstun = 0)
amount = dna.species.spec_stun(src,amount)
return ..()
/mob/living/carbon/human/cure_husk()
. = ..()
if(.)
@@ -15,4 +19,4 @@
/mob/living/carbon/human/become_husk()
. = ..()
if(.)
update_hair()
update_hair()
@@ -71,6 +71,7 @@ There are several things that need to be remembered:
/mob/living/carbon/human/regenerate_icons()
if(!..())
icon_render_key = null //invalidate bodyparts cache
update_body()
update_hair()
update_inv_w_uniform()
@@ -265,10 +266,10 @@ There are several things that need to be remembered:
if(hud_used.inventory_shown) //if the inventory is open
client.screen += shoes //add it to client's screen
update_observer_view(shoes,1)
var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
if("taur" in dna.species.mutant_bodyparts)
switch(dna.features["taur"])
if(!"Naga" || "None")
var/image/standing = shoes.build_worn_icon(state = shoes.icon_state, default_layer = SHOES_LAYER, default_icon_file = 'icons/mob/feet.dmi')
overlays_standing[SHOES_LAYER] = standing
apply_overlay(SHOES_LAYER)
@@ -5,7 +5,7 @@
return
if(say_disabled) //This is here to try to identify lag problems
usr << "<span class='danger'>Speech is currently admin-disabled.</span>"
to_chat(usr, "<span class='danger'>Speech is currently admin-disabled.</span>")
return
if(stat == DEAD)
@@ -21,7 +21,7 @@
if (src.client)
if (src.client.prefs.muted & MUTE_IC)
src << "<span class='danger'>You cannot whisper (muted).</span>"
to_chat(src, "<span class='danger'>You cannot whisper (muted).</span>")
return
log_whisper("[src.name]/[src.key] : [message]")
@@ -29,7 +29,7 @@
if(!weakened)
emote("collapse")
Weaken(10)
src << "<span class='danger'>You feel weak.</span>"
to_chat(src, "<span class='danger'>You feel weak.</span>")
switch(radiation)
@@ -38,11 +38,11 @@
if(!weakened)
emote("collapse")
Weaken(3)
src << "<span class='danger'>You feel weak.</span>"
to_chat(src, "<span class='danger'>You feel weak.</span>")
if(75 to 100)
if(prob(1))
src << "<span class='danger'>You mutate!</span>"
to_chat(src, "<span class='danger'>You mutate!</span>")
randmutb()
emote("gasp")
domutcheck()
@@ -19,7 +19,7 @@
/mob/living/carbon/monkey/New()
/mob/living/carbon/monkey/Initialize()
verbs += /mob/living/proc/mob_sleep
verbs += /mob/living/proc/lay_down
@@ -167,13 +167,13 @@
if(!(wear_mask.resistance_flags & UNACIDABLE))
wear_mask.acid_act(acidpwr)
else
src << "<span class='warning'>Your mask protects you from the acid.</span>"
to_chat(src, "<span class='warning'>Your mask protects you from the acid.</span>")
return
if(head)
if(!(head.resistance_flags & UNACIDABLE))
head.acid_act(acidpwr)
else
src << "<span class='warning'>Your hat protects you from the acid.</span>"
to_chat(src, "<span class='warning'>Your hat protects you from the acid.</span>")
return
take_bodypart_damage(acidpwr * min(0.6, acid_volume*0.1))
@@ -9,7 +9,7 @@
var/list/pet_monkey_names = list("Pun Pun", "Bubbles", "Mojo", "George", "Darwin", "Aldo", "Caeser", "Kanzi", "Kong", "Terk", "Grodd", "Mala", "Bojangles", "Coco", "Able", "Baker", "Scatter", "Norbit", "Travis")
var/list/rare_pet_monkey_names = list("Professor Bobo", "Deempisi's Revenge", "Furious George", "King Louie", "Dr. Zaius", "Jimmy Rustles", "Dinner", "Lanky")
/mob/living/carbon/monkey/punpun/New()
/mob/living/carbon/monkey/punpun/Initialize()
Read_Memory()
if(ancestor_name)
name = ancestor_name