diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
index c4c55fa63e..38d6c68933 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_abilities_vr.dm
@@ -1166,3 +1166,217 @@
to_chat(src, " You turn on your pain simulators ")
synth_cosmetic_pain = !synth_cosmetic_pain
+<<<<<<< HEAD
+=======
+
+//This is the 'long vore' ability. Also known as "Grab Prey with appendage" or "Long Predatorial Reach". Or simply "Tongue Vore"
+//It involves projectiles (which means it can be VV'd onto a gun for shenanigans)
+//It can also be recolored via the proc, which persists between rounds.
+
+/mob/living/proc/long_vore() // Allows the user to tongue grab a creature in range. Made a /living proc so frogs can frog you.
+ set name = "Grab Prey With Appendage"
+ set category = "Abilities"
+ set desc = "Grab a target with any of your appendages!"
+
+ if(stat || paralysis || weakened || stunned || world.time < last_special) //No tongue flicking while stunned.
+ to_chat(src, "You can't do that in your current state.")
+ return
+
+ last_special = world.time + 10 //Anti-spam.
+
+ if (!istype(src, /mob/living))
+ to_chat(src, "It doesn't work that way.")
+ return
+
+ var/choice = tgui_alert(src, "Do you wish to change the color of your appendage, use it, or change its functionality?", "Selection List", list("Use it", "Color", "Functionality"))
+
+ if(choice == "Color") //Easy way to set color so we don't bloat up the menu with even more buttons.
+ var/new_color = input(usr, "Choose a color to set your appendage to!", "", appendage_color) as color|null
+ if(new_color)
+ appendage_color = new_color
+ if(choice == "Functionality") //Easy way to set color so we don't bloat up the menu with even more buttons.
+ var/choice2 = tgui_alert(usr, "Choose if you want to be pulled to the target or pull them to you!", "Functionality Setting", list("Pull target to self", "Pull self to target"))
+ if(choice2 == "Pull target to self")
+ appendage_alt_setting = 0
+ else
+ appendage_alt_setting = 1
+ else
+ var/list/targets = list() //IF IT IS NOT BROKEN. DO NOT FIX IT.
+
+ for(var/mob/living/L in range(5, src))
+ if(!istype(L, /mob/living)) //Don't eat anything that isn't mob/living. Failsafe.
+ continue
+ if(L == src) //no eating yourself. 1984.
+ continue
+ if(L.devourable && L.throw_vore && (L.can_be_drop_pred || L.can_be_drop_prey))
+ targets += L
+
+ if(!(targets.len))
+ to_chat(src, "No eligible targets found.")
+ return
+
+ var/mob/living/target = tgui_input_list(src, "Please select a target.", "Victim", targets)
+
+ if(!target)
+ return
+
+ if(!istype(target, /mob/living)) //Safety.
+ to_chat(src, "You need to select a living target!")
+ return
+
+ if (get_dist(src,target) >= 6)
+ to_chat(src, "You need to be closer to do that.")
+ return
+
+ visible_message("\The [src] attempts to snatch up [target]!", \
+ "You attempt to snatch up [target]!" )
+ playsound(src, 'sound/vore/sunesound/pred/schlorp.ogg', 25)
+
+ //Code to shoot the beam here.
+ var/obj/item/projectile/beam/appendage/appendage_attack = new /obj/item/projectile/beam/appendage(get_turf(loc))
+ appendage_attack.launch_projectile(target, BP_TORSO, src) //Send it.
+ last_special = world.time + 100 //Cooldown for successful strike.
+
+
+
+
+/obj/item/projectile/beam/appendage //The tongue projecitle.
+ name = "appendage"
+ icon_state = "laser"
+ nodamage = 1
+ damage = 0
+ eyeblur = 0
+ check_armour = "bullet" //Not really needed, but whatever.
+ can_miss = FALSE //Let's not miss our tongue!
+ hitsound = 'sound/vore/sunesound/pred/schlorp.ogg'
+ hitsound_wall = 'sound/vore/sunesound/pred/schlorp.ogg'
+ excavation_amount = 0
+ hitscan_light_intensity = 0
+ hitscan_light_range = 0
+ muzzle_flash_intensity = 0
+ muzzle_flash_range = 0
+ impact_light_intensity = 0
+ impact_light_range = 0
+ light_range = 0 //No your tongue can not glow...For now.
+ light_power = 0
+ light_on = 0 //NO LIGHT
+ combustion = FALSE //No, your tongue can't set the room on fire.
+ pass_flags = PASSTABLE
+
+ muzzle_type = /obj/effect/projectile/muzzle/appendage
+ tracer_type = /obj/effect/projectile/tracer/appendage
+ impact_type = /obj/effect/projectile/impact/appendage
+
+/obj/item/projectile/beam/appendage/generate_hitscan_tracers()
+ if(firer) //This neat little code block allows for C O L O R A B L E tongues! Correction: 'Appendages'
+ if(istype(firer,/mob/living))
+ var/mob/living/originator = firer
+ color = originator.appendage_color
+ ..()
+
+/obj/item/projectile/beam/appendage/on_hit(var/atom/target)
+ if(target == firer) //NO EATING YOURSELF
+ return
+ if(istype(target, /mob/living))
+ var/mob/living/M = target
+ var/throw_range = get_dist(firer,M)
+ if(istype(firer, /mob/living)) //Let's check for any alt settings. Such as: User selected to be thrown at target.
+ var/mob/living/F = firer
+ if(F.appendage_alt_setting == 1)
+ F.throw_at(M, throw_range, firer.throw_speed, F) //Firer thrown at target.
+ F.updateicon()
+ return
+ if(istype(M))
+ M.throw_at(firer, throw_range, M.throw_speed, firer) //Fun fact: living things have a throw_speed of 2.
+ M.updateicon()
+ return
+ else //Anything that isn't a /living
+ return
+ if(istype(target, /obj/item/)) //We hit an object? Pull it. This can only happen via admin shenanigans such as a gun being VV'd with this projectile.
+ var/obj/item/hit_object = target
+ if(hit_object.density || hit_object.anchored)
+ if(istype(firer, /mob/living))
+ var/mob/living/originator = firer
+ originator.Weaken(2) //If you hit something dense or anchored, fall flat on your face.
+ originator.visible_message("\The [originator] trips over their self and falls flat on their face!", \
+ "You trip over yourself and fall flat on your face!" )
+ playsound(originator, "punch", 25, 1, -1)
+ return
+ else
+ hit_object.throw_at(firer, throw_range, hit_object.throw_speed, firer)
+ if(istype(target, /turf/simulated/wall) || istype(target, /obj/machinery/door) || istype(target, /obj/structure/window)) //This can happen normally due to odd terrain. For some reason, it seems to not actually interact with walls.
+ if(istype(firer, /mob/living))
+ var/mob/living/originator = firer
+ originator.Weaken(2) //Hit a wall? Whoops!
+ originator.visible_message("\The [originator] trips over their self and falls flat on their face!", \
+ "You trip over yourself and fall flat on your face!" )
+ playsound(originator, "punch", 25, 1, -1)
+ return
+ else
+ return
+
+
+
+/obj/effect/projectile/muzzle/appendage
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "muzzle_appendage"
+ light_range = 0
+ light_power = 0
+ light_color = "#FF0D00"
+
+/obj/effect/projectile/tracer/appendage
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "appendage_beam"
+ light_range = 0
+ light_power = 0
+ light_color = "#FF0D00" //Doesn't matter. Not used.
+
+/obj/effect/projectile/impact/appendage
+ icon = 'icons/obj/projectiles_vr.dmi'
+ icon_state = "impact_appendage_combined"
+ light_range = 0
+ light_power = 0
+ light_color = "#FF0D00"
+//LONG VORE ABILITY END
+
+/obj/item/weapon/gun/energy/gun/tongue //This is the 'tongue' gun for admin memery.
+ name = "tongue"
+ desc = "A tongue that can be used to grab things."
+ icon = 'icons/mob/dogborg_vr.dmi'
+ icon_state = "synthtongue"
+ item_state = "gun"
+ fire_delay = null
+ force = 0
+ fire_delay = 1 //Adminspawn. No delay.
+ charge_cost = 0 //This is an adminspawn gun...No reason to force it to have a charge state.
+
+ projectile_type = /obj/item/projectile/beam/appendage
+ cell_type = /obj/item/weapon/cell/device/weapon/recharge
+ battery_lock = 1
+ modifystate = null
+
+
+ firemodes = list(
+ list(mode_name="vore", projectile_type=/obj/item/projectile/beam/appendage, modifystate=null, fire_sound='sound/vore/sunesound/pred/schlorp.ogg', charge_cost = 0),)
+
+/obj/item/weapon/gun/energy/gun/tongue/update_icon() //No updating the icon.
+ icon_state = "synthtongue"
+ return
+
+/obj/item/weapon/gun/energy/bfgtaser/tongue
+ name = "9000-series Ball Tongue Taser"
+ desc = "A banned riot control device."
+ slot_flags = SLOT_BELT|SLOT_BACK
+ projectile_type = /obj/item/projectile/bullet/BFGtaser/tongue
+ fire_delay = 20
+ w_class = ITEMSIZE_LARGE
+ one_handed_penalty = 90 // The thing's heavy and huge.
+ accuracy = 45
+ charge_cost = 2400 //yes, this bad boy empties an entire weapon cell in one shot. What of it?
+
+/obj/item/projectile/bullet/BFGtaser/tongue
+ name = "tongue ball"
+ hitsound = 'sound/vore/sunesound/pred/schlorp.ogg'
+ hitsound_wall = 'sound/vore/sunesound/pred/schlorp.ogg'
+ zaptype = /obj/item/projectile/beam/appendage
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
diff --git a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
index ff6d6636ac..2c26069dff 100644
--- a/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
+++ b/code/modules/mob/living/simple_mob/subtypes/vore/vore.dm
@@ -25,6 +25,11 @@
permit_healbelly = client.prefs_vr.permit_healbelly
noisy = client.prefs_vr.noisy
selective_preference = client.prefs_vr.selective_preference
+<<<<<<< HEAD
+=======
+ appendage_color = client.prefs_vr.appendage_color
+ appendage_alt_setting = client.prefs_vr.appendage_alt_setting
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
drop_vore = client.prefs_vr.drop_vore
stumble_vore = client.prefs_vr.stumble_vore
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index 6e64db0d10..f555f7d28e 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -48,6 +48,11 @@
var/latejoin_prey = FALSE //CHOMPedit: If enabled, latejoiners can spawn ontop of and instantly eat the victim
var/noisy_full = FALSE //CHOMPedit: Enables belching when a mob has overeaten
var/selective_preference = DM_DEFAULT // Preference for selective bellymode
+<<<<<<< HEAD
+=======
+ var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait.
+ var/appendage_alt_setting = FALSE // Dictates if 'long_vore' user pulls prey to them or not. 1 = user thrown towards target.
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
var/regen_sounds = list(
'sound/effects/mob_effects/xenochimera/regen_1.ogg',
'sound/effects/mob_effects/xenochimera/regen_2.ogg',
@@ -276,6 +281,11 @@
P.can_be_drop_prey = src.can_be_drop_prey
P.can_be_drop_pred = src.can_be_drop_pred
P.allow_spontaneous_tf = src.allow_spontaneous_tf
+<<<<<<< HEAD
+=======
+ P.appendage_color = src.appendage_color
+ P.appendage_alt_setting = src.appendage_alt_setting
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
P.step_mechanics_pref = src.step_mechanics_pref
P.pickup_pref = src.pickup_pref
P.drop_vore = src.drop_vore
@@ -329,6 +339,11 @@
can_be_drop_pred = P.can_be_drop_pred
// allow_inbelly_spawning = P.allow_inbelly_spawning //CHOMP Removal: we have vore spawning at home. Actually if this were to be enabled, it would break anyway. Just leaving this here as a reference to it.
allow_spontaneous_tf = P.allow_spontaneous_tf
+<<<<<<< HEAD
+=======
+ appendage_color = P.appendage_color
+ appendage_alt_setting = P.appendage_alt_setting
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
step_mechanics_pref = P.step_mechanics_pref
pickup_pref = P.pickup_pref
drop_vore = P.drop_vore
diff --git a/code/modules/vore/eating/vore_vr.dm b/code/modules/vore/eating/vore_vr.dm
index 7089e4f896..7b746769a2 100644
--- a/code/modules/vore/eating/vore_vr.dm
+++ b/code/modules/vore/eating/vore_vr.dm
@@ -76,6 +76,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
var/list/belly_prefs = list()
var/vore_taste = "nothing in particular"
var/vore_smell = "nothing in particular"
+<<<<<<< HEAD
+=======
+ var/appendage_color = "#e03997" //Default pink. Used for the 'long_vore' trait.
+ var/appendage_alt_setting = 0 //Decides if appendage user is thrown at target or not.
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
var/selective_preference = DM_DEFAULT
@@ -182,6 +187,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
vore_smell = json_from_file["vore_smell"]
permit_healbelly = json_from_file["permit_healbelly"]
noisy = json_from_file["noisy"]
+<<<<<<< HEAD
+=======
+ appendage_color = json_from_file["appendage_color"]
+ appendage_alt_setting = json_from_file["appendage_alt_setting"]
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
selective_preference = json_from_file["selective_preference"]
show_vore_fx = json_from_file["show_vore_fx"]
can_be_drop_prey = json_from_file["can_be_drop_prey"]
@@ -228,6 +238,13 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
selective_preference = DM_DEFAULT
if (isnull(noisy))
noisy = FALSE
+<<<<<<< HEAD
+=======
+ if (isnull(appendage_color))
+ appendage_color = "#e03997"
+ if (isnull(appendage_alt_setting))
+ appendage_alt_setting = 0
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
if(isnull(show_vore_fx))
show_vore_fx = TRUE
if(isnull(can_be_drop_prey))
@@ -309,6 +326,11 @@ V::::::V V::::::VO:::::::OOO:::::::ORR:::::R R:::::REE::::::EEEEEE
"vore_smell" = vore_smell,
"permit_healbelly" = permit_healbelly,
"noisy" = noisy,
+<<<<<<< HEAD
+=======
+ "appendage_color" = appendage_color,
+ "appendage_alt_setting" = appendage_alt_setting,
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
"selective_preference" = selective_preference,
"show_vore_fx" = show_vore_fx,
"can_be_drop_prey" = can_be_drop_prey,
diff --git a/code/modules/vore/eating/vorepanel_vr.dm b/code/modules/vore/eating/vorepanel_vr.dm
index 80e9fb8058..0f67483c07 100644
--- a/code/modules/vore/eating/vorepanel_vr.dm
+++ b/code/modules/vore/eating/vorepanel_vr.dm
@@ -333,6 +333,11 @@
"latejoin_vore" = host.latejoin_vore, //CHOMPedit
"latejoin_prey" = host.latejoin_prey, //CHOMPedit
"allow_spontaneous_tf" = host.allow_spontaneous_tf,
+<<<<<<< HEAD
+=======
+ "appendage_color" = host.appendage_color,
+ "appendage_alt_setting" = host.appendage_alt_setting,
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
"step_mechanics_active" = host.step_mechanics_pref,
"pickup_mechanics_active" = host.pickup_pref,
"noisy" = host.noisy,
diff --git a/code/modules/vore/mouseray.dm b/code/modules/vore/mouseray.dm
index 65f997ad1a..83db1f63c1 100644
--- a/code/modules/vore/mouseray.dm
+++ b/code/modules/vore/mouseray.dm
@@ -230,6 +230,11 @@
new_mob.permit_healbelly = permit_healbelly
new_mob.noisy = noisy
new_mob.selective_preference = selective_preference
+<<<<<<< HEAD
+=======
+ new_mob.appendage_color = appendage_color
+ new_mob.appendage_alt_setting = appendage_alt_setting
+>>>>>>> 6285a02b37... Merge pull request #13731 from Cameron653/TONGUE_EDIT
new_mob.drop_vore = drop_vore
new_mob.stumble_vore = stumble_vore
new_mob.slip_vore = slip_vore