diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm
new file mode 100644
index 0000000000..57c0bab340
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_abilities.dm
@@ -0,0 +1,661 @@
+/mob/living/simple_animal/shadekin/initialize()
+ var/list/ability_types = subtypesof(/obj/effect/shadekin_ability)
+ ability_types += subtypesof(/obj/effect/rakshasa_ability)
+ shadekin_abilities = list()
+ for(var/type in ability_types)
+ shadekin_abilities += new type(src)
+
+ update_icon()
+
+ return ..()
+
+
+/obj/effect/rakshasa_ability
+ name = ""
+ desc = ""
+ icon = 'icons/mob/screen_spells.dmi'
+ var/ability_name = "FIX ME"
+ var/cost = 50
+ var/mob/living/simple_animal/shadekin/my_kin
+ var/shift_mode = NOT_WHILE_SHIFTED
+ var/ab_sound
+
+/obj/effect/rakshasa_ability/New(var/new_kin)
+ ..()
+ my_kin = new_kin
+ loc = null
+
+/obj/effect/rakshasa_ability/Destroy()
+ my_kin = null
+ return ..()
+
+/obj/effect/rakshasa_ability/proc/atom_button_text()
+ var/shift_denial
+
+ if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED))
+ shift_denial = "Physical Only"
+ else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
+ shift_denial = "Shifted Only"
+
+ if(shift_denial)
+ name = shift_denial
+ else
+ name = my_kin.energy >= cost ? "Activate" : "No Energy"
+ return src
+
+/obj/effect/rakshasa_ability/Click(var/location, var/control, var/params)
+ if(my_kin.stat) return
+
+ var/list/clickprops = params2list(params)
+ var/opts = clickprops["shift"]
+
+ if(opts)
+ to_chat(my_kin,"[name] (Cost: [cost]%) - [desc]")
+ else
+ do_ability(my_kin)
+
+/obj/effect/rakshasa_ability/proc/do_ability()
+ if(my_kin.stat)
+ to_chat(my_kin,"Can't use that ability in your state!")
+ return FALSE
+ if(shift_mode == NOT_WHILE_SHIFTED && (my_kin.ability_flags & AB_PHASE_SHIFTED))
+ to_chat(my_kin,"Can't use that ability while phase shifted!")
+ return FALSE
+ else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_kin.ability_flags & AB_PHASE_SHIFTED))
+ to_chat(my_kin,"Can only use that ability while phase shifted!")
+ return FALSE
+ else if(my_kin.energy < cost)
+ to_chat(my_kin,"Not enough energy for that ability!")
+ return FALSE
+
+ my_kin.energy -= cost
+ if(ab_sound)
+ playsound(src,ab_sound,75,1)
+
+ return TRUE
+
+
+
+
+/obj/effect/rakshasa_ability/phase_shift2
+ ability_name = "Goo Shift"
+ desc = "Shift yourself with goopy effects."
+ icon_state = "tech_passwall"
+ cost = 100
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/phase_shift2/do_ability()
+ if(!..())
+ return
+ new /obj/effect/decal/cleanable/blood/oil(loc, src)
+ playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
+ my_kin.phase_shift()
+ if(my_kin.ability_flags & AB_PHASE_SHIFTED)
+ cost = 0 //Shifting back is free (but harmful in light)
+ new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
+ var/goo_sounds = list (
+ 'sound/rakshasa/Decay1.ogg',
+ 'sound/rakshasa/Decay2.ogg',
+ 'sound/rakshasa/Decay3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(my_kin.loc, sound, 100, 1)
+ else
+ cost = initial(cost)
+ new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
+ playsound(my_kin.loc, 'sound/rakshasa/Emerge0.ogg', 100, 1)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/phase_shift3
+ ability_name = "Goo Shift No Emerge"
+ desc = "Shift yourself with goopy effects."
+ icon_state = "tech_passwall"
+ cost = 100
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/phase_shift3/do_ability()
+ if(!..())
+ return
+ new /obj/effect/decal/cleanable/blood/oil(loc, src)
+ playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
+ my_kin.phase_shift()
+ if(my_kin.ability_flags & AB_PHASE_SHIFTED)
+ cost = 0 //Shifting back is free (but harmful in light)
+ new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
+ var/goo_sounds = list (
+ 'sound/rakshasa/Decay1.ogg',
+ 'sound/rakshasa/Decay2.ogg',
+ 'sound/rakshasa/Decay3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(my_kin.loc, sound, 100, 1)
+ else
+ cost = initial(cost)
+ new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
+ var/goo_sounds = list (
+ 'sound/rakshasa/Decay1.ogg',
+ 'sound/rakshasa/Decay2.ogg',
+ 'sound/rakshasa/Decay3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(my_kin.loc, sound, 100, 1)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/drip_oil
+ ability_name = "Goo Drip"
+ desc = "Drip some goo."
+ icon_state = ""
+ cost = 0
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/drip_oil/do_ability()
+ if(!..())
+ return
+ new /obj/effect/decal/cleanable/blood/oil(my_kin.loc)
+ var/goo_sounds = list (
+ 'sound/rakshasa/Decay1.ogg',
+ 'sound/rakshasa/Decay2.ogg',
+ 'sound/rakshasa/Decay3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(my_kin.loc, sound, 100, 1)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/laugh
+ ability_name = "Laugh"
+ desc = "Laugh."
+ icon_state = ""
+ cost = 0
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/laugh/do_ability()
+ if(!..())
+ return
+ playsound(my_kin.loc, 'sound/rakshasa/Laugh.ogg', 100, 1)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/no
+ ability_name = "Say No"
+ desc = "Say no!"
+ icon_state = ""
+ cost = 0
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/no/do_ability()
+ if(!..())
+ return
+ playsound(my_kin.loc, 'sound/rakshasa/No.ogg', 100, 1)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/trap
+ ability_name = "Lay Trap"
+ desc = "Lay a trap that will notify you when someone steps in it."
+ icon_state = ""
+ cost = 0
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/trap/do_ability()
+ if(!..())
+ return
+ var/goo_sounds = list (
+ 'sound/rakshasa/Corrosion1.ogg',
+ 'sound/rakshasa/Corrosion2.ogg',
+ 'sound/rakshasa/Corrosion3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(my_kin.loc, sound, 100, 1)
+ new /obj/structure/gootrap (my_kin.loc)
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+/*
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// //
+// Starting Stuff //
+// //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+var/list/rakshasa_abilities
+
+/mob/living/simple_animal/shadekin/rakshasa/initialize()
+ //You spawned the prototype, and want a totally random one.
+ if(type == /mob/living/simple_animal/shadekin/rakshasa)
+
+ //I'm told by VerySoft these are the liklihood values
+ var/list/sk_types = list(
+ /mob/living/simple_animal/shadekin/red = 20, //Actively seek people out to nom, so fairly common to see (relatively speaking),
+ /mob/living/simple_animal/shadekin/blue = 15, //Explorers that like to interact with people, so still fairly common,
+ /mob/living/simple_animal/shadekin/purple = 15, //Also explorers that may or may not homf people,
+ /mob/living/simple_animal/shadekin/yellow = 1 //Very rare, usually never leaves their home
+ )
+ var/new_type = pickweight(sk_types)
+
+ new new_type(loc)
+ initialized = TRUE
+ return INITIALIZE_HINT_QDEL
+
+ if(icon_state == "map_example")
+ icon_state = pick("white","dark","brown")
+
+ icon_living = icon_state
+
+ switch(eye_state)
+ if(BLUE_EYES)
+ eye_icon_state = "e_blue"
+ if(RED_EYES)
+ eye_icon_state = "e_red"
+ if(PURPLE_EYES)
+ eye_icon_state = "e_purple"
+ if(YELLOW_EYES)
+ eye_icon_state = "e_yellow"
+ if(GREEN_EYES)
+ eye_icon_state = "e_green"
+ if(ORANGE_EYES)
+ eye_icon_state = "e_orange"
+ else
+ eye_icon_state = "e_red"
+
+ tailimage = image('icons/mob/vore_shadekin64.dmi',null,icon_state)
+ tailimage.pixel_x = -16
+
+ if(eye_desc)
+ desc += " This one has [eye_desc]!"
+
+ var/list/ability_types = subtypesof(/obj/effect/rakshasa_ability)
+ rakshasa_abilities = list()
+ for(var/type in ability_types)
+ rakshasa_abilities += new type(src)
+
+ update_icon()
+
+ return ..()
+
+/mob/living/simple_animal/shadekin/Destroy()
+ qdel_null_list(rakshasa_abilities)
+ . = ..()
+
+
+
+/mob/living/simple_animal/shadekin/rakshasa/Stat()
+ . = ..()
+ if(statpanel("Rakshasa"))
+ rakshasa_abilities_stat()
+
+/mob/living/simple_animal/shadekin/rakshasa/proc/rakshasa_abilities_stat()
+ for(var/A in rakshasa_abilities)
+ var/obj/effect/rakshasa_ability/ability = A
+ stat("[ability.ability_name]",ability.atom_button_text())
+
+
+
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// //
+// Some Procs for Abilities //
+// //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+// Phase shifting procs (and related procs)
+/mob/living/simple_animal/shadekin/rakshasa/proc/rak_phase_shift()
+ var/turf/T = get_turf(src)
+ if(!T.CanPass(null,T) || loc != T)
+ to_chat(src,"You can't use that here!")
+ return FALSE
+
+ forceMove(T)
+ var/original_canmove = canmove
+ SetStunned(0)
+ SetWeakened(0)
+ if(buckled)
+ buckled.unbuckle_mob()
+ if(pulledby)
+ pulledby.stop_pulling()
+ stop_pulling()
+ canmove = FALSE
+
+ //Shifting in
+ if(ability_flags & AB_PHASE_SHIFTED)
+ ability_flags &= ~AB_PHASE_SHIFTED
+ name = real_name
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = initial(B.escapable)
+
+ overlays.Cut()
+ alpha = initial(alpha)
+ invisibility = initial(invisibility)
+ see_invisible = initial(see_invisible)
+ incorporeal_move = initial(incorporeal_move)
+ density = initial(density)
+ force_max_speed = initial(force_max_speed)
+
+ //Cosmetics mostly
+ flick("tp_in",src)
+ custom_emote(1,"phases in!")
+ sleep(5) //The duration of the TP animation
+ canmove = original_canmove
+
+ //Potential phase-in vore
+ if(can_be_drop_pred) //Toggleable in vore panel
+ var/list/potentials = living_mobs(0)
+ if(potentials.len)
+ var/mob/living/target = pick(potentials)
+ if(istype(target) && vore_selected)
+ target.forceMove(vore_selected)
+ to_chat(target,"\The [src] phases in around you, [vore_selected.vore_verb]ing you into their [vore_selected.name]!")
+
+ // Do this after the potential vore, so we get the belly
+ update_icon()
+
+ //Affect nearby lights
+ var/destroy_lights = 0
+ if(eye_state == RED_EYES)
+ destroy_lights = 80
+ if(eye_state == PURPLE_EYES)
+ destroy_lights = 25
+
+ for(var/obj/machinery/light/L in machines)
+ if(L.z != z || get_dist(src,L) > 10)
+ continue
+
+ if(prob(destroy_lights))
+ spawn(rand(5,25))
+ L.broken()
+ else
+ L.flicker(10)
+
+ //Shifting out
+ else
+ ability_flags |= AB_PHASE_SHIFTED
+ custom_emote(1,"phases out!")
+ real_name = name
+ name = "Something"
+
+ for(var/belly in vore_organs)
+ var/obj/belly/B = belly
+ B.escapable = FALSE
+
+ overlays.Cut()
+ flick("tp_out",src)
+ sleep(5)
+ invisibility = INVISIBILITY_LEVEL_TWO
+ see_invisible = INVISIBILITY_LEVEL_TWO
+ update_icon()
+ alpha = 127
+
+ canmove = original_canmove
+ incorporeal_move = TRUE
+ density = FALSE
+ force_max_speed = TRUE
+
+/mob/living/simple_animal/shadekin/Rakshasa/UnarmedAttack()
+ if(ability_flags & AB_PHASE_SHIFTED)
+ return FALSE //Nope.
+
+ . = ..()
+
+/mob/living/simple_animal/shadekin/rakshasa/can_fall()
+ if(ability_flags & AB_PHASE_SHIFTED)
+ return FALSE //Nope!
+
+ return ..()
+
+/mob/living/simple_animal/shadekin/rakshasa/zMove(direction)
+ if(ability_flags & AB_PHASE_SHIFTED)
+ var/turf/destination = (direction == UP) ? GetAbove(src) : GetBelow(src)
+ if(destination)
+ forceMove(destination)
+ return TRUE
+
+ return ..()
+
+// Healing others
+/mob/living/simple_animal/shadekin/rakshasa/proc/rak_mend_other()
+ //I hate to crunch a view() but I only want ones I can see
+ var/list/viewed = oview(1)
+ var/list/targets = list()
+ for(var/mob/living/L in viewed)
+ targets += L
+ if(!targets.len)
+ to_chat(src,"Nobody nearby to mend!")
+ return FALSE
+
+ var/mob/living/target = input(src,"Pick someone to mend:","Mend Other") as null|anything in targets
+ if(!target)
+ return FALSE
+
+ target.add_modifier(/datum/modifier/shadekin/rakshasa/heal_boop,1 MINUTE)
+ visible_message("\The [src] gently places a hand on \the [target]...")
+ face_atom(target)
+ return TRUE
+
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+// //
+// //
+// Actual Abilities //
+// //
+// //
+////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
+
+/obj/effect/rakshasa_ability
+ name = ""
+ desc = ""
+ icon = 'icons/mob/screen_spells.dmi'
+ var/ability_name = "FIX ME"
+ var/cost = 50
+ var/mob/living/simple_animal/rakshasa/my_rak
+ var/shift_mode = NOT_WHILE_SHIFTED
+ var/ab_sound
+
+/obj/effect/rakshasa_ability/New(var/new_rak)
+ ..()
+ my_rak = new_rak
+ loc = null
+
+/obj/effect/rakshasa_ability/Destroy()
+ my_rak = null
+ return ..()
+
+/obj/effect/rakshasa_ability/proc/atom_button_text()
+ var/shift_denial
+
+ if(shift_mode == NOT_WHILE_SHIFTED && (my_rak.ability_flags & AB_PHASE_SHIFTED))
+ shift_denial = "Physical Only"
+ else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_rak.ability_flags & AB_PHASE_SHIFTED))
+ shift_denial = "Shifted Only"
+
+ if(shift_denial)
+ name = shift_denial
+ else
+ name = my_rak.energy >= cost ? "Activate" : "No Energy"
+ return src
+
+/obj/effect/rakshasa_ability/Click(var/location, var/control, var/params)
+ if(my_rak.stat) return
+
+ var/list/clickprops = params2list(params)
+ var/opts = clickprops["shift"]
+
+ if(opts)
+ to_chat(my_rak,"[name] (Cost: [cost]%) - [desc]")
+ else
+ do_ability(my_rak)
+
+/obj/effect/rakshasa_ability/proc/do_ability()
+ if(my_rak.stat)
+ to_chat(my_rak,"Can't use that ability in your state!")
+ return FALSE
+ if(shift_mode == NOT_WHILE_SHIFTED && (my_rak.ability_flags & AB_PHASE_SHIFTED))
+ to_chat(my_rak,"Can't use that ability while phase shifted!")
+ return FALSE
+ else if(shift_mode == ONLY_WHILE_SHIFTED && !(my_rak.ability_flags & AB_PHASE_SHIFTED))
+ to_chat(my_rak,"Can only use that ability while phase shifted!")
+ return FALSE
+ else if(my_rak.energy < cost)
+ to_chat(my_rak,"Not enough energy for that ability!")
+ return FALSE
+
+ my_rak.energy -= cost
+ if(ab_sound)
+ playsound(src,ab_sound,75,1)
+
+ return TRUE
+
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/rak_phase_shift
+ ability_name = "Phase Shift"
+ desc = "Shift yourself out of alignment with realspace to travel quickly between areas."
+ icon_state = "tech_passwall"
+ cost = 100
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/rak_phase_shift/do_ability()
+ if(!..())
+ return
+ my_rak.rak_phase_shift()
+ if(my_rak.ability_flags & AB_PHASE_SHIFTED)
+ cost = 0 //Shifting back is free (but harmful in light)
+ else
+ cost = initial(cost)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/goo_phase_shift
+ ability_name = "Goo Shift"
+ desc = "Shift yourself with goopy effects."
+ icon_state = "tech_passwall"
+ cost = 100
+ shift_mode = SHIFTED_OR_NOT
+ ab_sound = 'sound/effects/stealthoff.ogg'
+/obj/effect/rakshasa_ability/rak_phase_shift/do_ability()
+ if(!..())
+ return
+ new /obj/effect/decal/cleanable/blood/oil(loc, src)
+ playsound(src, 'sound/rakshasa/Corrosion1.ogg', 100, 1)
+ my_rak.rak_phase_shift()
+ if(my_rak.ability_flags & AB_PHASE_SHIFTED)
+ cost = 0 //Shifting back is free (but harmful in light)
+ else
+ cost = initial(cost)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/heal_boop
+ ability_name = "Regenerate Other"
+ desc = "Spend energy to heal physical wounds in another creature."
+ icon_state = "tech_biomedaura"
+ cost = 50
+ shift_mode = NOT_WHILE_SHIFTED
+ ab_sound = 'sound/effects/EMPulse.ogg'
+/obj/effect/rakshasa_ability/heal_boop/do_ability()
+ if(!..())
+ return
+ if(!my_rak.rak_mend_other())
+ my_rak.energy += cost //Refund due to abort
+
+/datum/modifier/rakshasa/heal_boop
+ name = "Shadekin Regen"
+ desc = "You feel serene and well rested."
+ mob_overlay_state = "green_sparkles"
+
+ on_created_text = "Sparkles begin to appear around you, and all your ills seem to fade away."
+ on_expired_text = "The sparkles have faded, although you feel much healthier than before."
+ stacks = MODIFIER_STACK_EXTEND
+
+/datum/modifier/rakshasa/heal_boop/tick()
+ if(!holder.getBruteLoss() && !holder.getFireLoss() && !holder.getToxLoss() && !holder.getOxyLoss() && !holder.getCloneLoss()) // No point existing if the spell can't heal.
+ expire()
+ return
+ holder.adjustBruteLoss(-2)
+ holder.adjustFireLoss(-2)
+ holder.adjustToxLoss(-2)
+ holder.adjustOxyLoss(-2)
+ holder.adjustCloneLoss(-2)
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/create_shade
+ ability_name = "Create Shade"
+ desc = "Create a field of darkness that follows you."
+ icon_state = "tech_dispelold"
+ cost = 25
+ shift_mode = NOT_WHILE_SHIFTED
+ ab_sound = 'sound/effects/bamf.ogg'
+/obj/effect/rakshasa_ability/create_shade/do_ability()
+ if(!..())
+ return
+ my_rak.add_modifier(/datum/modifier/rakshasa/create_shade,20 SECONDS)
+/datum/modifier/rakshasa/create_shade
+ name = "Shadekin Shadegen"
+ desc = "Darkness envelops you."
+ mob_overlay_state = ""
+
+ on_created_text = "You drag part of The Dark into realspace, enveloping yourself."
+ on_expired_text = "You lose your grasp on The Dark and realspace reasserts itself."
+ stacks = MODIFIER_STACK_EXTEND
+ var/mob/living/simple_animal/rakshasa/my_rak
+
+/datum/modifier/rakshasa/create_shade/tick()
+ if(my_rak.ability_flags & AB_PHASE_SHIFTED)
+ expire()
+
+/datum/modifier/rakshasa/create_shade/on_applied()
+ my_rak = holder
+ holder.glow_toggle = TRUE
+ holder.glow_range = 8
+ holder.glow_intensity = -10
+ holder.glow_color = "#FFFFFF"
+ holder.set_light(8, -10, "#FFFFFF")
+
+/datum/modifier/rakshasa/create_shade/on_expire()
+ holder.glow_toggle = initial(holder.glow_toggle)
+ holder.glow_range = initial(holder.glow_range)
+ holder.glow_intensity = initial(holder.glow_intensity)
+ holder.glow_color = initial(holder.glow_color)
+ holder.set_light(0)
+ my_rak = null
+/*
+/////////////////////////////////////////////////////////////////
+/obj/effect/rakshasa_ability/energy_feast
+ ability_name = "Devour Energy"
+ desc = "Devour the energy from another creature (potentially fatal)."
+ icon_state = "gen_eat"
+ cost = 25
+ shift_mode = NOT_WHILE_SHIFTED
+/obj/effect/rakshasa_ability/energy_feast/do_ability()
+ if(!..())
+ return
+*/
+
+
+*/
+
+
+
+
+
+
+
+
diff --git a/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm
new file mode 100644
index 0000000000..2d44ca6279
--- /dev/null
+++ b/code/modules/mob/living/simple_animal/vore/shadekin/rakshasa_trap.dm
@@ -0,0 +1,76 @@
+/obj/structure/gootrap
+ name = "goo"
+ throw_speed = 2
+ throw_range = 1
+ gender = PLURAL
+ icon = 'icons/effects/blood.dmi'
+ var/base_icon = 'icons/effects/blood.dmi'
+ icon_state = "mfloor1"
+ var/basecolor="#030303"
+ desc = ""
+ throwforce = 0
+ w_class = ITEMSIZE_NORMAL
+ matter = list(DEFAULT_WALL_MATERIAL = 18750)
+ var/deployed = 1
+ anchored = 1
+
+/obj/structure/gootrap/proc/can_use(mob/user)
+ return (user.IsAdvancedToolUser() && !issilicon(user) && !user.stat && !user.restrained())
+
+/obj/structure/gootrap/update_icon()
+ ..()
+ color = basecolor
+
+/obj/structure/gootrap/New()
+ ..()
+ update_icon()
+ return
+
+/obj/structure/gootrap/attack_hand(mob/user as mob)
+ if(has_buckled_mobs() && can_use(user))
+ var/victim = english_list(buckled_mobs)
+ user.visible_message(
+ "[user] begins freeing [victim] from \the [src].",
+ "You carefully begin to free [victim] from \the [src].",
+ )
+ if(do_after(user, 5))
+ user.visible_message("[victim] has been freed from \the [src] by [user].")
+ for(var/A in buckled_mobs)
+ unbuckle_mob(A)
+ anchored = 0
+ else
+ ..()
+
+/obj/structure/gootrap/proc/attack_mob(mob/living/L)
+ //trap the victim in place
+ set_dir(L.dir)
+ can_buckle = 1
+ buckle_mob(L)
+ var/goo_sounds = list (
+ 'sound/rakshasa/Decay1.ogg',
+ 'sound/rakshasa/Decay2.ogg',
+ 'sound/rakshasa/Decay3.ogg'
+ )
+ var/sound = pick(goo_sounds)
+ playsound(src, sound, 100, 1)
+ L << "You hear a gooey schlorp as \the [src] ensnares your leg, trapping you in place!"
+ deployed = 0
+ can_buckle = initial(can_buckle)
+
+
+/obj/structure/gootrap/Crossed(AM as mob|obj)
+ if(deployed && isliving(AM))
+ var/mob/living/L = AM
+ if(L.m_intent == "run")
+ L.visible_message(
+ "[L] steps on \the [src].",
+ "You step on \the [src]!",
+ "You hear a gooey schlorp as the goo ensnares your leg!"
+ )
+ attack_mob(L)
+ if(!has_buckled_mobs())
+ anchored = 0
+ deployed = 0
+ message_admins("[key_name(usr)] has stepped in the goo trap.")
+ ..()
+
diff --git a/icons/mob/vore_shadekin64.dmi b/icons/mob/vore_shadekin64.dmi
index e2da6db20a..7c209923b1 100644
Binary files a/icons/mob/vore_shadekin64.dmi and b/icons/mob/vore_shadekin64.dmi differ
diff --git a/sound/rakshasa/Corrosion1.ogg b/sound/rakshasa/Corrosion1.ogg
new file mode 100644
index 0000000000..912e535639
Binary files /dev/null and b/sound/rakshasa/Corrosion1.ogg differ
diff --git a/sound/rakshasa/Corrosion2.ogg b/sound/rakshasa/Corrosion2.ogg
new file mode 100644
index 0000000000..dfd24cc9d8
Binary files /dev/null and b/sound/rakshasa/Corrosion2.ogg differ
diff --git a/sound/rakshasa/Corrosion3.ogg b/sound/rakshasa/Corrosion3.ogg
new file mode 100644
index 0000000000..cef4bf5c2d
Binary files /dev/null and b/sound/rakshasa/Corrosion3.ogg differ
diff --git a/sound/rakshasa/Decay1.ogg b/sound/rakshasa/Decay1.ogg
new file mode 100644
index 0000000000..e65a838e48
Binary files /dev/null and b/sound/rakshasa/Decay1.ogg differ
diff --git a/sound/rakshasa/Decay2.ogg b/sound/rakshasa/Decay2.ogg
new file mode 100644
index 0000000000..b1e0a10e2f
Binary files /dev/null and b/sound/rakshasa/Decay2.ogg differ
diff --git a/sound/rakshasa/Decay3.ogg b/sound/rakshasa/Decay3.ogg
new file mode 100644
index 0000000000..cfe8b52925
Binary files /dev/null and b/sound/rakshasa/Decay3.ogg differ
diff --git a/sound/rakshasa/Emerge0.ogg b/sound/rakshasa/Emerge0.ogg
new file mode 100644
index 0000000000..bf665de908
Binary files /dev/null and b/sound/rakshasa/Emerge0.ogg differ
diff --git a/sound/rakshasa/Laugh.ogg b/sound/rakshasa/Laugh.ogg
new file mode 100644
index 0000000000..13b6bc8e5d
Binary files /dev/null and b/sound/rakshasa/Laugh.ogg differ
diff --git a/sound/rakshasa/No.ogg b/sound/rakshasa/No.ogg
new file mode 100644
index 0000000000..1b835e46bc
Binary files /dev/null and b/sound/rakshasa/No.ogg differ