diff --git a/code/__DEFINES/ai/swarmer_defines.dm b/code/__DEFINES/ai/swarmer_defines.dm deleted file mode 100644 index fd77592ce38..00000000000 --- a/code/__DEFINES/ai/swarmer_defines.dm +++ /dev/null @@ -1,9 +0,0 @@ -// Swarmers -/// Key where we store the replication ability -#define BB_SWARMER_REPLICATE_ACTION "BB_swarmer_replicate_action" -/// Our construction target -#define BB_SWARMER_CONSTRUCT_TARGET "BB_swarmer_construct_target" -/// Key where we define the trap construction ability -#define BB_SWARMER_TRAP_ACTION "BB_swarmer_trap_action" -/// Key where we define the barrier construction ability -#define BB_SWARMER_BARRIER_ACTION "BB_swarmer_barrier_action" diff --git a/code/__HELPERS/trait_helpers.dm b/code/__HELPERS/trait_helpers.dm index 8f505f9003c..0a5574357d7 100644 --- a/code/__HELPERS/trait_helpers.dm +++ b/code/__HELPERS/trait_helpers.dm @@ -565,11 +565,6 @@ Remember to update _globalvars/traits.dm if you're adding/removing/renaming trai /// A web is being spun on this turf presently #define TRAIT_SPINNING_WEB_TURF "spinning_web_turf" -/// A swarmer construct is being built here -#define TRAIT_SWARMER_CONSTRUCTION "swarmer_construction_turf" -/// A swarmer is deconstructing this already -#define TRAIT_SWARMER_DISINTEGRATING "swarmer_disintegrating" - //***** EFFECT TRAITS *****// // Causes the effect to go through a teleporter instead of being deleted by it. #define TRAIT_EFFECT_CAN_TELEPORT "trait_effect_can_teleport" diff --git a/code/_globalvars/lists/mob_lists.dm b/code/_globalvars/lists/mob_lists.dm index d55e3db5c14..b345bdef7fa 100644 --- a/code/_globalvars/lists/mob_lists.dm +++ b/code/_globalvars/lists/mob_lists.dm @@ -37,83 +37,6 @@ GLOBAL_LIST_EMPTY(hear_radio_list) //Mobs that hear the radio even if there's GLOBAL_LIST_EMPTY(emote_list) -/// Blacklist of types that swarmers should not touch -GLOBAL_LIST_INIT(swarmer_blacklist, list( - /obj/item/gun, - /turf/simulated/floor, - /obj/structure/swarmer, - /obj/structure/flora, - /turf/simulated/wall/indestructible, - /obj/machinery/atmospherics, - /obj/structure/particle_accelerator, - /obj/machinery/field/generator, - /obj/machinery/chem_dispenser, - /obj/machinery/nuclearbomb, - /obj/structure/reagent_dispensers/fueltank, - /obj/structure/cable, - /obj/structure/fans/tiny, - /obj/structure/holosign/barrier/atmos, - /obj/machinery/tcomms, - /obj/machinery/message_server, - /obj/machinery/blackbox_recorder, - /obj/machinery/power, - /obj/machinery/cryopod, - /obj/item/mmi, - /obj/item/organ/internal/brain, - /obj/machinery/computer/cryopod, - /obj/machinery/porta_turret, - /obj/machinery/clonepod, - /obj/structure/shuttle/engine, - /obj/machinery/hydroponics/soil, - /obj/machinery/field/containment, - /obj/machinery/gravity_generator, - /mob/living/basic/swarmer, - /obj/item/stack/sheet/wood, - /obj/structure/table_frame/wood, - /obj/structure/signpost/wood, - /obj/structure/spirit_board, - /obj/structure/mineral_door/wood, - /obj/structure/falsewall/wood, - /obj/structure/dresser, - /obj/structure/door_assembly/door_assembly_wood, - /obj/machinery/door/airlock/wood, - /obj/item/storage/bag/plants/seed_sorting_tray, - /obj/structure/displaycase_chassis, - /obj/item/shield/riot/buckler, - /obj/item/popsicle_stick, - /obj/item/nullrod/claymore/bostaff, - /obj/item/melee/classic_baton, - /obj/item/storage/fancy/cigars/cohiba, - /obj/item/stack/tile/wood, - /obj/item/clothing/shoes/sandal, - /obj/item/melee/baseball_bat, - /obj/item/reagent_containers/glass/bucket/wooden, - /obj/item/cultivator/rake, - /obj/item/mounted/noticeboard, - /obj/item/reagent_containers/drinks/mug/wood, - /obj/item/match/firebrand, - /obj/structure/chair/wood, - /obj/structure/barricade/wooden, - /obj/structure/chair/stool/wood, - /obj/structure/bookcase, - /obj/structure/spear_rack, - /obj/structure/bed/wood, - /obj/structure/bed/dogbed, - /obj/structure/closet/coffin, - /obj/structure/lightable/torch, - /obj/structure/shelf/wood, - /obj/structure/chair/sofa/pew, - /obj/machinery/smartfridge/drying_rack, - /obj/item/weaponcrafting/stock, - /obj/structure/beebox, - /obj/item/honey_frame, - /obj/structure/ore_box, - /obj/structure/loom, - /obj/structure/fermenting_barrel, - /obj/machinery/compost_bin, - /obj/structure/roulette, -)) - // Dear God GLOBAL_LIST_INIT(migo_sounds, list( 'sound/items/bubblewrap.ogg', 'sound/items/change_jaws.ogg', 'sound/items/crowbar.ogg', 'sound/items/drink.ogg', diff --git a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm index e191d5d5465..d2691e9b3f2 100644 --- a/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm +++ b/code/datums/ai/basic_mobs/basic_subtrees/attack_obstacle_in_path.dm @@ -99,12 +99,3 @@ /datum/ai_planning_subtree/attack_obstacle_in_path/prowl attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches target_key = BB_PROWL_TARGET - -/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches - attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches - -/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls - attack_behaviour = /datum/ai_behavior/attack_obstructions/avoid_breaches/walls - -/datum/ai_behavior/attack_obstructions/avoid_breaches/walls - can_attack_turfs = TRUE diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index 955ff075ca3..07531535679 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -215,7 +215,6 @@ GLOBAL_LIST_EMPTY(event_last_fired) new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/demon_incursion, 10, TRUE, _first_run_time = 35 MINUTES), new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/disease_outbreak, 8, TRUE), new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/revenant, 9), - new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/swarmers, 9), new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_morph, 16, is_one_shot = TRUE), //new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_floor_cluwne, 15, is_one_shot = TRUE) //new /datum/event_meta(EVENT_LEVEL_MAJOR, /datum/event/spawn_pulsedemon, 20, is_one_shot = TRUE) diff --git a/code/modules/events/event_procs.dm b/code/modules/events/event_procs.dm index 217db61eaec..4e0f17a7bd8 100644 --- a/code/modules/events/event_procs.dm +++ b/code/modules/events/event_procs.dm @@ -53,13 +53,6 @@ return possible_areas -/proc/findMaintananceEventArea() // For maintanance events ONLY - var/list/maintanance_area = typecacheof(list(/area/station/maintenance)) - - var/list/possible_areas = typecache_filter_list(SSmapping.existing_station_areas, maintanance_area) - - return pick(possible_areas) - // Returns how many characters are currently active(not logged out, not AFK for more than 10 minutes) // with a specific role. // Note that this isn't sorted just by department, because e.g. having a roboticist shouldn't make meteors spawn. diff --git a/code/modules/events/swarmers.dm b/code/modules/events/swarmers.dm deleted file mode 100644 index cdc627ace26..00000000000 --- a/code/modules/events/swarmers.dm +++ /dev/null @@ -1,63 +0,0 @@ -/datum/event/swarmers - name = "Swarmer Infestation" - nominal_severity = EVENT_LEVEL_MAJOR - role_weights = list(ASSIGNMENT_ENGINEERING = 5, ASSIGNMENT_SECURITY = 3, ASSIGNMENT_CREW = 0.8) - role_requirements = list(ASSIGNMENT_ENGINEERING = 1, ASSIGNMENT_SECURITY = 1, ASSIGNMENT_CREW = 20) - /// The name of the notification for dchat - var/notify_title = "swarmer portal" - -/datum/event/swarmers/setup() - impact_area = findMaintananceEventArea() - -/datum/event/swarmers/start() - if(isnull(impact_area)) - log_debug("No valid event areas could be generated for swarmers.") - return - var/list/area_turfs = get_area_turfs(impact_area) - for(var/i in 1 to length(area_turfs)) - var/turf/T = pick_n_take(area_turfs) - if(T.is_blocked_turf()) - shuffle(area_turfs) - continue - // Give ghosts some time to jump there before it begins. - var/image/alert_overlay = image('icons/mob/swarmer.dmi', "ui_replicate") - notify_ghosts("\A [src] is about to spawn in [get_area(T)].", title = notify_title, source = T, alert_overlay = alert_overlay, flashwindow = FALSE, action = NOTIFY_FOLLOW) - addtimer(CALLBACK(src, PROC_REF(spawn_portal), T), 5 SECONDS) - return - - log_debug("swarmers failed to find a valid turf in [impact_area]") - -/datum/event/swarmers/proc/spawn_portal(location) - new /obj/effect/swarmer_portal(location) - -/obj/effect/swarmer_portal - // Swarmer Portal - name = "Swarmer Portal" - desc = "A shimmering portal, crackling and humming with live electricity." - icon = 'icons/obj/stationobjs.dmi' - icon_state = "portal" - light_range = 4 - - /// How many can we spawn - var/spawn_max = 1 - /// How many have spawned? - var/spawn_total = 0 - -/obj/effect/swarmer_portal/Initialize(mapload) - . = ..() - spawn_max = max(length(GLOB.crew_list) / 10, 1) - addtimer(CALLBACK(src, PROC_REF(spawn_next_swarmer)), 2 SECONDS) - -/obj/effect/swarmer_portal/proc/spawn_next_swarmer() - if(spawn_total < spawn_max) - make_mob(/mob/living/basic/swarmer) - addtimer(CALLBACK(src, PROC_REF(spawn_next_swarmer)), 2 SECONDS) - else - qdel(src) - -/obj/effect/swarmer_portal/proc/make_mob(mob_type) - var/mob/M = new mob_type(get_turf(src)) - M.faction = list("swarmer") - spawn_total++ - do_sparks(5, TRUE, src) - step(M, pick(GLOB.cardinal)) diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index 94378f48a35..46a2d46d044 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -795,15 +795,4 @@ return "[pick(syllables)][terminator]" return "[copytext_char(input, 1, min(7, length(input)))][terminator]" -/datum/language/swarmer - name = "Swarmer" - desc = "A heavily encoded alien binary pattern." - speech_verb = "tones" - ask_verb = "tones" - exclaim_verbs = list("tones") - colour = "say_quote" - key = "z" // Zwarmer...Or Zerg! - flags = RESTRICTED | HIVEMIND | NOBABEL - follow = TRUE - #undef SCRAMBLE_CACHE_LEN diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm deleted file mode 100644 index 03feca3189e..00000000000 --- a/code/modules/mob/living/basic/hostile/swarmers/swarmer.dm +++ /dev/null @@ -1,365 +0,0 @@ -// ===================== -// MARK: Swarmer -// ===================== -/mob/living/basic/swarmer - name = "swarmer" - desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely." - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer" - icon_living = "swarmer" - icon_dead = "swarmer_unactivated" - bubble_icon = "swarmer" - mob_biotypes = MOB_ROBOTIC - health = 50 - maxHealth = 50 - melee_damage_lower = 6 - melee_damage_upper = 10 - melee_damage_type = BURN - melee_attack_cooldown_min = 1.5 SECONDS - melee_attack_cooldown_max = 2.5 SECONDS - a_intent = INTENT_HARM - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - mob_size = MOB_SIZE_SMALL - pass_flags = PASSTABLE - ventcrawler = VENTCRAWLER_ALWAYS - light_color = LIGHT_COLOR_CYAN - attack_verb_continuous = "shocks" - attack_verb_simple = "shock" - friendly_verb_continuous = "pinches" - friendly_verb_simple = "pinch" - attack_sound = 'sound/effects/empulse.ogg' - faction = list("swarmer") - 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) - minimum_survivable_temperature = 0 - maximum_survivable_temperature = 500 - speak_emote = list("tones") - loot = list(/obj/effect/decal/cleanable/blood/gibs/robot) - death_message = "explodes with a sharp pop!" - basic_mob_flags = DEL_ON_DEATH - sentience_type = SENTIENCE_OTHER // No, you cannot sentience or mind-transfer into them - environment_smash = ENVIRONMENT_SMASH_RWALLS // EAT EVERYTHING - step_type = FOOTSTEP_MOB_CLAW - is_ranged = TRUE - projectile_type = /obj/projectile/beam/disabler - projectile_sound = 'sound/weapons/taser2.ogg' - ranged_cooldown = 1 SECONDS - ai_controller = /datum/ai_controller/basic_controller/swarmer - see_in_dark = 6 - light_range = 2 - light_color = LIGHT_COLOR_CYAN - step_type = FOOTSTEP_MOB_CLAW - loot = list( - /obj/effect/gibspawner/robot, - /obj/item/stack/ore/bluespace_crystal, - ) - - /// Swarmer actions - var/list/innate_actions = list( - /datum/action/cooldown/mob_cooldown/swarmer_trap = BB_SWARMER_TRAP_ACTION, - /datum/action/cooldown/mob_cooldown/swarmer_barrier = BB_SWARMER_BARRIER_ACTION, - /datum/action/cooldown/mob_cooldown/swarmer_replicate = BB_SWARMER_REPLICATE_ACTION, - ) - /// Resources the swarmer gains from consuming things - var/resources = 0 - /// Maximum possible resources a swarmer can have - var/resource_max = 100 - -/mob/living/basic/swarmer/Initialize(mapload) - . = ..() - AddComponent(/datum/component/ai_retaliate_advanced, CALLBACK(src, PROC_REF(retaliate_callback))) - add_language("Swarmer", 1) - verbs -= /mob/living/verb/pulled - updatename() - grant_actions_by_list(innate_actions) - set_default_language(GLOB.all_languages["Swarmer"]) - -/mob/living/basic/swarmer/proc/retaliate_callback(mob/living/attacker) - if(!istype(attacker)) - return - if(attacker.ai_controller) // Don't chain retaliates. - var/list/shitlist = attacker.ai_controller.blackboard[BB_BASIC_MOB_RETALIATE_LIST] - if(src in shitlist) - return - for(var/mob/living/basic/swarmer/lesser/the_swarm in oview(src, 7)) - if(the_swarm == attacker) // Do not commit suicide attacking yourself - continue - if(the_swarm.faction_check_mob(attacker, FALSE)) // Don't attack other swarmers - continue - the_swarm.ai_controller.insert_blackboard_key_lazylist(BB_BASIC_MOB_RETALIATE_LIST, attacker) - -/mob/living/basic/swarmer/proc/updatename() - real_name = "Swarmer [rand(100,999)]-[pick("kappa", "sigma", "beta", "omicron", "iota", "epsilon", "omega", "gamma", "delta", "tau", "alpha")]" - name = real_name - -/mob/living/basic/swarmer/get_status_tab_items() - var/list/status_tab_data = ..() - status_tab_data[++status_tab_data.len] = list("Resources:", "[resources] / [resource_max]") - return status_tab_data - -/mob/living/basic/swarmer/emp_act() - adjustHealth(35) - -/mob/living/basic/swarmer/death(gibbed) - do_sparks(3, 1, src) - . = ..() - -/mob/living/basic/swarmer/Login() // In case an admin gets a funny idea. - ..() - var/list/string_list = list() - string_list += "You are a swarmer, a weapon of a long dead civilization. Until further orders from your original masters are received, you must continue to consume and replicate." - string_list += "Clicking on any object will try to consume it, either deconstructing it into its components, destroying it, or integrating any materials it has into you if successful." - string_list += "Prime Directives:" - string_list += "1. Consume resources and replicate until there are no more resources left." - string_list += "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable." - string_list += "3. Defend yourself and your fellow machines." - to_chat(src, string_list.Join()) - -/mob/living/basic/swarmer/melee_attack(atom/target, list/modifiers, ignore_cooldown) - face_atom(target) - if(is_type_in_list(target, GLOB.swarmer_blacklist)) - to_chat(src, "Our sensors have designated this object important to station functionality or to our mission. Aborting.") - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - return FALSE - if(HAS_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING)) - to_chat(src, "This asset is already being converted into useable resources. Aborting.") - return FALSE - if(iswallturf(target)) - disintegrate_wall(target) - return FALSE - if(ismachinery(target)) - disintegrate_machine(target) - return FALSE - if(istype(target, /obj/structure)) - disintegrate_machine(target) - return FALSE - if(isitem(target)) - integrate(target) - return FALSE - if(!isliving(target)) - return ..() - var/mob/living/L = target - if(istype(L, /mob/living/basic/swarmer)) - to_chat(src, "We do not wish to harm one of our own. Aborting.") - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - return FALSE - if(L.stat == DEAD) - disintegrate_mob(target) - return FALSE - if(iscarbon(target)) - var/mob/living/carbon/C = target - if((!C.IsWeakened())) - L.apply_damage(30, STAMINA) - C.Confused(6 SECONDS) - C.Jitter(6 SECONDS) - return ..() - else if(C.canBeHandcuffed() && !C.handcuffed) - L.apply_damage(30, STAMINA) - var/obj/item/restraints/handcuffs/cable/cyan/cuffs = new /obj/item/restraints/handcuffs/cable/cyan(src) - playsound(loc, cuffs.cuffsound, 15, TRUE, -10) - if(do_mob(src, C, 1 SECONDS)) - cuffs.apply_cuffs(target, src) - return FALSE - // Make it go away. - disintegrate_mob(target) - return FALSE - if(issilicon(target)) - var/mob/living/silicon/S = target - S.apply_damage(30, STAMINA) - if(S.IsWeakened()) - disintegrate_mob(target) - - return ..() - -/mob/living/basic/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(!(flags & SHOCK_TESLA)) - return FALSE - return ..() - -/mob/living/basic/swarmer/proc/disintegrate_wall(turf/simulated/wall/target) - if(istype(target, /turf/simulated/wall/indestructible)) - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - return - if(spacecheck(target)) - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - return - new /obj/effect/temp_visual/swarmer(target.loc) - to_chat(src, "Beginning disintegration of [target].") - ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - if(!do_after_once(src, 1 SECONDS, target = target, attempt_cancel_message = "You stop disintegrating [target].", interaction_key = "disintegrate")) - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - return - resources = clamp(resources + 8, 0, resource_max) - adjustHealth(-40) - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - target.ex_act(EXPLODE_HEAVY) - -/mob/living/basic/swarmer/proc/disintegrate_machine(obj/machinery/target) - if(spacecheck(target)) - return - - new /obj/effect/temp_visual/swarmer/dismantle(target.loc) - to_chat(src, "Beginning disintegration of [target].") - ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - if(!do_after_once(src, 2.5 SECONDS, target = target, attempt_cancel_message = "You stop disintegrating [target].", interaction_key = "disintegrate")) - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - return - resources = clamp(resources + 10, 0, resource_max) - adjustHealth(-20) - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - if(istype(target, /obj/structure/reagent_dispensers)) - var/obj/structure/reagent_dispensers/dispenser = target - dispenser.boom() - return - target.deconstruct() - -/mob/living/basic/swarmer/proc/integrate(obj/item/target) - new /obj/effect/temp_visual/swarmer/integrate(target.loc) - resources = clamp(resources + 10, 0, resource_max) - adjustHealth(-10) - qdel(target) - -/mob/living/basic/swarmer/proc/disintegrate_mob(mob/living/target) - new /obj/effect/temp_visual/swarmer/integrate(target.loc) - ADD_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - to_chat(src, "Beginning integration of [target].") - if(!do_after_once(src, 1 SECONDS, target = target, attempt_cancel_message = "You stop integrating [target].", interaction_key = "disintegrate")) - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - return - REMOVE_TRAIT(target, TRAIT_SWARMER_DISINTEGRATING, src) - resources = clamp(resources + 50, 0, resource_max) - adjustHealth(-40) - if(isanimal_or_basicmob(target) || issilicon(target)) // Not crew? Are a silicon? Don't care. - target.gib() - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - return - ai_controller.clear_blackboard_key(BB_BASIC_MOB_CURRENT_TARGET) - disappear_mob(target) - -/mob/living/basic/swarmer/proc/disappear_mob(mob/target) - if(!is_station_level(z)) - to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") - return - - var/turf/simulated/floor/F = find_safe_turf(zlevels = z) - - if(!F) - return - - do_sparks(4, 0, target) - playsound(src,'sound/effects/sparks4.ogg', 50, TRUE) - do_teleport(target, F, 0) - -/mob/living/basic/swarmer/proc/spacecheck(atom/target) - for(var/turf/T in range(1, target)) - var/datum/gas_mixture/environment = T.get_readonly_air() - var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */ - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) - var/area/A = get_area(T) - if(isspaceturf(T) || istype(A, /area/shuttle) || istype(A, /area/space) || pressure_dangerlevel) - to_chat(src, "Destroying this object has the potential to cause a hull breach. Aborting.") - return TRUE - else if(istype(A, /area/station/engineering/engine/supermatter)) - to_chat(src, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - return TRUE - return FALSE - -// ===================== -// MARK: Lesser Swarmer -// ===================== - -/mob/living/basic/swarmer/lesser - name = "lesser swarmer" - desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely. This one is more fragile." - icon_state = "lesser_swarmer" - health = 35 - maxHealth = 35 - ai_controller = /datum/ai_controller/basic_controller/swarmer/lesser - loot = list( - /obj/effect/gibspawner/robot, - ) - innate_actions = list( - /datum/action/cooldown/mob_cooldown/swarmer_trap = BB_SWARMER_TRAP_ACTION, - /datum/action/cooldown/mob_cooldown/swarmer_barrier = BB_SWARMER_BARRIER_ACTION, - ) - -/mob/living/basic/swarmer/lesser/Initialize(mapload) - . = ..() - icon_state = pick("lesser_swarmer", "lesser_swarmer_2") - -/mob/living/basic/swarmer/lesser/updatename() - real_name = "Lesser Swarmer [rand(100,999)]-[pick("kappa", "sigma", "beta", "omicron", "iota", "epsilon", "omega", "gamma", "delta", "tau", "alpha")]" - name = real_name - -// ===================== -// MARK: Swarmer Structures -// ===================== - -/obj/structure/swarmer // Default swarmer effect object visual feedback - name = "swarmer ui" - desc = null - icon = 'icons/mob/swarmer.dmi' - icon_state = "ui_light" - layer = MOB_LAYER - anchored = TRUE - resistance_flags = FIRE_PROOF | UNACIDABLE | ACID_PROOF - light_color = LIGHT_COLOR_CYAN - max_integrity = 30 - anchored = TRUE - /// Light range - var/lon_range = 1 - -/obj/structure/swarmer/Initialize(mapload) - . = ..() - set_light(lon_range) - -/obj/structure/swarmer/play_attack_sound(damage_amount, damage_type = BRUTE, damage_flag = 0) - switch(damage_type) - if(BRUTE) - playsound(src, 'sound/weapons/egloves.ogg', 80, TRUE) - if(BURN) - playsound(src, 'sound/items/welder.ogg', 100, TRUE) - -/obj/structure/swarmer/emp_act() - do_sparks(3, 1, src) - qdel(src) - -/obj/structure/swarmer/trap - name = "swarmer trap" - desc = "A quickly assembled trap that electrifies living beings and overwhelms machine sensors. Will not retain its form if damaged enough." - icon_state = "trap" - max_integrity = 10 - -/obj/structure/swarmer/trap/Initialize(mapload) - . = ..() - var/static/list/loc_connections = list( - COMSIG_ATOM_ENTERED = PROC_REF(on_atom_entered), - ) - AddElement(/datum/element/connect_loc, loc_connections) - -/obj/structure/swarmer/trap/proc/on_atom_entered(datum/source, atom/movable/entered) - SIGNAL_HANDLER // COMSIG_ATOM_ENTERED - if(!isliving(entered)) - return - var/mob/living/L = entered - if(istype(L, /mob/living/basic/swarmer)) - return - playsound(loc,'sound/effects/snap.ogg', 50, 1, -1) - L.electrocute_act(100, src, 1, flags = SHOCK_NOGLOVES | SHOCK_ILLUSION) - L.Weaken(10 SECONDS) - qdel(src) - -/obj/structure/swarmer/barricade - name = "swarmer barricade" - desc = "A quickly assembled energy barricade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through." - icon_state = "barricade" - light_range = MINIMUM_USEFUL_LIGHT_RANGE - max_integrity = 50 - -/obj/structure/swarmer/barricade/CanPass(atom/movable/O) - if(istype(O, /mob/living/basic/swarmer)) - return TRUE - if(istype(O, /obj/projectile/beam/disabler)) - return TRUE diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm deleted file mode 100644 index 2efedd2717a..00000000000 --- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_actions.dm +++ /dev/null @@ -1,99 +0,0 @@ -/datum/action/cooldown/mob_cooldown/swarmer_trap - name = "Construct Shock Trap" - button_icon = 'icons/mob/swarmer.dmi' - button_icon_state = "ui_trap" - desc = "Construct a shock trap, using 25 resources." - click_to_activate = FALSE - melee_cooldown_time = CLICK_CD_CLICK_ABILITY - cooldown_time = 60 SECONDS - shared_cooldown = NONE - -/datum/action/cooldown/mob_cooldown/swarmer_trap/Activate(atom/target) - var/mob/living/basic/swarmer/user = target - if(!istype(user)) - to_chat(target, "Incompatible hardware detected. Aborting.") - return - var/turf/T = get_turf(user) - for(var/turf/turf_in_view in view(1, T)) - if(locate(/obj/structure/swarmer) in turf_in_view) - to_chat(user, "Location too close to existing hardware. Aborting.") - return - if(user.resources < 25) - to_chat(user, "Insufficient resources. Aborting.") - return - user.resources -= 25 - user.visible_message("[user] manufactures a sparking pylon.") - playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) - new /obj/structure/swarmer/trap(T) - StartCooldown() - -/datum/action/cooldown/mob_cooldown/swarmer_barrier - name = "Construct Barricade" - button_icon = 'icons/mob/swarmer.dmi' - button_icon_state = "ui_barricade" - desc = "Construct a barricade, using 25 resources." - click_to_activate = FALSE - melee_cooldown_time = CLICK_CD_CLICK_ABILITY - cooldown_time = 75 SECONDS - shared_cooldown = NONE - -/datum/action/cooldown/mob_cooldown/swarmer_barrier/Activate(atom/target) - var/mob/living/basic/swarmer/user = target - if(!istype(user)) - to_chat(target, "Incompatible hardware detected. Aborting.") - return - if(user.resources < 25) - to_chat(user, "Insufficient resources. Aborting.") - return - var/turf/T = get_turf(user) - for(var/turf/turf_in_view in view(1, T)) - if(locate(/obj/structure/swarmer) in turf_in_view) - to_chat(user, "Location too close to existing hardware. Aborting.") - return - if(!do_after_once(user, 2 SECONDS, target = T, attempt_cancel_message = "You stop building a barricade.", interaction_key = "swarmer_barricade_create")) - return - // Check again to make sure they still have the requirements - if(user.resources < 25) - to_chat(user, "Insufficient resources. Aborting.") - return - T = get_turf(user) - for(var/turf/turf_in_view in view(1, T)) - if(locate(/obj/structure/swarmer) in turf_in_view) - to_chat(user, "Location too close to existing hardware. Aborting.") - return - user.resources -= 25 - user.visible_message("[user] manufactures a holographic shield.") - playsound(get_turf(user), 'sound/machines/click.ogg', 50, TRUE) - new /obj/structure/swarmer/barricade(T) - StartCooldown() - -/datum/action/cooldown/mob_cooldown/swarmer_replicate - name = "Replicate" - button_icon = 'icons/mob/swarmer.dmi' - button_icon_state = "ui_replicate" - desc = "Construct a new swarmer, using 50 resources." - click_to_activate = FALSE - cooldown_time = 20 SECONDS - melee_cooldown_time = CLICK_CD_CLICK_ABILITY - shared_cooldown = NONE - -/datum/action/cooldown/mob_cooldown/swarmer_replicate/Activate(atom/target) - var/mob/living/basic/swarmer/user = target - if(!istype(user)) - to_chat(target, "Incompatible hardware detected. Aborting.") - return - if(user.resources < 50) - to_chat(user, "Insufficient resources. Aborting.") - return - if(!do_after_once(user, 4 SECONDS, target = user, attempt_cancel_message = "You stop building a new swarmer.", interaction_key = "swarmer_replicate_create")) - return - // Check again after the do-after. - if(user.resources < 50) - to_chat(user, "Insufficient resources. Aborting.") - return - var/turf/T = get_turf(user) - user.resources -= 50 - user.visible_message("[user] manufactures a new swarmer.") - playsound(get_turf(user), 'sound/items/rped.ogg', 50, TRUE) - new /mob/living/basic/swarmer/lesser(T) - StartCooldown() diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm deleted file mode 100644 index 4efc90e82e9..00000000000 --- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_ai.dm +++ /dev/null @@ -1,284 +0,0 @@ -/// Attacks people it can see, disintegrates things based on priority. -/datum/ai_controller/basic_controller/swarmer - blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, - BB_AGGRO_RANGE = 4, - ) - ai_movement = /datum/ai_movement/jps - idle_behavior = /datum/idle_behavior/idle_random_walk - - ai_traits = AI_FLAG_PAUSE_DURING_DO_AFTER - - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/target_retaliate/check_faction, - /datum/ai_planning_subtree/ranged_skirmish/avoid_friendly, - /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - /datum/ai_planning_subtree/swarmer_replicate, - /datum/ai_planning_subtree/swarmer_find_construction_target, - /datum/ai_planning_subtree/swarmer_create_trap, - /datum/ai_planning_subtree/swarmer_create_barricade, - /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls/swarmer_hunting, - /datum/ai_planning_subtree/find_and_hunt_target/corpses/swarmer, - /datum/ai_planning_subtree/find_and_hunt_target/swarmer_objects, - /datum/ai_planning_subtree/find_and_hunt_target/prowl, - ) - -/// Attacks people it can see, disintegrates things based on priority. More aggressive. -/datum/ai_controller/basic_controller/swarmer/lesser - blackboard = list( - BB_TARGETING_STRATEGY = /datum/targeting_strategy/basic, - BB_AGGRO_RANGE = 8, - ) - planning_subtrees = list( - /datum/ai_planning_subtree/simple_find_target, - /datum/ai_planning_subtree/target_retaliate/check_faction, - /datum/ai_planning_subtree/ranged_skirmish/avoid_friendly, - /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls, - /datum/ai_planning_subtree/basic_melee_attack_subtree, - /datum/ai_planning_subtree/swarmer_find_construction_target, - /datum/ai_planning_subtree/swarmer_create_trap, - /datum/ai_planning_subtree/swarmer_create_barricade, - /datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls/swarmer_hunting, - /datum/ai_planning_subtree/find_and_hunt_target/corpses/swarmer, - /datum/ai_planning_subtree/find_and_hunt_target/swarmer_objects, - /datum/ai_planning_subtree/find_and_hunt_target/prowl, - ) - -/datum/ai_planning_subtree/find_and_hunt_target/corpses/swarmer - hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/swarmer - hunt_range = 4 - -/datum/ai_planning_subtree/find_and_hunt_target/swarmer_objects - finding_behavior = /datum/ai_behavior/find_hunt_target/swarmer_objects - hunting_behavior = /datum/ai_behavior/hunt_target/interact_with_target/swarmer - hunt_targets = list(/obj/item, /obj/structure, /obj/machinery, /turf/simulated/wall, /mob/living) - hunt_range = 4 - -/datum/ai_planning_subtree/attack_obstacle_in_path/avoid_breaches/walls/swarmer_hunting - target_key = BB_CURRENT_HUNTING_TARGET - -/datum/ai_behavior/hunt_target/interact_with_target/swarmer - always_reset_target = TRUE - hunt_cooldown = 0 SECONDS - -/datum/ai_behavior/find_hunt_target/swarmer_objects - -/datum/ai_behavior/find_hunt_target/swarmer_objects/valid_dinner(mob/living/source, atom/dinner, radius) - if(is_type_in_list(dinner, GLOB.swarmer_blacklist)) - return FALSE - if(HAS_TRAIT(dinner, TRAIT_SWARMER_DISINTEGRATING)) - return FALSE - if(isitem(dinner) && !isturf(dinner.loc)) - return FALSE - if(isliving(dinner)) - var/mob/living/M = dinner - if(M.stat == DEAD) - return TRUE - for(var/turf/T in range(1, dinner)) - var/datum/gas_mixture/environment = T.get_readonly_air() - var/environment_pressure = environment.return_pressure() - var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */ - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) - var/area/A = get_area(T) - if(isspaceturf(T) || istype(A, /area/shuttle) || istype(A, /area/space) || istype(A, /area/station/engineering/engine/supermatter) || pressure_dangerlevel) - return FALSE - return TRUE - -/// Run the barricade construction behaviour if we have an ability to use for it -/datum/ai_planning_subtree/swarmer_replicate - /// Key where the trap action is stored - var/action_key = BB_SWARMER_REPLICATE_ACTION - -/datum/ai_planning_subtree/swarmer_replicate/select_behaviors(datum/ai_controller/controller, seconds_per_tick) - var/mob/living/basic/swarmer/user = controller.pawn - if(!istype(user)) - return - if(user.resources < 50) - return - if(!controller.blackboard_key_exists(action_key)) - return - var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key] - if(replicate_action.IsAvailable()) - controller.queue_behavior(/datum/ai_behavior/swarmer_replicate, action_key) - return SUBTREE_RETURN_FINISH_PLANNING - -/// REPLICATE -/datum/ai_behavior/swarmer_replicate - required_distance = 0 - behavior_flags = AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - -/datum/ai_behavior/swarmer_replicate/setup(datum/ai_controller/controller, action_key) - var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key] - var/mob/living/basic/swarmer/user = controller.pawn - if(!istype(user)) - return FALSE - if(!replicate_action || user.resources < 50) - return FALSE - return ..() - -/datum/ai_behavior/swarmer_replicate/perform(seconds_per_tick, datum/ai_controller/controller, action_key) - . = ..() - var/datum/action/cooldown/mob_cooldown/swarmer_replicate/replicate_action = controller.blackboard[action_key] - var/result = replicate_action.Trigger() - if(result) - return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED - return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED - -/// Search for a nearby location to build on -/datum/ai_planning_subtree/swarmer_find_construction_target - -/datum/ai_planning_subtree/swarmer_find_construction_target/select_behaviors(datum/ai_controller/controller, seconds_per_tick) - var/mob/living/basic/swarmer/user = controller.pawn - if(!istype(user)) - return - if(user.resources < 25) - return - controller.queue_behavior(/datum/ai_behavior/swarmer_find_construction_target) - -/// Find a nearby clear turf and store it -/datum/ai_behavior/swarmer_find_construction_target - action_cooldown = 5 SECONDS - /// Where do we store the target data - var/target_key = BB_SWARMER_CONSTRUCT_TARGET - /// How far do we look for valid turfs? - var/scan_range = 5 - -/datum/ai_behavior/swarmer_find_construction_target/perform(seconds_per_tick, datum/ai_controller/controller) - . = ..() - var/mob/living/swarmer = controller.pawn - var/atom/current_target = controller.blackboard[target_key] - if(current_target && !(locate(/obj/structure/swarmer) in current_target)) - // Already got a target - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - - controller.clear_blackboard_key(target_key) - var/turf/our_turf = get_turf(swarmer) - if(is_valid_construction_turf(our_turf, swarmer)) - controller.set_blackboard_key(target_key, our_turf) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED - - var/list/turfs_by_range = list() - for(var/i in 1 to scan_range) - turfs_by_range["[i]"] = list() - for(var/turf/turf_in_view in oview(scan_range, our_turf)) - if(!is_valid_construction_turf(turf_in_view, swarmer)) - continue - turfs_by_range["[get_dist(our_turf, turf_in_view)]"] += turf_in_view - - var/list/final_turfs - for(var/list/turf_list as anything in turfs_by_range) - if(length(turfs_by_range[turf_list])) - final_turfs = turfs_by_range[turf_list] - break - if(!length(final_turfs)) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - - controller.set_blackboard_key(target_key, pick(final_turfs)) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED - -/datum/ai_behavior/swarmer_find_construction_target/proc/is_valid_construction_turf(turf/target_turf, mob/living/swarmer) - for(var/turf/turf_in_view in view(1, target_turf)) - if(locate(/obj/structure/swarmer) in turf_in_view) - return FALSE - if(HAS_TRAIT(target_turf, TRAIT_SWARMER_CONSTRUCTION)) - return FALSE - if(isspaceturf(target_turf)) - return FALSE - var/datum/gas_mixture/environment = target_turf.get_readonly_air() - var/datum/tlv/cur_tlv = new/datum/tlv(ONE_ATMOSPHERE * 0.80, ONE_ATMOSPHERE *0.90, ONE_ATMOSPHERE * 1.10,ONE_ATMOSPHERE * 1.20) /* kpa */ - var/environment_pressure = environment.return_pressure() - var/pressure_dangerlevel = cur_tlv.get_danger_level(environment_pressure) - if(pressure_dangerlevel) - return FALSE - return !target_turf.is_blocked_turf(source_atom = swarmer) - -/// Run the trap construction behaviour if we have an ability to use for it -/datum/ai_planning_subtree/swarmer_create_trap - /// Key where the trap action is stored - var/action_key = BB_SWARMER_TRAP_ACTION - /// Key where the target turf is stored - var/target_key = BB_SWARMER_CONSTRUCT_TARGET - -/datum/ai_planning_subtree/swarmer_create_trap/select_behaviors(datum/ai_controller/controller, seconds_per_tick) - if(!controller.blackboard_key_exists(action_key) || !controller.blackboard_key_exists(target_key)) - return - var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key] - if(trap_action.IsAvailable()) - controller.queue_behavior(/datum/ai_behavior/swarmer_create_trap, action_key, target_key) - return SUBTREE_RETURN_FINISH_PLANNING - -/// Move to an open nearby turf and build a trap -/datum/ai_behavior/swarmer_create_trap - action_cooldown = 15 SECONDS // We don't want them doing this too quickly - required_distance = 0 - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - -/datum/ai_behavior/swarmer_create_trap/setup(datum/ai_controller/controller, action_key, target_key) - var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key] - var/turf/target_turf = controller.blackboard[target_key] - var/mob/living/basic/swarmer/user = controller.pawn - if(!istype(user)) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if(!trap_action || !target_turf || user.resources < 25) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - - set_movement_target(controller, target_turf) - return ..() - -/datum/ai_behavior/swarmer_create_trap/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key) - . = ..() - var/datum/action/cooldown/mob_cooldown/swarmer_trap/trap_action = controller.blackboard[action_key] - var/result = trap_action.Trigger() - if(result) - return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_SUCCEEDED - return AI_BEHAVIOR_INSTANT | AI_BEHAVIOR_FAILED - -/datum/ai_behavior/swarmer_create_trap/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key) - controller.clear_blackboard_key(target_key) - return ..() - -/// Run the barricade construction behaviour if we have an ability to use for it -/datum/ai_planning_subtree/swarmer_create_barricade - /// Key where the trap action is stored - var/action_key = BB_SWARMER_BARRIER_ACTION - /// Key where the target turf is stored - var/target_key = BB_SWARMER_CONSTRUCT_TARGET - -/datum/ai_planning_subtree/swarmer_create_barricade/select_behaviors(datum/ai_controller/controller, seconds_per_tick) - if(!controller.blackboard_key_exists(action_key) || !controller.blackboard_key_exists(target_key)) - return - var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key] - if(barrier_action.IsAvailable()) - controller.queue_behavior(/datum/ai_behavior/swarmer_create_trap, action_key, target_key) - return SUBTREE_RETURN_FINISH_PLANNING - -/// Move to an open nearby turf and build a barricade -/datum/ai_behavior/swarmer_create_barricade - action_cooldown = 45 SECONDS - required_distance = 0 - behavior_flags = AI_BEHAVIOR_REQUIRE_MOVEMENT | AI_BEHAVIOR_CAN_PLAN_DURING_EXECUTION - -/datum/ai_behavior/swarmer_create_barricade/setup(datum/ai_controller/controller, action_key, target_key) - var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key] - var/turf/target_turf = controller.blackboard[target_key] - var/mob/living/basic/swarmer/user = controller.pawn - if(!istype(user)) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - if(!barrier_action || !target_turf || user.resources < 25) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - - set_movement_target(controller, target_turf) - return ..() - -/datum/ai_behavior/swarmer_create_barricade/perform(seconds_per_tick, datum/ai_controller/controller, action_key, target_key) - . = ..() - var/datum/action/cooldown/mob_cooldown/swarmer_barrier/barrier_action = controller.blackboard[action_key] - if(barrier_action?.Trigger()) - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_SUCCEEDED - return AI_BEHAVIOR_DELAY | AI_BEHAVIOR_FAILED - -/datum/ai_behavior/swarmer_create_barricade/finish_action(datum/ai_controller/controller, succeeded, action_key, target_key) - controller.clear_blackboard_key(target_key) - return ..() diff --git a/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm b/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm deleted file mode 100644 index 798a32f1ab0..00000000000 --- a/code/modules/mob/living/basic/hostile/swarmers/swarmer_effects.dm +++ /dev/null @@ -1,15 +0,0 @@ -/obj/effect/temp_visual/swarmer // temporary swarmer visual feedback objects - icon = 'icons/mob/swarmer.dmi' - icon_state = "disintegrate" - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/swarmer/Initialize(mapload) - . = ..() - playsound(loc, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/obj/effect/temp_visual/swarmer/dismantle - icon_state = "dismantle" - duration = 2.5 SECONDS - -/obj/effect/temp_visual/swarmer/integrate - icon_state = "integrate" diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi deleted file mode 100644 index 97c95ebdfdb..00000000000 Binary files a/icons/mob/swarmer.dmi and /dev/null differ diff --git a/paradise.dme b/paradise.dme index d85e3d18a11..4530a2b0d5d 100644 --- a/paradise.dme +++ b/paradise.dme @@ -162,7 +162,6 @@ #include "code\__DEFINES\ai\ai_defines.dm" #include "code\__DEFINES\ai\blackboard_defines.dm" #include "code\__DEFINES\ai\changeling_giant_spider_ai_defines.dm" -#include "code\__DEFINES\ai\swarmer_defines.dm" #include "code\__DEFINES\dcs\ai_signals.dm" #include "code\__DEFINES\dcs\area_signals.dm" #include "code\__DEFINES\dcs\atom_signals.dm" @@ -2146,7 +2145,6 @@ #include "code\modules\events\spider_infestation.dm" #include "code\modules\events\spider_terror.dm" #include "code\modules\events\spontaneous_appendicitis.dm" -#include "code\modules\events\swarmers.dm" #include "code\modules\events\tear.dm" #include "code\modules\events\tear_honk.dm" #include "code\modules\events\traders.dm" @@ -2533,10 +2531,6 @@ #include "code\modules\mob\living\basic\hostile\giant_spider\giant_spider_ai.dm" #include "code\modules\mob\living\basic\hostile\gorilla\gorilla.dm" #include "code\modules\mob\living\basic\hostile\gorilla\gorilla_emote.dm" -#include "code\modules\mob\living\basic\hostile\swarmers\swarmer.dm" -#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_actions.dm" -#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_ai.dm" -#include "code\modules\mob\living\basic\hostile\swarmers\swarmer_effects.dm" #include "code\modules\mob\living\basic\hostile\revenant\revenant.dm" #include "code\modules\mob\living\basic\hostile\revenant\revenant_abilities.dm" #include "code\modules\mob\living\basic\lavaland\goliath\goliath.dm"