{"action":"created","comment":{"url":"https://api.github.com/repos/tgstation/-tg-station/pulls/comments/38103060","id":38103060,"diff_hunk":"@@ -0,0 +1,500 @@\n+////Deactivated swarmer shell////\n+/obj/item/unactivated_swarmer\n+\tname = \"unactivated swarmer\"\n+\tdesc = \"A currently unactivated swarmer. Swarmers can self activate at any time, it would be wise to immediately dispose of this.\"\n+\ticon = 'icons/mob/swarmer.dmi'\n+\ticon_state = \"swarmer_unactivated\"\n+\n+/obj/item/unactivated_swarmer/attack_ghost(mob/user)\n+\tvar/be_swarmer = alert(\"Become a swarmer? (Warning, You can no longer be cloned!)\",,\"Yes\",\"No\")\n+\tif(be_swarmer == \"No\" || qdeleted())\n+\t\treturn\n+\tvar/mob/living/simple_animal/hostile/swarmer/S = new /mob/living/simple_animal/hostile/swarmer(get_turf(loc))\n+\tS.key = user.key\n+\tqdel(src)\n+\n+////The Mob itself////\n+\n+/mob/living/simple_animal/hostile/swarmer\n+\tname = \"swarmer\"\n+\ticon = 'icons/mob/swarmer.dmi'\n+\tdesc = \"A robot of unknown design, they seek only to consume materials and replicate themselves indefinitely.\"\n+\tspeak_emote = list(\"tones\")\n+\thealth = 40\n+\tmaxHealth = 40\n+\tstatus_flags = CANPUSH\n+\ticon_state = \"swarmer\"\n+\ticon_living = \"swarmer\"\n+\ticon_dead = \"swarmer_unactivated\"\n+\ticon_gib = null\n+\twander = 0\n+\tharm_intent_damage = 5\n+\tminbodytemp = 0\n+\tmaxbodytemp = 500\n+\tatmos_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)\n+\tunsuitable_atmos_damage = 0\n+\tmelee_damage_lower = 15\n+\tmelee_damage_upper = 15\n+\tmelee_damage_type = STAMINA\n+\tignored_damage_types = list(BRUTE = 0, BURN = 0, TOX = 1, CLONE = 1, STAMINA = 1, OXY = 1)\n+\tlanguages = SWARMER\n+\tenvironment_smash = 0\n+\tattacktext = \"shocks\"\n+\tattack_sound = 'sound/effects/EMPulse.ogg'\n+\tfriendly = \"pinches\"\n+\tspeed = 0\n+\tfaction = list(\"swarmer\")\n+\tAIStatus = AI_OFF\n+\tprojectiletype = /obj/item/projectile/beam/disabler\n+\tpass_flags = PASSTABLE | PASSMOB\n+\tventcrawler = 2\n+\tranged = 1\n+\tprojectiletype = /obj/item/projectile/beam/disabler\n+\tranged_cooldown_cap = 2\n+\tprojectilesound = 'sound/weapons/taser2.ogg'\n+\tvar/resources = 0 //Resource points, generated by consuming metal/glass\n+\n+/mob/living/simple_animal/hostile/swarmer/Login()\n+\t..()\n+\tsrc << \"<b>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.</b>\"\n+\tsrc << \"<b>Ctrl + Click provides most of your swarmer specific interactions, such as cannibalizing metal or glass, destroying the environment, or teleporting mobs away from you.\"\n+\tsrc << \"<b>Objectives:</b>\"\n+\tsrc << \"1. Consume resources and replicate until there are no more resources left.\"\n+\tsrc << \"2. Ensure that the station is fit for invasion at a later date, do not perform actions that would render it dangerous or inhospitable.\"\n+\tsrc << \"3. Biological resources will be harvested at a later date, do not harm them.\"\n+\n+/mob/living/simple_animal/hostile/swarmer/New()\n+\t..()\n+\tverbs -= /mob/living/verb/pulled\n+\n+/mob/living/simple_animal/hostile/swarmer/Stat()\n+\t..()\n+\tif(statpanel(\"Status\"))\n+\t\tstat(\"Resources:\",resources)\n+\n+/mob/living/simple_animal/hostile/swarmer/death(gibbed)\n+\t..(gibbed)\n+\tnew /obj/effect/decal/cleanable/robot_debris(src.loc)\n+\tghostize()\n+\tqdel(src)\n+\n+/mob/living/simple_animal/hostile/swarmer/emp_act()\n+\tif(health > 1)\n+\t\thealth = 1\n+\t\t..()\n+\thealth = 0\n+\n+/mob/living/simple_animal/hostile/swarmer/CanPass(atom/movable/O)\n+\tif(istype(O, /obj/item/projectile/beam/disabler))//Allows for swarmers to fight as a group without wasting their shots hitting each other\n+\t\treturn 1\n+\tif(isswarmer(O))\n+\t\treturn 1\n+\t..()\n+\n+////CTRL CLICK FOR SWARMERS AND SWARMER_ACT()'S////\n+/mob/living/simple_animal/hostile/swarmer/CtrlClickOn(atom/A)\n+\tface_atom(A)\n+\tif(!isturf(loc))\n+\t\treturn\n+\tif(next_move > world.time)\n+\t\treturn\n+\tif(!A.Adjacent(src))\n+\t\treturn\n+\tA.swarmer_act(src)\n+\treturn\n+\n+/atom/proc/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/item/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.Integrate(src)\n+\n+/obj/item/weapon/gun/swarmer_act()//Stops you from eating the entire armory\n+\treturn\n+\n+/turf/simulated/floor/swarmer_act()\n+\treturn\n+\n+/obj/machinery/atmospherics/swarmer_act()\n+\treturn\n+\n+/obj/structure/disposalpipe/swarmer_act()\n+\treturn\n+\n+/obj/machinery/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DismantleMachine(src)\n+\n+/obj/machinery/light/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/door/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/camera/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\tdeactivate(S, 0)\n+\n+/obj/machinery/particle_accelerator/control_box/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/field/generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/gravity_generator/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/vending/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisIntegrate(src)\n+\n+/obj/machinery/chem_dispenser/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>The volatile chemicals in this machine would destroy us. Aborting.</span>\"\n+\n+/obj/structure/reagent_dispensers/fueltank/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>Destroying this object would cause a chain reaction. Aborting.</span>\"\n+\n+/obj/structure/cable/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>\"\n+\n+/obj/machinery/portable_atmospherics/canister/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>An inhospitable area may be created as a result of destroying this object. Aborting.</span>\"\n+\n+/obj/machinery/power/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>Disrupting the power grid would bring no benefit to us. Aborting.</span>\"\n+\n+/turf/simulated/wall/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tif(locate(/turf/space) in range(1, src))\n+\t\tS << \"<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>\"\n+\t\treturn\n+\t..()\n+\n+/obj/structure/window/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tif(locate(/turf/space) in range(1, src))\n+\t\tS << \"<span class='warning'>Destroying this object has the potential to cause a hull breach. Aborting.</span>\"\n+\t\treturn\n+\t..()\n+\n+/obj/item/stack/cable_coil/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)//Wiring would be too effective as a resource\n+\tS << \"<span class='warning'>This object does not contain enough materials to work with.</span>\"\n+\n+/obj/machinery/porta_turret/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>Attempting to dismantle this machine would result in an immediate counterattack. Aborting.</span>\"\n+\n+/mob/living/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS.DisperseTarget(src)\n+\n+/mob/living/simple_animal/slime/swarmer_act(mob/living/simple_animal/hostile/swarmer/S)\n+\tS << \"<span class='warning'>This biological resource is somehow resisting our bluespace transceiver. Aborting.</span>\"\n+\n+\n+////END CTRL CLICK FOR SWARMERS////\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/Fabricate(var/atom/fabrication_object,var/fabrication_cost = 0)\n+\tif(!isturf(loc))\n+\t\tsrc << \"<span class='warning'>This is not a suitable location for fabrication. We need more space.</span>\"\n+\tif(resources >= fabrication_cost)\n+\t\tresources -= fabrication_cost\n+\telse\n+\t\tsrc << \"<span class='warning'>You do not have the necessary resources to fabricate this object.</span>\"\n+\t\treturn 0\n+\tnew fabrication_object(loc)\n+\treturn 1\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/Integrate(var/obj/item/target)\n+\tif(resources >= 100)\n+\t\tsrc << \"<span class='warning'>We cannot hold more materials!</span>\"\n+\t\treturn\n+\tif((target.materials[MAT_METAL]) || (target.materials[MAT_GLASS]))\n+\t\tresources++\n+\t\tdo_attack_animation(target)\n+\t\tchangeNext_move(CLICK_CD_MELEE)\n+\t\tif(istype(target, /obj/item/stack))\n+\t\t\tvar/obj/item/stack/S = target\n+\t\t\tS.use(1)\n+\t\t\tif(S.amount)\n+\t\t\t\treturn\n+\t\tqdel(target)\n+\telse\n+\t\tsrc << \"<span class='warning'>\\the [target] is incompatible with our internal matter recycler.</span>\"\n+\t\treturn\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/DisIntegrate(var/atom/movable/target)\n+\tnew /obj/effect/effect/sparks(get_turf(target))\n+\tdo_attack_animation(target)\n+\tchangeNext_move(CLICK_CD_MELEE)\n+\ttarget.ex_act(3)\n+\treturn\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/DisperseTarget(var/mob/living/target)\n+\tif(target != src)\n+\t\tsrc << \"<span class='info'>Attempting to remove this being from our presence.</span>\"\n+\t\tif(src.z != ZLEVEL_STATION)\n+\t\t\tsrc << \"<span class='warning'>Our bluespace transceiver cannot locate a viable bluespace link, our teleportation abilities are useless in this area.</span>\"\n+\t\t\treturn\n+\t\tif(do_mob(src, target, 30))\n+\t\t\tvar/cycle\n+\t\t\tfor(cycle=0,cycle<100,cycle++)\n+\t\t\t\tvar/random_location = locate(rand(37,202),rand(75,192),ZLEVEL_STATION)//Drunk dial a turf in the general ballpark of the station\n+\t\t\t\tif(istype(random_location, /turf/simulated/floor))\n+\t\t\t\t\tvar/turf/simulated/floor/F = random_location\n+\t\t\t\t\tif(F.air)\n+\t\t\t\t\t\tvar/datum/gas_mixture/A = F.air\n+\t\t\t\t\t\tif(A.oxygen >= 16 && !A.toxins && A.carbon_dioxide < 10 && !A.trace_gases.len)//Can most things breathe in this location?\n+\t\t\t\t\t\t\tif((A.temperature > 270) && (A.temperature < 360))//Not too hot, not too cold\n+\t\t\t\t\t\t\t\tvar/pressure = A.return_pressure()\n+\t\t\t\t\t\t\t\tif((pressure > 20) && (pressure < 550))//Account for crushing pressure or vaccuums\n+\t\t\t\t\t\t\t\t\tif(ishuman(target))//If we're getting rid of a human, slap some zipties on them to keep them away from us a little longer\n+\t\t\t\t\t\t\t\t\t\tvar/obj/item/weapon/restraints/handcuffs/cable/zipties/Z = new /obj/item/weapon/restraints/handcuffs/cable/zipties(src)\n+\t\t\t\t\t\t\t\t\t\tvar/mob/living/carbon/human/H = target\n+\t\t\t\t\t\t\t\t\t\tZ.apply_cuffs(H, src)\n+\t\t\t\t\t\t\t\t\tdo_teleport(target, F, 0)\n+\t\t\t\t\t\t\t\t\tplaysound(src,'sound/effects/sparks4.ogg',50,1)\n+\t\t\t\t\t\t\t\t\tbreak\n+\t\t\treturn\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/DismantleMachine(var/obj/machinery/target)\n+\tdo_attack_animation(target)\n+\tsrc << \"<span class='info'>We begin to dismantle this machine. We will need to be uninterrupted.</span>\"\n+\tnew /obj/effect/effect/sparks(get_turf(target))\n+\tif(do_mob(src, target, 100))\n+\t\tsrc << \"<span class='info'>Dismantling complete.</span>\"\n+\t\tvar/obj/item/stack/sheet/metal/M = new /obj/item/stack/sheet/metal(target.loc)\n+\t\tM.amount = 5\n+\t\tfor(var/obj/item/I in target.component_parts)\n+\t\t\tI.loc = M.loc\n+\t\tnew /obj/effect/effect/sparks(get_turf(target))\n+\t\ttarget.dropContents()\n+\t\tif(istype(target, /obj/machinery/computer))\n+\t\t\tvar/obj/machinery/computer/C = target\n+\t\t\tC.circuit.loc = M.loc\n+\t\tqdel(target)\n+\n+/obj/effect/swarmer //Default destroyable object for swarmer constructions\n+\tname = \"swarmer construction\"\n+\tdesc = \"Debug swarmer item, this shouldn't be here. Yell at a coder.\"\n+\tgender = NEUTER\n+\ticon = 'icons/mob/swarmer.dmi'\n+\ticon_state = \"ui_light\"\n+\tluminosity = 1\n+\tvar/health = 30\n+\n+/obj/effect/swarmer/proc/TakeDamage(damage)\n+\thealth -= damage\n+\tif(health <= 0)\n+\t\tqdel(src)\n+\n+/obj/effect/swarmer/bullet_act(obj/item/projectile/Proj)\n+\tif(Proj.damage)\n+\t\tif((Proj.damage_type == BRUTE || Proj.damage_type == BURN))\n+\t\t\tTakeDamage(Proj.damage)\n+\t..()\n+\n+/obj/effect/swarmer/attackby(obj/item/weapon/I, mob/living/user, params)\n+\tif(istype(I, /obj/item/weapon))\n+\t\tuser.changeNext_move(CLICK_CD_MELEE)\n+\t\tuser.do_attack_animation(src)\n+\t\tTakeDamage(I.force)\n+\treturn\n+\n+/obj/effect/swarmer/ex_act()\n+\tqdel(src)\n+\treturn\n+\n+/obj/effect/swarmer/blob_act()\n+\tqdel(src)\n+\treturn\n+\n+/obj/effect/swarmer/attack_animal(mob/living/user)\n+\tif(isanimal(user))\n+\t\tvar/mob/living/simple_animal/S = user\n+\t\tS.do_attack_animation(src)\n+\t\tuser.changeNext_move(CLICK_CD_MELEE)\n+\t\tif(S.melee_damage_type == BRUTE || S.melee_damage_type == BURN)\n+\t\t\tTakeDamage(rand(S.melee_damage_lower, S.melee_damage_upper))\n+\treturn\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/CreateTrap()\n+\tset name = \"Create trap\"\n+\tset category = \"Swarmer\"\n+\tset desc = \"Creates a simple trap that will non-lethally electrocute anything that steps on it. Costs 5 resources\"\n+\tif(/obj/effect/swarmer/trap in loc)\n+\t\tsrc << \"<span class='warning'>There is already a trap here. Aborting.</span>\"\n+\t\treturn\n+\tFabricate(/obj/effect/swarmer/trap, 5)\n+\treturn\n+\n+/obj/effect/swarmer/trap\n+\tname = \"swarmer trap\"\n+\tdesc = \"A quickly assembled electric trap. Will not retain its form if damaged enough.\"\n+\ticon_state = \"trap\"\n+\tluminosity = 1\n+\thealth = 10\n+\n+/obj/effect/swarmer/trap/Crossed(var/atom/movable/AM)\n+\tif(isliving(AM))\n+\t\tvar/mob/living/L = AM\n+\t\tif(!istype(L, /mob/living/simple_animal/hostile/swarmer))\n+\t\t\tL.electrocute_act(0, src, 1, 1)\n+\t\t\tqdel(src)\n+\t..()\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/CreateBarricade()\n+\tset name = \"Create barricade\"\n+\tset category = \"Swarmer\"\n+\tset desc = \"Creates a barricade that will stop anything but swarmers and disabler beams from passing through.\"\n+\tif(/obj/effect/swarmer/blockade in loc)\n+\t\tsrc << \"<span class='warning'>There is already a blockade here. Aborting.</span>\"\n+\t\treturn\n+\tFabricate(/obj/effect/swarmer/blockade, 5)\n+\treturn\n+\n+/obj/effect/swarmer/blockade\n+\tname = \"swarmer blockade\"\n+\tdesc = \"A quickly assembled energy blockade. Will not retain its form if damaged enough, but disabler beams and swarmers pass right through.\"\n+\ticon_state = \"barricade\"\n+\tluminosity = 1\n+\thealth = 50\n+\tdensity = 1\n+\tanchored = 1\n+\n+/obj/effect/swarmer/blockade/CanPass(atom/movable/O)\n+\tif(isswarmer(O))\n+\t\treturn 1\n+\tif(istype(O, /obj/item/projectile/beam/disabler))\n+\t\treturn 1\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/CreateSwarmer()\n+\tset name = \"Replicate\"\n+\tset category = \"Swarmer\"\n+\tset desc = \"Creates a shell for a new swarmer. Swarmers will self activate.\"\n+\tsrc << \"<span class='info'>We are attempting to replicate ourselves. We will need to stand still until the process is complete.</span>\"\n+\tif(resources < 50)\n+\t\tsrc << \"<span class='warning'>We do not have the resources for this!</span>\"\n+\t\treturn\n+\tif(!isturf(loc))\n+\t\tsrc << \"<span class='warning'>This is not a suitable location for replicating ourselves. We need more room.</span>\"\n+\t\treturn\n+\tif(do_mob(src, src, 100))\n+\t\tif(Fabricate(/obj/item/unactivated_swarmer, 50))\n+\t\t\tplaysound(loc,'sound/items/poster_being_created.ogg',50, 1, -1)\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/RepairSelf()\n+\tset name = \"Self Repair\"\n+\tset category = \"Swarmer\"\n+\tset desc = \"Attempts to repair damage to our body. You will have to remain motionless until repairs are complete.\"\n+\tif(!isturf(loc))\n+\t\treturn\n+\tsrc << \"<span class='info'>Attempting to repair damage to our body, stand by...</span>\"\n+\tif(do_mob(src, src, 100))\n+\t\tadjustBruteLoss(-100)\n+\t\tsrc << \"<span class='info'>We successfully repaired ourselves.</span>\"\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/ToggleLight()\n+\tif(!luminosity)\n+\t\tSetLuminosity(3)\n+\telse\n+\t\tSetLuminosity(0)\n+\n+/mob/living/simple_animal/hostile/swarmer/proc/ContactSwarmers()\n+\tvar/message = input(src, \"Announce to other swarmers\", \"Swarmer contact\")\n+\tif(message)\n+\t\tfor(var/mob/living/simple_animal/hostile/swarmer/S in mob_list)","path":"code/modules/mob/living/simple_animal/bot_swarm/swarmer.dm","position":400,"original_position":400,"commit_id":"27b42d0b602a34e8bb068e63d910c9b2136804ea","original_commit_id":"27b42d0b602a34e8bb068e63d910c9b2136804ea","user":{"login":"Anonus","id":3886584,"avatar_url":"https://avatars.githubusercontent.com/u/3886584?v=3","gravatar_id":"","url":"https://api.github.com/users/Anonus","html_url":"https://github.com/Anonus","followers_url":"https://api.github.com/users/Anonus/followers","following_url":"https://api.github.com/users/Anonus/following{/other_user}","gists_url":"https://api.github.com/users/Anonus/gists{/gist_id}","starred_url":"https://api.github.com/users/Anonus/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Anonus/subscriptions","organizations_url":"https://api.github.com/users/Anonus/orgs","repos_url":"https://api.github.com/users/Anonus/repos","events_url":"https://api.github.com/users/Anonus/events{/privacy}","received_events_url":"https://api.github.com/users/Anonus/received_events","type":"User","site_admin":false},"body":"Should probably be visible to ghosts as well, so that you can ping for ghosts easier.","created_at":"2015-08-27T14:43:01Z","updated_at":"2015-08-27T14:43:01Z","html_url":"https://github.com/tgstation/-tg-station/pull/11382#discussion_r38103060","pull_request_url":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382","_links":{"self":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/comments/38103060"},"html":{"href":"https://github.com/tgstation/-tg-station/pull/11382#discussion_r38103060"},"pull_request":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382"}}},"pull_request":{"url":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382","id":43283423,"html_url":"https://github.com/tgstation/-tg-station/pull/11382","diff_url":"https://github.com/tgstation/-tg-station/pull/11382.diff","patch_url":"https://github.com/tgstation/-tg-station/pull/11382.patch","issue_url":"https://api.github.com/repos/tgstation/-tg-station/issues/11382","number":11382,"state":"open","locked":false,"title":"Adds \"Swarmers\" - Simple mob side antagonist","user":{"login":"Ergovisavi","id":4465459,"avatar_url":"https://avatars.githubusercontent.com/u/4465459?v=3","gravatar_id":"","url":"https://api.github.com/users/Ergovisavi","html_url":"https://github.com/Ergovisavi","followers_url":"https://api.github.com/users/Ergovisavi/followers","following_url":"https://api.github.com/users/Ergovisavi/following{/other_user}","gists_url":"https://api.github.com/users/Ergovisavi/gists{/gist_id}","starred_url":"https://api.github.com/users/Ergovisavi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ergovisavi/subscriptions","organizations_url":"https://api.github.com/users/Ergovisavi/orgs","repos_url":"https://api.github.com/users/Ergovisavi/repos","events_url":"https://api.github.com/users/Ergovisavi/events{/privacy}","received_events_url":"https://api.github.com/users/Ergovisavi/received_events","type":"User","site_admin":false},"body":"### Adds \"Swarmers\", new simple mob\r\n* Intended to be used in the middle of a round, and are not a main antagonist\r\n* Completely nonlethal. They are incapable of dealing anything but stamina damage to mobs. Their melee attack deals 15 stamina damage, and they have a disabler beam on a decent cooldown.\r\n* Very low amount of health at 40 max, but can self repair.\r\n* Cannot pull.\r\n* Can ventcrawl\r\n* Unlike standard silicons cannot survive in a fire\r\n* Speak swarmer language, and do not understand human speech\r\n* Disablers go right through em, to allow swarmers to better cover each other\r\n\r\n#### Swarmer abilities (Cannot be used in vents)\r\n* Create Trap - Costs 5 resources, puts a small trap on the ground. Mobs that run over it get electrocuted for 0 damage, but will still stun them just like any other electric shock. Has 10 health.\r\n* Create Barricade - Costs 5 resources, creates a barricade that cannot be passed by anything but swarmers and disabler beams. They have 50 health.\r\n* Replicate - Creates a new inactive swarmer at your location after a 10 second delay. Costs 50 resources. Ghosts can click on an inactive swarmer to take control of it.\r\n* Self repair - Repairs to full health after a small delay.\r\n* Contact swarmers - Just sends a message to any other active swarmers\r\n* Toggle Light - Just toggles some brightness on the swarmer.\r\n\r\n#### Swarmer Ctrl+Click abilities:\r\n* Ctrl Click on a item to attempt to cannibalize it for resources. One resource point for one objects, but sheets are consumed one at a time. Only occurs on items with glass or metal materials in it. Remember, because you cannot pull or pick up, resources must be acquired on site. Some objects are banned, such as wiring (Way too much of it on station) and guns (No eating the whole armory).\r\n* Ctrl Click on structure or wall to attempt to Disintegrate it to turn it into useable materials (Calls ex_act(3) on things), notable uses include destroying tables, walls, closets, vending machines, etc. You are incapable of causing a hull breach or destroying the powernet in this fashion.\r\n* Ctrl Click on a mob in melee range to teleport them away. This requires both parties to remain still, and ~3 seconds. The mob is teleported to random safe-for-humans tile on the station zlevel. If they're a human, they get ziptied as well.\r\n* Ctrl Click on a machine to dismantle the machine (Requires 10 seconds). Some machines are obviously protected against this. The circuit board for the machine will drop on the floor, and swarmers can't eat them.\r\n\r\n#### Other stuff\r\n* Adds functionality for simple mobs to ignore specific damage types with a list\r\n* Adds functionality for simple mobs to do different damage types on melee attacks\r\n* Changes some attack_animals to keep up with the new functionalities listed above\r\n* Changes a few ex_act()'s to drop metal for structures\r\n\r\nSwarmers jobs are basically to just run around the station eating random objects. A few things are protected from them, such as atmos canisters, emitters, wiring, etc. They can defend themselves, but can't ever kill anything, and are easily killed, so it's mostly just a cat and mouse game.\r\n\r\n![Swarmer doing swarmer things](http://i.imgur.com/91u9yok.gif)\r\n![Swarmer HUD](http://i.imgur.com/9sTUpOH.jpg?1)","created_at":"2015-08-25T13:10:14Z","updated_at":"2015-08-27T14:43:01Z","closed_at":null,"merged_at":null,"merge_commit_sha":"3b4e4503e2fa8618cf921b551ddb3d5ff6d3744e","assignee":null,"milestone":null,"commits_url":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382/commits","review_comments_url":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382/comments","review_comment_url":"https://api.github.com/repos/tgstation/-tg-station/pulls/comments{/number}","comments_url":"https://api.github.com/repos/tgstation/-tg-station/issues/11382/comments","statuses_url":"https://api.github.com/repos/tgstation/-tg-station/statuses/27b42d0b602a34e8bb068e63d910c9b2136804ea","head":{"label":"Ergovisavi:bot_swarm","ref":"bot_swarm","sha":"27b42d0b602a34e8bb068e63d910c9b2136804ea","user":{"login":"Ergovisavi","id":4465459,"avatar_url":"https://avatars.githubusercontent.com/u/4465459?v=3","gravatar_id":"","url":"https://api.github.com/users/Ergovisavi","html_url":"https://github.com/Ergovisavi","followers_url":"https://api.github.com/users/Ergovisavi/followers","following_url":"https://api.github.com/users/Ergovisavi/following{/other_user}","gists_url":"https://api.github.com/users/Ergovisavi/gists{/gist_id}","starred_url":"https://api.github.com/users/Ergovisavi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ergovisavi/subscriptions","organizations_url":"https://api.github.com/users/Ergovisavi/orgs","repos_url":"https://api.github.com/users/Ergovisavi/repos","events_url":"https://api.github.com/users/Ergovisavi/events{/privacy}","received_events_url":"https://api.github.com/users/Ergovisavi/received_events","type":"User","site_admin":false},"repo":{"id":15734108,"name":"-tg-station","full_name":"Ergovisavi/-tg-station","owner":{"login":"Ergovisavi","id":4465459,"avatar_url":"https://avatars.githubusercontent.com/u/4465459?v=3","gravatar_id":"","url":"https://api.github.com/users/Ergovisavi","html_url":"https://github.com/Ergovisavi","followers_url":"https://api.github.com/users/Ergovisavi/followers","following_url":"https://api.github.com/users/Ergovisavi/following{/other_user}","gists_url":"https://api.github.com/users/Ergovisavi/gists{/gist_id}","starred_url":"https://api.github.com/users/Ergovisavi/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Ergovisavi/subscriptions","organizations_url":"https://api.github.com/users/Ergovisavi/orgs","repos_url":"https://api.github.com/users/Ergovisavi/repos","events_url":"https://api.github.com/users/Ergovisavi/events{/privacy}","received_events_url":"https://api.github.com/users/Ergovisavi/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/Ergovisavi/-tg-station","description":"/tg/'s SS13 branch","fork":true,"url":"https://api.github.com/repos/Ergovisavi/-tg-station","forks_url":"https://api.github.com/repos/Ergovisavi/-tg-station/forks","keys_url":"https://api.github.com/repos/Ergovisavi/-tg-station/keys{/key_id}","collaborators_url":"https://api.github.com/repos/Ergovisavi/-tg-station/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/Ergovisavi/-tg-station/teams","hooks_url":"https://api.github.com/repos/Ergovisavi/-tg-station/hooks","issue_events_url":"https://api.github.com/repos/Ergovisavi/-tg-station/issues/events{/number}","events_url":"https://api.github.com/repos/Ergovisavi/-tg-station/events","assignees_url":"https://api.github.com/repos/Ergovisavi/-tg-station/assignees{/user}","branches_url":"https://api.github.com/repos/Ergovisavi/-tg-station/branches{/branch}","tags_url":"https://api.github.com/repos/Ergovisavi/-tg-station/tags","blobs_url":"https://api.github.com/repos/Ergovisavi/-tg-station/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/Ergovisavi/-tg-station/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/Ergovisavi/-tg-station/git/refs{/sha}","trees_url":"https://api.github.com/repos/Ergovisavi/-tg-station/git/trees{/sha}","statuses_url":"https://api.github.com/repos/Ergovisavi/-tg-station/statuses/{sha}","languages_url":"https://api.github.com/repos/Ergovisavi/-tg-station/languages","stargazers_url":"https://api.github.com/repos/Ergovisavi/-tg-station/stargazers","contributors_url":"https://api.github.com/repos/Ergovisavi/-tg-station/contributors","subscribers_url":"https://api.github.com/repos/Ergovisavi/-tg-station/subscribers","subscription_url":"https://api.github.com/repos/Ergovisavi/-tg-station/subscription","commits_url":"https://api.github.com/repos/Ergovisavi/-tg-station/commits{/sha}","git_commits_url":"https://api.github.com/repos/Ergovisavi/-tg-station/git/commits{/sha}","comments_url":"https://api.github.com/repos/Ergovisavi/-tg-station/comments{/number}","issue_comment_url":"https://api.github.com/repos/Ergovisavi/-tg-station/issues/comments{/number}","contents_url":"https://api.github.com/repos/Ergovisavi/-tg-station/contents/{+path}","compare_url":"https://api.github.com/repos/Ergovisavi/-tg-station/compare/{base}...{head}","merges_url":"https://api.github.com/repos/Ergovisavi/-tg-station/merges","archive_url":"https://api.github.com/repos/Ergovisavi/-tg-station/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/Ergovisavi/-tg-station/downloads","issues_url":"https://api.github.com/repos/Ergovisavi/-tg-station/issues{/number}","pulls_url":"https://api.github.com/repos/Ergovisavi/-tg-station/pulls{/number}","milestones_url":"https://api.github.com/repos/Ergovisavi/-tg-station/milestones{/number}","notifications_url":"https://api.github.com/repos/Ergovisavi/-tg-station/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/Ergovisavi/-tg-station/labels{/name}","releases_url":"https://api.github.com/repos/Ergovisavi/-tg-station/releases{/id}","created_at":"2014-01-08T11:53:27Z","updated_at":"2014-04-23T09:25:28Z","pushed_at":"2015-08-27T08:49:12Z","git_url":"git://github.com/Ergovisavi/-tg-station.git","ssh_url":"git@github.com:Ergovisavi/-tg-station.git","clone_url":"https://github.com/Ergovisavi/-tg-station.git","svn_url":"https://github.com/Ergovisavi/-tg-station","homepage":"","size":534984,"stargazers_count":0,"watchers_count":0,"language":"DM","has_issues":false,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"open_issues_count":0,"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"tgstation:master","ref":"master","sha":"d7eca4f3277cae3e55b6e8e5938d310dce2df5b6","user":{"login":"tgstation","id":1363778,"avatar_url":"https://avatars.githubusercontent.com/u/1363778?v=3","gravatar_id":"","url":"https://api.github.com/users/tgstation","html_url":"https://github.com/tgstation","followers_url":"https://api.github.com/users/tgstation/followers","following_url":"https://api.github.com/users/tgstation/following{/other_user}","gists_url":"https://api.github.com/users/tgstation/gists{/gist_id}","starred_url":"https://api.github.com/users/tgstation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tgstation/subscriptions","organizations_url":"https://api.github.com/users/tgstation/orgs","repos_url":"https://api.github.com/users/tgstation/repos","events_url":"https://api.github.com/users/tgstation/events{/privacy}","received_events_url":"https://api.github.com/users/tgstation/received_events","type":"Organization","site_admin":false},"repo":{"id":3234987,"name":"-tg-station","full_name":"tgstation/-tg-station","owner":{"login":"tgstation","id":1363778,"avatar_url":"https://avatars.githubusercontent.com/u/1363778?v=3","gravatar_id":"","url":"https://api.github.com/users/tgstation","html_url":"https://github.com/tgstation","followers_url":"https://api.github.com/users/tgstation/followers","following_url":"https://api.github.com/users/tgstation/following{/other_user}","gists_url":"https://api.github.com/users/tgstation/gists{/gist_id}","starred_url":"https://api.github.com/users/tgstation/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/tgstation/subscriptions","organizations_url":"https://api.github.com/users/tgstation/orgs","repos_url":"https://api.github.com/users/tgstation/repos","events_url":"https://api.github.com/users/tgstation/events{/privacy}","received_events_url":"https://api.github.com/users/tgstation/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/tgstation/-tg-station","description":"the /tg/station branch of SS13","fork":false,"url":"https://api.github.com/repos/tgstation/-tg-station","forks_url":"https://api.github.com/repos/tgstation/-tg-station/forks","keys_url":"https://api.github.com/repos/tgstation/-tg-station/keys{/key_id}","collaborators_url":"https://api.github.com/repos/tgstation/-tg-station/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/tgstation/-tg-station/teams","hooks_url":"https://api.github.com/repos/tgstation/-tg-station/hooks","issue_events_url":"https://api.github.com/repos/tgstation/-tg-station/issues/events{/number}","events_url":"https://api.github.com/repos/tgstation/-tg-station/events","assignees_url":"https://api.github.com/repos/tgstation/-tg-station/assignees{/user}","branches_url":"https://api.github.com/repos/tgstation/-tg-station/branches{/branch}","tags_url":"https://api.github.com/repos/tgstation/-tg-station/tags","blobs_url":"https://api.github.com/repos/tgstation/-tg-station/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/tgstation/-tg-station/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/tgstation/-tg-station/git/refs{/sha}","trees_url":"https://api.github.com/repos/tgstation/-tg-station/git/trees{/sha}","statuses_url":"https://api.github.com/repos/tgstation/-tg-station/statuses/{sha}","languages_url":"https://api.github.com/repos/tgstation/-tg-station/languages","stargazers_url":"https://api.github.com/repos/tgstation/-tg-station/stargazers","contributors_url":"https://api.github.com/repos/tgstation/-tg-station/contributors","subscribers_url":"https://api.github.com/repos/tgstation/-tg-station/subscribers","subscription_url":"https://api.github.com/repos/tgstation/-tg-station/subscription","commits_url":"https://api.github.com/repos/tgstation/-tg-station/commits{/sha}","git_commits_url":"https://api.github.com/repos/tgstation/-tg-station/git/commits{/sha}","comments_url":"https://api.github.com/repos/tgstation/-tg-station/comments{/number}","issue_comment_url":"https://api.github.com/repos/tgstation/-tg-station/issues/comments{/number}","contents_url":"https://api.github.com/repos/tgstation/-tg-station/contents/{+path}","compare_url":"https://api.github.com/repos/tgstation/-tg-station/compare/{base}...{head}","merges_url":"https://api.github.com/repos/tgstation/-tg-station/merges","archive_url":"https://api.github.com/repos/tgstation/-tg-station/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/tgstation/-tg-station/downloads","issues_url":"https://api.github.com/repos/tgstation/-tg-station/issues{/number}","pulls_url":"https://api.github.com/repos/tgstation/-tg-station/pulls{/number}","milestones_url":"https://api.github.com/repos/tgstation/-tg-station/milestones{/number}","notifications_url":"https://api.github.com/repos/tgstation/-tg-station/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/tgstation/-tg-station/labels{/name}","releases_url":"https://api.github.com/repos/tgstation/-tg-station/releases{/id}","created_at":"2012-01-21T17:32:47Z","updated_at":"2015-08-23T21:18:50Z","pushed_at":"2015-08-27T12:17:39Z","git_url":"git://github.com/tgstation/-tg-station.git","ssh_url":"git@github.com:tgstation/-tg-station.git","clone_url":"https://github.com/tgstation/-tg-station.git","svn_url":"https://github.com/tgstation/-tg-station","homepage":"http://www.tgstation13.org/","size":741299,"stargazers_count":238,"watchers_count":238,"language":"DM","has_issues":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":814,"mirror_url":null,"open_issues_count":862,"forks":814,"open_issues":862,"watchers":238,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382"},"html":{"href":"https://github.com/tgstation/-tg-station/pull/11382"},"issue":{"href":"https://api.github.com/repos/tgstation/-tg-station/issues/11382"},"comments":{"href":"https://api.github.com/repos/tgstation/-tg-station/issues/11382/comments"},"review_comments":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382/comments"},"review_comment":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/tgstation/-tg-station/pulls/11382/commits"},"statuses":{"href":"https://api.github.com/repos/tgstation/-tg-station/statuses/27b42d0b602a34e8bb068e63d910c9b2136804ea"}}}}