{"action":"created","comment":{"url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/comments/196735258","pull_request_review_id":130329346,"id":196735258,"node_id":"MDI0OlB1bGxSZXF1ZXN0UmV2aWV3Q29tbWVudDE5NjczNTI1OA==","diff_hunk":"@@ -0,0 +1,946 @@\n+#define EMPOWERED_THRALL_LIMIT 5\n+\n+/obj/effect/proc_holder/spell/proc/shadowling_check(var/mob/living/carbon/human/H)\n+\tif(!H || !istype(H)) return\n+\tif(H.dna.species.id == \"shadowling\" && is_shadow(H)) return TRUE\n+\tif(H.dna.species.id == \"l_shadowling\" && is_thrall(H)) return TRUE\n+\tif(!is_shadow_or_thrall(usr)) to_chat(usr, \"<span class='warning'>You can't wrap your head around how to do this.</span>\")\n+\telse if(is_thrall(usr)) to_chat(usr, \"<span class='warning'>You aren't powerful enough to do this.</span>\")\n+\telse if(is_shadow(usr)) to_chat(usr, \"<span class='warning'>Your telepathic ability is suppressed. Hatch or use Rapid Re-Hatch first.</span>\")\n+\treturn 0\n+\n+\n+\n+\n+/obj/effect/proc_holder/spell/targeted/sling //Stuns and mutes a human target for 10 seconds\n+\tranged_mousepointer = 'icons/effects/cult_target.dmi'\n+\tvar/mob/living/user\n+\tvar/mob/living/target\n+\n+/obj/effect/proc_holder/spell/targeted/sling/Click()\n+\tvar/mob/living/user = usr\n+\tif(!istype(user))\n+\t\treturn\n+\tvar/msg\n+\tif(!can_cast(user))\n+\t\tmsg = \"<span class='warning'>You can no longer cast [name]!</span>\"\n+\t\tremove_ranged_ability(msg)\n+\t\treturn\n+\tif(active)\n+\t\tremove_ranged_ability()\n+\telse\n+\t\tadd_ranged_ability(user, null, TRUE)\n+\n+\tif(action)\n+\t\taction.UpdateButtonIcon()\n+\n+\n+/obj/effect/proc_holder/spell/targeted/sling/InterceptClickOn(mob/living/caller, params, atom/t)\n+\tif(!isliving(t))\n+\t\tto_chat(caller, \"<span class='warning'>You may only use this ability on living things!</span>\")\n+\t\trevert_cast()\n+\t\treturn\n+\tuser = caller\n+\ttarget = t\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\n+/obj/effect/proc_holder/spell/targeted/sling/revert_cast()\n+\t. = ..()\n+\tremove_ranged_ability()\n+\n+/obj/effect/proc_holder/spell/targeted/sling/start_recharge()\n+\t. = ..()\n+\tif(action)\n+\t\taction.UpdateButtonIcon()\n+\n+/obj/effect/proc_holder/spell/targeted/sling/glare //Stuns and mutes a human target for 10 seconds\n+\tname = \"Glare\"\n+\tdesc = \"Disrupts the target's motor and speech abilities.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 300\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon_state = \"glare\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\n+\n+/obj/effect/proc_holder/spell/targeted/sling/glare/InterceptClickOn(mob/living/caller, params, atom/t)\n+\t. = ..()\n+\tif(target.stat)\n+\t\tto_chat(user, \"<span class='warning'>[target] must be conscious!</span>\")\n+\t\trevert_cast()\n+\t\treturn\n+\tif(is_shadow_or_thrall(target))\n+\t\tto_chat(user, \"<span class='warning'>You cannot glare at allies!</span>\")\n+\t\trevert_cast()\n+\t\treturn\n+\tvar/mob/living/carbon/human/M = target\n+\tuser.visible_message(\"<span class='warning'><b>[user]'s eyes flash a purpleish-red!</b></span>\")\n+\tvar/distance = get_dist(target, user)\n+\tif (distance <= 1) //Melee\n+\t\ttarget.visible_message(\"<span class='danger'>[target] suddendly collapses...</span>\")\n+\t\tto_chat(target, \"<span class='userdanger'>A purple light flashes across your vision, and you lose control of your movements!</span>\")\n+\t\ttarget.Stun(100)\n+\t\tM.silent += 10\n+\telse //Distant glare\n+\t\tvar/loss = 100 - ((distance - 1) * 18)\n+\t\ttarget.adjustStaminaLoss(loss)\n+\t\ttarget.stuttering = loss\n+\t\tto_chat(target, \"<span class='userdanger'>A purple light flashes across your vision, and exhaustion floods your body...</span>\")\n+\t\ttarget.visible_message(\"<span class='danger'>[target] looks very tired...</span>\")\n+\tcharge_counter = 0\n+\tstart_recharge()\n+\tremove_ranged_ability()\n+\tuser = null\n+\ttarget = null\n+\n+\n+/obj/effect/proc_holder/spell/aoe_turf/veil //Puts out most nearby lights except for flares and yellow slime cores\n+\tname = \"Veil\"\n+\tdesc = \"Extinguishes most nearby light sources.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 150 //Short cooldown because people can just turn the lights back on\n+\thuman_req = 1\n+\tclothes_req = 0\n+\trange = 5\n+\taction_icon_state = \"veil\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tvar/blacklisted_lights = list(/obj/item/flashlight/flare, /obj/item/flashlight/slime)\n+\tvar/admin_override = FALSE //Requested by Shadowlight213. Allows anyone to cast the spell, not just shadowlings.\n+\n+/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishItem(obj/item/I) //Does not darken items held by mobs due to mobs having separate luminosity, use extinguishMob() or write your own proc.\n+\tif(istype(I, /obj/item/flashlight))\n+\t\tvar/obj/item/flashlight/F = I\n+\t\tif(F.on)\n+\t\t\tif(is_type_in_list(I, blacklisted_lights))\n+\t\t\t\tI.visible_message(\"<span class='danger'>[I] dims slightly before scattering the shadows around it.</span>\")\n+\t\t\t\treturn F.brightness_on //Necessary because flashlights become 0-luminosity when held.  I don't make the rules of lightcode.\n+\t\t\tF.on = 0\n+\t\t\tF.update_brightness()\n+\telse if(istype(I, /obj/item/pda))\n+\t\tvar/obj/item/pda/P = I\n+\t\tP.fon = 0\n+\tI.set_light(0)\n+\treturn I.luminosity\n+\n+/obj/effect/proc_holder/spell/aoe_turf/veil/proc/extinguishMob(mob/living/H)\n+\tvar/blacklistLuminosity = 0\n+\tfor(var/obj/item/F in H)\n+\t\tblacklistLuminosity += extinguishItem(F)\n+\tH.set_light(blacklistLuminosity) //I hate lightcode for making me do it this way\n+\n+\n+/obj/effect/proc_holder/spell/aoe_turf/veil/cast(list/targets,mob/user = usr)\n+\tif(!shadowling_check(user) && !admin_override)\n+\t\trevert_cast()\n+\t\treturn\n+\tto_chat(user, \"<span class='shadowling'>You silently disable all nearby lights.</span>\")\n+\tfor(var/turf/T in view(5))\n+\t\tfor(var/obj/item/F in T.contents)\n+\t\t\textinguishItem(F)\n+\t\tfor(var/obj/machinery/light/L in T.contents)\n+\t\t\tL.on = 0\n+\t\t\tL.visible_message(\"<span class='warning'>[L] flickers and falls dark.</span>\")\n+\t\t\tL.update(0)\n+\t\tfor(var/obj/machinery/computer/C in T.contents)\n+\t\t\tC.set_light(0)\n+\t\t\tC.visible_message(\"<span class='warning'>[C] grows dim, its screen barely readable.</span>\")\n+\t\tfor(var/obj/structure/glowshroom/G in orange(7, user)) //High radius because glowshroom spam wrecks shadowlings\n+\t\t\tG.visible_message(\"<span class='warning'>[G] withers away!</span>\")\n+\t\t\tqdel(G)\n+\t\tfor(var/mob/living/H in T.contents)\n+\t\t\textinguishMob(H)\n+\t\tfor(var/mob/living/silicon/robot/borg in T.contents)\n+\t\t\tif(!borg.lamp_cooldown)\n+\t\t\t\tborg.update_headlamp(TRUE, INFINITY)\n+\t\t\t\tto_chat(borg, \"<span class='danger'>Your headlamp is fried! You'll need a human to help replace it.</span>\")\n+\t\tfor(var/obj/machinery/camera/cam in T.contents)\n+\t\t\tcam.set_light(0)\n+\t\t\tif(prob(10))\n+\t\t\t\tcam.emp_act(2)\n+\n+/obj/effect/proc_holder/spell/aoe_turf/flashfreeze //Stuns and freezes nearby people - a bit more effective than a changeling's cryosting\n+\tname = \"Icy Veins\"\n+\tdesc = \"Instantly freezes the blood of nearby people, stunning them and causing burn damage.\"\n+\tpanel = \"Shadowling Abilities\"\n+\trange = 3\n+\tcharge_max = 250\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"icy_veins\"\n+\tsound = 'sound/effects/ghost2.ogg'\n+\n+/obj/effect/proc_holder/spell/aoe_turf/flashfreeze/cast(list/targets,mob/user = usr)\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tto_chat(user, \"<span class='shadowling'>You freeze the nearby air.</span>\")\n+\tfor(var/turf/T in targets)\n+\t\tfor(var/mob/living/carbon/M in T.contents)\n+\t\t\tif(is_shadow_or_thrall(M))\n+\t\t\t\tif(M == user) //No message for the user, of course\n+\t\t\t\t\tcontinue\n+\t\t\t\telse\n+\t\t\t\t\tto_chat(M, \"<span class='danger'>You feel a blast of paralyzingly cold air wrap around you and flow past, but you are unaffected!</span>\")\n+\t\t\t\t\tcontinue\n+\t\t\tto_chat(M, \"<span class='userdanger'>A wave of shockingly cold air engulfs you!</span>\")\n+\t\t\tM.Stun(2)\n+\t\t\tM.apply_damage(10, BURN)\n+\t\t\tif(M.bodytemperature)\n+\t\t\t\tM.bodytemperature -= 200 //Extreme amount of initial cold\n+\t\t\tif(M.reagents)\n+\t\t\t\tM.reagents.add_reagent(\"frostoil\", 15) //Half of a cryosting\n+\n+\n+\n+\n+/obj/effect/proc_holder/spell/targeted/enthrall //Turns a target into the shadowling's slave. This overrides all previous loyalties\n+\tname = \"Enthrall\"\n+\tdesc = \"Allows you to enslave a conscious, non-braindead, non-catatonic human to your will. This takes some time to cast.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 0\n+\thuman_req = 1\n+\tclothes_req = 0\n+\trange = 1 //Adjacent to user\n+\taction_icon_state = \"enthrall\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tvar/enthralling = 0\n+\n+/obj/effect/proc_holder/spell/targeted/enthrall/cast(list/targets,mob/living/carbon/human/user = usr)\n+\tlistclearnulls(SSticker.mode.thralls)\n+\tif(!(user.mind in SSticker.mode.shadows)) return\n+\tif(user.dna.species.id != \"shadowling\")\n+\t\tif(SSticker.mode.thralls.len >= 5)\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\tfor(var/mob/living/carbon/human/target in targets)\n+\t\tif(!in_range(user, target))\n+\t\t\tto_chat(user, \"<span class='warning'>You need to be closer to enthrall [target]!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(!target.key || !target.mind)\n+\t\t\tto_chat(user, \"<span class='warning'>The target has no mind!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(target.stat)\n+\t\t\tto_chat(user, \"<span class='warning'>The target must be conscious!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(is_shadow_or_thrall(target))\n+\t\t\tto_chat(user, \"<span class='warning'>You can not enthrall allies!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(!ishuman(target))\n+\t\t\tto_chat(user, \"<span class='warning'>You can only enthrall humans!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(enthralling)\n+\t\t\tto_chat(user, \"<span class='warning'>You are already enthralling!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(!target.client)\n+\t\t\tto_chat(user, \"<span class='warning'>[target]'s mind is vacant of activity.</span>\")\n+\t\tenthralling = 1\n+\n+\t\tfor(var/progress = 0, progress <= 3, progress++)\n+\t\t\tswitch(progress)\n+\t\t\t\tif(1)\n+\t\t\t\t\tto_chat(user, \"<span class='notice'>You place your hands to [target]'s head...</span>\")\n+\t\t\t\t\tuser.visible_message(\"<span class='warning'>[user] places their hands onto the sides of [target]'s head!</span>\")\n+\t\t\t\tif(2)\n+\t\t\t\t\tto_chat(user, \"<span class='notice'>You begin preparing [target]'s mind as a blank slate...</span>\")\n+\t\t\t\t\tuser.visible_message(\"<span class='warning'>[user]'s palms flare a bright red against [target]'s temples!</span>\")\n+\t\t\t\t\tto_chat(target, \"<span class='danger'>A terrible red light floods your mind. You collapse as conscious thought is wiped away.</span>\")\n+\t\t\t\t\ttarget.Knockdown(120)\n+\t\t\t\t\tif(target.isloyal())\n+\t\t\t\t\t\tto_chat(user, \"<span class='notice'>They are protected by an implant. You begin to shut down the nanobots in their brain - this will take some time..</span>\")\n+\t\t\t\t\t\tuser.visible_message(\"<span class='warning'>[user] pauses, then dips their head in concentration!</span>\")\n+\t\t\t\t\t\tto_chat(target, \"<span class='boldannounce'>You feel your mental protection faltering</span>\")\n+\t\t\t\t\t\tif(!do_mob(user, target, 650)) //65 seconds to remove a loyalty implant. yikes!\n+\t\t\t\t\t\t\tto_chat(user, \"<span class='warning'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>\")\n+\t\t\t\t\t\t\tto_chat(target, \"<span class='userdanger'>You wrest yourself away from [user]'s hands and compose yourself</span>\")\n+\t\t\t\t\t\t\tenthralling = 0\n+\t\t\t\t\t\t\treturn\n+\t\t\t\t\t\tto_chat(user, \"<span class='notice'>The nanobots composing the mindshield implant have been rendered inert. Now to continue.</span>\")\n+\t\t\t\t\t\tuser.visible_message(\"<span class='warning'>[user] relaxes again.</span>\")\n+\t\t\t\t\t\tfor(var/obj/item/implant/mindshield/L in target)\n+\t\t\t\t\t\t\tif(L)\n+\t\t\t\t\t\t\t\tqdel(L)\n+\t\t\t\t\t\tto_chat(target, \"<span class='boldannounce'>Your mental protection unexpectedly falters, dims, dies.</span>\")\n+\t\t\t\tif(3)\n+\t\t\t\t\tto_chat(user, \"<span class='notice'>You begin planting the tumor that will control the new thrall...</span>\")\n+\t\t\t\t\tuser.visible_message(\"<span class='warning'>A strange energy passes from [user]'s hands into [target]'s head!</span>\")\n+\t\t\t\t\tto_chat(target, \"<span class='boldannounce'>You feel your memories twisting, morphing. A sense of horror dominates your mind.</span>\")\n+\t\t\tif(!do_mob(user, target, 70)) //around 21 seconds total for enthralling, 86 for someone with a loyalty implant\n+\t\t\t\tto_chat(user, \"<span class='warning'>The enthralling has been interrupted - your target's mind returns to its previous state.</span>\")\n+\t\t\t\tto_chat(target, \"<span class='userdanger'>You wrest yourself away from [user]'s hands and compose yourself</span>\")\n+\t\t\t\tenthralling = 0\n+\t\t\t\treturn\n+\n+\t\tenthralling = 0\n+\t\tto_chat(user, \"<span class='shadowling'>You have enthralled <b>[target.real_name]</b>!</span>\")\n+\t\ttarget.visible_message(\"<span class='big'>[target] looks to have experienced a revelation!</span>\", \\\n+\t\t\t\t\t\t\t   \"<span class='warning'>False faces all d<b>ark not real not real not--</b></span>\")\n+\t\ttarget.setOxyLoss(0) //In case the shadowling was choking them out\n+\t\ttarget.mind.special_role = \"thrall\"\n+\t\tvar/obj/item/organ/internal/shadowtumor/ST = new\n+\t\tST.Insert(target, FALSE, FALSE)\n+\t\ttarget.add_thrall()\n+\t\tif(target.reagents.has_reagent(\"frostoil\")) //Stabilize body temp incase the sling froze them earlier\n+\t\t\ttarget.reagents.remove_reagent(\"frostoil\")\n+\t\t\tto_chat(target, \"<span class='notice'>You feel warmer... it feels good.</span>\")\n+\t\t\ttarget.bodytemperature = 310\n+\n+\n+/obj/effect/proc_holder/spell/self/shadowling_hivemind //Lets a shadowling talk to its allies\n+\tname = \"Hivemind Commune\"\n+\tdesc = \"Allows you to silently communicate with all other shadowlings and thralls.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 0\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"commune\"\n+\n+/obj/effect/proc_holder/spell/self/shadowling_hivemind/cast(mob/living/user,mob/user = usr)\n+\tif(!is_shadow(user))\n+\t\tto_chat(user, \"<span class='warning'>You must be a shadowling to do that!</span>\")\n+\t\treturn\n+\tvar/text = stripped_input(user, \"What do you want to say your thralls and fellow shadowlings?.\", \"Hive Chat\", \"\")\n+\tif(!text)\n+\t\treturn\n+\tvar/my_message = \"<font size=2><span class='shadowling'><b>\\[Shadowling\\]</b><i> [user.real_name]</i>: [text]</span></font>\"\n+\tfor(var/mob/M in GLOB.mob_list)\n+\t\tif(is_shadow_or_thrall(M))\n+\t\t\tto_chat(M, my_message)\n+\t\tif(M in GLOB.dead_mob_list)\n+\t\t\tto_chat(M, \"<a href='?src=[REF(M)];follow=[REF(user)]'>(F)</a> [my_message]\")\n+\tlog_say(\"[user.real_name]/[user.key] : [text]\")\n+\n+\n+\n+/obj/effect/proc_holder/spell/self/shadowling_regenarmor //Resets a shadowling's species to normal, removes genetic defects, and re-equips their armor\n+\tname = \"Rapid Re-Hatch\"\n+\tdesc = \"Re-forms protective chitin that may be lost during cloning or similar processes.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 600\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"regen_armor\"\n+\n+/obj/effect/proc_holder/spell/self/shadowling_regenarmor/cast(mob/living/carbon/human/user)\n+\tif(!is_shadow(user))\n+\t\tto_chat(user, \"<span class='warning'>You must be a shadowling to do this!</span>\")\n+\t\trevert_cast()\n+\t\treturn\n+\tuser.visible_message(\"<span class='warning'>[user]'s skin suddenly bubbles and shifts around their body!</span>\", \\\n+\t\t\t\t\t\t \"<span class='shadowling'>You regenerate your protective armor and cleanse your form of defects.</span>\")\n+\tuser.setCloneLoss(0)\n+\tuser.equip_to_slot_or_del(new /obj/item/clothing/suit/space/shadowling(user), SLOT_WEAR_SUIT)\n+\tuser.equip_to_slot_or_del(new /obj/item/clothing/head/shadowling(user), SLOT_HEAD)\n+\tuser.set_species(/datum/species/shadow/ling)\n+\n+\n+/obj/effect/proc_holder/spell/self/collective_mind //Lets a shadowling bring together their thralls' strength, granting new abilities and a headcount\n+\tname = \"Collective Hivemind\"\n+\tdesc = \"Gathers the power of all of your thralls and compares it to what is needed for ascendance. Also gains you new abilities.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 300 //30 second cooldown to prevent spam\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon_state = \"collective_mind\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tvar/blind_smoke_acquired\n+\tvar/screech_acquired\n+\tvar/reviveThrallAcquired\n+\n+/obj/effect/proc_holder/spell/self/collective_mind/cast(mob/living/carbon/human/user)\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tvar/thralls = 0\n+\tvar/victory_threshold = SSticker.mode.required_thralls\n+\tvar/mob/M\n+\n+\tto_chat(user, \"<span class='shadowling'><b>You focus your telepathic energies abound, harnessing and drawing together the strength of your thralls.</b></span>\")\n+\n+\tfor(M in GLOB.alive_mob_list)\n+\t\tif(is_thrall(M))\n+\t\t\tthralls++\n+\t\t\tto_chat(M, \"<span class='shadowling'>You feel hooks sink into your mind and pull.</span>\")\n+\n+\tif(!do_after(user, 30, target = user))\n+\t\tto_chat(user, \"<span class='warning'>Your concentration has been broken. The mental hooks you have sent out now retract into your mind.</span>\")\n+\t\treturn\n+\n+\tif(thralls >= CEILING(3 * SSticker.mode.thrall_ratio, 1) && !screech_acquired)\n+\t\tscreech_acquired = 1\n+\t\tto_chat(user, \"<span class='shadowling'><i>The power of your thralls has granted you the <b>Sonic Screech</b> ability. This ability will shatter nearby windows and deafen enemies, plus stunning silicon lifeforms.</span>\")\n+\t\tuser.mind.AddSpell(new /obj/effect/proc_holder/spell/aoe_turf/unearthly_screech(null))\n+\n+\tif(thralls >= CEILING(5 * SSticker.mode.thrall_ratio, 1) && !blind_smoke_acquired)\n+\t\tblind_smoke_acquired = 1\n+\t\tto_chat(user, \"<span class='shadowling'><i>The power of your thralls has granted you the <b>Blinding Smoke</b> ability. It will create a choking cloud that will blind any non-thralls who enter. \\\n+\t\t\t</i></span>\")\n+\t\tuser.mind.AddSpell(new /obj/effect/proc_holder/spell/self/blindness_smoke(null))\n+\n+\tif(thralls >= CEILING(9 * SSticker.mode.thrall_ratio, 1) && !reviveThrallAcquired)\n+\t\treviveThrallAcquired = 1\n+\t\tto_chat(user, \"<span class='shadowling'><i>The power of your thralls has granted you the <b>Black Recuperation</b> ability. This will, after a short time, bring a dead thrall completely back to life \\\n+\t\twith no bodily defects.</i></span>\")\n+\t\tuser.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/revive_thrall(null))\n+\n+\tif(thralls < victory_threshold)\n+\t\tto_chat(user, \"<span class='shadowling'>You do not have the power to ascend. You require [victory_threshold] thralls, but only [thralls] living thralls are present.</span>\")\n+\n+\telse if(thralls >= victory_threshold)\n+\t\tto_chat(user, \"<span class='shadowling'><b>You are now powerful enough to ascend. Use the Ascendance ability when you are ready. <i>This will kill all of your thralls.</i></span>\")\n+\t\tto_chat(user, \"<span class='shadowling'><b>You may find Ascendance in the Shadowling Evolution tab.</b></span>\")\n+\t\tfor(M in GLOB.alive_mob_list)\n+\t\t\tif(is_shadow(M))\n+\t\t\t\tvar/obj/effect/proc_holder/spell/self/collective_mind/CM\n+\t\t\t\tif(CM in M.mind.spell_list)\n+\t\t\t\t\tM.mind.spell_list -= CM\n+\t\t\t\t\tqdel(CM)\n+\t\t\t\tM.mind.RemoveSpell(/obj/effect/proc_holder/spell/self/shadowling_hatch)\n+\t\t\t\tM.mind.AddSpell(new /obj/effect/proc_holder/spell/self/shadowling_ascend(null))\n+\t\t\t\tif(M == user)\n+\t\t\t\t\tto_chat(user, \"<span class='shadowling'><i>You project this power to the rest of the shadowlings.</i></span>\")\n+\t\t\t\telse\n+\t\t\t\t\tto_chat(M, \"<span class='shadowling'><b>[user.real_name] has coalesced the strength of the thralls. You can draw upon it at any time to ascend. (Shadowling Evolution Tab)</b></span>\") //Tells all the other shadowlings\n+\n+\n+/obj/effect/proc_holder/spell/self/blindness_smoke //Spawns a cloud of smoke that blinds non-thralls/shadows and grants slight healing to shadowlings and their allies\n+\tname = \"Blindness Smoke\"\n+\tdesc = \"Spews a cloud of smoke which will blind enemies.\"\n+\tpanel = \"Shadowling Abilities\"\n+\tcharge_max = 600\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon_state = \"black_smoke\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tsound = 'sound/effects/bamf.ogg'\n+\n+/obj/effect/proc_holder/spell/self/blindness_smoke/cast(mob/living/carbon/human/user) //Extremely hacky\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tuser.visible_message(\"<span class='warning'>[user] bends over and coughs out a cloud of black smoke!</span>\")\n+\tto_chat(user, \"<span class='shadowling'>You regurgitate a vast cloud of blinding smoke.</span>\")\n+\tvar/obj/item/reagent_containers/glass/beaker/large/B = new /obj/item/reagent_containers/glass/beaker/large(user.loc) //hacky\n+\tB.reagents.clear_reagents() //Just in case!\n+\tB.invisibility = INFINITY //This ought to do the trick\n+\tB.reagents.add_reagent(\"blindness_smoke\", 10)\n+\tvar/datum/effect_system/smoke_spread/chem/S = new\n+\tS.attach(B)\n+\tif(S)\n+\t\tS.set_up(B.reagents, 4, 0, B.loc)\n+\t\tS.start()\n+\tqdel(B)\n+\n+/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech //Damages nearby windows, confuses nearby carbons, and outright stuns silly cones\n+\tname = \"Sonic Screech\"\n+\tdesc = \"Deafens, stuns, and confuses nearby people. Also shatters windows.\"\n+\tpanel = \"Shadowling Abilities\"\n+\trange = 7\n+\tcharge_max = 300\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon_state = \"screech\"\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tsound = 'sound/effects/screech.ogg'\n+\n+/obj/effect/proc_holder/spell/aoe_turf/unearthly_screech/cast(list/targets,mob/user = usr)\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tuser.audible_message(\"<span class='warning'><b>[user] lets out a horrible scream!</b></span>\")\n+\tfor(var/turf/T in targets)\n+\t\tfor(var/mob/target in T.contents)\n+\t\t\tif(is_shadow_or_thrall(target))\n+\t\t\t\tif(target == user) //No message for the user, of course\n+\t\t\t\t\tcontinue\n+\t\t\t\telse\n+\t\t\t\t\tcontinue\n+\t\t\tif(iscarbon(target))\n+\t\t\t\tvar/mob/living/carbon/M = target\n+\t\t\t\tto_chat(M, \"<span class='danger'><b>A spike of pain drives into your head and scrambles your thoughts!</b></span>\")\n+\t\t\t\tM.confused += 10\n+\t\t\t\tM.adjustEarDamage(0, 30)//as bad as a changeling shriek\n+\t\t\telse if(issilicon(target))\n+\t\t\t\tvar/mob/living/silicon/S = target\n+\t\t\t\tto_chat(S, \"<span class='warning'><b>ERROR $!(@ ERROR )#^! SENSORY OVERLOAD \\[$(!@#</b></span>\")\n+\t\t\t\tplaysound(S, 'sound/machines/warning-buzzer.ogg', 50, 1)\n+\t\t\t\tvar/datum/effect_system/spark_spread/sp = new /datum/effect_system/spark_spread\n+\t\t\t\tsp.set_up(5, 1, S)\n+\t\t\t\tsp.start()\n+\t\t\t\tS.Knockdown(6)\n+\t\tfor(var/obj/structure/window/W in T.contents)\n+\t\t\tW.take_damage(rand(80, 100))\n+\n+/obj/effect/proc_holder/spell/targeted/revive_thrall //Completely revives a dead thrall\n+\tname = \"Black Recuperation\"\n+\tdesc = \"Revives or empowers a thrall.\"\n+\tpanel = \"Shadowling Abilities\"\n+\trange = 1\n+\tcharge_max = 600\n+\thuman_req = 1\n+\tclothes_req = 0\n+\tinclude_user = 0\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"revive_thrall\"\n+\n+/obj/effect/proc_holder/spell/targeted/revive_thrall/cast(list/targets,mob/user = usr)\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tfor(var/mob/living/carbon/human/thrallToRevive in targets)\n+\t\tvar/choice = alert(user,\"Empower a living thrall or revive a dead one?\",,\"Empower\",\"Revive\",\"Cancel\")\n+\t\tswitch(choice)\n+\t\t\tif(\"Empower\")\n+\t\t\t\tif(!is_thrall(thrallToRevive))\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>[thrallToRevive] is not a thrall.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tif(thrallToRevive.stat != CONSCIOUS)\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>[thrallToRevive] must be conscious to become empowered.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tif(thrallToRevive.dna.species.id == \"l_shadowling\")\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>[thrallToRevive] is already empowered.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tvar/empowered_thralls = 0\n+\t\t\t\tfor(var/datum/mind/M in SSticker.mode.thralls)\n+\t\t\t\t\tif(!ishuman(M.current))\n+\t\t\t\t\t\treturn\n+\t\t\t\t\tvar/mob/living/carbon/human/H = M.current\n+\t\t\t\t\tif(H.dna.species.id == \"l_shadowling\")\n+\t\t\t\t\t\tempowered_thralls++\n+\t\t\t\tif(empowered_thralls >= EMPOWERED_THRALL_LIMIT)\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>You cannot spare this much energy. There are too many empowered thralls.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tuser.visible_message(\"<span class='danger'>[user] places their hands over [thrallToRevive]'s face, red light shining from beneath.</span>\", \\\n+\t\t\t\t\t\t\t\t\t\"<span class='shadowling'>You place your hands on [thrallToRevive]'s face and begin gathering energy...</span>\")\n+\t\t\t\tto_chat(thrallToRevive, \"<span class='userdanger'>[user] places their hands over your face. You feel energy gathering. Stand still...</span>\")\n+\t\t\t\tif(!do_mob(user, thrallToRevive, 80))\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tto_chat(user, \"<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>\")\n+\t\t\t\tuser.visible_message(\"<span class='boldannounce'><i>Red lightning surges into [thrallToRevive]'s face!</i></span>\")\n+\t\t\t\tplaysound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)\n+\t\t\t\tplaysound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)\n+\t\t\t\tuser.Beam(thrallToRevive,icon_state=\"red_lightning\",time=1)\n+\t\t\t\tthrallToRevive.Knockdown(5)\n+\t\t\t\tthrallToRevive.visible_message(\"<span class='warning'><b>[thrallToRevive] collapses, their skin and face distorting!</span>\", \\\n+\t\t\t\t\t\t\t\t\t\t\t   \"<span class='userdanger'><i>AAAAAAAAAAAAAAAAAAAGH-</i></span>\")\n+\t\t\t\tif (!do_mob(user, thrallToRevive, 5))\n+\t\t\t\t\tthrallToRevive.Unconscious(600)\n+\t\t\t\t\tthrallToRevive.visible_message(\"<span class='warning'><b>[thrallToRevive] gasps, and passes out!</b></span>\", \"<span class='warning'><i>That... feels nice....</i></span>\")\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>We have been interrupted! [thrallToRevive] will need to rest to recover.</span>\")\n+\t\t\t\t\treturn\n+\t\t\t\tthrallToRevive.visible_message(\"<span class='warning'>[thrallToRevive] slowly rises, no longer recognizable as human.</span>\", \\\n+\t\t\t\t\t\t\t\t\t\t\t   \"<span class='shadowling'><b>You feel new power flow into you. You have been gifted by your masters. You now closely resemble them. You are empowered in \\\n+\t\t\t\t\t\t\t\t\t\t\t    darkness but wither slowly in light. In addition, Lesser Glare and Guise have been upgraded into their true forms.</b></span>\")\n+\t\t\t\tthrallToRevive.set_species(/datum/species/shadow/ling/lesser)\n+\t\t\t\tthrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/targeted/lesser_glare)\n+\t\t\t\tthrallToRevive.mind.RemoveSpell(/obj/effect/proc_holder/spell/self/lesser_shadow_walk)\n+\t\t\t\tthrallToRevive.mind.AddSpell(new /obj/effect/proc_holder/spell/targeted/sling/glare(null))\n+\t\t\tif(\"Revive\")\n+\t\t\t\tif(!is_thrall(thrallToRevive))\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>[thrallToRevive] is not a thrall.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tif(thrallToRevive.stat != DEAD)\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>[thrallToRevive] is not dead.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tuser.visible_message(\"<span class='danger'>[user] kneels over [thrallToRevive], placing their hands on \\his chest.</span>\", \\\n+\t\t\t\t\t\t\t\t\t\"<span class='shadowling'>You crouch over the body of your thrall and begin gathering energy...</span>\")\n+\t\t\t\tthrallToRevive.notify_ghost_cloning(\"Your masters are resuscitating you! Re-enter your corpse if you wish to be brought to life.\", source = thrallToRevive)\n+\t\t\t\tif(!do_mob(user, thrallToRevive, 30))\n+\t\t\t\t\tto_chat(user, \"<span class='warning'>Your concentration snaps. The flow of energy ebbs.</span>\")\n+\t\t\t\t\trevert_cast()\n+\t\t\t\t\treturn\n+\t\t\t\tto_chat(user, \"<span class='shadowling'><b><i>You release a massive surge of power into [thrallToRevive]!</b></i></span>\")\n+\t\t\t\tuser.visible_message(\"<span class='boldannounce'><i>Red lightning surges from [user]'s hands into [thrallToRevive]'s chest!</i></span>\")\n+\t\t\t\tplaysound(thrallToRevive, 'sound/weapons/Egloves.ogg', 50, 1)\n+\t\t\t\tplaysound(thrallToRevive, 'sound/machines/defib_zap.ogg', 50, 1)\n+\t\t\t\tuser.Beam(thrallToRevive,icon_state=\"red_lightning\",time=1)\n+\t\t\t\tvar/b = do_mob(user, thrallToRevive, 20)\n+\t\t\t\tif(thrallToRevive.revive(full_heal = 1))\n+\t\t\t\t\tthrallToRevive.visible_message(\"<span class='boldannounce'>[thrallToRevive] heaves in breath, dim red light shining in their eyes.</span>\", \\\n+\t\t\t\t\t\t\t\t\t\t\t   \"<span class='shadowling'><b><i>You have returned. One of your masters has brought you from the darkness beyond.</b></i></span>\")\n+\t\t\t\t\tthrallToRevive.Knockdown(4)\n+\t\t\t\t\tthrallToRevive.emote(\"gasp\")\n+\t\t\t\t\tplaysound(thrallToRevive, \"bodyfall\", 50, 1)\n+\t\t\t\t\tif (!b)\n+\t\t\t\t\t\tthrallToRevive.Knockdown(50)\n+\t\t\t\t\t\tthrallToRevive.Unconscious(500)\n+\t\t\t\t\t\tthrallToRevive.visible_message(\"<span class='boldannounce'>[thrallToRevive] collapses in exhaustion.</span>\", \\\n+\t\t\t\t\t\t   \"<span class='warning'><b><i>You collapse in exhaustion... nap..... dark.</b></i></span>\")\n+\t\t\telse\n+\t\t\t\trevert_cast()\n+\t\t\t\treturn\n+\n+\n+/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle\n+\tname = \"Destroy Engines\"\n+\tdesc = \"Extends the time of the emergency shuttle's arrival by fifteen minutes. This can only be used once.\"\n+\tpanel = \"Shadowling Abilities\"\n+\trange = 1\n+\thuman_req = 1\n+\tclothes_req = 0\n+\tcharge_max = 600\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"extend_shuttle\"\n+\n+/obj/effect/proc_holder/spell/targeted/shadowling_extend_shuttle/cast(list/targets, mob/living/carbon/human/user = usr)\n+\tif(!shadowling_check(user))\n+\t\trevert_cast()\n+\t\treturn\n+\tfor(var/mob/living/carbon/human/target in targets)\n+\t\tif(target.stat)\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(!is_thrall(target))\n+\t\t\tto_chat(user, \"<span class='warning'>[target] must be a thrall.</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(SSshuttle.emergency.mode != SHUTTLE_CALL)\n+\t\t\tto_chat(user, \"span class='warning'>The shuttle must be inbound only to the station.</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tvar/mob/living/carbon/human/M = target\n+\t\tuser.visible_message(\"<span class='warning'>[user]'s eyes flash a bright red!</span>\", \\\n+\t\t\t\t\t\t  \"<span class='notice'>You begin to draw [M]'s life force.</span>\")\n+\t\tM.visible_message(\"<span class='warning'>[M]'s face falls slack, their jaw slightly distending.</span>\", \\\n+\t\t\t\t\t\t  \"<span class='boldannounce'>You are suddenly transported... far, far away...</span>\")\n+\t\tif(!do_after(user, 50, target = M))\n+\t\t\tto_chat(M, \"<span class='warning'>You are snapped back to reality, your haze dissipating!</span>\")\n+\t\t\tto_chat(user, \"<span class='warning'>You have been interrupted. The draw has failed.</span>\")\n+\t\t\treturn\n+\t\tto_chat(user, \"<span class='notice'>You project [M]'s life force toward the approaching shuttle, extending its arrival duration!</span>\")\n+\t\tM.visible_message(\"<span class='warning'>[M]'s eyes suddenly flare red. They proceed to collapse on the floor, not breathing.</span>\", \\\n+\t\t\t\t\t\t  \"<span class='warning'><b>...speeding by... ...pretty blue glow... ...touch it... ...no glow now... ...no light... ...nothing at all...</span>\")\n+\t\tM.death()\n+\t\tif(SSshuttle.emergency.mode == SHUTTLE_CALL)\n+\t\t\tvar/more_minutes = 9000\n+\t\t\tvar/timer = SSshuttle.emergency.timeLeft()\n+\t\t\ttimer += more_minutes\n+\t\t\tpriority_announce(\"Major system failure aboard the emergency shuttle. This will extend its arrival time by approximately 15 minutes...\", \"System Failure\", 'sound/misc/notice1.ogg')\n+\t\t\tSSshuttle.emergency.setTimer(timer)\n+\t\tuser.mind.spell_list.Remove(src) //Can only be used once!\n+\t\tqdel(src)\n+\n+\n+// THRALL ABILITIES BEYOND THIS POINT //\n+\n+\n+/obj/effect/proc_holder/spell/targeted/lesser_glare //a defensive ability, nothing else. can't be used to stun people, steal tasers, etc. Just good for escaping\n+\tname = \"Lesser Glare\"\n+\tdesc = \"Makes a single target dizzy for a bit.\"\n+\tpanel = \"Thrall Abilities\"\n+\tcharge_max = 450\n+\thuman_req = 1\n+\tclothes_req = 0\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\taction_icon_state = \"glare\"\n+\n+/obj/effect/proc_holder/spell/targeted/lesser_glare/cast(list/targets,mob/user = usr)\n+\tfor(var/mob/living/target in targets)\n+\t\tif(!ishuman(target) || !target)\n+\t\t\tto_chat(user, \"<span class='warning'>You nay only glare at humans!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(target.stat)\n+\t\t\tto_chat(user, \"<span class='warning'>[target] must be conscious!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tif(is_shadow_or_thrall(target))\n+\t\t\tto_chat(user, \"<span class='warning'>You cannot glare at allies!</span>\")\n+\t\t\trevert_cast()\n+\t\t\treturn\n+\t\tvar/mob/living/carbon/human/M = target\n+\t\tuser.visible_message(\"<span class='warning'><b>[user]'s eyes flash a bright red!</b></span>\")\n+\t\ttarget.visible_message(\"<span class='danger'>[target] suddendly looks dizzy and nauseous...</span>\")\n+\t\tif(in_range(target, user))\n+\t\t\tto_chat(target, \"<span class='userdanger'>Your gaze is forcibly drawn into [user]'s eyes, and you suddendly feel dizzy and nauseous...</span>\")\n+\t\telse //Only alludes to the thrall if the target is close by\n+\t\t\tto_chat(target, \"<span class='userdanger'>Red lights suddenly dance in your vision, and you suddendly feel dizzy and nauseous...</span>\")\n+\t\tM.confused += 25\n+\t\tM.Jitter(50)\n+\t\tif(prob(25))\n+\t\t\tM.vomit(10)\n+\n+\n+\n+/obj/effect/proc_holder/spell/self/lesser_shadow_walk //Thrall version of Shadow Walk, only works in darkness, doesn't grant phasing, but gives near-invisibility\n+\tname = \"Guise\"\n+\tdesc = \"Wraps your form in shadows, making you harder to see.\"\n+\tpanel = \"Thrall Abilities\"\n+\tcharge_max = 1200\n+\thuman_req = 1\n+\taction_icon = 'yogstation/icons/mob/actions.dmi'\n+\tclothes_req = 0","path":"yogstation/code/game/gamemodes/shadowling/shadowling_abilities.dm","position":691,"original_position":691,"commit_id":"ba7a0514f0baebfad6ee7c8c08cd816ee0c0e158","original_commit_id":"ba7a0514f0baebfad6ee7c8c08cd816ee0c0e158","user":{"login":"ThatLing","id":24573384,"node_id":"MDQ6VXNlcjI0NTczMzg0","avatar_url":"https://avatars3.githubusercontent.com/u/24573384?v=4","gravatar_id":"","url":"https://api.github.com/users/ThatLing","html_url":"https://github.com/ThatLing","followers_url":"https://api.github.com/users/ThatLing/followers","following_url":"https://api.github.com/users/ThatLing/following{/other_user}","gists_url":"https://api.github.com/users/ThatLing/gists{/gist_id}","starred_url":"https://api.github.com/users/ThatLing/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/ThatLing/subscriptions","organizations_url":"https://api.github.com/users/ThatLing/orgs","repos_url":"https://api.github.com/users/ThatLing/repos","events_url":"https://api.github.com/users/ThatLing/events{/privacy}","received_events_url":"https://api.github.com/users/ThatLing/received_events","type":"User","site_admin":false},"body":"Replace 1 with TRUE and 0 with FALSE","created_at":"2018-06-20T11:10:45Z","updated_at":"2018-06-20T11:18:33Z","html_url":"https://github.com/yogstation13/Yogstation-TG/pull/1377#discussion_r196735258","pull_request_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377","author_association":"MEMBER","_links":{"self":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/comments/196735258"},"html":{"href":"https://github.com/yogstation13/Yogstation-TG/pull/1377#discussion_r196735258"},"pull_request":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377"}}},"pull_request":{"url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377","id":195997834,"node_id":"MDExOlB1bGxSZXF1ZXN0MTk1OTk3ODM0","html_url":"https://github.com/yogstation13/Yogstation-TG/pull/1377","diff_url":"https://github.com/yogstation13/Yogstation-TG/pull/1377.diff","patch_url":"https://github.com/yogstation13/Yogstation-TG/pull/1377.patch","issue_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/1377","number":1377,"state":"open","locked":false,"title":"[WIP]Adds shadowlings BACK","user":{"login":"GuppyLaxx","id":25938722,"node_id":"MDQ6VXNlcjI1OTM4NzIy","avatar_url":"https://avatars2.githubusercontent.com/u/25938722?v=4","gravatar_id":"","url":"https://api.github.com/users/GuppyLaxx","html_url":"https://github.com/GuppyLaxx","followers_url":"https://api.github.com/users/GuppyLaxx/followers","following_url":"https://api.github.com/users/GuppyLaxx/following{/other_user}","gists_url":"https://api.github.com/users/GuppyLaxx/gists{/gist_id}","starred_url":"https://api.github.com/users/GuppyLaxx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GuppyLaxx/subscriptions","organizations_url":"https://api.github.com/users/GuppyLaxx/orgs","repos_url":"https://api.github.com/users/GuppyLaxx/repos","events_url":"https://api.github.com/users/GuppyLaxx/events{/privacy}","received_events_url":"https://api.github.com/users/GuppyLaxx/received_events","type":"User","site_admin":false},"body":"### **Yeah, I got bored, So I ported hippie shadowlings.**\r\n**(((With some MRTY:tm: changes)))**\r\n\r\nI've got zero idea on how pre-rebase shadowlings worked, but this should be the same or very close, couple of notable things is how shadowlings shadowwalk now, the fact they have a shield, and all that jazz.\r\nThis is just a basic port, I got it all to compile and it fully functions from everything I tested *(Except the admin one button antag)* \r\nGonna be changing up stuff later to fit yogs balance and all that crap, could probably use one or two test merges every once in a while to give me a hand with that. also changelog and crap later","created_at":"2018-06-20T01:13:08Z","updated_at":"2018-06-20T11:18:34Z","closed_at":null,"merged_at":null,"merge_commit_sha":"f51520536af7f5e0b00e4cd9c39148ea78681592","assignee":null,"assignees":[],"requested_reviewers":[{"login":"Partheo","id":10659549,"node_id":"MDQ6VXNlcjEwNjU5NTQ5","avatar_url":"https://avatars0.githubusercontent.com/u/10659549?v=4","gravatar_id":"","url":"https://api.github.com/users/Partheo","html_url":"https://github.com/Partheo","followers_url":"https://api.github.com/users/Partheo/followers","following_url":"https://api.github.com/users/Partheo/following{/other_user}","gists_url":"https://api.github.com/users/Partheo/gists{/gist_id}","starred_url":"https://api.github.com/users/Partheo/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/Partheo/subscriptions","organizations_url":"https://api.github.com/users/Partheo/orgs","repos_url":"https://api.github.com/users/Partheo/repos","events_url":"https://api.github.com/users/Partheo/events{/privacy}","received_events_url":"https://api.github.com/users/Partheo/received_events","type":"User","site_admin":false}],"requested_teams":[],"labels":[{"id":857051716,"node_id":"MDU6TGFiZWw4NTcwNTE3MTY=","url":"https://api.github.com/repos/yogstation13/Yogstation-TG/labels/DME%20Edit","name":"DME Edit","color":"ededed","default":false},{"id":857051718,"node_id":"MDU6TGFiZWw4NTcwNTE3MTg=","url":"https://api.github.com/repos/yogstation13/Yogstation-TG/labels/Feature","name":"Feature","color":"0e8a16","default":false}],"milestone":null,"commits_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377/commits","review_comments_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377/comments","review_comment_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/comments{/number}","comments_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/1377/comments","statuses_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/statuses/ba7a0514f0baebfad6ee7c8c08cd816ee0c0e158","head":{"label":"GuppyLaxx:blackpeople","ref":"blackpeople","sha":"ba7a0514f0baebfad6ee7c8c08cd816ee0c0e158","user":{"login":"GuppyLaxx","id":25938722,"node_id":"MDQ6VXNlcjI1OTM4NzIy","avatar_url":"https://avatars2.githubusercontent.com/u/25938722?v=4","gravatar_id":"","url":"https://api.github.com/users/GuppyLaxx","html_url":"https://github.com/GuppyLaxx","followers_url":"https://api.github.com/users/GuppyLaxx/followers","following_url":"https://api.github.com/users/GuppyLaxx/following{/other_user}","gists_url":"https://api.github.com/users/GuppyLaxx/gists{/gist_id}","starred_url":"https://api.github.com/users/GuppyLaxx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GuppyLaxx/subscriptions","organizations_url":"https://api.github.com/users/GuppyLaxx/orgs","repos_url":"https://api.github.com/users/GuppyLaxx/repos","events_url":"https://api.github.com/users/GuppyLaxx/events{/privacy}","received_events_url":"https://api.github.com/users/GuppyLaxx/received_events","type":"User","site_admin":false},"repo":{"id":136838014,"node_id":"MDEwOlJlcG9zaXRvcnkxMzY4MzgwMTQ=","name":"Yogstation-TG","full_name":"GuppyLaxx/Yogstation-TG","owner":{"login":"GuppyLaxx","id":25938722,"node_id":"MDQ6VXNlcjI1OTM4NzIy","avatar_url":"https://avatars2.githubusercontent.com/u/25938722?v=4","gravatar_id":"","url":"https://api.github.com/users/GuppyLaxx","html_url":"https://github.com/GuppyLaxx","followers_url":"https://api.github.com/users/GuppyLaxx/followers","following_url":"https://api.github.com/users/GuppyLaxx/following{/other_user}","gists_url":"https://api.github.com/users/GuppyLaxx/gists{/gist_id}","starred_url":"https://api.github.com/users/GuppyLaxx/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/GuppyLaxx/subscriptions","organizations_url":"https://api.github.com/users/GuppyLaxx/orgs","repos_url":"https://api.github.com/users/GuppyLaxx/repos","events_url":"https://api.github.com/users/GuppyLaxx/events{/privacy}","received_events_url":"https://api.github.com/users/GuppyLaxx/received_events","type":"User","site_admin":false},"private":false,"html_url":"https://github.com/GuppyLaxx/Yogstation-TG","description":null,"fork":true,"url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG","forks_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/forks","keys_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/keys{/key_id}","collaborators_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/teams","hooks_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/hooks","issue_events_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/issues/events{/number}","events_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/events","assignees_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/assignees{/user}","branches_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/branches{/branch}","tags_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/tags","blobs_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/git/refs{/sha}","trees_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/git/trees{/sha}","statuses_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/statuses/{sha}","languages_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/languages","stargazers_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/stargazers","contributors_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/contributors","subscribers_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/subscribers","subscription_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/subscription","commits_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/commits{/sha}","git_commits_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/git/commits{/sha}","comments_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/comments{/number}","issue_comment_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/issues/comments{/number}","contents_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/contents/{+path}","compare_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/compare/{base}...{head}","merges_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/merges","archive_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/downloads","issues_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/issues{/number}","pulls_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/pulls{/number}","milestones_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/milestones{/number}","notifications_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/labels{/name}","releases_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/releases{/id}","deployments_url":"https://api.github.com/repos/GuppyLaxx/Yogstation-TG/deployments","created_at":"2018-06-10T19:19:38Z","updated_at":"2018-06-19T16:15:17Z","pushed_at":"2018-06-20T01:07:31Z","git_url":"git://github.com/GuppyLaxx/Yogstation-TG.git","ssh_url":"git@github.com:GuppyLaxx/Yogstation-TG.git","clone_url":"https://github.com/GuppyLaxx/Yogstation-TG.git","svn_url":"https://github.com/GuppyLaxx/Yogstation-TG","homepage":null,"size":1116595,"stargazers_count":0,"watchers_count":0,"language":"DM","has_issues":false,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":0,"mirror_url":null,"archived":false,"open_issues_count":0,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":0,"open_issues":0,"watchers":0,"default_branch":"master"}},"base":{"label":"yogstation13:master","ref":"master","sha":"0e6b6a8f7b2f1a88cc7a889a2957e8c4ed947790","user":{"login":"yogstation13","id":16735403,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NzM1NDAz","avatar_url":"https://avatars3.githubusercontent.com/u/16735403?v=4","gravatar_id":"","url":"https://api.github.com/users/yogstation13","html_url":"https://github.com/yogstation13","followers_url":"https://api.github.com/users/yogstation13/followers","following_url":"https://api.github.com/users/yogstation13/following{/other_user}","gists_url":"https://api.github.com/users/yogstation13/gists{/gist_id}","starred_url":"https://api.github.com/users/yogstation13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yogstation13/subscriptions","organizations_url":"https://api.github.com/users/yogstation13/orgs","repos_url":"https://api.github.com/users/yogstation13/repos","events_url":"https://api.github.com/users/yogstation13/events{/privacy}","received_events_url":"https://api.github.com/users/yogstation13/received_events","type":"Organization","site_admin":false},"repo":{"id":120966336,"node_id":"MDEwOlJlcG9zaXRvcnkxMjA5NjYzMzY=","name":"Yogstation-TG","full_name":"yogstation13/Yogstation-TG","owner":{"login":"yogstation13","id":16735403,"node_id":"MDEyOk9yZ2FuaXphdGlvbjE2NzM1NDAz","avatar_url":"https://avatars3.githubusercontent.com/u/16735403?v=4","gravatar_id":"","url":"https://api.github.com/users/yogstation13","html_url":"https://github.com/yogstation13","followers_url":"https://api.github.com/users/yogstation13/followers","following_url":"https://api.github.com/users/yogstation13/following{/other_user}","gists_url":"https://api.github.com/users/yogstation13/gists{/gist_id}","starred_url":"https://api.github.com/users/yogstation13/starred{/owner}{/repo}","subscriptions_url":"https://api.github.com/users/yogstation13/subscriptions","organizations_url":"https://api.github.com/users/yogstation13/orgs","repos_url":"https://api.github.com/users/yogstation13/repos","events_url":"https://api.github.com/users/yogstation13/events{/privacy}","received_events_url":"https://api.github.com/users/yogstation13/received_events","type":"Organization","site_admin":false},"private":false,"html_url":"https://github.com/yogstation13/Yogstation-TG","description":null,"fork":false,"url":"https://api.github.com/repos/yogstation13/Yogstation-TG","forks_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/forks","keys_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/keys{/key_id}","collaborators_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/collaborators{/collaborator}","teams_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/teams","hooks_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/hooks","issue_events_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/events{/number}","events_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/events","assignees_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/assignees{/user}","branches_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/branches{/branch}","tags_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/tags","blobs_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/git/blobs{/sha}","git_tags_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/git/tags{/sha}","git_refs_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/git/refs{/sha}","trees_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/git/trees{/sha}","statuses_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/statuses/{sha}","languages_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/languages","stargazers_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/stargazers","contributors_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/contributors","subscribers_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/subscribers","subscription_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/subscription","commits_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/commits{/sha}","git_commits_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/git/commits{/sha}","comments_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/comments{/number}","issue_comment_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/comments{/number}","contents_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/contents/{+path}","compare_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/compare/{base}...{head}","merges_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/merges","archive_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/{archive_format}{/ref}","downloads_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/downloads","issues_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues{/number}","pulls_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls{/number}","milestones_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/milestones{/number}","notifications_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/notifications{?since,all,participating}","labels_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/labels{/name}","releases_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/releases{/id}","deployments_url":"https://api.github.com/repos/yogstation13/Yogstation-TG/deployments","created_at":"2018-02-09T23:19:43Z","updated_at":"2018-06-20T05:26:55Z","pushed_at":"2018-06-20T07:43:42Z","git_url":"git://github.com/yogstation13/Yogstation-TG.git","ssh_url":"git@github.com:yogstation13/Yogstation-TG.git","clone_url":"https://github.com/yogstation13/Yogstation-TG.git","svn_url":"https://github.com/yogstation13/Yogstation-TG","homepage":null,"size":1116767,"stargazers_count":6,"watchers_count":6,"language":"DM","has_issues":true,"has_projects":true,"has_downloads":true,"has_wiki":true,"has_pages":false,"forks_count":25,"mirror_url":null,"archived":false,"open_issues_count":58,"license":{"key":"agpl-3.0","name":"GNU Affero General Public License v3.0","spdx_id":"AGPL-3.0","url":"https://api.github.com/licenses/agpl-3.0","node_id":"MDc6TGljZW5zZTE="},"forks":25,"open_issues":58,"watchers":6,"default_branch":"master"}},"_links":{"self":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377"},"html":{"href":"https://github.com/yogstation13/Yogstation-TG/pull/1377"},"issue":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/1377"},"comments":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/issues/1377/comments"},"review_comments":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377/comments"},"review_comment":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/comments{/number}"},"commits":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/pulls/1377/commits"},"statuses":{"href":"https://api.github.com/repos/yogstation13/Yogstation-TG/statuses/ba7a0514f0baebfad6ee7c8c08cd816ee0c0e158"}},"author_association":"CONTRIBUTOR"}}
{"actor":{"display_login":"ThatLing"}}