diff --git a/code/modules/mob/living/simple_animal/bear.dm b/code/modules/mob/living/simple_animal/bear.dm index 6c1aca47fc3..fb69bef9ef9 100644 --- a/code/modules/mob/living/simple_animal/bear.dm +++ b/code/modules/mob/living/simple_animal/bear.dm @@ -68,33 +68,40 @@ switch(stance) if(BEAR_STANCE_IDLE) + var/obj/mecha/M = null + var/mob/living/L = null stop_automated_movement = 0 stance_step++ if(stance_step > 5) stance_step = 0 - for( var/mob/living/L in viewers(7,src) ) + for(L in viewers(7,src)) if(isbear(L)) continue if(!L.stat) - emote("stares alertly at [L]") stance = BEAR_STANCE_ALERT + target_mob = L break + for(M in view(7,src)) + if (M.occupant) + stance = BEAR_STANCE_ALERT + target_mob = M + break + if (target_mob) + emote("stares alertly at [target_mob]") + if(BEAR_STANCE_ALERT) stop_automated_movement = 1 var/found_mob = 0 - for( var/mob/living/L in viewers(7,src) ) - if(isbear(L)) continue - if(!L.stat) + if(target_mob in SA_search(target_mob)) + if(target_mob && !(SA_attackable(target_mob))) stance_step = max(0, stance_step) //If we have not seen a mob in a while, the stance_step will be negative, we need to reset it to 0 as soon as we see a mob again. stance_step++ found_mob = 1 - target_mob = L src.dir = get_dir(src,target_mob) //Keep staring at the mob if(stance_step in list(1,4,7)) //every 3 ticks - var/action = pick( list( "growls at [L]", "stares angrily at [L]", "prepares to attack [L]", "closely watches [L]" ) ) + var/action = pick( list( "growls at [target_mob]", "stares angrily at [target_mob]", "prepares to attack [target_mob]", "closely watches [target_mob]" ) ) if(action) emote(action) - break if(!found_mob) stance_step-- @@ -104,10 +111,10 @@ stance = BEAR_STANCE_ATTACK if(BEAR_STANCE_ATTACK) //This one should only be active for one tick, stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = BEAR_STANCE_ALERT stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - if(target_mob in viewers(7,src)) + if(target_mob in SA_search(target_mob)) walk_to(src, target_mob, 1, 3) stance = BEAR_STANCE_ATTACKING stance_step = 0 @@ -115,11 +122,11 @@ stop_automated_movement = 1 stance_step++ - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = BEAR_STANCE_ALERT stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns return - if(!(target_mob in viewers(7,src))) + if(!(target_mob in SA_search(target_mob))) stance = BEAR_STANCE_ALERT stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns target_mob = null @@ -137,6 +144,9 @@ else if(isliving(target_mob)) var/mob/living/L = target_mob L.adjustBruteLoss(damage) + else if(istype(target_mob,/obj/mecha)) + var/obj/mecha/M = target_mob + M.attack_animal(src) if(stance_step >= 20) //attacks for 20 ticks, then it gets tired and needs to rest emote( "is worn out and needs to rest" ) @@ -148,7 +158,7 @@ stop_automated_movement = 1 stance_step++ if(stance_step >= 10) //rests for 10 ticks - if(target_mob && target_mob in viewers(7,src)) + if(target_mob && target_mob in SA_search(target_mob)) stance = BEAR_STANCE_ATTACK //If the mob he was chasing is still nearby, resume the attack, otherwise go idle. else stance = BEAR_STANCE_IDLE diff --git a/code/modules/mob/living/simple_animal/carp.dm b/code/modules/mob/living/simple_animal/carp.dm index 9615891b548..3b1ac48fd5a 100644 --- a/code/modules/mob/living/simple_animal/carp.dm +++ b/code/modules/mob/living/simple_animal/carp.dm @@ -70,24 +70,32 @@ if(!stat) switch(stance) if(CARP_STANCE_IDLE) + var/obj/mecha/M = null + var/mob/living/L = null stop_automated_movement = 0 stance_step++ if(stance_step > 5) stance_step = 0 - for( var/mob/living/L in viewers(7,src) ) + for(L in viewers(7,src)) if(iscarp(L)) continue if(!L.stat) - emote("gnashes at [L]") stance = CARP_STANCE_ATTACK target_mob = L break + for(M in view(7,src)) + if (M.occupant) + stance = CARP_STANCE_ATTACK + target_mob = M + break + if (target_mob) + emote("nashes at [target_mob]") if(CARP_STANCE_ATTACK) //This one should only be active for one tick stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = CARP_STANCE_IDLE stance_step = 5 //Make it very alert, so it quickly attacks again if a mob returns - if(target_mob in viewers(7,src)) + if(target_mob in SA_search(target_mob)) walk_to(src, target_mob, 1, 3) stance = CARP_STANCE_ATTACKING stance_step = 0 @@ -95,12 +103,12 @@ if(CARP_STANCE_ATTACKING) stop_automated_movement = 1 stance_step++ - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = CARP_STANCE_IDLE stance_step = 3 //Make it very alert, so it quickly attacks again if a mob returns target_mob = null return - if(!(target_mob in viewers(7,src))) + if(!(target_mob in SA_search(target_mob))) stance = CARP_STANCE_IDLE stance_step = 1 target_mob = null @@ -112,6 +120,9 @@ if(prob(10)) L.Weaken(5) L.visible_message("\the [src] knocks down \the [L]!") + if(istype(target_mob,/obj/mecha)) + var/obj/mecha/M = target_mob + M.attack_animal(src) /mob/living/simple_animal/carp/Process_Spacemove(var/check_drift = 0) return //No drifting in space for space carp! //original comments do not steal \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/clown.dm b/code/modules/mob/living/simple_animal/clown.dm index e8cbe2d2dbb..b1d54efc125 100644 --- a/code/modules/mob/living/simple_animal/clown.dm +++ b/code/modules/mob/living/simple_animal/clown.dm @@ -69,29 +69,37 @@ switch(stance) if(CLOWN_STANCE_IDLE) if (src.hostile == 0) return - for( var/mob/living/L in viewers(7,src) ) + var/obj/mecha/M = null + var/mob/living/L = null + for(L in viewers(7,src)) if(isclown(L)) continue if(!L.stat) - emote("honks menacingly at [L]") stance = CLOWN_STANCE_ATTACK target_mob = L break + for(M in view(7,src)) + if (M.occupant) + stance = CLOWN_STANCE_ATTACK + target_mob = M + break + if (target_mob) + emote("honks menacingly at [target_mob]") if(CLOWN_STANCE_ATTACK) //This one should only be active for one tick stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = CLOWN_STANCE_IDLE - if(target_mob in viewers(7,src)) + if(target_mob in SA_search(target_mob)) walk_to(src, target_mob, 1, 3) stance = CLOWN_STANCE_ATTACKING if(CLOWN_STANCE_ATTACKING) stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = CLOWN_STANCE_IDLE target_mob = null return - if(!(target_mob in viewers(7,src))) + if(!(target_mob in SA_search(target_mob))) stance = CLOWN_STANCE_IDLE target_mob = null return @@ -102,9 +110,16 @@ if(prob(10)) L.Weaken(5) L.visible_message("\the [src] slips \the [L]!") - for(var/mob/M in viewers(src, null)) - if(istype(M, /mob/living/simple_animal/clown)) - var/mob/living/simple_animal/clown/C = M + for(var/mob/H in viewers(src, null)) + if(istype(H, /mob/living/simple_animal/clown)) + var/mob/living/simple_animal/clown/C = H + C.hostile = 1 + if(istype(target_mob,/obj/mecha)) + var/obj/mecha/M = target_mob + M.attack_animal(src) + for(var/mob/H in viewers(src, null)) + if(istype(H, /mob/living/simple_animal/clown)) + var/mob/living/simple_animal/clown/C = H C.hostile = 1 /mob/living/simple_animal/clown/bullet_act(var/obj/item/projectile/Proj) diff --git a/code/modules/mob/living/simple_animal/life.dm b/code/modules/mob/living/simple_animal/life.dm index 6d4fbfcbf58..2613053858b 100644 --- a/code/modules/mob/living/simple_animal/life.dm +++ b/code/modules/mob/living/simple_animal/life.dm @@ -414,4 +414,22 @@ health -= 30 /mob/living/simple_animal/adjustBruteLoss(damage) - health -= damage \ No newline at end of file + health -= damage + + +/mob/living/simple_animal/proc/SA_search(target_mob) + if(isliving(target_mob)) + return (viewers(7,src)) + if(istype(target_mob,/obj)) + return (view(7,src)) + +/mob/living/simple_animal/proc/SA_attackable(target_mob) + if (isliving(target_mob)) + var/mob/living/L = target_mob + if(!L.stat) + return (0) + if (istype(target_mob,/obj/mecha)) + var/obj/mecha/M = target_mob + if (M.occupant) + return (0) + return (1) \ No newline at end of file diff --git a/code/modules/mob/living/simple_animal/syndicate.dm b/code/modules/mob/living/simple_animal/syndicate.dm index bbe5588d8a4..a2d0b1ab555 100644 --- a/code/modules/mob/living/simple_animal/syndicate.dm +++ b/code/modules/mob/living/simple_animal/syndicate.dm @@ -71,19 +71,26 @@ if(!stat) switch(stance) if(SYNDICATE_STANCE_IDLE) + var/obj/mecha/M = null + var/mob/living/L = null stop_automated_movement = 0 - for( var/mob/living/L in viewers(7,src) ) + for(L in viewers(7,src)) if(isSyndicate(L)) continue if(!L.stat) stance = SYNDICATE_STANCE_ATTACK target_mob = L break + for(M in view(7,src)) + if (M.occupant) + stance = SYNDICATE_STANCE_ATTACK + target_mob = M + break if(SYNDICATE_STANCE_ATTACK) //This one should only be active for one tick stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = SYNDICATE_STANCE_IDLE - if(target_mob in viewers(10,src)) + if(target_mob in SA_search(target_mob)) if(ranged) if(get_dist(src, target_mob) <= 6) OpenFire(target_mob) @@ -95,11 +102,11 @@ if(SYNDICATE_STANCE_ATTACKING) stop_automated_movement = 1 - if(!target_mob || target_mob.stat) + if(!target_mob || SA_attackable(target_mob)) stance = SYNDICATE_STANCE_IDLE target_mob = null return - if(!(target_mob in viewers(7,src))) + if(!(target_mob in SA_search(target_mob))) stance = SYNDICATE_STANCE_IDLE target_mob = null return @@ -107,8 +114,9 @@ if(isliving(target_mob)) var/mob/living/L = target_mob L.attack_animal(src) - - + if(istype(target_mob,/obj/mecha)) + var/obj/mecha/M = target_mob + M.attack_animal(src) /mob/living/simple_animal/syndicate/proc/OpenFire(target_mob) src.target = target_mob