From 28137689b8f2f9bdd50cd5e85d91b475e9fd6ae9 Mon Sep 17 00:00:00 2001 From: GDN <96800819+GDNgit@users.noreply.github.com> Date: Mon, 22 Aug 2022 13:50:18 -0500 Subject: [PATCH] Swarmer removal (#18873) --- code/__DEFINES/medal.dm | 2 - code/__DEFINES/mobs.dm | 1 - code/_onclick/hud/swarmer.dm | 97 --- .../gamemodes/miniantags/bot_swarm/swarmer.dm | 710 ------------------ .../miniantags/bot_swarm/swarmer_event.dm | 25 - code/game/objects/effects/effects.dm | 3 - code/modules/events/event_container.dm | 1 - code/modules/mining/minebot.dm | 1 - code/modules/mob/language.dm | 11 - icons/mob/swarmer.dmi | Bin 15064 -> 0 bytes paradise.dme | 3 - strings/tips.txt | 2 - 12 files changed, 856 deletions(-) delete mode 100644 code/_onclick/hud/swarmer.dm delete mode 100644 code/game/gamemodes/miniantags/bot_swarm/swarmer.dm delete mode 100644 code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm delete mode 100644 icons/mob/swarmer.dmi diff --git a/code/__DEFINES/medal.dm b/code/__DEFINES/medal.dm index 46babe14bbc..0d1cd3d80f9 100644 --- a/code/__DEFINES/medal.dm +++ b/code/__DEFINES/medal.dm @@ -10,7 +10,6 @@ #define BOSS_MEDAL_DRAKE "Drake" #define BOSS_MEDAL_HIEROPHANT "Hierophant" #define BOSS_MEDAL_LEGION "Legion" -#define BOSS_MEDAL_SWARMERS "Swarmer Beacon" #define BOSS_MEDAL_TENDRIL "Tendril" #define BOSS_MEDAL_ROBOT "Ancient Robot" @@ -21,6 +20,5 @@ #define COLOSSUS_SCORE "Colossus Killed" #define DRAKE_SCORE "Drakes Killed" #define LEGION_SCORE "Legion Killed" -#define SWARMER_BEACON_SCORE "Swarmer Beacons Killed" #define TENDRIL_CLEAR_SCORE "Tendrils Killed" #define ROBOT_SCORE "Ancient Robots Killed" diff --git a/code/__DEFINES/mobs.dm b/code/__DEFINES/mobs.dm index 8197d0594a6..d600a7e857a 100644 --- a/code/__DEFINES/mobs.dm +++ b/code/__DEFINES/mobs.dm @@ -241,7 +241,6 @@ #define iscorgi(A) (istype((A), /mob/living/simple_animal/pet/dog/corgi)) #define ismouse(A) (istype((A), /mob/living/simple_animal/mouse)) #define isbot(A) (istype((A), /mob/living/simple_animal/bot)) -#define isswarmer(A) (istype((A), /mob/living/simple_animal/hostile/swarmer)) #define isguardian(A) (istype((A), /mob/living/simple_animal/hostile/guardian)) #define isnymph(A) (istype((A), /mob/living/simple_animal/diona)) #define ishostile(A) (istype(A, /mob/living/simple_animal/hostile)) diff --git a/code/_onclick/hud/swarmer.dm b/code/_onclick/hud/swarmer.dm deleted file mode 100644 index 2042442642a..00000000000 --- a/code/_onclick/hud/swarmer.dm +++ /dev/null @@ -1,97 +0,0 @@ - -////HUD NONSENSE//// -/obj/screen/swarmer - icon = 'icons/mob/swarmer.dmi' - -/obj/screen/swarmer/FabricateTrap - icon_state = "ui_trap" - name = "Create trap (Costs 5 Resources)" - desc = "Creates a trap that will nonlethally shock any non-swarmer that attempts to cross it. (Costs 5 resources)" - -/obj/screen/swarmer/FabricateTrap/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateTrap() - -/obj/screen/swarmer/Barricade - icon_state = "ui_barricade" - name = "Create barricade (Costs 5 Resources)" - desc = "Creates a destructible barricade that will stop any non swarmer from passing it. Also allows disabler beams to pass through. (Costs 5 resources)" - -/obj/screen/swarmer/Barricade/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateBarricade() - -/obj/screen/swarmer/Replicate - icon_state = "ui_replicate" - name = "Replicate (Costs 50 Resources)" - desc = "Creates a another of our kind." - -/obj/screen/swarmer/Replicate/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.CreateSwarmer() - -/obj/screen/swarmer/RepairSelf - icon_state = "ui_self_repair" - name = "Repair self" - desc = "Repairs damage to our body." - -/obj/screen/swarmer/RepairSelf/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.RepairSelf() - -/obj/screen/swarmer/ToggleLight - icon_state = "ui_light" - name = "Toggle light" - desc = "Toggles our inbuilt light on or off." - -/obj/screen/swarmer/ToggleLight/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ToggleLight() - -/obj/screen/swarmer/ContactSwarmers - icon_state = "ui_contact_swarmers" - name = "Contact swarmers" - desc = "Sends a message to all other swarmers, should they exist." - -/obj/screen/swarmer/ContactSwarmers/Click() - if(isswarmer(usr)) - var/mob/living/simple_animal/hostile/swarmer/S = usr - S.ContactSwarmers() - -/mob/living/simple_animal/hostile/swarmer/create_mob_hud() - if(client && !hud_used) - hud_used = new /datum/hud/swarmer(src) - -/datum/hud/swarmer/New(mob/owner) - ..() - var/obj/screen/using - - using = new /obj/screen/swarmer/FabricateTrap() - using.screen_loc = ui_rhand - static_inventory += using - - using = new /obj/screen/swarmer/Barricade() - using.screen_loc = ui_lhand - static_inventory += using - - using = new /obj/screen/swarmer/Replicate() - using.screen_loc = ui_zonesel - static_inventory += using - - using = new /obj/screen/swarmer/RepairSelf() - using.screen_loc = ui_storage1 - static_inventory += using - - using = new /obj/screen/swarmer/ToggleLight() - using.screen_loc = ui_back - static_inventory += using - - using = new /obj/screen/swarmer/ContactSwarmers() - using.screen_loc = ui_inventory - static_inventory += using - diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm deleted file mode 100644 index c446653f1be..00000000000 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer.dm +++ /dev/null @@ -1,710 +0,0 @@ -////Deactivated swarmer shell//// -/obj/item/deactivated_swarmer - name = "unactivated swarmer" - desc = "A shell of swarmer that was completely powered down. It can no longer activate itself." - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - origin_tech = "bluespace=4;materials=4;programming=7" - materials = list(MAT_METAL=10000, MAT_GLASS=4000) - -/obj/effect/mob_spawn/swarmer - name = "unactivated swarmer" - desc = "A currently unactivated swarmer. Swarmers can self activate at any time, so it would be wise to immediately dispose of this." - icon = 'icons/mob/swarmer.dmi' - icon_state = "swarmer_unactivated" - density = FALSE - anchored = FALSE - - mob_type = /mob/living/simple_animal/hostile/swarmer - mob_name = "a swarmer" - death = FALSE - roundstart = FALSE - important_info = "Follow your objectives, do not make the station inhospitable or try and kill crew." - flavour_text = "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." - description = {"Your goal is to create more of yourself by consuming the station. 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. Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage. - Objectives: - 1. Consume resources and replicate until there are no more resources left. - 2. Ensure that this location is fit for invasion at a later date; do not perform actions that would render it dangerous or inhospitable. - 3. Biological resources will be harvested at a later date; do not harm them."} - -/obj/effect/mob_spawn/swarmer/Initialize(mapload) - . = ..() - var/area/A = get_area(src) - if(A) - notify_ghosts("A swarmer shell has been created in [A.name].", 'sound/effects/bin_close.ogg', source = src, action = NOTIFY_ATTACK, flashwindow = FALSE) - -/obj/effect/mob_spawn/swarmer/attack_hand(mob/living/user) - . = ..() - if(.) - return - to_chat(user, "Picking up the swarmer may cause it to activate. You should be careful about this.") - -/obj/effect/mob_spawn/swarmer/screwdriver_act(mob/user, obj/item/I) - if(user.a_intent == INTENT_HARM) - return - . = TRUE - if(!I.use_tool(src, user, 0, volume = I.tool_volume)) - return - user.visible_message("[usr.name] deactivates [src].", - "After some fiddling, you find a way to disable [src]'s power source.", - "You hear clicking.") - new /obj/item/deactivated_swarmer(get_turf(src)) - qdel(src) - -////The Mob itself//// - -/mob/living/simple_animal/hostile/swarmer - name = "Swarmer" - real_name = "Swarmer" - icon = 'icons/mob/swarmer.dmi' - desc = "Robotic constructs of unknown design, swarmers seek only to consume materials and replicate themselves indefinitely." - speak_emote = list("tones") - bubble_icon = "swarmer" - mob_biotypes = MOB_ROBOTIC - health = 40 - maxHealth = 40 - icon_state = "swarmer" - icon_living = "swarmer" - icon_dead = "swarmer_unactivated" - wander = FALSE - harm_intent_damage = 5 - minbodytemp = 0 - maxbodytemp = 500 - 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) - unsuitable_atmos_damage = 0 - melee_damage_lower = 15 - melee_damage_upper = 15 - melee_damage_type = STAMINA - damage_coeff = list(BRUTE = 1, BURN = 1, TOX = 0, CLONE = 0, STAMINA = 0, OXY = 0) - hud_possible = list(SPECIALROLE_HUD, DIAG_STAT_HUD, DIAG_HUD) - obj_damage = 0 - environment_smash = ENVIRONMENT_SMASH_NONE - attacktext = "shocks" - attack_sound = 'sound/effects/empulse.ogg' - friendly = "pinches" - speed = 0 - a_intent = INTENT_HARM - can_change_intents = FALSE - faction = list("swarmer") - AIStatus = AI_OFF - pass_flags = PASSTABLE - flags_2 = RAD_PROTECT_CONTENTS_2 | RAD_NO_CONTAMINATE_2 - mob_size = MOB_SIZE_SMALL - ventcrawler = VENTCRAWLER_ALWAYS - ranged = TRUE - projectiletype = /obj/item/projectile/beam/disabler - ranged_cooldown_time = 20 - projectilesound = 'sound/weapons/taser2.ogg' - loot = list(/obj/effect/decal/cleanable/robot_debris, /obj/item/stack/ore/bluespace_crystal) - del_on_death = TRUE - deathmessage = "explodes with a sharp pop!" - light_color = LIGHT_COLOR_CYAN - universal_understand = FALSE - var/resources = 0 //Resource points, generated by consuming metal/glass - var/max_resources = 100 - -/mob/living/simple_animal/hostile/swarmer/Login() - ..() - to_chat(src, "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.") - to_chat(src, "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.") - to_chat(src, "Ctrl-Clicking on a mob will attempt to remove it from the area and place it in a safe environment for storage.") - to_chat(src, "Prime Directives:") - to_chat(src, "1. Consume resources and replicate until there are no more resources left.") - to_chat(src, "2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.") - to_chat(src, "3. Biological and sentient resources will be harvested at a later date, do not harm them.") - to_chat(src, "For more information, check the wiki page: ([GLOB.configuration.url.wiki_url]/index.php/Swarmer)") - -/mob/living/simple_animal/hostile/swarmer/Initialize(mapload) - . = ..() - add_language("Swarmer", 1) - verbs -= /mob/living/verb/pulled - for(var/datum/atom_hud/data/diagnostic/diag_hud in GLOB.huds) - diag_hud.add_to_hud(src) - updatename() - -/mob/living/simple_animal/hostile/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/simple_animal/hostile/swarmer/med_hud_set_health() - var/image/holder = hud_list[DIAG_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "huddiag[RoundDiagBar(health / maxHealth)]" - -/mob/living/simple_animal/hostile/swarmer/med_hud_set_status() - var/image/holder = hud_list[DIAG_STAT_HUD] - var/icon/I = icon(icon, icon_state, dir) - holder.pixel_y = I.Height() - world.icon_size - holder.icon_state = "hudstat" - -/mob/living/simple_animal/hostile/swarmer/Stat() - ..() - if(statpanel("Status")) - stat("Resources:",resources) - -/mob/living/simple_animal/hostile/swarmer/emp_act() - if(health > 1) - adjustHealth(health-1) - else - death() - -/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O) - if(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other - return 1 - if(isswarmer(O)) - return 1 - ..() - -////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S//// -/mob/living/simple_animal/hostile/swarmer/AttackingTarget() - if(!isliving(target)) - return target.swarmer_act(src) - else - return ..() - -/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A) - face_atom(A) - if(!isturf(loc)) - return - if(next_move > world.time) - return - if(!A.Adjacent(src)) - return - A.swarmer_act(src) - -/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - return TRUE //return TRUE/FALSE whether or not an AI swarmer should try this swarmer_act() again, NOT whether it succeeded. - -/atom/movable/swarmer_act() - if(!simulated) - return FALSE - return ..() - -/obj/effect/mob_spawn/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.Integrate(src) - return FALSE //would logically be TRUE, but we don't want AI swarmers eating player spawn chances. - -/obj/effect/mob_spawn/swarmer/IntegrateAmount() - return 50 - -/turf/simulated/wall/indestructible/swarmer_act() - return FALSE - -/obj/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(resistance_flags & INDESTRUCTIBLE) - to_chat(S, "High value materials detected, consuming [src] would waste them. Aborting.") - return FALSE - for(var/mob/living/L in contents) - if(!issilicon(L) && !isbrain(L)) - to_chat(S, "An organism has been detected inside this object. Aborting.") - return FALSE - return ..() - -/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(..()) - return S.Integrate(src) - return FALSE - -/atom/movable/proc/IntegrateAmount() - return 0 - -/obj/item/IntegrateAmount() //returns the amount of resources gained when eating this item - if(materials[MAT_METAL] || materials[MAT_GLASS]) - return 1 - return ..() - -/obj/item/gun/swarmer_act() //Stops you from eating the entire armory - return FALSE - -/turf/simulated/floor/swarmer_act() //ex_act() on turf calls it on its contents, this is to prevent attacking mobs by DisIntegrate()'ing the floor - return FALSE - -/obj/structure/lattice/catwalk/swarmer_catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "We have created these for our own benefit. Aborting.") - return FALSE - -/obj/structure/swarmer/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(S.AIStatus == AI_ON) - return FALSE - else - return ..() - -/obj/effect/swarmer_act() - return FALSE - -/obj/effect/decal/cleanable/robot_debris/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisIntegrate(src) - qdel(src) - return TRUE - -/obj/structure/flora/swarmer_act() - return FALSE - -/turf/simulated/floor/plating/lava/swarmer_act() - if(!is_safe()) - new /obj/structure/lattice/catwalk/swarmer_catwalk(src) - return FALSE - -/obj/machinery/atmospherics/swarmer_act() - return FALSE - -/obj/structure/disposalpipe/swarmer_act() - return FALSE - -/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - S.DismantleMachine(src) - return TRUE - -/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return FALSE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - S.DisIntegrate(src) - toggle_cam(S, 0) - return TRUE - -/obj/structure/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/particle_accelerator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) // Since the console is still parented to this - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - if(!active) - S.DisIntegrate(src) - return TRUE - to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - return FALSE - -/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//It's more visually interesting than dismantling the machine - if(!..()) - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/turretid/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - S.DisIntegrate(src) - return TRUE - -/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "The volatile chemicals in this machine would destroy us. Aborting.") - return FALSE - -/obj/machinery/nuclearbomb/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This device's destruction would result in the extermination of everything in the area. Aborting.") - return FALSE - -/obj/effect/rune/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Searching... sensor malfunction! Target lost. Aborting.") - return FALSE - -/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Destroying this object would cause a chain reaction. Aborting.") - return FALSE - -/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/atmospherics/portable/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - return FALSE - -/obj/structure/fans/tiny/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - return FALSE - -/obj/structure/holosign/barrier/atmos/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "An inhospitable area may be created as a result of destroying this object. Aborting.") - return FALSE - -/obj/machinery/tcomms/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") - return FALSE - -/obj/machinery/message_server/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This communications relay should be preserved, it will be a useful resource to our masters in the future. Aborting.") - return FALSE - -/obj/machinery/blackbox_recorder/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This machine has recorded large amounts of data on this structure and its inhabitants, it will be a useful resource to our masters in the future. Aborting. ") - return FALSE - -/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - -/obj/machinery/gateway/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This bluespace source will be important to us later. Aborting.") - return FALSE - -/obj/machinery/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This cryogenic sleeper should be preserved, it will be a useful resource to our masters in the future. Aborting.") - return FALSE - -/obj/machinery/computer/cryopod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(!..()) - return FALSE - to_chat(S, "This cryopod control computer should be preserved, it contains useful items and information about the inhabitants. Aborting.") - return FALSE - -/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(loc, /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return TRUE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return TRUE - return ..() - -/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/isonshuttle = istype(get_area(src), /area/shuttle) - for(var/turf/T in range(1, src)) - var/area/A = get_area(T) - if(isspaceturf(T) || (!isonshuttle && (istype(A, /area/shuttle) || istype(A, /area/space))) || (isonshuttle && !istype(A, /area/shuttle))) - to_chat(S, "Destroying this object has the potential to cause a hull breach. Aborting.") - S.target = null - return FALSE - else if(istype(A, /area/engine/supermatter)) - to_chat(S, "Disrupting the containment of a supermatter crystal would not be to our benefit. Aborting.") - S.target = null - return FALSE - return ..() - -/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource - to_chat(S, "This object does not contain enough materials to work with.") - return FALSE - -/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "Attempting to dismantle this machine would result in an immediate counterattack. Aborting.") - return FALSE - -/obj/machinery/clonepod/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - if(occupant) - to_chat(S, "Destroying this machine while it is occupied would result in biological and sentient resources to be harmed. Aborting.") - return FALSE - return ..() - -/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - S.DisperseTarget(src) - return TRUE - -/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This biological resource is somehow resisting our bluespace transceiver. Aborting.") - return FALSE - -/obj/structure/shuttle/engine/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This shuttle may be important to us later. Aborting.") - return FALSE - -/obj/structure/lattice/catwalk/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - var/turf/here = get_turf(src) - for(var/A in here.contents) - var/obj/structure/cable/C = A - if(istype(C)) - to_chat(S, "Disrupting the power grid would bring no benefit to us. Aborting.") - return FALSE - return ..() - -/obj/item/deactivated_swarmer/IntegrateAmount() - return 50 - -/obj/machinery/hydroponics/soil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object does not contain enough materials to work with.") - return FALSE - -/obj/machinery/field/containment/swarmer_act(mob/living/simple_animal/hostile/swarmer/S) - to_chat(S, "This object does not contain solid matter. Aborting.") - return FALSE - -////END CTRL CLICK FOR SWARMERS//// - -/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(atom/fabrication_object, fabrication_cost = 0) - if(!isturf(loc)) - to_chat(src, "This is not a suitable location for fabrication. We need more space.") - if(resources >= fabrication_cost) - resources -= fabrication_cost - else - to_chat(src, "You do not have the necessary resources to fabricate this object.") - return 0 - return new fabrication_object(loc) - -/mob/living/simple_animal/hostile/swarmer/proc/Integrate(atom/movable/target) - var/resource_gain = target.IntegrateAmount() - if(resources + resource_gain > max_resources) - to_chat(src, "We cannot hold more materials!") - return TRUE - if(resource_gain) - resources += resource_gain - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - var/obj/effect/temp_visual/swarmer/integrate/I = new /obj/effect/temp_visual/swarmer/integrate(get_turf(target)) - I.pixel_x = target.pixel_x - I.pixel_y = target.pixel_y - I.pixel_z = target.pixel_z - if(istype(target, /obj/item/stack)) - var/obj/item/stack/S = target - S.use(1) - if(S.amount) - return TRUE - qdel(target) - return TRUE - else - to_chat(src, "[target] is incompatible with our internal matter recycler.") - return FALSE - -/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(atom/movable/target) - new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - do_attack_animation(target) - changeNext_move(CLICK_CD_MELEE) - target.ex_act(EXPLODE_LIGHT) - -/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(mob/living/target) - if(target == src) - return - - if(!is_station_level(z) && !is_mining_level(z)) - to_chat(src, "Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.") - return - - to_chat(src, "Attempting to remove this being from our presence.") - - if(!do_mob(src, target, 30)) - return - - var/turf/simulated/floor/F - F = find_safe_turf(zlevels = z) - - if(!F) - return - // If we're getting rid of a human, slap some energy cuffs on - // them to keep them away from us a little longer - - var/mob/living/carbon/human/H = target - if(ishuman(target) && (!H.handcuffed)) - var/obj/item/restraints/handcuffs/energy/used/Z = new /obj/item/restraints/handcuffs/energy/used(src) - Z.apply_cuffs(target, src) - - do_sparks(4, 0, target) - playsound(src,'sound/effects/sparks4.ogg', 50, TRUE) - do_teleport(target, F, 0) - -/mob/living/simple_animal/hostile/swarmer/electrocute_act(shock_damage, source, siemens_coeff = 1, flags = NONE) - if(!(flags & SHOCK_TESLA)) - return FALSE - return ..() - -/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(obj/machinery/target) - do_attack_animation(target) - to_chat(src, "We begin to dismantle this machine. We will need to be uninterrupted.") - var/obj/effect/temp_visual/swarmer/dismantle/D = new /obj/effect/temp_visual/swarmer/dismantle(get_turf(target)) - D.pixel_x = target.pixel_x - D.pixel_y = target.pixel_y - D.pixel_z = target.pixel_z - if(do_mob(src, target, 100)) - to_chat(src, "Dismantling complete.") - var/atom/Tsec = target.drop_location() - new /obj/item/stack/sheet/metal(Tsec, 5) - for(var/obj/item/I in target.component_parts) - I.forceMove(Tsec) - var/obj/effect/temp_visual/swarmer/disintegration/N = new /obj/effect/temp_visual/swarmer/disintegration(get_turf(target)) - N.pixel_x = target.pixel_x - N.pixel_y = target.pixel_y - N.pixel_z = target.pixel_z - target.dropContents() - if(istype(target, /obj/machinery/computer)) - var/obj/machinery/computer/C = target - if(C.circuit) - new C.circuit(Tsec) - qdel(target) - - -/obj/effect/temp_visual/swarmer //temporary swarmer visual feedback objects - icon = 'icons/mob/swarmer.dmi' - layer = BELOW_MOB_LAYER - -/obj/effect/temp_visual/swarmer/disintegration - icon_state = "disintegrate" - duration = 10 - -/obj/effect/temp_visual/swarmer/disintegration/Initialize(mapload) - . = ..() - playsound(loc, "sparks", 100, TRUE, SHORT_RANGE_SOUND_EXTRARANGE) - -/obj/effect/temp_visual/swarmer/dismantle - icon_state = "dismantle" - duration = 25 - -/obj/effect/temp_visual/swarmer/integrate - icon_state = "integrate" - duration = 5 - -/obj/structure/swarmer //Default swarmer effect object visual feedback - name = "swarmer ui" - desc = null - gender = NEUTER - 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 - 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() - ..() - 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 - density = FALSE - -/obj/structure/swarmer/trap/Crossed(atom/movable/AM, oldloc) - if(isliving(AM)) - var/mob/living/L = AM - if(!istype(L, /mob/living/simple_animal/hostile/swarmer)) - playsound(loc,'sound/effects/snap.ogg',50, 1, -1) - L.electrocute_act(100, src, 1, flags = SHOCK_NOGLOVES | SHOCK_ILLUSION) - if(isrobot(L) || ismachineperson(L)) - L.Weaken(10 SECONDS) - qdel(src) - ..() - -/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap() - set name = "Create trap" - set category = "Swarmer" - set desc = "Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources." - if(locate(/obj/structure/swarmer/trap) in loc) - to_chat(src, "There is already a trap here. Aborting.") - return - Fabricate(/obj/structure/swarmer/trap, 5) - - -/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade() - set name = "Create barricade" - set category = "Swarmer" - set desc = "Creates a barricade that will stop anything but swarmers and disabler beams from passing through." - if(locate(/obj/structure/swarmer/blockade) in loc) - to_chat(src, "There is already a blockade here. Aborting.") - return - if(resources < 5) - to_chat(src, "We do not have the resources for this!") - return - if(do_mob(src, src, 10)) - Fabricate(/obj/structure/swarmer/blockade, 5) - - -/obj/structure/swarmer/blockade - name = "swarmer blockade" - desc = "A quickly assembled energy blockade. 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/blockade/CanPass(atom/movable/O) - if(isswarmer(O)) - return 1 - if(istype(O, /obj/item/projectile/beam/disabler)) - return 1 - -/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer() - set name = "Replicate" - set category = "Swarmer" - set desc = "Creates a shell for a new swarmer. Swarmers will self activate." - to_chat(src, "We are attempting to replicate ourselves. We will need to stand still until the process is complete.") - if(resources < 50) - to_chat(src, "We do not have the resources for this!") - return - if(!isturf(loc)) - to_chat(src, "This is not a suitable location for replicating ourselves. We need more room.") - return - if(do_mob(src, src, 100)) - var/createtype = SwarmerTypeToCreate() - if(createtype && Fabricate(createtype, 50)) - playsound(loc,'sound/items/poster_being_created.ogg',50, TRUE, -1) - - -/mob/living/simple_animal/hostile/swarmer/proc/SwarmerTypeToCreate() - return /obj/effect/mob_spawn/swarmer - - -/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf() - set name = "Self Repair" - set category = "Swarmer" - set desc = "Attempts to repair damage to our body. You will have to remain motionless until repairs are complete." - if(!isturf(loc)) - return - to_chat(src, "Attempting to repair damage to our body, stand by...") - if(do_mob(src, src, 100)) - adjustHealth(-100) - to_chat(src, "We successfully repaired ourselves.") - -/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight() - if(!light_range) - set_light(3) - else - set_light(0) - -/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers() - var/message = input(src, "Announce to other swarmers", "Swarmer contact") - if(message) - for(var/mob/M in GLOB.mob_list) - if(isswarmer(M) || (M in GLOB.dead_mob_list)) - to_chat(M, "Swarm communication - [src] states: [message]") diff --git a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm b/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm deleted file mode 100644 index d2462442fdf..00000000000 --- a/code/game/gamemodes/miniantags/bot_swarm/swarmer_event.dm +++ /dev/null @@ -1,25 +0,0 @@ -/datum/event/spawn_swarmer - startWhen = 3 //30 minutes - announceWhen = 10 - -/datum/event/spawn_swarmer/announce() - if(prob(25)) //25% chance to announce it to the crew - var/swarmer_report = "NAS Trurl High-Priority Update" - swarmer_report += "

Our long-range sensors have detected an odd signal emanating from your station's gateway. We recommend immediate investigation of your gateway, as something may have come \ - through." - print_command_report(swarmer_report, "Classified NAS Trurl Update", FALSE) - GLOB.event_announcement.Announce("A report has been downloaded and printed out at all communications consoles.", "Incoming Classified Message", 'sound/AI/commandreport.ogg') - -/datum/event/spawn_swarmer/start() - if(find_swarmer()) - return 0 - if(!GLOB.the_gateway) - return 0 - new /obj/effect/mob_spawn/swarmer(get_turf(GLOB.the_gateway)) - - -/datum/event/spawn_swarmer/proc/find_swarmer() - for(var/mob/living/M in GLOB.mob_list) - if(istype(M, /mob/living/simple_animal/hostile/swarmer) && M.client) //If there is a swarmer with an active client, we've found our swarmer - return 1 - return 0 diff --git a/code/game/objects/effects/effects.dm b/code/game/objects/effects/effects.dm index e3ee96f492e..3adbee6f4bc 100644 --- a/code/game/objects/effects/effects.dm +++ b/code/game/objects/effects/effects.dm @@ -64,9 +64,6 @@ armor = list(MELEE = 100, BULLET = 100, LASER = 100, ENERGY = 100, BOMB = 100, BIO = 100, RAD = 100, FIRE = 100, ACID = 100) // Most of these overrides procs below are overkill, but better safe than sorry. -/obj/effect/abstract/swarmer_act() - return - /obj/effect/abstract/bullet_act(obj/item/projectile/P) return diff --git a/code/modules/events/event_container.dm b/code/modules/events/event_container.dm index da97d07533a..dbe205565b5 100644 --- a/code/modules/events/event_container.dm +++ b/code/modules/events/event_container.dm @@ -180,7 +180,6 @@ GLOBAL_LIST_EMPTY(event_last_fired) new /datum/event_meta(EVENT_LEVEL_MODERATE, "Flux Anomaly", /datum/event/anomaly/anomaly_flux, 75, list(ASSIGNMENT_ENGINEER = 50)), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Gravitational Anomaly", /datum/event/anomaly/anomaly_grav, 200), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Revenant", /datum/event/revenant, 150), - new /datum/event_meta(EVENT_LEVEL_MODERATE, "Swarmer Spawn", /datum/event/spawn_swarmer, 150, is_one_shot = TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Morph Spawn", /datum/event/spawn_morph, 40, list(ASSIGNMENT_SECURITY = 10), is_one_shot = TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Disease Outbreak", /datum/event/disease_outbreak, 0, list(ASSIGNMENT_MEDICAL = 150), TRUE), new /datum/event_meta(EVENT_LEVEL_MODERATE, "Door Runtime", /datum/event/door_runtime, 50, list(ASSIGNMENT_ENGINEER = 25, ASSIGNMENT_AI = 150), TRUE) diff --git a/code/modules/mining/minebot.dm b/code/modules/mining/minebot.dm index 29c2caba747..81f713503d6 100644 --- a/code/modules/mining/minebot.dm +++ b/code/modules/mining/minebot.dm @@ -33,7 +33,6 @@ /obj/item/stack/ore/bananium, /obj/item/stack/ore/tranquillite, /obj/item/stack/ore/glass, /obj/item/stack/ore/titanium) healable = FALSE - loot = list(/obj/effect/decal/cleanable/robot_debris) del_on_death = TRUE var/mode = MINEDRONE_COLLECT var/light_on = FALSE diff --git a/code/modules/mob/language.dm b/code/modules/mob/language.dm index fc79980320f..bd9091e5083 100644 --- a/code/modules/mob/language.dm +++ b/code/modules/mob/language.dm @@ -658,17 +658,6 @@ follow = TRUE syllables = list ("beep", "boop") -/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 - // Language handling. /mob/proc/add_language(language) var/datum/language/new_language = GLOB.all_languages[language] diff --git a/icons/mob/swarmer.dmi b/icons/mob/swarmer.dmi deleted file mode 100644 index 3ffd18fb26be8a05b280d307d10448629830bd27..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 15064 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