diff --git a/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm b/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm index e9413bc4a4..eeeb5b9ba8 100644 --- a/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm +++ b/code/modules/mob/living/carbon/xenomorph/ai/movement/lurking.dm @@ -67,8 +67,13 @@ continue var/blocked = FALSE - for(var/atom/potential_blocker as anything in potential_home) - if(potential_blocker != idle_xeno && (potential_blocker.can_block_movement || potential_blocker.density)) + for(var/obj/structure/potential_blocker in potential_home) + if(potential_blocker.unslashable && potential_blocker.can_block_movement && potential_blocker.density) + blocked = TRUE + break + + for(var/mob/potential_blocker in potential_home) + if(potential_blocker != idle_xeno && potential_blocker.can_block_movement && potential_blocker.density) blocked = TRUE break @@ -76,7 +81,24 @@ continue var/preferred = FALSE + for(var/obj/structure/structure in potential_home) + if(structure.unslashable && structure.can_block_movement && structure.density) + continue + + if(structure.invisibility == 101) + continue + + preferred = TRUE + break + for(var/turf/closed/touching_turf in orange(1, potential_home)) + if(get_dir(potential_home, touching_turf) in diagonals) + continue + + preferred = TRUE + break + + for(var/obj/item/stack/sheet/sheet in potential_home) preferred = TRUE break @@ -194,12 +216,14 @@ #undef LURKER_BAITS_BEFORE_AMBUSH /datum/xeno_ai_movement/linger/lurking/proc/interact_random(mob/living/carbon/xenomorph/X) - for(var/obj/potential_interaction in orange(1, X)) - if(istype(potential_interaction, /obj/structure/window_frame)) + for(var/atom/potential_interaction in orange(1, X)) + if(istype(potential_interaction, /obj/structure/shuttle)) + continue + if(istype(potential_interaction, /turf/closed/shuttle)) continue - if(istype(potential_interaction, /obj/structure/pipes)) + if(istype(potential_interaction, /obj/effect)) continue - if(istype(potential_interaction, /obj/structure/sign)) + if(istype(potential_interaction, /turf/open)) continue if(!potential_interaction.xeno_ai_act(X)) continue diff --git a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm index b5a8cfff51..e528b52054 100644 --- a/code/modules/mob/living/carbon/xenomorph/attack_alien.dm +++ b/code/modules/mob/living/carbon/xenomorph/attack_alien.dm @@ -520,6 +520,10 @@ . = XENO_NO_DELAY_ACTION + if(M.action_busy) + to_chat(M, SPAN_WARNING("You are already doing something!")) + return + if(M.claw_type >= CLAW_TYPE_SHARP) M.animation_attack_on(src) playsound(src, 'sound/effects/metalhit.ogg', 25, 1) @@ -933,6 +937,7 @@ M.visible_message(SPAN_DANGER("[M] smashes [src] beyond recognition!"), \ SPAN_DANGER("You enter a frenzy and smash [src] apart!"), null, 5, CHAT_TYPE_XENO_COMBAT) malfunction() + tip_over() else M.visible_message(SPAN_DANGER("[M] [M.slashes_verb] [src]!"), \ SPAN_DANGER("You [M.slash_verb] [src]!"), null, 5, CHAT_TYPE_XENO_COMBAT) diff --git a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm index 8915cebbe6..d18b5eb671 100644 --- a/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm +++ b/code/modules/mob/living/carbon/xenomorph/castes/Lurker.dm @@ -59,6 +59,7 @@ icon_xeno = 'icons/mob/xenos/lurker.dmi' icon_xenonid = 'icons/mob/xenonids/lurker.dmi' + forced_retarget_time = (2 SECONDS) var/pull_direction /mob/living/carbon/xenomorph/lurker/launch_towards(datum/launch_metadata/LM) diff --git a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm index 9f4ce3df0e..217f61d56f 100644 --- a/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm +++ b/code/modules/mob/living/carbon/xenomorph/xeno_ai_interaction.dm @@ -30,13 +30,19 @@ At bare minimum, make sure the relevant checks from parent types gets copied in return OBJECT_PENALTY /obj/structure/xeno_ai_act(mob/living/carbon/xenomorph/X) - if(unslashable) + if(unslashable || indestructible || (climbable && islurker(X))) if(!X.action_busy) do_climb(X) return return ..() +/obj/structure/machinery/xeno_ai_act(mob/living/carbon/xenomorph/X) + if(stat & TIPPED_OVER) + return + + return ..() + // MINERAL DOOR /obj/structure/mineral_door/xeno_ai_obstacle(mob/living/carbon/xenomorph/X, direction, turf/target) return DOOR_PENALTY