diff --git a/code/__DEFINES/ai/monsters.dm b/code/__DEFINES/ai/monsters.dm index 4ad06155f6c..f08bd169120 100644 --- a/code/__DEFINES/ai/monsters.dm +++ b/code/__DEFINES/ai/monsters.dm @@ -85,3 +85,11 @@ #define BB_TARGET_CANNIBAL "BB_target_cannibal" ///the tree we will burn down #define BB_TARGET_TREE "BB_target_tree" + +// mega arachnid keys +/// ability to throw restrain projectiles +#define BB_ARACHNID_RESTRAIN "BB_arachnid_restrain" +/// the found surveillance item we must destroy +#define BB_SURVEILLANCE_TARGET "BB_surveillance_target" +/// our acid slip ability +#define BB_ARACHNID_SLIP "BB_arachnid_slip" diff --git a/code/datums/ai/hunting_behavior/hunting_lights.dm b/code/datums/ai/hunting_behavior/hunting_lights.dm index f26743b7dfa..6b82e87f269 100644 --- a/code/datums/ai/hunting_behavior/hunting_lights.dm +++ b/code/datums/ai/hunting_behavior/hunting_lights.dm @@ -1,23 +1,18 @@ /datum/ai_planning_subtree/find_and_hunt_target/look_for_light_fixtures target_key = BB_LOW_PRIORITY_HUNTING_TARGET finding_behavior = /datum/ai_behavior/find_hunt_target/light_fixtures - hunting_behavior = /datum/ai_behavior/hunt_target/light_fixtures + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_targets = list(/obj/machinery/light) hunt_range = 7 -/datum/ai_behavior/hunt_target/light_fixtures +/datum/ai_behavior/hunt_target/unarmed_attack_target/light_fixtures hunt_cooldown = 10 SECONDS always_reset_target = TRUE -/datum/ai_behavior/hunt_target/light_fixtures/target_caught(mob/living/hunter, obj/machinery/light/hunted) - hunter.UnarmedAttack(hunted, TRUE) - /datum/ai_behavior/find_hunt_target/light_fixtures /datum/ai_behavior/find_hunt_target/light_fixtures/valid_dinner(mob/living/source, obj/machinery/light/dinner, radius) - if(istype(dinner, /obj/machinery/light)) - var/obj/machinery/light/light_target = dinner - if(light_target.status == LIGHT_BROKEN) //light is already broken - return FALSE + if(dinner.status == LIGHT_BROKEN) //light is already broken + return FALSE return can_see(source, dinner, radius) diff --git a/code/datums/components/appearance_on_aggro.dm b/code/datums/components/appearance_on_aggro.dm new file mode 100644 index 00000000000..85690a579ae --- /dev/null +++ b/code/datums/components/appearance_on_aggro.dm @@ -0,0 +1,49 @@ + +/** + * component gave to basic creatures to allow them to change appearance when find a target + */ +/datum/component/appearance_on_aggro + var/target_key = BB_BASIC_MOB_CURRENT_TARGET + /// path of the overlay to apply + var/mutable_appearance/overlay_path + /// visibility of our icon when aggroed + var/alpha_on_aggro + /// visibility of our icon when deaggroed + var/alpha_on_deaggro + +/datum/component/appearance_on_aggro/Initialize(overlay_icon, overlay_state, alpha_on_aggro, alpha_on_deaggro) + if(!isliving(parent)) + return COMPONENT_INCOMPATIBLE + if(overlay_icon && overlay_state) + src.overlay_path = mutable_appearance(overlay_icon, overlay_state) + if(!alpha_on_aggro || !alpha_on_deaggro) + return + src.alpha_on_aggro = alpha_on_aggro + src.alpha_on_deaggro = alpha_on_deaggro + +/datum/component/appearance_on_aggro/RegisterWithParent() + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(change_appearance)) + RegisterSignal(parent, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(revert_appearance)) + +/datum/component/appearance_on_aggro/UnregisterFromParent() + . = ..() + UnregisterSignal(parent, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) + +/datum/component/appearance_on_aggro/proc/change_appearance(mob/living/source) + SIGNAL_HANDLER + + var/atom/target = source.ai_controller.blackboard[target_key] + if(isnull(target)) + return + if(overlay_path) + source.add_overlay(overlay_path) + if(alpha_on_aggro) + animate(source, alpha = alpha_on_aggro, time = 2 SECONDS) + +/datum/component/appearance_on_aggro/proc/revert_appearance(mob/living/source) + SIGNAL_HANDLER + + if(overlay_path) + source.cut_overlay(overlay_path) + if(alpha_on_deaggro) + animate(source, alpha = alpha_on_deaggro, time = 2 SECONDS) diff --git a/code/datums/elements/appearance_on_aggro.dm b/code/datums/elements/appearance_on_aggro.dm deleted file mode 100644 index 1e64eb6140a..00000000000 --- a/code/datums/elements/appearance_on_aggro.dm +++ /dev/null @@ -1,34 +0,0 @@ -/** - * Element gave to basic creatures to allow them to change appearance when find a target - */ -/datum/element/appearance_on_aggro - element_flags = ELEMENT_BESPOKE - argument_hash_start_idx = 2 - /// the target key - var/target_key = BB_BASIC_MOB_CURRENT_TARGET - /// path of the overlay to apply - var/mutable_appearance/overlay_path - -/datum/element/appearance_on_aggro/Attach(datum/target, overlay_icon, overlay_state) - . = ..() - if(!isliving(target)) - return ELEMENT_INCOMPATIBLE - src.overlay_path = mutable_appearance(overlay_icon, overlay_state) - RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_SET(target_key), PROC_REF(add_overlay)) - RegisterSignal(target, COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key), PROC_REF(remove_overlay)) - -/datum/element/appearance_on_aggro/proc/remove_overlay(mob/living/source) - SIGNAL_HANDLER - - source.cut_overlay(overlay_path) - -/datum/element/appearance_on_aggro/Detach(datum/target) - . = ..() - UnregisterSignal(target, list(COMSIG_AI_BLACKBOARD_KEY_SET(target_key), COMSIG_AI_BLACKBOARD_KEY_CLEARED(target_key))) - -/datum/element/appearance_on_aggro/proc/add_overlay(mob/living/source) - SIGNAL_HANDLER - var/atom/target = source.ai_controller.blackboard[target_key] - if(isnull(target)) - return - source.add_overlay(overlay_path) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm new file mode 100644 index 00000000000..7f40e6ae0a1 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid.dm @@ -0,0 +1,56 @@ +//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. +//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. +/mob/living/basic/mega_arachnid + name = "mega arachnid" + desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." + icon = 'icons/mob/simple/jungle/arachnid.dmi' + icon_state = "arachnid" + icon_living = "arachnid" + icon_dead = "arachnid_dead" + mob_biotypes = MOB_ORGANIC|MOB_BUG + melee_damage_lower = 30 + melee_damage_upper = 30 + maxHealth = 300 + health = 300 + + pixel_x = -16 + base_pixel_x = -16 + + habitable_atmos = list("min_oxy" = 0, "max_oxy" = 0, "min_plas" = 0, "max_plas" = 0, "min_co2" = 0, "max_co2" = 0, "min_n2" = 0, "max_n2" = 0) + faction = list(FACTION_JUNGLE) + obj_damage = 30 + environment_smash = ENVIRONMENT_SMASH_WALLS + minimum_survivable_temperature = T0C + maximum_survivable_temperature = T0C + 450 + status_flags = NONE + lighting_cutoff_red = 5 + lighting_cutoff_green = 20 + lighting_cutoff_blue = 25 + mob_size = MOB_SIZE_LARGE + + speak_emote = list("chitters") + attack_sound = 'sound/weapons/bladeslice.ogg' + attack_vis_effect = ATTACK_EFFECT_SLASH + ai_controller = /datum/ai_controller/basic_controller/mega_arachnid + alpha = 40 + +/mob/living/basic/mega_arachnid/Initialize(mapload) + . = ..() + var/datum/action/cooldown/spell/pointed/projectile/flesh_restraints/restrain = new(src) + var/datum/action/small_sprite/mega_arachnid/mini_arachnid = new(src) + var/datum/action/cooldown/mob_cooldown/secrete_acid/acid_spray = new(src) + acid_spray.Grant(src) + restrain.Grant(src) + mini_arachnid.Grant(src) + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + AddComponent(/datum/component/appearance_on_aggro, alpha_on_aggro = 255, alpha_on_deaggro = alpha) + AddComponent(/datum/component/tree_climber, climbing_distance = 15) + ai_controller.set_blackboard_key(BB_ARACHNID_RESTRAIN, restrain) + ai_controller.set_blackboard_key(BB_ARACHNID_SLIP, acid_spray) + +/mob/living/basic/mega_arachnid/Login() + . = ..() + if(!. || !client) + return FALSE + + animate(src, alpha = 255, time = 2 SECONDS) //make them visible diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm new file mode 100644 index 00000000000..e8c4d1723e7 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_abilities.dm @@ -0,0 +1,80 @@ + +/datum/action/cooldown/spell/pointed/projectile/flesh_restraints + name = "fleshy restraints" + desc = "Launch at your prey to immobilize them." + button_icon = 'icons/obj/restraints.dmi' + button_icon_state = "flesh_snare" + + cooldown_time = 6 SECONDS + spell_requirements = NONE + + active_msg = "You prepare to throw a restraint at your target!" + cast_range = 8 + projectile_type = /obj/projectile/mega_arachnid + +/obj/projectile/mega_arachnid + name = "flesh snare" + icon_state = "tentacle_end" + damage = 0 + +/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) + . = ..() + if(!iscarbon(target) || blocked >= 100) + return + var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/restraint = new(get_turf(target)) + restraint.spring_trap(null, target) + +/obj/item/restraints/legcuffs/beartrap/mega_arachnid + name = "fleshy restraints" + desc = "Used by mega arachnids to immobilize their prey." + flags_1 = NONE + item_flags = DROPDEL + icon_state = "flesh_snare" + armed = TRUE + +/obj/item/restraints/legcuffs/beartrap/mega_arachnid/Initialize(mapload) + . = ..() + AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) + + +/datum/action/cooldown/mob_cooldown/secrete_acid + name = "Secrete Acid" + button_icon = 'icons/effects/acid.dmi' + button_icon_state = "default" + desc = "Secrete a slippery acid!" + cooldown_time = 15 SECONDS + melee_cooldown_time = 0 SECONDS + click_to_activate = FALSE + +/datum/action/cooldown/mob_cooldown/secrete_acid/Activate(atom/target_atom) + RegisterSignal(owner, COMSIG_MOVABLE_MOVED, PROC_REF(release_acid)) + addtimer(CALLBACK(src, PROC_REF(deactivate_ability)), 3 SECONDS) + StartCooldown() + return TRUE + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/release_acid() + SIGNAL_HANDLER + + var/turf/current_turf = owner.loc + if(locate(/obj/effect/slippery_acid) in current_turf.contents) + return + + new /obj/effect/slippery_acid(current_turf) + +/datum/action/cooldown/mob_cooldown/secrete_acid/proc/deactivate_ability() + UnregisterSignal(owner, COMSIG_MOVABLE_MOVED) + +/obj/effect/slippery_acid + name = "slippery acid" + icon = 'icons/effects/acid.dmi' + icon_state = "default" + layer = BELOW_MOB_LAYER + plane = GAME_PLANE + anchored = TRUE + /// how long does the acid exist for + var/duration_time = 5 SECONDS + +/obj/effect/slippery_acid/Initialize(mapload) + . = ..() + AddComponent(/datum/component/slippery, 6 SECONDS) + QDEL_IN(src, duration_time) diff --git a/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm new file mode 100644 index 00000000000..e2c67af2467 --- /dev/null +++ b/code/modules/mob/living/basic/jungle/mega_arachnid/mega_arachnid_ai.dm @@ -0,0 +1,79 @@ +/datum/ai_controller/basic_controller/mega_arachnid + blackboard = list( + BB_TARGETTING_DATUM = new /datum/targetting_datum/basic, + BB_BASIC_MOB_FLEEING = TRUE, + ) + + ai_movement = /datum/ai_movement/basic_avoidance + idle_behavior = /datum/idle_behavior/idle_random_walk + planning_subtrees = list( + /datum/ai_planning_subtree/simple_find_target, + /datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain, + /datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid, + /datum/ai_planning_subtree/flee_target/mega_arachnid, + /datum/ai_planning_subtree/climb_trees, + /datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance, + ) + +///destroy surveillance objects to boost our stealth +/datum/ai_planning_subtree/find_and_hunt_target/destroy_surveillance + target_key = BB_SURVEILLANCE_TARGET + finding_behavior = /datum/ai_behavior/find_hunt_target/find_active_surveillance + hunting_behavior = /datum/ai_behavior/hunt_target/unarmed_attack_target + hunt_targets = list(/obj/machinery/camera, /obj/machinery/light) + hunt_range = 7 + +/datum/ai_behavior/find_hunt_target/find_active_surveillance + +/datum/ai_behavior/find_hunt_target/find_active_camera/valid_dinner(mob/living/source, obj/machinery/dinner, radius) + if(dinner.machine_stat & BROKEN) + return FALSE + + return can_see(source, dinner, radius) + +///spray slippery acid as we flee! +/datum/ai_planning_subtree/flee_target/mega_arachnid + flee_behaviour = /datum/ai_behavior/run_away_from_target/mega_arachnid + +/datum/ai_planning_subtree/flee_target/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + if(!controller.blackboard[BB_BASIC_MOB_FLEEING]) + return + var/datum/action/cooldown/slip_acid = controller.blackboard[BB_ARACHNID_SLIP] + + if(!QDELETED(slip_acid) && slip_acid.IsAvailable()) + controller.queue_behavior(/datum/ai_behavior/use_mob_ability, BB_ARACHNID_SLIP) + + return ..() + +/datum/ai_behavior/run_away_from_target/mega_arachnid + clear_failed_targets = FALSE + run_distance = 5 + +///only engage in melee combat against cuffed targets, otherwise keep throwing restraints at them +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid + ///minimum health our target must be before we can attack them + var/minimum_health = 50 + +/datum/ai_planning_subtree/basic_melee_attack_subtree/mega_arachnid/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/atom/target = controller.blackboard[BB_BASIC_MOB_CURRENT_TARGET] + if(!ishuman(target)) + return ..() + + var/mob/living/carbon/human_target = target + if(!human_target.legcuffed && human_target.health > minimum_health) + return + + return ..() + +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain + ability_key = BB_ARACHNID_RESTRAIN + +/// only fire ability at humans if they are not cuffed +/datum/ai_planning_subtree/targeted_mob_ability/arachnid_restrain/SelectBehaviors(datum/ai_controller/controller, seconds_per_tick) + var/mob/living/target = controller.blackboard[target_key] + if(!ishuman(target)) + return + var/mob/living/carbon/human_target = target + if(human_target.legcuffed) + return + return ..() diff --git a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm index df4ed505f3d..db0d310a71c 100644 --- a/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm +++ b/code/modules/mob/living/basic/space_fauna/hivebot/_hivebot.dm @@ -42,7 +42,7 @@ . = ..() var/static/list/death_loot = list(/obj/effect/decal/cleanable/robot_debris) AddElement(/datum/element/death_drops, death_loot) - AddElement(/datum/element/appearance_on_aggro, overlay_icon = icon, overlay_state = "[initial(icon_state)]_attack") + AddComponent(/datum/component/appearance_on_aggro, overlay_icon = icon, overlay_state = "[initial(icon_state)]_attack") if(!ranged_attacker) return AddComponent(/datum/component/ranged_attacks, /obj/item/ammo_casing/hivebot, cooldown_time = ranged_attack_cooldown) diff --git a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm b/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm deleted file mode 100644 index b7caeb42c14..00000000000 --- a/code/modules/mob/living/simple_animal/hostile/jungle/mega_arachnid.dm +++ /dev/null @@ -1,84 +0,0 @@ -//Large and powerful, but timid. It won't engage anything above 50 health, or anything without legcuffs. -//It can fire fleshy snares that legcuff anyone that it hits, making them look especially tasty to the arachnid. -/mob/living/simple_animal/hostile/jungle/mega_arachnid - name = "mega arachnid" - desc = "Though physically imposing, it prefers to ambush its prey, and it will only engage with an already crippled opponent." - icon = 'icons/mob/simple/jungle/arachnid.dmi' - icon_state = "arachnid" - icon_living = "arachnid" - icon_dead = "arachnid_dead" - mob_biotypes = MOB_ORGANIC|MOB_BUG - melee_damage_lower = 30 - melee_damage_upper = 30 - maxHealth = 300 - health = 300 - speed = 1 - ranged = 1 - pixel_x = -16 - base_pixel_x = -16 - move_to_delay = 10 - aggro_vision_range = 9 - speak_emote = list("chitters") - attack_sound = 'sound/weapons/bladeslice.ogg' - attack_vis_effect = ATTACK_EFFECT_SLASH - ranged_cooldown_time = 60 - projectiletype = /obj/projectile/mega_arachnid - projectilesound = 'sound/weapons/pierce.ogg' - alpha = 50 - - footstep_type = FOOTSTEP_MOB_CLAW - var/datum/action/small_sprite/mini_arachnid = new/datum/action/small_sprite/mega_arachnid() - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Life(seconds_per_tick = SSMOBS_DT, times_fired) - ..() - if(target && ranged_cooldown > world.time && iscarbon(target)) - var/mob/living/carbon/C = target - if(!C.legcuffed && C.health < 50) - retreat_distance = 9 - minimum_distance = 9 - alpha = 125 - return - retreat_distance = 0 - minimum_distance = 0 - alpha = 255 - - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Aggro() - ..() - alpha = 255 - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/LoseAggro() - ..() - alpha = 50 - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/Initialize(mapload) - . = ..() - add_cell_sample() - mini_arachnid.Grant(src) - -/mob/living/simple_animal/hostile/jungle/mega_arachnid/add_cell_sample() - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) - -/obj/projectile/mega_arachnid - name = "flesh snare" - icon_state = "tentacle_end" - damage = 0 - -/obj/projectile/mega_arachnid/on_hit(atom/target, blocked = FALSE) - if(iscarbon(target) && blocked < 100) - var/obj/item/restraints/legcuffs/beartrap/mega_arachnid/B = new /obj/item/restraints/legcuffs/beartrap/mega_arachnid(get_turf(target)) - B.spring_trap(null, target) - return ..() - -/obj/item/restraints/legcuffs/beartrap/mega_arachnid - name = "fleshy restraints" - desc = "Used by mega arachnids to immobilize their prey." - item_flags = DROPDEL - flags_1 = NONE - icon_state = "flesh_snare" - armed = TRUE - -/obj/item/restraints/legcuffs/beartrap/mega_arachnid/Initialize(mapload) - . = ..() - AddElement(/datum/element/swabable, CELL_LINE_TABLE_MEGA_ARACHNID, CELL_VIRUS_TABLE_GENERIC_MOB, 1, 5) diff --git a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm index 01d190c5889..1210e5527eb 100644 --- a/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm +++ b/code/modules/research/xenobiology/vatgrowing/samples/cell_lines/common.dm @@ -736,6 +736,6 @@ /datum/reagent/drug/nicotine = -1, /datum/reagent/toxin/pestkiller = -1) - resulting_atoms = list(/mob/living/simple_animal/hostile/jungle/mega_arachnid = 1) + resulting_atoms = list(/mob/living/basic/mega_arachnid = 1) #undef VAT_GROWTH_RATE diff --git a/code/modules/unit_tests/simple_animal_freeze.dm b/code/modules/unit_tests/simple_animal_freeze.dm index baa58cb21ad..2390a9cf74b 100644 --- a/code/modules/unit_tests/simple_animal_freeze.dm +++ b/code/modules/unit_tests/simple_animal_freeze.dm @@ -144,7 +144,6 @@ /mob/living/simple_animal/hostile/illusion/mirage, /mob/living/simple_animal/hostile/jungle, /mob/living/simple_animal/hostile/jungle/leaper, - /mob/living/simple_animal/hostile/jungle/mega_arachnid, /mob/living/simple_animal/hostile/jungle/mook, /mob/living/simple_animal/hostile/jungle/seedling, /mob/living/simple_animal/hostile/megafauna, diff --git a/tgstation.dme b/tgstation.dme index 038cfdb72d4..b36b24fdf83 100644 --- a/tgstation.dme +++ b/tgstation.dme @@ -984,6 +984,7 @@ #include "code\datums\components\aggro_emote.dm" #include "code\datums\components\ai_retaliate_advanced.dm" #include "code\datums\components\anti_magic.dm" +#include "code\datums\components\appearance_on_aggro.dm" #include "code\datums\components\aquarium_content.dm" #include "code\datums\components\area_based_godmode.dm" #include "code\datums\components\area_sound_manager.dm" @@ -1297,7 +1298,6 @@ #include "code\datums\elements\ai_target_damagesource.dm" #include "code\datums\elements\amputating_limbs.dm" #include "code\datums\elements\animal_variety.dm" -#include "code\datums\elements\appearance_on_aggro.dm" #include "code\datums\elements\art.dm" #include "code\datums\elements\atmos_requirements.dm" #include "code\datums\elements\atmos_sensitive.dm" @@ -4227,6 +4227,9 @@ #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp.dm" #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_abilities.dm" #include "code\modules\mob\living\basic\icemoon\ice_whelp\ice_whelp_ai.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_abilities.dm" +#include "code\modules\mob\living\basic\jungle\mega_arachnid\mega_arachnid_ai.dm" #include "code\modules\mob\living\basic\lavaland\mining.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\_bileworm.dm" #include "code\modules\mob\living\basic\lavaland\bileworm\bileworm_actions.dm" @@ -4544,7 +4547,6 @@ #include "code\modules\mob\living\simple_animal\hostile\gorilla\visuals_icons.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\_jungle_mobs.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\leaper.dm" -#include "code\modules\mob\living\simple_animal\hostile\jungle\mega_arachnid.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\mook.dm" #include "code\modules\mob\living\simple_animal\hostile\jungle\seedling.dm" #include "code\modules\mob\living\simple_animal\hostile\megafauna\_megafauna.dm"