Merge upstream

This commit is contained in:
Cyberboss
2017-03-30 19:18:59 -04:00
102 changed files with 8157 additions and 382 deletions
+1 -1
View File
@@ -805,7 +805,7 @@ This is the proc mobs get to turn into a ghost. Forked from ghostize due to comp
if(mob_eye.hud_used)
LAZYINITLIST(mob_eye.observers)
mob_eye.observers |= src
mob_eye.hud_used.show_hud(1,src)
mob_eye.hud_used.show_hud(mob_eye.hud_used.hud_version, src)
observetarget = mob_eye
/mob/dead/observer/verb/register_pai_candidate()
+1 -1
View File
@@ -20,7 +20,7 @@
/datum/emote/brain/flash
key = "flash"
message = "lights' blink."
message = "blinks their lights."
/datum/emote/brain/notice
key = "notice"
@@ -74,7 +74,8 @@ In all, this is a lot like the monkey code. /N
/mob/living/carbon/alien/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
switch(M.melee_damage_type)
if(BRUTE)
@@ -89,7 +90,6 @@ In all, this is a lot like the monkey code. /N
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
/mob/living/carbon/alien/attack_slime(mob/living/simple_animal/slime/M)
if(..()) //successful slime attack
@@ -302,13 +302,14 @@
/mob/living/carbon/human/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(check_shields(damage, "the [M.name]", null, MELEE_ATTACK, M.armour_penetration))
return 0
return FALSE
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
if(!dam_zone) //Dismemberment successful
return 1
return TRUE
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
@@ -138,11 +138,12 @@
/mob/living/carbon/monkey/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
var/dam_zone = dismembering_strike(M, pick("chest", "l_hand", "r_hand", "l_leg", "r_leg"))
if(!dam_zone) //Dismemberment successful
return 1
return TRUE
var/obj/item/bodypart/affecting = get_bodypart(ran_zone(dam_zone))
if(!affecting)
affecting = get_bodypart("chest")
@@ -24,7 +24,8 @@
"<span class='userdanger'>[M] took a swipe at [src]!</span>")
/mob/living/silicon/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
if(prob(damage))
for(var/mob/living/N in buckled_mobs)
@@ -44,7 +45,6 @@
adjustCloneLoss(damage)
if(STAMINA)
adjustStaminaLoss(damage)
updatehealth()
/mob/living/silicon/attack_paw(mob/living/user)
return attack_hand(user)
@@ -60,25 +60,25 @@
return 1
/mob/living/simple_animal/attack_larva(mob/living/carbon/alien/larva/L)
if(..() && stat != DEAD) //successful larva bite
. = ..()
if(. && stat != DEAD) //successful larva bite
var/damage = rand(5, 10)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
attack_threshold_check(damage)
return 1
. = attack_threshold_check(damage)
if(.)
L.amount_grown = min(L.amount_grown + damage, L.max_grown)
/mob/living/simple_animal/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
var/damage = rand(M.melee_damage_lower, M.melee_damage_upper)
attack_threshold_check(damage, M.melee_damage_type)
return 1
return attack_threshold_check(damage, M.melee_damage_type)
/mob/living/simple_animal/attack_slime(mob/living/simple_animal/slime/M)
if(..()) //successful slime attack
var/damage = rand(15, 25)
if(M.is_adult)
damage = rand(20, 35)
attack_threshold_check(damage)
return 1
return attack_threshold_check(damage)
/mob/living/simple_animal/proc/attack_threshold_check(damage, damagetype = BRUTE, armorcheck = "melee")
var/temp_damage = damage
@@ -89,8 +89,10 @@
if(temp_damage >= 0 && temp_damage <= force_threshold)
visible_message("<span class='warning'>[src] looks unharmed.</span>")
return FALSE
else
apply_damage(damage, damagetype, null, getarmor(null, armorcheck))
return TRUE
/mob/living/simple_animal/bullet_act(obj/item/projectile/Proj)
if(!Proj)
@@ -338,7 +338,7 @@
/mob/living/simple_animal/bot/medbot/proc/assess_patient(mob/living/carbon/C)
//Time to see if they need medical help!
if(C.stat == 2)
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
return 0 //welp too late for them!
if(C.suiciding)
@@ -404,7 +404,7 @@
soft_reset()
return
if(C.stat == 2)
if(C.stat == DEAD || (C.status_flags & FAKEDEATH))
var/list/messagevoice = list("No! Stay with me!" = 'sound/voice/mno.ogg',"Live, damnit! LIVE!" = 'sound/voice/mlive.ogg',"I...I've never lost a patient before. Not today, I mean." = 'sound/voice/mlost.ogg')
var/message = pick(messagevoice)
speak(message)
@@ -74,7 +74,7 @@
else
to_chat(M, "<span class='cult'>You cannot repair your own dents, as you have none!</span>")
else if(src != M)
..()
return ..()
/mob/living/simple_animal/hostile/construct/Process_Spacemove(movement_dir = 0)
return 1
@@ -36,5 +36,6 @@
qdel(target) //Nom
target = null
adjustBruteLoss(-2)
return TRUE
else
..()
return ..()
@@ -183,12 +183,11 @@ var/global/list/parasites = list() //all currently existing/living guardians
return 0
/mob/living/simple_animal/hostile/guardian/AttackingTarget()
if(src.loc == summoner)
if(loc == summoner)
to_chat(src, "<span class='danger'><B>You must be manifested to attack!</span></B>")
return 0
return FALSE
else
..()
return 1
return ..()
/mob/living/simple_animal/hostile/guardian/death()
drop_all_held_items()
@@ -33,7 +33,8 @@
stat(null, "Stealth Cooldown Remaining: [max(round((stealthcooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/assassin/AttackingTarget()
if(..())
. = ..()
if(.)
if(toggle && (isliving(target) || istype(target, /obj/structure/window) || istype(target, /obj/structure/grille)))
ToggleMode(1)
@@ -17,19 +17,18 @@
stat(null, "Bomb Cooldown Remaining: [max(round((bomb_cooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/bomb/AttackingTarget()
if(..())
if(prob(40))
if(isliving(target))
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
L.apply_damage(15, BRUTE)
new /obj/effect/overlay/temp/explosion(get_turf(M))
. = ..()
if(. && prob(40) && isliving(target))
var/mob/living/M = target
if(!M.anchored && M != summoner && !hasmatchingsummoner(M))
new /obj/effect/overlay/temp/guardian/phase/out(get_turf(M))
do_teleport(M, M, 10)
for(var/mob/living/L in range(1, M))
if(hasmatchingsummoner(L)) //if the summoner matches don't hurt them
continue
if(L != src && L != summoner)
L.apply_damage(15, BRUTE)
new /obj/effect/overlay/temp/explosion(get_turf(M))
/mob/living/simple_animal/hostile/guardian/bomb/AltClickOn(atom/movable/A)
if(!istype(A))
@@ -19,9 +19,9 @@
summoner.adjust_fire_stacks(-20)
/mob/living/simple_animal/hostile/guardian/fire/AttackingTarget()
if(..())
if(ishuman(target) && target != summoner)
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
. = ..()
if(. && ishuman(target) && target != summoner)
new /obj/effect/hallucination/delusion(target.loc,target,force_kind="custom",duration=200,skip_nearby=0, custom_icon = src.icon_state, custom_icon_file = src.icon)
/mob/living/simple_animal/hostile/guardian/fire/Crossed(AM as mob|obj)
..()
@@ -20,18 +20,18 @@
var/successfulshocks = 0
/mob/living/simple_animal/hostile/guardian/beam/AttackingTarget()
if(..())
if(isliving(target) && target != src && target != summoner)
cleardeletedchains()
for(var/chain in enemychains)
var/datum/beam/B = chain
if(B.target == target)
return //oh this guy already HAS a chain, let's not chain again
if(enemychains.len > 2)
var/datum/beam/C = pick(enemychains)
qdel(C)
enemychains -= C
enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
. = ..()
if(. && isliving(target) && target != src && target != summoner)
cleardeletedchains()
for(var/chain in enemychains)
var/datum/beam/B = chain
if(B.target == target)
return //oh this guy already HAS a chain, let's not chain again
if(enemychains.len > 2)
var/datum/beam/C = pick(enemychains)
qdel(C)
enemychains -= C
enemychains += Beam(target, "lightning[rand(1,12)]", time=70, maxdistance=7, beam_type=/obj/effect/ebeam/chain)
/mob/living/simple_animal/hostile/guardian/beam/Destroy()
removechains()
@@ -22,10 +22,10 @@
/mob/living/simple_animal/hostile/guardian/punch/AttackingTarget()
. = ..()
if(isliving(target))
src.say("[src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry][src.battlecry]!!")
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
playsound(loc, src.attack_sound, 50, 1, 1)
..()
@@ -27,21 +27,20 @@
stat(null, "Beacon Cooldown Remaining: [max(round((beacon_cooldown - world.time)*0.1, 0.1), 0)] seconds")
/mob/living/simple_animal/hostile/guardian/healer/AttackingTarget()
if(..())
if(toggle == TRUE)
if(iscarbon(target))
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
if(C == summoner)
update_health_hud()
med_hud_set_health()
med_hud_set_status()
. = ..()
if(. && toggle && iscarbon(target))
var/mob/living/carbon/C = target
C.adjustBruteLoss(-5)
C.adjustFireLoss(-5)
C.adjustOxyLoss(-5)
C.adjustToxLoss(-5)
var/obj/effect/overlay/temp/heal/H = new /obj/effect/overlay/temp/heal(get_turf(C))
if(namedatum)
H.color = namedatum.colour
if(C == summoner)
update_health_hud()
med_hud_set_health()
med_hud_set_status()
/mob/living/simple_animal/hostile/guardian/healer/ToggleMode()
if(src.loc == summoner)
@@ -169,7 +169,8 @@
if(istype(target, /obj/effect/decal/cleanable))
visible_message("[src] cleans up \the [target].")
qdel(target)
return
return TRUE
var/atom/movable/M = target
M.clean_blood()
visible_message("[src] polishes \the [target].")
return TRUE
@@ -144,12 +144,12 @@
target = null
wanted_objects -= typecacheof(/obj/structure/beebox) //so we don't attack beeboxes when not going home
else
if(beegent && isliving(target))
. = ..()
if(. && beegent && isliving(target))
var/mob/living/L = target
if(L.reagents)
beegent.reaction_mob(L, INJECT)
L.reagents.add_reagent(beegent.id, rand(1,5))
target.attack_animal(src)
/mob/living/simple_animal/hostile/poison/bees/proc/assign_reagent(datum/reagent/R)
@@ -228,11 +228,11 @@
//leave pollination for the peasent bees
/mob/living/simple_animal/hostile/poison/bees/queen/AttackingTarget()
if(beegent && isliving(target))
. = ..()
if(. && beegent && isliving(target))
var/mob/living/L = target
beegent.reaction_mob(L, TOUCH)
L.reagents.add_reagent(beegent.id, rand(1,5))
target.attack_animal(src)
//PEASENT BEES
@@ -39,8 +39,8 @@
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/AttackingTarget()
..()
if(ishuman(target))
. = ..()
if(. && ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
@@ -36,10 +36,9 @@
return 1
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
..()
if(iscarbon(target))
. = ..()
if(. && prob(12) && iscarbon(target))
var/mob/living/carbon/C = target
if(prob(12))
C.Weaken(3)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
C.Weaken(3)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
@@ -9,8 +9,8 @@
var/poison_type = "toxin"
/mob/living/simple_animal/hostile/poison/AttackingTarget()
..()
if(isliving(target))
. = ..()
if(. && isliving(target))
var/mob/living/L = target
if(L.reagents)
L.reagents.add_reagent(poison_type, poison_per_bite)
@@ -38,10 +38,8 @@
egg_lain = 1
/mob/living/simple_animal/hostile/headcrab/AttackingTarget()
if(egg_lain)
target.attack_animal(src)
return
if(iscarbon(target) && !ismonkey(target))
. = ..()
if(. && !egg_lain && iscarbon(target) && !ismonkey(target))
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
@@ -50,13 +48,7 @@
return
Infect(target)
to_chat(src, "<span class='userdanger'>With our egg laid, our death approaches rapidly...</span>")
spawn(100)
death()
return
target.attack_animal(src)
addtimer(CALLBACK(src, .proc/death), 100)
/obj/item/organ/body_egg/changeling_egg
name = "changeling egg"
@@ -280,7 +280,7 @@
/mob/living/simple_animal/hostile/proc/AttackingTarget()
target.attack_animal(src)
return target.attack_animal(src)
/mob/living/simple_animal/hostile/proc/Aggro()
vision_range = aggro_vision_range
@@ -48,8 +48,8 @@
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
..()
if(isliving(target) && prob(multiply_chance))
. = ..()
if(. && isliving(target) && prob(multiply_chance))
var/mob/living/L = target
if(L.stat == DEAD)
return
@@ -71,4 +71,4 @@
/mob/living/simple_animal/hostile/illusion/escape/AttackingTarget()
return
return FALSE
@@ -194,7 +194,7 @@
target = null
return
target.attack_animal(src)
return target.attack_animal(src)
/mob/living/simple_animal/hostile/syndicate/mecha_pilot/handle_automated_action()
@@ -108,7 +108,7 @@ Difficulty: Hard
for(var/mob/living/simple_animal/hostile/megafauna/bubblegum/B in mob_list)
if(B != src)
qdel(src) //There can be only one
break
return
var/obj/effect/proc_holder/spell/bloodcrawl/bloodspell = new
AddSpell(bloodspell)
if(istype(loc, /obj/effect/dummy/slaughter))
@@ -126,7 +126,7 @@ Difficulty: Hard
/mob/living/simple_animal/hostile/megafauna/bubblegum/AttackingTarget()
if(!charging)
..()
return ..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/Goto(target, delay, minimum_distance)
if(!charging)
@@ -639,7 +639,7 @@ Difficulty: Very Hard
medsensor.add_hud_to(src)
/mob/living/simple_animal/hostile/lightgeist/AttackingTarget()
..()
. = ..()
if(isliving(target) && target != src)
var/mob/living/L = target
if(L.stat < DEAD)
@@ -69,7 +69,7 @@ Difficulty: Medium
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
if(!swooping)
..()
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/DestroySurroundings()
if(!swooping)
@@ -139,7 +139,7 @@ Difficulty: Hard
if(!blinking)
if(target && isliving(target))
INVOKE_ASYNC(src, .proc/melee_blast, get_turf(target)) //melee attacks on living mobs produce a 3x3 blast
..()
return ..()
/mob/living/simple_animal/hostile/megafauna/hierophant/DestroySurroundings()
if(!blinking)
@@ -55,8 +55,8 @@ Difficulty: Medium
internal = new/obj/item/device/gps/internal/legion(src)
/mob/living/simple_animal/hostile/megafauna/legion/AttackingTarget()
..()
if(ishuman(target))
. = ..()
if(. && ishuman(target))
var/mob/living/L = target
if(L.stat == UNCONSCIOUS)
var/mob/living/simple_animal/hostile/asteroid/hivelordbrood/legion/A = new(loc)
@@ -71,8 +71,8 @@
..()
/mob/living/simple_animal/hostile/megafauna/AttackingTarget()
..()
if(isliving(target))
. = ..()
if(. && isliving(target))
var/mob/living/L = target
if(L.stat != DEAD)
if(!client && ranged && ranged_cooldown <= world.time)
@@ -214,8 +214,10 @@ var/global/list/AISwarmerCapsByType = list(/mob/living/simple_animal/hostile/swa
/mob/living/simple_animal/hostile/swarmer/ai/resource/AttackingTarget()
if(target.swarmer_act(src))
add_type_to_wanted(target.type)
return TRUE
else
add_type_to_ignore(target.type)
return FALSE
/mob/living/simple_animal/hostile/swarmer/ai/resource/handle_automated_action()
@@ -308,8 +310,9 @@ var/global/list/AISwarmerCapsByType = list(/mob/living/simple_animal/hostile/swa
var/mob/living/L = target
L.attack_animal(src)
L.electrocute_act(10, src, safety = TRUE) //safety = TRUE means we don't check gloves... Ok?
return TRUE
else
..()
return ..()
@@ -66,6 +66,11 @@
. = ..()
if(.)
icon_state = initial(icon_state)
if(prob(15) && iscarbon(target))
var/mob/living/carbon/C = target
C.Weaken(2)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
/mob/living/simple_animal/hostile/mimic/crate/proc/trigger()
if(!attempt_open)
@@ -87,18 +92,6 @@
O.loc = C
..()
/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget()
. =..()
var/mob/living/L = .
if(iscarbon(L))
var/mob/living/carbon/C = L
if(prob(15))
C.Weaken(2)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window)
/mob/living/simple_animal/hostile/mimic/copy
@@ -178,14 +171,12 @@ var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/ca
..()
/mob/living/simple_animal/hostile/mimic/copy/AttackingTarget()
..()
if(knockdown_people)
if(iscarbon(target))
var/mob/living/carbon/C = target
if(prob(15))
C.Weaken(2)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
. = ..()
if(knockdown_people && . && prob(15) && iscarbon(target))
var/mob/living/carbon/C = target
C.Weaken(2)
C.visible_message("<span class='danger'>\The [src] knocks down \the [C]!</span>", \
"<span class='userdanger'>\The [src] knocks you down!</span>")
/mob/living/simple_animal/hostile/mimic/copy/Aggro()
..()
@@ -165,7 +165,7 @@
if(istype(target, /obj/item/weapon/ore))
EatOre(target)
return
..()
return ..()
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(atom/targeted_ore)
for(var/obj/item/weapon/ore/O in targeted_ore.loc)
@@ -233,6 +233,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
return TRUE
/mob/living/simple_animal/hostile/asteroid/hivelord/death(gibbed)
mouse_opacity = 1
@@ -360,8 +361,8 @@
..()
/mob/living/simple_animal/hostile/asteroid/hivelordbrood/blood/AttackingTarget()
..()
if(iscarbon(target))
. = ..()
if(. && iscarbon(target))
transfer_reagents(target, 1)
@@ -924,7 +925,7 @@
regenerate_icons()
visible_message("<span class='notice'>[src] slurps up [target].</span>")
qdel(target)
..()
return ..()
/obj/item/udder/gutlunch
@@ -77,7 +77,7 @@
if(faint_ticker < 2)
M.visible_message("[M] chews a bit on [src].")
faint_ticker++
return
return TRUE
M.visible_message("<span class='warning'>[M] devours [src]!</span>")
var/level_gain = (powerlevel - M.powerlevel)
if(level_gain >= -1 && !bruised && !M.ckey)//Player shrooms can't level up to become robust gods.
@@ -86,7 +86,8 @@
M.LevelUp(level_gain)
M.adjustBruteLoss(-M.maxHealth)
qdel(src)
..()
return TRUE
return ..()
/mob/living/simple_animal/hostile/mushroom/revive(full_heal = 0, admin_revive = 0)
if(..())
@@ -93,9 +93,9 @@
if(can_be_seen(get_turf(loc)))
if(client)
to_chat(src, "<span class='warning'>You cannot attack, there are eyes on you!</span>")
return
return FALSE
else
..()
return ..()
/mob/living/simple_animal/hostile/statue/DestroySurroundings()
if(!can_be_seen(get_turf(loc)))
@@ -52,7 +52,7 @@
T.atmos_spawn_air("o2=[amt]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
..()
. = ..()
if(iscarbon(target))
var/mob/living/carbon/C = target
if(prob(15))
@@ -307,7 +307,7 @@
//Simple animals
/mob/living/simple_animal/parrot/attack_animal(mob/living/simple_animal/M)
..() //goodbye immortal parrots
. = ..() //goodbye immortal parrots
if(client)
return
@@ -52,7 +52,7 @@
else
to_chat(M, "<span class='cult'>You cannot heal <b>[src]</b>, as [p_they()] [p_are()] unharmed!</span>")
else if(src != M)
..()
return ..()
/mob/living/simple_animal/shade/attackby(obj/item/O, mob/user, params) //Marker -Agouri
if(istype(O, /obj/item/device/soulstone))
@@ -248,7 +248,8 @@ var/list/slime_colours = list("rainbow", "grey", "purple", "metal", "orange",
M.updatehealth()
/mob/living/simple_animal/slime/attack_animal(mob/living/simple_animal/M)
if(..())
. = ..()
if(.)
attacked += 10