more updates

This commit is contained in:
Fox McCloud
2019-08-31 00:17:37 -04:00
parent 97ff6bb33c
commit 133795d75c
47 changed files with 236 additions and 227 deletions
@@ -241,10 +241,10 @@
else
to_chat(user, "[src] is in pristine condition.")
/mob/living/simple_animal/bot/adjustHealth(amount)
/mob/living/simple_animal/bot/adjustHealth(amount, updating_health = TRUE)
if(amount > 0 && prob(10))
new /obj/effect/decal/cleanable/blood/oil(loc)
return ..(amount)
. = ..()
/mob/living/simple_animal/bot/updatehealth(reason = "none given")
..(reason)
@@ -217,7 +217,7 @@
/mob/living/simple_animal/hostile/construct/builder/Found(atom/A) //what have we found here?
if(istype(A, /mob/living/simple_animal/hostile/construct)) //is it a construct?
if(isconstruct(A)) //is it a construct?
var/mob/living/simple_animal/hostile/construct/C = A
if(C.health < C.maxHealth) //is it hurt? let's go heal it if it is
return 1
@@ -236,7 +236,7 @@
..()
if(isliving(target))
var/mob/living/L = target
if(istype(L, /mob/living/simple_animal/hostile/construct) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
if(isconstruct(L) && L.health >= L.maxHealth) //is this target an unhurt construct? stop trying to heal it
LoseTarget()
return 0
if(L.health <= melee_damage_lower+melee_damage_upper) //ey bucko you're hurt as fuck let's go hit you
@@ -245,7 +245,7 @@
/mob/living/simple_animal/hostile/construct/builder/Aggro()
..()
if(istype(target, /mob/living/simple_animal/hostile/construct)) //oh the target is a construct no need to flee
if(isconstruct(target)) //oh the target is a construct no need to flee
retreat_distance = null
minimum_distance = 1
@@ -256,7 +256,7 @@
/mob/living/simple_animal/hostile/construct/builder/hostile //actually hostile, will move around, hit things, heal other constructs
AIStatus = AI_ON
environment_smash = 1 //only token destruction, don't smash the cult wall NO STOP
environment_smash = ENVIRONMENT_SMASH_STRUCTURES //only token destruction, don't smash the cult wall NO STOP
/////////////////////////////Behemoth/////////////////////////
@@ -17,23 +17,10 @@
stop_automated_movement = 1
friendly = "pinches"
ventcrawler = 2
var/obj/item/inventory_head
var/obj/item/inventory_mask
can_hide = 1
can_collar = 1
gold_core_spawnable = CHEM_MOB_SPAWN_FRIENDLY
/mob/living/simple_animal/crab/handle_automated_movement()
//CRAB movement
if(!stat)
if(isturf(src.loc) && !resting && !buckled) //This is so it only moves if it's not inside a closet, gentics machine, etc.
turns_since_move++
if(turns_since_move >= turns_per_move)
var/east_vs_west = pick(4, 8)
if(Process_Spacemove(east_vs_west))
Move(get_step(src, east_vs_west), east_vs_west)
turns_since_move = 0
/mob/living/simple_animal/crab/Life(seconds, times_fired)
. = ..()
regenerate_icons()
@@ -91,8 +91,8 @@
say("Nom")
/mob/living/simple_animal/hostile/retaliate/goat/AttackingTarget()
..()
if(isdiona(target))
. = ..()
if(. && isdiona(target))
var/mob/living/carbon/human/H = target
var/obj/item/organ/external/NB = pick(H.bodyparts)
H.visible_message("<span class='warning'>[src] takes a big chomp out of [H]!</span>", "<span class='userdanger'>[src] takes a big chomp out of your [NB.name]!</span>")
@@ -158,7 +158,8 @@
if(istype(target, /obj/effect/decal/cleanable))
visible_message("<span class='notice'>\The [src] cleans up \the [target].</span>")
qdel(target)
return
return TRUE
var/atom/movable/M = target
M.clean_blood()
visible_message("<span class='notice'>\The [src] polishes \the [target].</span>")
return TRUE
@@ -22,6 +22,9 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
emote_taunt = list("flutters")
taunt_chance = 20
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -39,11 +42,6 @@
/mob/living/simple_animal/hostile/scarybat/Process_Spacemove(var/check_drift = 0)
return ..() //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/scarybat/FindTarget()
. = ..()
if(.)
custom_emote(1, "flutters towards [.]")
/mob/living/simple_animal/hostile/scarybat/Found(var/atom/A)//This is here as a potential override to pick a specific target if available
if(istype(A) && A == owner)
return 0
@@ -137,12 +137,13 @@
if(target == beehome)
var/obj/structure/beebox/BB = target
forceMove(BB)
toggle_ai(AI_IDLE)
target = null
wanted_objects -= beehometypecache //so we don't attack beeboxes when not going home
return //no don't attack the goddamm box
else
..()
if(isliving(target) && (!client || a_intent == INTENT_HARM))
. = ..()
if(. && isliving(target) && (!client || a_intent == INTENT_HARM))
var/mob/living/L = target
if(L.reagents)
if(beegent)
@@ -222,8 +223,8 @@
//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))
@@ -283,6 +284,14 @@
QDEL_NULL(queen)
return ..()
/mob/living/simple_animal/hostile/poison/bees/consider_wakeup()
if(beehome && loc == beehome) // If bees are chilling in their nest, they're not actively looking for targets
idle = min(100, ++idle)
if(idle >= BEE_IDLE_ROAMING && prob(BEE_PROB_GOROAM))
toggle_ai(AI_ON)
forceMove(beehome.drop_location())
else
..()
//Syndicate Bees
/mob/living/simple_animal/hostile/poison/bees/syndi
@@ -327,8 +336,8 @@
return TRUE
/mob/living/simple_animal/hostile/poison/bees/syndi/AttackingTarget()
..()
if(target && isliving(target))
. = ..()
if(. && target && isliving(target))
var/mob/living/L = target
if(L.stat)
LoseTarget()
@@ -10,6 +10,8 @@
response_help = "pets the"
response_disarm = "gently pushes aside the"
response_harm = "hits the"
emote_taunt = list("gnashes")
taunt_chance = 30
speed = 0
maxHealth = 25
health = 25
@@ -50,14 +52,9 @@
/mob/living/simple_animal/hostile/carp/Process_Spacemove(var/movement_dir = 0)
return 1 //No drifting in space for space carp! //original comments do not steal
/mob/living/simple_animal/hostile/carp/FindTarget()
. = ..()
if(.)
custom_emote(1, "gnashes at [.]!")
/mob/living/simple_animal/hostile/carp/AttackingTarget()
..()
if(ishuman(target))
. = ..()
if(. && ishuman(target))
var/mob/living/carbon/human/H = target
H.adjustStaminaLoss(8)
@@ -19,6 +19,8 @@
attacktext = "grips"
attack_sound = 'sound/hallucinations/growl1.ogg'
speak_emote = list("growls")
emote_taunt = list("wails")
taunt_chance = 25
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -29,14 +31,9 @@
/mob/living/simple_animal/hostile/faithless/Process_Spacemove(var/movement_dir = 0)
return 1
/mob/living/simple_animal/hostile/faithless/FindTarget()
. = ..()
if(.)
custom_emote(1, "wails at [.]!")
/mob/living/simple_animal/hostile/faithless/AttackingTarget()
..()
if(iscarbon(target))
. = ..()
if(. && iscarbon(target))
var/mob/living/carbon/C = target
if(prob(12))
C.Weaken(3)
@@ -40,8 +40,8 @@
/mob/living/simple_animal/hostile/poison/giant_spider/AttackingTarget()
// This is placed here, NOT on /poison, because the other subtypes of /poison/ already override AttackingTarget() completely, and as such it would do nothing but confuse people there.
..()
if(venom_per_bite > 0 && iscarbon(target) && (!client || a_intent == INTENT_HARM))
. = ..()
if(. && venom_per_bite > 0 && iscarbon(target) && (!client || a_intent == INTENT_HARM))
var/mob/living/carbon/C = target
var/inject_target = pick("chest", "head")
if(C.can_inject(null, 0, inject_target, 0))
@@ -36,16 +36,14 @@
else if(mind) // Let's make this a feature
egg.origin = mind
for(var/obj/item/organ/internal/I in src)
I.loc = egg
I.forceMove(egg)
visible_message("<span class='warning'>[src] plants something in [victim]'s flesh!</span>", \
"<span class='danger'>We inject our egg into [victim]'s body!</span>")
egg_lain = 1
/mob/living/simple_animal/hostile/headslug/AttackingTarget()
if(egg_lain)
target.attack_animal(src)
return
if(iscarbon(target) && !issmall(target))
. = ..()
if(. && !egg_lain && iscarbon(target) && !issmall(target))
// Changeling egg can survive in aliens!
var/mob/living/carbon/C = target
if(C.stat == DEAD)
@@ -54,10 +52,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/internal/body_egg/changeling_egg
name = "changeling egg"
@@ -42,19 +42,16 @@
whisper_action.Grant(src)
/mob/living/simple_animal/hostile/hellhound/handle_automated_action()
. = ..()
if(!..())
return
if(resting)
if(!wants_to_rest())
custom_emote(1, "growls, and gets up.")
playsound(get_turf(src), 'sound/hallucinations/growl2.ogg', 50, 1)
icon_state = "[icon_living]"
resting = 0
update_canmove()
StopResting()
else if(wants_to_rest())
custom_emote(1, "lays down, and starts to lick their wounds.")
icon_state = "[icon_resting]"
resting = 1
update_canmove()
StartResting()
/mob/living/simple_animal/hostile/hellhound/examine(mob/user)
. = ..()
@@ -97,7 +94,7 @@
/mob/living/simple_animal/hostile/hellhound/AttackingTarget()
. = ..()
if(ishuman(target) && (!client || a_intent == INTENT_HARM))
if(. && ishuman(target) && (!client || a_intent == INTENT_HARM))
special_aoe()
/mob/living/simple_animal/hostile/hellhound/attackby(obj/item/C, mob/user, params)
@@ -46,8 +46,8 @@
/mob/living/simple_animal/hostile/illusion/AttackingTarget()
..()
if(istype(target, /mob/living) && prob(multiply_chance))
. = ..()
if(. && isliving(target) && prob(multiply_chance))
var/mob/living/L = target
if(L.stat == DEAD)
return
@@ -23,6 +23,9 @@
pixel_x = -16
see_in_dark = 8
emote_taunt = list("nashes")
taunt_chance = 20
harm_intent_damage = 8
melee_damage_lower = 15
melee_damage_upper = 15
@@ -33,18 +36,13 @@
var/stalk_tick_delay = 3
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/panther/FindTarget(var/list/possible_targets)
/mob/living/simple_animal/hostile/panther/AttackingTarget()
. = ..()
if(.)
emote("nashes at [.]")
/mob/living/simple_animal/hostile/panther/AttackingTarget()
. =..()
var/mob/living/L = .
if(istype(L))
if(prob(15))
L.Weaken(3)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
if(prob(15) && iscarbon(target))
var/mob/living/carbon/C = target
C.Weaken(3)
C.visible_message("<span class='danger'>\the [src] knocks down \the [C]!</span>")
//*******//
// Snake //
@@ -67,6 +65,9 @@
maxHealth = 25
health = 25
emote_taunt = list("hisses wickedly")
taunt_chance = 20
harm_intent_damage = 2
melee_damage_lower = 3
melee_damage_upper = 10
@@ -77,13 +78,9 @@
var/stalk_tick_delay = 3
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
/mob/living/simple_animal/hostile/snake/FindTarget()
. = ..()
if(.)
emote("hisses wickedly")
/mob/living/simple_animal/hostile/snake/AttackingTarget()
. =..()
var/mob/living/L = .
if(istype(L))
L.apply_damage(rand(3,12), TOX)
if(.)
if(iscarbon(target))
var/mob/living/carbon/C = target
C.apply_damage(rand(3, 12), TOX)
@@ -122,12 +122,16 @@ 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)
..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/MoveToTarget(list/possible_targets)
if(!charging)
..()
/mob/living/simple_animal/hostile/megafauna/bubblegum/Move()
if(charging)
new /obj/effect/temp_visual/decoy/fading(loc, src)
@@ -62,14 +62,14 @@ Difficulty: Medium
return
..()
/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount)
/mob/living/simple_animal/hostile/megafauna/dragon/adjustHealth(amount, updating_health = TRUE)
if(swooping)
return 0
return FALSE
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/AttackingTarget()
if(!swooping)
..()
return ..()
/mob/living/simple_animal/hostile/megafauna/dragon/DestroySurroundings()
if(!swooping)
@@ -123,13 +123,18 @@ Difficulty: Hard
adjustHealth(-L.maxHealth*0.5)
L.dust()
/mob/living/simple_animal/hostile/megafauna/hierophant/CanAttack(atom/the_target)
. = ..()
if(istype(the_target, /mob/living/simple_animal/hostile/asteroid/hivelordbrood)) //ignore temporary targets in favor of more permanent targets
return FALSE
/*/mob/living/simple_animal/hostile/megafauna/hierophant/GiveTarget(new_target)
var/targets_the_same = (new_target == target)
. = ..()
if(. && target && !targets_the_same)
visible_message("<span class='hierophant'>\"[pick(target_phrases)]\"</span>")*/
/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount)
/mob/living/simple_animal/hostile/megafauna/hierophant/adjustHealth(amount, updating_health = TRUE)
. = ..()
if(src && amount > 0 && !blinking)
wander = TRUE
@@ -140,7 +145,7 @@ Difficulty: Hard
if(target && isliving(target))
spawn(0)
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_gps = new/obj/item/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)
@@ -59,8 +59,8 @@
loot = crusher_loot
/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)
@@ -81,7 +81,7 @@ GLOBAL_LIST_INIT(AISwarmerCapsByType, list(/mob/living/simple_animal/hostile/swa
new createtype(loc)
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE, forced = FALSE)
/mob/living/simple_animal/hostile/megafauna/swarmer_swarm_beacon/adjustHealth(amount, updating_health = TRUE)
. = ..()
if(. > 0 && world.time > call_help_cooldown)
call_help_cooldown = world.time + call_help_cooldown_amt
@@ -17,7 +17,9 @@
melee_damage_upper = 12
attacktext = "attacks"
attack_sound = 'sound/weapons/bite.ogg'
emote_taunt = list("growls")
speak_emote = list("creaks")
taunt_chance = 30
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -29,11 +31,6 @@
gold_core_spawnable = CHEM_MOB_SPAWN_HOSTILE
del_on_death = 1
/mob/living/simple_animal/hostile/mimic/FindTarget()
. = ..()
if(.)
custom_emote(1, "growls at [.]")
/mob/living/simple_animal/hostile/mimic/emp_act(severity)
if(is_electronic)
switch(severity)
@@ -56,7 +53,7 @@
for(var/obj/item/I in loc)
I.loc = src
/mob/living/simple_animal/hostile/mimic/crate/DestroySurroundings()
/mob/living/simple_animal/hostile/mimic/crate/DestroyPathToTarget()
..()
if(prob(90))
icon_state = "[initial(icon_state)]open"
@@ -77,15 +74,19 @@
. = ..()
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)
visible_message("<b>[src]</b> starts to move!")
attempt_open = 1
/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(damage)
/mob/living/simple_animal/hostile/mimic/crate/adjustHealth(amount, updating_health = TRUE)
trigger()
..(damage)
. = ..()
/mob/living/simple_animal/hostile/mimic/crate/LoseTarget()
..()
@@ -96,18 +97,10 @@
var/obj/structure/closet/crate/C = new(get_turf(src))
// Put loot in crate
for(var/obj/O in src)
O.loc = C
O.forceMove(C)
// due to `del_on_death`
return ..()
/mob/living/simple_animal/hostile/mimic/crate/AttackingTarget()
. =..()
var/mob/living/L = .
if(istype(L))
if(prob(15))
L.Weaken(2)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
var/global/list/protected_objects = list(/obj/structure/table, /obj/structure/cable, /obj/structure/window)
/mob/living/simple_animal/hostile/mimic/copy
@@ -191,14 +184,11 @@ 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()
..()
@@ -41,13 +41,10 @@
flag = "energy"
temperature = 50
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(var/new_target)
/mob/living/simple_animal/hostile/asteroid/basilisk/GiveTarget(new_target)
if(..()) //we have a target
if(isliving(target))
var/mob/living/L = target
if(L.bodytemperature > 261)
L.bodytemperature = 261
visible_message("<span class='danger'>The [src.name]'s stare chills [L.name] to the bone!</span>")
if(isliving(target) && !target.Adjacent(targets_from) && ranged_cooldown <= world.time)//No more being shot at point blank or spammed with RNG beams
OpenFire(target)
/mob/living/simple_animal/hostile/asteroid/basilisk/ex_act(severity)
switch(severity)
@@ -48,14 +48,13 @@
retreat_distance = 10
minimum_distance = 10
if(will_burrow)
spawn(chase_time)
Burrow()
addtimer(CALLBACK(src, .proc/Burrow), chase_time)
/mob/living/simple_animal/hostile/asteroid/goldgrub/AttackingTarget()
if(istype(target, /obj/item/stack/ore))
EatOre(target)
return
..()
return ..()
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/EatOre(var/atom/targeted_ore)
for(var/obj/item/stack/ore/O in get_turf(targeted_ore))
@@ -69,13 +68,13 @@
/mob/living/simple_animal/hostile/asteroid/goldgrub/proc/Burrow()//Begin the chase to kill the goldgrub in time
if(!stat)
visible_message("<span class='danger'>The [src.name] buries into the ground, vanishing from sight!</span>")
visible_message("<span class='danger'>The [name] buries into the ground, vanishing from sight!</span>")
qdel(src)
/mob/living/simple_animal/hostile/asteroid/goldgrub/bullet_act(obj/item/projectile/P)
visible_message("<span class='danger'>The [P.name] was repelled by [src.name]'s girth!</span>")
return
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(damage)
/mob/living/simple_animal/hostile/asteroid/goldgrub/adjustHealth(amount, updating_health = TRUE)
vision_range = 9
. = ..()
@@ -54,6 +54,8 @@
/mob/living/simple_animal/hostile/asteroid/goliath/OpenFire()
var/tturf = get_turf(target)
if(!isturf(tturf))
return
if(get_dist(src, target) <= 7)//Screen range check, so you can't get tentacle'd offscreen
visible_message("<span class='warning'>The [src.name] digs its tentacles under [target.name]!</span>")
new /obj/effect/temp_visual/goliath_tentacle/original(tturf, src)
@@ -61,10 +63,10 @@
icon_state = icon_aggro
pre_attack = FALSE
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(damage)
ranged_cooldown--
/mob/living/simple_animal/hostile/asteroid/goliath/adjustHealth(amount, updating_health = TRUE)
ranged_cooldown -= 10
handle_preattack()
..()
. = ..()
/mob/living/simple_animal/hostile/asteroid/goliath/Aggro()
vision_range = aggro_vision_range
@@ -30,7 +30,7 @@
stop_automated_movement_when_pulled = TRUE
stat_exclusive = TRUE
robust_searching = TRUE
search_objects = TRUE
search_objects = 3
del_on_death = TRUE
loot = list(/obj/effect/decal/cleanable/blood/gibs)
deathmessage = "is pulped into bugmash."
@@ -63,14 +63,35 @@
else
..()
/mob/living/simple_animal/hostile/asteroid/gutlunch/CanAttack(atom/the_target) // Gutlunch-specific version of CanAttack to handle stupid stat_exclusive = true crap so we don't have to do it for literally every single simple_animal/hostile except the two that spawn in lavaland
if(isturf(the_target) || !the_target || the_target.type == /atom/movable/lighting_object) // bail out on invalids
return FALSE
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
return FALSE
if(isliving(the_target))
var/mob/living/L = the_target
if(faction_check_mob(L) && !attack_same)
return FALSE
if(L.stat > stat_attack || L.stat != stat_attack && stat_exclusive)
return FALSE
return TRUE
if(isobj(the_target) && is_type_in_typecache(the_target, wanted_objects))
return TRUE
return FALSE
/mob/living/simple_animal/hostile/asteroid/gutlunch/AttackingTarget()
if(is_type_in_typecache(target, wanted_objects)) //we eats
if(is_type_in_typecache(target,wanted_objects)) //we eats
udder.generateMilk()
regenerate_icons()
visible_message("<span class='notice'>[src] slurps up [target].</span>")
qdel(target)
return
..()
return ..()
/obj/item/udder/gutlunch
name = "nutrient sac"
@@ -44,6 +44,7 @@
/mob/living/simple_animal/hostile/asteroid/hivelord/AttackingTarget()
OpenFire()
return TRUE
/mob/living/simple_animal/hostile/asteroid/hivelord/spawn_crusher_loot()
loot += crusher_loot //we don't butcher
@@ -28,12 +28,14 @@
/mob/living/simple_animal/hostile/asteroid/Aggro()
..()
icon_state = icon_aggro
if(vision_range != aggro_vision_range)
icon_state = icon_aggro
/mob/living/simple_animal/hostile/asteroid/LoseAggro()
..()
if(stat == CONSCIOUS)
icon_state = icon_living
if(stat == DEAD)
return
icon_state = icon_living
/mob/living/simple_animal/hostile/asteroid/bullet_act(var/obj/item/projectile/P)//Reduces damage from most projectiles to curb off-screen kills
if(!stat)
@@ -61,21 +61,42 @@
health = maxHealth
..()
/mob/living/simple_animal/hostile/mushroom/adjustHealth(damage)//Possibility to flee from a fight just to make it more visually interesting
/mob/living/simple_animal/hostile/mushroom/CanAttack(atom/the_target) // Mushroom-specific version of CanAttack to handle stupid attack_same = 2 crap so we don't have to do it for literally every single simple_animal/hostile because this shit never gets spawned
if(!the_target || isturf(the_target) || istype(the_target, /atom/movable/lighting_object))
return FALSE
if(see_invisible < the_target.invisibility)//Target's invisible to us, forget it
return FALSE
if(isliving(the_target))
var/mob/living/L = the_target
if (!faction_check_mob(L) && attack_same == 2)
return FALSE
if(L.stat > stat_attack)
return FALSE
return TRUE
return FALSE
/mob/living/simple_animal/hostile/mushroom/adjustHealth(amount, updating_health = TRUE)//Possibility to flee from a fight just to make it more visually interesting
if(!retreat_distance && prob(33))
retreat_distance = 5
spawn(30)
retreat_distance = null
..()
addtimer(CALLBACK(src, .proc/stop_retreat), 30)
. = ..()
/mob/living/simple_animal/hostile/mushroom/attack_animal(var/mob/living/L)
/mob/living/simple_animal/hostile/mushroom/proc/stop_retreat()
retreat_distance = null
/mob/living/simple_animal/hostile/mushroom/attack_animal(mob/living/L)
if(istype(L, /mob/living/simple_animal/hostile/mushroom) && stat == DEAD)
var/mob/living/simple_animal/hostile/mushroom/M = L
if(faint_ticker < 2)
M.visible_message("<span class='notice'>[M] chews a bit on [src].</span>")
M.visible_message("[M] chews a bit on [src].")
faint_ticker++
return
M.visible_message("<span class='notice'>[M] devours [src]!</span>")
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.
if(level_gain < 1)//So we still gain a level if two mushrooms were the same level
@@ -83,7 +104,8 @@
M.LevelUp(level_gain)
M.adjustBruteLoss(-M.maxHealth)
qdel(src)
..()
return TRUE
return ..()
/mob/living/simple_animal/hostile/mushroom/revive()
..()
@@ -1,20 +1,20 @@
/mob/living/simple_animal/hostile/retaliate
var/list/enemies = list()
/mob/living/simple_animal/hostile/retaliate/Found(var/atom/A)
/mob/living/simple_animal/hostile/retaliate/Found(atom/A)
if(isliving(A))
var/mob/living/L = A
if(!L.stat)
return L
else
enemies -= L
else if(istype(A, /obj/mecha))
else if(ismecha(A))
var/obj/mecha/M = A
if(M.occupant)
return A
else if(istype(A, /obj/spacepod))
var/obj/spacepod/M = A
if(M.pilot)
else if(isspacepod(A))
var/obj/spacepod/S = A
if(S.pilot)
return A
/mob/living/simple_animal/hostile/retaliate/ListTargets()
@@ -25,48 +25,32 @@
return see
/mob/living/simple_animal/hostile/retaliate/proc/Retaliate()
..()
var/list/around = view(src, 7)
var/list/around = view(src, vision_range)
for(var/atom/movable/A in around)
if(A == src)
continue
if(isliving(A))
var/mob/living/M = A
var/faction_check = 0
for(var/F in faction)
if(F in M.faction)
faction_check = 1
break
if(faction_check && attack_same || !faction_check)
if(faction_check_mob(M) && attack_same || !faction_check_mob(M))
enemies |= M
else if(istype(A, /obj/mecha))
else if(ismecha(A))
var/obj/mecha/M = A
if(M.occupant)
enemies |= M
enemies |= M.occupant
else if(istype(A, /obj/spacepod))
var/obj/spacepod/M = A
if(M.pilot)
enemies |= M
enemies |= M.pilot
else if(isspacepod(A))
var/obj/spacepod/S = A
if(S.pilot)
enemies |= S
enemies |= S.pilot
for(var/mob/living/simple_animal/hostile/retaliate/H in around)
var/retaliate_faction_check = 0
for(var/F in faction)
if(F in H.faction)
retaliate_faction_check = 1
break
if(retaliate_faction_check && !attack_same && !H.attack_same)
if(faction_check_mob(H) && !attack_same && !H.attack_same)
H.enemies |= enemies
return 0
/mob/living/simple_animal/hostile/retaliate/adjustHealth(damage)
..(damage)
Retaliate()
/mob/living/simple_animal/hostile/retaliate/DestroySurroundings()
for(var/dir in cardinal) // North, South, East, West
var/obj/structure/obstacle = locate(/obj/structure, get_step(src, dir))
if(istype(obstacle, /obj/structure/closet) || istype(obstacle, /obj/structure/table))
obstacle.attack_animal(src)
/mob/living/simple_animal/hostile/retaliate/adjustHealth(amount, updating_health = TRUE)
. = ..()
if(amount > 0 && stat == CONSCIOUS)
Retaliate()
@@ -35,6 +35,9 @@
maxHealth = 20
health = 20
emote_taunt = list("wails")
taunt_chance = 20
harm_intent_damage = 10
melee_damage_lower = 2
melee_damage_upper = 3
@@ -51,11 +54,6 @@
/mob/living/simple_animal/hostile/retaliate/ghost/Process_Spacemove(var/check_drift = 0)
return 1
/mob/living/simple_animal/hostile/retaliate/ghost/FindTarget()
. = ..()
if(.)
custom_emote(1, "wails at [.]")
/mob/living/simple_animal/hostile/retaliate/ghost/Life(seconds, times_fired)
if(target)
invisibility = pick(0,0,60,invisibility)
@@ -118,8 +118,9 @@
//Try to move onto target's turf and eat them
/mob/living/simple_animal/hostile/spaceWorm/wormHead/AttackingTarget()
..()
attemptToEat(target)
. = ..()
if(.)
attemptToEat(target)
//Attempt to eat things we bump into, Mobs, Walls, Clowns
/mob/living/simple_animal/hostile/spaceWorm/wormHead/Bump(atom/obstacle)
@@ -86,11 +86,11 @@
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()
/mob/living/simple_animal/hostile/statue/DestroyPathToTarget()
if(!can_be_seen(get_turf(loc)))
..()
@@ -135,6 +135,8 @@
LoseTarget()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/handle_automated_action()
if(!..())
return
if(seen_enemy)
aggro_cycles++
if(alert_on_timeout && !raised_alert && aggro_cycles >= 60)
@@ -166,7 +168,6 @@
pointed(body)
else
scan_cycles++
..()
/mob/living/simple_animal/hostile/syndicate/melee/autogib/depot/proc/raise_alert(var/reason)
if(istype(depotarea) && (!raised_alert || seen_revived_enemy) && !depotarea.used_self_destruct)
@@ -58,7 +58,7 @@
if(invisibility > 0)
GrayDeCloak()
else
..()
return ..()
/mob/living/simple_animal/hostile/poison/terror_spider/proc/GrayCloak()
visible_message("<span class='notice'>[src] hides in the vent.</span>")
@@ -58,7 +58,7 @@
visible_message("<span class='notice'>[src] retracts its fangs a little.</span>")
melee_damage_lower = melee_damage_lower_rage1
melee_damage_upper = melee_damage_upper_rage1
..()
return ..()
/obj/structure/spider/terrorweb/red
@@ -24,6 +24,8 @@
attacktext = "bites"
attack_sound = 'sound/weapons/bite.ogg'
speak_emote = list("pines")
emote_taunt = list("growls")
taunt_chance = 20
atmos_requirements = list("min_oxy" = 0, "max_oxy" = 0, "min_tox" = 0, "max_tox" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0)
minbodytemp = 0
@@ -34,15 +36,10 @@
deathmessage = "is hacked into pieces!"
del_on_death = 1
/mob/living/simple_animal/hostile/tree/FindTarget()
. = ..()
if(.)
custom_emote(1, "growls at [.]")
/mob/living/simple_animal/hostile/tree/AttackingTarget()
. =..()
var/mob/living/L = .
if(istype(L))
. = ..()
if(. && iscarbon(target))
var/mob/living/carbon/C = target
if(prob(15))
L.Weaken(3)
L.visible_message("<span class='danger'>\the [src] knocks down \the [L]!</span>")
C.Weaken(3)
C.visible_message("<span class='danger'>\the [src] knocks down \the [C]!</span>")
@@ -105,6 +105,12 @@
/mob/living/simple_animal/hostile/venus_human_trap/OpenFire(atom/the_target)
for(var/turf/T in getline(src,target))
if (T.density)
return
for(var/obj/O in T)
if(O.density)
return
var/dist = get_dist(src,the_target)
Beam(the_target, "vine", time=dist*2, maxdistance=dist+2, beam_type=/obj/effect/ebeam/vine)
the_target.attack_animal(src)