diff --git a/code/__defines/belly_modes_vr.dm b/code/__defines/belly_modes_vr.dm
index e6f072ca0c..c85550b991 100644
--- a/code/__defines/belly_modes_vr.dm
+++ b/code/__defines/belly_modes_vr.dm
@@ -29,9 +29,10 @@
#define DM_TRANSFORM_FEMALE_EGG "Transform (Female) (EGG)"
//Addon mode flags
-#define DM_FLAG_NUMBING 0x1
-#define DM_FLAG_ITEMWEAK 0x2
-#define DM_FLAG_STRIPPING 0x4
+#define DM_FLAG_NUMBING 0x1
+#define DM_FLAG_STRIPPING 0x2
+#define DM_FLAG_LEAVEREMAINS 0x4 //TFF 30/4/19: Ports VoreStation Remains Option - new belly mode
+#define DM_FLAG_ITEMWEAK 0x8
// Stance for hostile mobs to be in while devouring someone.
#define HOSTILE_STANCE_EATING 99
diff --git a/code/__defines/mobs_vr.dm b/code/__defines/mobs_vr.dm
index 2e3f8b0760..1ed0f361a0 100644
--- a/code/__defines/mobs_vr.dm
+++ b/code/__defines/mobs_vr.dm
@@ -27,3 +27,10 @@
#define SPECIES_ZORREN_FLAT "Flatland Zorren"
#define SPECIES_ZORREN_HIGH "Highlander Zorren"
#define SPECIES_CUSTOM "Custom Species"
+
+//TFF 30/4/19: Ports VoreStation Remains Option - new mob defines
+
+#define SPECIES_MONKEY_AKULA "Sobaka"
+#define SPECIES_MONKEY_NEVREAN "Sparra"
+#define SPECIES_MONKEY_SERGAL "Saru"
+#define SPECIES_MONKEY_VULPKANIN "Wolpin"
diff --git a/code/_helpers/global_lists_vr.dm b/code/_helpers/global_lists_vr.dm
index 7294474cab..a977a5e317 100644
--- a/code/_helpers/global_lists_vr.dm
+++ b/code/_helpers/global_lists_vr.dm
@@ -372,6 +372,27 @@ var/global/list/cont_flavors_musky = list("drenched",
"sticky",
"tainted")
+//TFF 30/4/19: Ports VoreStation Remains Option - sets species that won't result in remains left behind
+var/global/list/remainless_species = list(SPECIES_PROMETHEAN,
+ SPECIES_DIONA,
+ SPECIES_ALRAUNE,
+ SPECIES_PROTEAN,
+ SPECIES_MONKEY, //Exclude all monkey subtypes, to prevent abuse of it. They aren't,
+ SPECIES_MONKEY_TAJ, //set to have remains anyway, but making double sure,
+ SPECIES_MONKEY_SKRELL,
+ SPECIES_MONKEY_UNATHI,
+ SPECIES_MONKEY_AKULA,
+ SPECIES_MONKEY_NEVREAN,
+ SPECIES_MONKEY_SERGAL,
+ SPECIES_MONKEY_VULPKANIN,
+ SPECIES_XENO, //Same for xenos,
+ SPECIES_XENO_DRONE,
+ SPECIES_XENO_HUNTER,
+ SPECIES_XENO_SENTINEL,
+ SPECIES_XENO_QUEEN,
+ SPECIES_SHADOW,
+ SPECIES_GOLEM) //Some special species that may or may not be ever used in event too
+
/hook/startup/proc/init_vore_datum_ref_lists()
var/paths
diff --git a/code/game/machinery/cryopod.dm b/code/game/machinery/cryopod.dm
index bd3f075866..1b6d2f94fe 100644
--- a/code/game/machinery/cryopod.dm
+++ b/code/game/machinery/cryopod.dm
@@ -506,6 +506,11 @@
//visible_message("\The [initial(name)] hums and hisses as it moves [to_despawn.real_name] into storage.", 3)
visible_message("\The [initial(name)] [on_store_visible_message_1] [to_despawn.real_name] [on_store_visible_message_2].", 3)
+//TFF: Port Vorestation fix for people getting kicked while inside a belly. Re-added 1/5/19. Didn't synch my fork before that last one, apparently. >W>
+ if(to_despawn.client && to_despawn.stat<2)
+ var/mob/observer/dead/newghost = to_despawn.ghostize()
+ newghost.timeofdeath = world.time
+
//This should guarantee that ghosts don't spawn.
to_despawn.ckey = null
diff --git a/code/modules/admin/verbs/debug_vr.dm b/code/modules/admin/verbs/debug_vr.dm
index 79089c8da0..aaf959e059 100644
--- a/code/modules/admin/verbs/debug_vr.dm
+++ b/code/modules/admin/verbs/debug_vr.dm
@@ -3,7 +3,7 @@
set name = "Quick NIF"
set desc = "Spawns a NIF into someone in quick-implant mode."
- if(!check_rights(R_ADMIN || R_EVENT))
+ if(!check_rights(R_ADMIN|R_EVENT|R_DEBUG)) //TFF 24/4/19: Allow Devs to use Quick-NIF verb.
return
var/mob/living/carbon/human/H = input("Pick a mob with a player","Quick NIF") as null|anything in player_list
diff --git a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
index 86ea0381d0..23746cc104 100644
--- a/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_accessories_vr.dm
@@ -30,6 +30,11 @@
display_name = "collar, holo"
path = /obj/item/clothing/accessory/collar/holo
+//TFF 23/4/19: Indigestible collar addition
+/datum/gear/collar/holo/indigestible
+ display_name = "collar, holo (indigestible)"
+ path = /obj/item/clothing/accessory/collar/holo/indigestible
+
/datum/gear/accessory/white_drop_pouches
allowed_roles = list("Paramedic","Chief Medical Officer","Medical Doctor","Chemist")
@@ -53,4 +58,4 @@
/datum/gear/accessory/flops/New()
..()
- gear_tweaks = list(gear_tweak_free_color_choice)
\ No newline at end of file
+ gear_tweaks = list(gear_tweak_free_color_choice)
diff --git a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
index d8b29d0d92..36deb28018 100644
--- a/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_eyes_vr.dm
@@ -12,4 +12,8 @@
/datum/gear/eyes/science_proper
display_name = "science goggles (no overlay)"
- path = /obj/item/clothing/glasses/fluff/science_proper
\ No newline at end of file
+ path = /obj/item/clothing/glasses/fluff/science_proper
+
+datum/gear/eyes/flipgoggles
+ display_name = "Flip Goggles"
+ path = /obj/item/clothing/glasses/goggles/flip
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_implants.dm b/code/modules/client/preference_setup/loadout/loadout_implants.dm
new file mode 100644
index 0000000000..d58e3dc762
--- /dev/null
+++ b/code/modules/client/preference_setup/loadout/loadout_implants.dm
@@ -0,0 +1,29 @@
+//TFF 29/4/19: Add implants category, includes reagent implanters
+
+
+/datum/gear/implant
+ display_name = "implant, tracking"
+ path = /obj/item/weapon/implant/tracking/weak
+ cost = 0 //VOREStation Edit. Changed cost to 0
+ slot = "implant"
+ exploitable = 1
+ sort_category = "Implants"
+
+/* VOREStation Edit - Make languages great again
+/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
+ display_name = "implant, language, EAL"
+ path = /obj/item/weapon/implant/language/eal
+ cost = 2
+ slot = "implant"
+ exploitable = 1*/
+
+//Reagent implants - cost of 2 to reduce chance of abuse
+/datum/gear/implant/reagent_generator
+ display_name = "implant, milk production"
+ path = /obj/item/weapon/implanter/reagent_generator/milk
+ exploitable = 0
+ cost = 2
+
+/datum/gear/implant/reagent_generator/egg
+ display_name = "implant, egg production"
+ path = /obj/item/weapon/implanter/reagent_generator/egg
diff --git a/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm b/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
index ff04b6a989..5c5fac3e7f 100644
--- a/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_shoes_vr.dm
@@ -12,4 +12,10 @@
/datum/gear/shoes/siren
display_name = "boots, Siren"
- path = /obj/item/clothing/shoes/boots/fluff/siren
\ No newline at end of file
+ path = /obj/item/clothing/shoes/boots/fluff/siren
+
+/datum/gear/shoes/tall
+ display_name = "tall jackboots"
+ path = /obj/item/clothing/shoes/boots/jackboots/tall
+ slot = slot_shoes
+ sort_category = "Shoes and Footwear"
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
index 002d032a3d..22e8dea4ac 100644
--- a/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_suit_vr.dm
@@ -20,4 +20,8 @@
/datum/gear/suit/gntop
display_name = "GN crop jacket"
- path = /obj/item/clothing/suit/storage/fluff/gntop
\ No newline at end of file
+ path = /obj/item/clothing/suit/storage/fluff/gntop
+
+/datum/gear/suit/denim_vest/black
+ display_name = "black denim vest"
+ path = /obj/item/clothing/suit/storage/toggle/denim_jacket/sleeveless/black
\ No newline at end of file
diff --git a/code/modules/client/preference_setup/loadout/loadout_utility.dm b/code/modules/client/preference_setup/loadout/loadout_utility.dm
index 76178dada2..c381c980dc 100644
--- a/code/modules/client/preference_setup/loadout/loadout_utility.dm
+++ b/code/modules/client/preference_setup/loadout/loadout_utility.dm
@@ -115,22 +115,7 @@
display_name = "cell, device"
path = /obj/item/weapon/cell/device
-/datum/gear/utility/implant
- exploitable = 1
-/* VOREStation Edit - Make languages great again
-/datum/gear/utility/implant/eal //This does nothing if you don't actually know EAL.
- display_name = "implant, language, EAL"
- path = /obj/item/weapon/implant/language/eal
- cost = 2
- slot = "implant"
- exploitable = 1*/
-
-/datum/gear/utility/implant/tracking
- display_name = "implant, tracking"
- path = /obj/item/weapon/implant/tracking/weak
- cost = 0 //VOREStation Edit. Changed cost to 0
- slot = "implant"
- exploitable = 1
+//TFF 29/4/19: remove implants, move to loadout_implants.dm
/datum/gear/utility/pen
display_name = "Fountain Pen"
diff --git a/code/modules/clothing/under/accessories/accessory_vr.dm b/code/modules/clothing/under/accessories/accessory_vr.dm
index 4c30c2cef8..2adf9557a4 100644
--- a/code/modules/clothing/under/accessories/accessory_vr.dm
+++ b/code/modules/clothing/under/accessories/accessory_vr.dm
@@ -165,6 +165,15 @@
overlay_state = "collar_holo_overlay"
matter = list(DEFAULT_WALL_MATERIAL = 50)
+//TFF 23/4/19: Indigestible collar addition
+/obj/item/clothing/accessory/collar/holo/indigestible
+ name = "Holo-collar"
+ desc = "A special variety of the holo-collar that seems to be made of a very durable fabric that fits around the neck."
+ icon_state = "collar_holo"
+ item_state = "collar_holo_overlay"
+ overlay_state = "collar_holo_overlay"
+ matter = list(DEFAULT_WALL_MATERIAL = 50)
+
// Chompstation edit - Deprecated, implementing a custom method of renaming collars.
/*
/obj/item/clothing/accessory/collar/holo/attack_self(mob/user as mob)
diff --git a/code/modules/mob/living/carbon/human/human.dm b/code/modules/mob/living/carbon/human/human.dm
index e1a120643f..884f016e23 100644
--- a/code/modules/mob/living/carbon/human/human.dm
+++ b/code/modules/mob/living/carbon/human/human.dm
@@ -167,7 +167,7 @@
update |= temp.take_damage(b_loss * 0.05, f_loss * 0.05, used_weapon = weapon_message)
if(update) UpdateDamageIcon()
-/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/utility/implant)
+/mob/living/carbon/human/proc/implant_loadout(var/datum/gear/G = new/datum/gear/implant) //TFF 29/4/19: filepath change due to loadout change
var/obj/item/weapon/implant/I = new G.path(src)
I.imp_in = src
I.implanted = 1
diff --git a/code/modules/mob/living/carbon/human/human_damage.dm b/code/modules/mob/living/carbon/human/human_damage.dm
index 394acc565e..31e14a5f63 100644
--- a/code/modules/mob/living/carbon/human/human_damage.dm
+++ b/code/modules/mob/living/carbon/human/human_damage.dm
@@ -117,8 +117,8 @@
amount *= M.incoming_damage_percent
if(!isnull(M.incoming_brute_damage_percent))
amount *= M.incoming_brute_damage_percent
- if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
- take_overall_damage(amount, 0)
+ if(nif && nif.flag_check(NIF_C_BRUTEARMOR,NIF_FLAGS_COMBAT))
+ take_overall_damage(amount *= 0.7, 0) //VOREStation Edit - NIF mod for damage resistance for this type of damage
else
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
@@ -135,8 +135,8 @@
amount *= M.incoming_damage_percent
if(!isnull(M.incoming_fire_damage_percent))
amount *= M.incoming_fire_damage_percent
- if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
- take_overall_damage(0, amount)
+ if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT))
+ take_overall_damage(0, amount *= 0.7) //VOREStation Edit - NIF mod for damage resistance for this type of damage
else
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
@@ -177,8 +177,8 @@
amount *= M.incoming_damage_percent
if(!isnull(M.incoming_fire_damage_percent))
amount *= M.incoming_fire_damage_percent
- if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT)){amount *= 0.7} //VOREStation Edit - NIF mod for damage resistance for this type of damage
- O.take_damage(0, amount, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source)
+ if(nif && nif.flag_check(NIF_C_BURNARMOR,NIF_FLAGS_COMBAT))
+ O.take_damage(0, amount *= 0.7, sharp=is_sharp(damage_source), edge=has_edge(damage_source), used_weapon=damage_source) //VOREStation Edit - NIF mod for damage resistance for this type of damage
else
for(var/datum/modifier/M in modifiers)
if(!isnull(M.incoming_healing_percent))
diff --git a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
index f2847a1523..dd9d811198 100644
--- a/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/blank_vr.dm
@@ -1,15 +1,19 @@
+//TFF 30/4/19: Make leave_remains_vr.dm work! >:C
/datum/species
//var/vore_numbing = 0
- var/gets_food_nutrition = 1 // If this is set to 0, the person can't get nutrition from food.
+ var/gets_food_nutrition = TRUE // If this is set to 0, the person can't get nutrition from food.
var/metabolism = 0.0015
- var/lightweight = 0 //Oof! Nonhelpful bump stumbles.
- var/trashcan = 0 //It's always sunny in the wrestling ring.
+ var/lightweight = FALSE //Oof! Nonhelpful bump stumbles.
+ var/trashcan = FALSE //It's always sunny in the wrestling ring.
+ var/base_species = null // Unused outside of a few species
+ var/selects_bodytype = 0 // Allows the species to choose from body types intead of being forced to be just one.
/datum/species/custom
name = SPECIES_CUSTOM
name_plural = "Custom"
- var/base_species = "Human"
+ selects_bodytype = TRUE
+ base_species = SPECIES_HUMAN
unarmed_types = list(/datum/unarmed_attack/stomp, /datum/unarmed_attack/kick, /datum/unarmed_attack/punch, /datum/unarmed_attack/bite)
diff --git a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
index f56faa515a..e2a48c75ab 100644
--- a/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/monkey_vr.dm
@@ -1,5 +1,6 @@
+//TFF 30/4/19: Ports VoreStation Remains Option - refactor species names
/datum/species/monkey/shark
- name = "Sobaka"
+ name = SPECIES_MONKEY_AKULA
name_plural = "Sobaka"
icobase = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sobaka_vr.dmi'
@@ -8,7 +9,7 @@
default_language = "Skrellian" //Closest we have.
/datum/species/monkey/sergal
- name = "Saru"
+ name = SPECIES_MONKEY_SERGAL
greater_form = "Sergal"
icobase = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
deform = 'icons/mob/human_races/monkeys/r_sergaling_vr.dmi'
@@ -16,7 +17,7 @@
default_language = LANGUAGE_SAGARU
/datum/species/monkey/sparra
- name = "Sparra"
+ name = SPECIES_MONKEY_NEVREAN
name_plural = "Sparra"
greater_form = "Nevrean"
tail = null
@@ -41,7 +42,7 @@
*/
/datum/species/monkey/vulpkanin
- name = "Wolpin"
+ name = SPECIES_MONKEY_VULPKANIN
name_plural = "Wolpin"
icobase = 'icons/mob/human_races/monkeys/r_wolpin.dmi'
diff --git a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
index aa8af0e273..da5d052b65 100644
--- a/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
+++ b/code/modules/mob/living/carbon/human/species/station/station_special_vr.dm
@@ -14,7 +14,9 @@
slowdown = -0.2 //scuttly, but not as scuttly as a tajara or a teshari.
brute_mod = 0.8 //About as tanky to brute as a Unathi. They'll probably snap and go feral when hurt though.
burn_mod = 1.15 //As vulnerable to burn as a Tajara.
- var/base_species = "Xenochimera"
+ //TFF 30/4/19: Making leave_remains_vr.dm work. >:C
+ base_species = "Xenochimera"
+ selects_bodytype = TRUE
num_alternate_languages = 2
secondary_langs = list("Sol Common")
diff --git a/code/modules/mob/living/simple_animal/aliens/mimic.dm b/code/modules/mob/living/simple_animal/aliens/mimic.dm
index fff75ecbe7..0a22010c72 100644
--- a/code/modules/mob/living/simple_animal/aliens/mimic.dm
+++ b/code/modules/mob/living/simple_animal/aliens/mimic.dm
@@ -38,6 +38,8 @@
minbodytemp = 0
meat_type = /obj/item/weapon/reagent_containers/food/snacks/carpmeat
+//TFF 30/4/19: Port VoreStation Mechanical Vore Prefs - hide Mimic prefs
+ showvoreprefs = 0 //VOREStation Edit - Hides mechanical vore prefs for mimics. You can't see their gaping maws when they're just sitting idle.
/mob/living/simple_animal/hostile/mimic/set_target()
. = ..()
diff --git a/code/modules/mob/living/simple_animal/animals/sculpture.dm b/code/modules/mob/living/simple_animal/animals/sculpture.dm
index 1acf703a89..be0057f501 100644
--- a/code/modules/mob/living/simple_animal/animals/sculpture.dm
+++ b/code/modules/mob/living/simple_animal/animals/sculpture.dm
@@ -3,6 +3,7 @@
/mob/living/simple_animal/sculpture
name = "\improper sculpture"
desc = "It's some kind of hastily-painted human-size stone sculpture. Just looking at it makes you feel nervous."
+ icon = 'icons/mob/sculpture.dmi'
icon_state = "sculpture"
icon_living = "sculpture"
icon_dead = "sculpture"
diff --git a/code/modules/projectiles/guns/energy/stun_vr.dm b/code/modules/projectiles/guns/energy/stun_vr.dm
index b0bfd53e46..0a1ceeb597 100644
--- a/code/modules/projectiles/guns/energy/stun_vr.dm
+++ b/code/modules/projectiles/guns/energy/stun_vr.dm
@@ -3,4 +3,20 @@
fire_delay = 4
/obj/item/weapon/gun/energy/stunrevolver
- charge_cost = 400
\ No newline at end of file
+ charge_cost = 400
+
+//CHOMPEDIT:
+/obj/item/weapon/gun/energy/stunrevolver/oneshot
+ desc = "A heavily modified LAEP20 Zeus. It fires a beam instead of an electrode. The massive recoil makes it only useful as a last resort weapon."
+ charge_cost = 2400
+ projectile_type = /obj/item/projectile/beam/stun/oneshot
+
+/obj/item/weapon/gun/energy/stunrevolver/oneshot/Fire(atom/target, mob/living/user, clickparams, pointblank=0, reflex=0)
+ ..()
+ if(iscarbon(user))
+ var/mob/living/carbon/nerd = user
+ var/mysize = nerd.size_multiplier
+ nerd.Weaken(3-mysize) //200% gets the knockdown micros usually get now from firing a gun. Micros get their base knockdown + this.
+ nerd.adjustBruteLoss(10-mysize*4) //This means 200% = 10-8; 100% = 10-4; etc
+
+
diff --git a/code/modules/projectiles/projectile/beams.dm b/code/modules/projectiles/projectile/beams.dm
index 9755f604ab..364f587bec 100644
--- a/code/modules/projectiles/projectile/beams.dm
+++ b/code/modules/projectiles/projectile/beams.dm
@@ -18,6 +18,7 @@
muzzle_type = /obj/effect/projectile/laser/muzzle
tracer_type = /obj/effect/projectile/laser/tracer
impact_type = /obj/effect/projectile/laser/impact
+
/obj/item/projectile/beam/practice
name = "laser"
@@ -210,4 +211,12 @@
/obj/item/projectile/beam/stun/med
name = "stun beam"
icon_state = "stun"
- agony = 35
\ No newline at end of file
+ agony = 35
+
+//CHOMPEDIT: Charge beam that drains all power
+/obj/item/projectile/beam/stun/oneshot
+ name = "Overdrive Stun beam"
+ light_color = "#AA00FF"
+ //shotcost = 2400
+ agony = 240
+//CHOMPEDIT END.
diff --git a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
index 9ee5356f7c..0ecd23b221 100644
--- a/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
+++ b/code/modules/vore/appearance/sprite_accessories_taur_vr.dm
@@ -143,7 +143,7 @@
/datum/sprite_accessory/tail/taur/roiz_long_lizard // Not ACTUALLY a taur, but it uses 32x64 so it wouldn't fit in tails.dmi, and having it as a tail bugs up the sprite.
name = "Long Lizard Tail (Roiz Lizden)"
icon_state = "roiz_tail_s"
- do_colouration = 0
+ do_colouration = 1 //TFF 25/4/19: Make colourable as per request.
// ckeys_allowed = list("spoopylizz")
/datum/sprite_accessory/tail/taur/wolf
@@ -399,6 +399,38 @@
icon_state = "otie_s"
extra_overlay = "otie_markings"
+//TFF 25/4/19: Add Mermaid taur body selection. Requested addition!
+/datum/sprite_accessory/tail/taur/mermaid
+ name = "Mermaid (Taur)"
+ icon_state = "mermaid_s"
+
+ msg_owner_help_walk = "You carefully slide around %prey."
+ msg_prey_help_walk = "%owner's huge fin slides past beside you!"
+
+ msg_owner_help_run = "You carefully slide around %prey."
+ msg_prey_help_run = "%owner's huge fine slides past beside you!"
+
+ msg_owner_disarm_run = "Your fin comes up above %prey, pushing them down to the ground!"
+ msg_prey_disarm_run = "%owner's fin comes up you, forcing you down to the ground!"
+
+ msg_owner_disarm_walk = "You push down on %prey with your fin, pinning them down under you!"
+ msg_prey_disarm_walk = "%owner pushes down on you with their fin, pinning you down below them!"
+
+ msg_owner_harm_run = "While sliding across the ground, you go right over %prey, crushing them!"
+ msg_prey_harm_run = "%owner slides over your body, carelessly crushing you with their heavy fin!"
+
+ msg_owner_harm_walk = "Your heavy fin slowly and methodically slides down upon %prey, crushing against the floor below!"
+ msg_prey_harm_walk = "%owner's thick, heavy fin slowly and methodically slides down upon your body, mercilessly crushing you into the floor below!"
+
+ msg_owner_grab_success = "You slide over %prey with your large, thick fin, smushing them against the ground before bending around them, trapping them between the base of the fin and the end of it!"
+ msg_prey_grab_success = "%owner slithers over you with their large, thick fin, smushing you against the ground before bending around you, trapping you between the fin's base and the end of it!"
+
+ msg_owner_grab_fail = "You squish %prey under your large, thick fin, forcing them onto the ground!"
+ msg_prey_grab_fail = "%owner pins you under their large, thick fin, forcing you onto the ground!"
+
+ msg_prey_stepunder = "You jump over %prey's thick fin."
+ msg_owner_stepunder = "%owner bounds over your fin."
+
//wickedtemp: Chakat Tempest
/datum/sprite_accessory/tail/taur/feline/tempest
name = "Feline (wickedtemp) (Taur)"
diff --git a/code/modules/vore/eating/belly_obj_vr.dm b/code/modules/vore/eating/belly_obj_vr.dm
index 6a45b64488..630f10602d 100644
--- a/code/modules/vore/eating/belly_obj_vr.dm
+++ b/code/modules/vore/eating/belly_obj_vr.dm
@@ -39,7 +39,7 @@
//Actual full digest modes
var/tmp/static/list/digest_modes = list(DM_HOLD,DM_DIGEST,DM_ABSORB,DM_DRAIN,DM_UNABSORB,DM_HEAL,DM_SHRINK,DM_GROW,DM_SIZE_STEAL)
//Digest mode addon flags
- var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING)
+ var/tmp/static/list/mode_flag_list = list("Numbing" = DM_FLAG_NUMBING, "Itemweak" = DM_FLAG_ITEMWEAK, "Stripping" = DM_FLAG_STRIPPING, "Leave Remains" = DM_FLAG_LEAVEREMAINS) //TFF 30/4/19: Ports VoreStation Remains Option - add new belly mode addon to toggle
//Transformation modes
var/tmp/static/list/transform_modes = list(DM_TRANSFORM_MALE,DM_TRANSFORM_FEMALE,DM_TRANSFORM_KEEP_GENDER,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR,DM_TRANSFORM_CHANGE_SPECIES_AND_TAUR_EGG,DM_TRANSFORM_REPLICA,DM_TRANSFORM_REPLICA_EGG,DM_TRANSFORM_KEEP_GENDER_EGG,DM_TRANSFORM_MALE_EGG,DM_TRANSFORM_FEMALE_EGG, DM_EGG)
@@ -259,10 +259,9 @@
if(owner.stat == DEAD)
return
if(!prey.isEdible) //CHOMPEDIT: Trying to make pred mobs prey? N O U
-
+
var/mob/living/simple_animal/preydator = prey
-
- if(preydator.icon_state == preydator.icon_living && preydator.size_multiplier >= 1)
+ if(preydator.icon_state == preydator.icon_living)
user.visible_message("\the [user] promptly gets tackled by \the [prey] for trying to break their prefs! !!")
user.Weaken(5)
if (preydator.will_eat(user))
diff --git a/code/modules/vore/eating/bellymodes_vr.dm b/code/modules/vore/eating/bellymodes_vr.dm
index 6c7a38633d..a632bdebcd 100644
--- a/code/modules/vore/eating/bellymodes_vr.dm
+++ b/code/modules/vore/eating/bellymodes_vr.dm
@@ -113,6 +113,9 @@
to_chat(M,"" + digest_alert_prey + "")
play_sound = pick(death_sounds)
+ //TFF 30/4/19: Ports VoreStation Remains Option - handler to leave remains
+ if((mode_flags & DM_FLAG_LEAVEREMAINS) && M.digest_leave_remains)
+ handle_remains_leaving(M)
digestion_death(M)
owner.update_icons()
if(compensation > 0)
@@ -129,9 +132,9 @@
if(istype(M,/mob/living/simple_animal/retaliate/synx))
var/syntox = digest_brute+digest_burn
owner.adjustToxLoss(syntox)
- M.adjustBruteLoss(-syntox*2) //Should automaticaly clamp to 0
- M.adjustFireLoss(-syntox*2) //Should automaticaly clamp to 0
- //END SYNX hook.
+ if(M.health <= M.maxHealth)
+ M.health = M.health + syntox*2
+
// Deal digestion damage (and feed the pred)
var/old_brute = M.getBruteLoss()
var/old_burn = M.getFireLoss()
diff --git a/code/modules/vore/eating/digest_act_vr.dm b/code/modules/vore/eating/digest_act_vr.dm
index 20843b0b3d..aa77f113f1 100644
--- a/code/modules/vore/eating/digest_act_vr.dm
+++ b/code/modules/vore/eating/digest_act_vr.dm
@@ -39,7 +39,9 @@
return FALSE //Sorta important to not digest your own beacons.
/obj/item/weapon/storage/glass_ornament/digest_act(...)
return FALSE
-
+//TFF 23/4/19: Indigestible collar addition
+/obj/item/clothing/accessory/collar/holo/indigestible/digest_act(...)
+ return FALSE
/////////////
// Some special treatment
/////////////
diff --git a/code/modules/vore/eating/leave_remains_vr.dm b/code/modules/vore/eating/leave_remains_vr.dm
new file mode 100644
index 0000000000..46ac2f873e
--- /dev/null
+++ b/code/modules/vore/eating/leave_remains_vr.dm
@@ -0,0 +1,164 @@
+//TFF 30/4/19: Ports VoreStation Remains Option - add new file to handle leaving some remains after digestion kills you
+/obj/belly/proc/handle_remains_leaving(var/mob/living/M)
+
+ if(istype(M,/mob/living/carbon/human)) //Are we even humanoid?
+ var/mob/living/carbon/human/H = M
+
+ if((H.species.name in remainless_species) || H.isSynthetic()) //Don't leave anything if there is nothing to leave
+ return
+
+ else
+ var/bones_amount = rand(2,3) //some random variety in amount of bones left
+
+ if(prob(20)) //ribcage surviving whole is some luck
+ new /obj/item/weapon/digestion_remains/ribcage(src,owner)
+ bones_amount--
+
+ while(bones_amount) //throw in the rest
+ new /obj/item/weapon/digestion_remains(src,owner)
+ bones_amount--
+
+ var/skull_amount = 1
+ switch(H.species.name) //oh boy here we go, finding us a right skull
+ if(SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull(src,owner)
+ skull_amount--
+ if(SPECIES_TAJ)
+ new /obj/item/weapon/digestion_remains/skull/tajaran(src,owner)
+ skull_amount--
+ if(SPECIES_UNATHI)
+ new /obj/item/weapon/digestion_remains/skull/unathi(src,owner)
+ skull_amount--
+ if(SPECIES_SKRELL)
+ new /obj/item/weapon/digestion_remains/skull/skrell(src,owner)
+ skull_amount--
+ if(SPECIES_VASILISSAN)
+ new /obj/item/weapon/digestion_remains/skull/vasilissan(src,owner)
+ skull_amount--
+ if(SPECIES_AKULA)
+ new /obj/item/weapon/digestion_remains/skull/akula(src,owner)
+ skull_amount--
+ if(SPECIES_RAPALA)
+ new /obj/item/weapon/digestion_remains/skull/rapala(src,owner)
+ skull_amount--
+ if(SPECIES_VULPKANIN)
+ new /obj/item/weapon/digestion_remains/skull/vulpkanin(src,owner)
+ skull_amount--
+ if(SPECIES_SERGAL)
+ new /obj/item/weapon/digestion_remains/skull/sergal(src,owner)
+ skull_amount--
+ if(SPECIES_ZORREN_FLAT || SPECIES_ZORREN_HIGH)
+ new /obj/item/weapon/digestion_remains/skull/zorren(src,owner)
+ skull_amount--
+ if(SPECIES_NEVREAN)
+ new /obj/item/weapon/digestion_remains/skull/nevrean(src,owner)
+ skull_amount--
+ if(SPECIES_TESHARI)
+ new /obj/item/weapon/digestion_remains/skull/teshari(src,owner)
+ skull_amount--
+ if(SPECIES_VOX)
+ new /obj/item/weapon/digestion_remains/skull/vox(src,owner)
+ skull_amount--
+ if(SPECIES_XENOHYBRID)
+ new /obj/item/weapon/digestion_remains/skull/xenohybrid(src,owner)
+ skull_amount--
+ if(skull_amount && H.species.selects_bodytype) //We still haven't found correct skull...
+ if(H.species.base_species == SPECIES_HUMAN)
+ new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
+ else
+ new /obj/item/weapon/digestion_remains/skull/unknown/anthro(src,owner)
+ else if(skull_amount) //Something entirely different...
+ new /obj/item/weapon/digestion_remains/skull/unknown(src,owner)
+ else
+ return
+
+/obj/item/weapon/digestion_remains
+ name = "bone"
+ desc = "A bleached bone. It's very non-descript and its hard to tell what species or part of the body it came from."
+ icon = 'icons/obj/bones_vr.dmi'
+ icon_state = "generic"
+ force = 0
+ throwforce = 0
+ item_state = "bone"
+ w_class = ITEMSIZE_SMALL
+ var/pred_ckey
+ var/pred_name
+
+/obj/item/weapon/digestion_remains/New(var/newloc,var/mob/living/pred)
+ ..(newloc)
+ pred_ckey = pred.ckey
+ pred_name = pred.name
+
+/obj/item/weapon/digestion_remains/attack_self(mob/user)
+ if(user.a_intent == I_HURT)
+ to_chat(user,"As you squeeze the [name], it crumbles into dust and falls apart into nothing!")
+ qdel(src)
+
+/obj/item/weapon/digestion_remains/ribcage
+ name = "ribcage"
+ desc = "A bleached ribcage. It's very white and definitely has seen better times. Hard to tell what it belonged to."
+ icon_state = "ribcage"
+
+/obj/item/weapon/digestion_remains/skull
+ name = "skull"
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a human."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/tajaran
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a tajara."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unathi
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an unathi."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/skrell
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a skrell."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vasilissan
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vasilissan."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/akula
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to an akula."
+ icon_state = "skull_unathi"
+
+/obj/item/weapon/digestion_remains/skull/rapala
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a rapala."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/vulpkanin
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vulpkanin."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/sergal
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a sergal."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/zorren
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a zorren."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/nevrean
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a nevrean."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/teshari
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a teshari."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/vox
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to a vox."
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/unknown
+ desc = "A bleached skull. It looks very weakened. You can't quite tell what species it belonged to."
+ icon_state = "skull"
+
+/obj/item/weapon/digestion_remains/skull/unknown/anthro
+ icon_state = "skull_taj"
+
+/obj/item/weapon/digestion_remains/skull/xenohybrid
+ desc = "A bleached skull. It looks very weakened. Seems like it belonged to something with an elongated head."
+ icon_state = "skull_xenohybrid"
\ No newline at end of file
diff --git a/code/modules/vore/eating/living_vr.dm b/code/modules/vore/eating/living_vr.dm
index a7bfc1af9c..8d1717b320 100644
--- a/code/modules/vore/eating/living_vr.dm
+++ b/code/modules/vore/eating/living_vr.dm
@@ -1,7 +1,11 @@
///////////////////// Mob Living /////////////////////
/mob/living
var/digestable = 1 // Can the mob be digested inside a belly?
+ //TFF 30/4/19: Ports VoreStation Remains Option - set var for leaving remains
+ var/digest_leave_remains = 0 // Will this mob leave bones/skull/etc after the melty demise?
var/allowmobvore = 1 // Will simplemobs attempt to eat the mob?
+ //TFF 30/4/19: Ports VoreStation Mechanical Vore Prefs - set var for displaying vore prefs on examine
+ var/showvoreprefs = 1 // Determines if the mechanical vore preferences button will be displayed on the mob or not.
var/obj/belly/vore_selected // Default to no vore capability.
var/list/vore_organs = list() // List of vore containers inside a mob
var/absorbed = 0 // If a mob is absorbed into another
@@ -194,6 +198,8 @@
var/datum/vore_preferences/P = client.prefs_vr
P.digestable = src.digestable
+ //TFF 30/4/19: Ports VoreStation Remains Option
+ P.digest_leave_remains = src.digest_leave_remains
P.allowmobvore = src.allowmobvore
P.vore_taste = src.vore_taste
P.can_be_drop_prey = src.can_be_drop_prey
@@ -219,6 +225,8 @@
var/datum/vore_preferences/P = client.prefs_vr
digestable = P.digestable
+ //TFF 30/4/19: Ports VoreStation Remains Option
+ P.digest_leave_remains = src.digest_leave_remains
allowmobvore = P.allowmobvore
vore_taste = P.vore_taste
can_be_drop_prey = P.can_be_drop_prey
@@ -612,3 +620,27 @@
set category = "Preferences"
set desc = "Switch sharp/fuzzy scaling for current mob."
appearance_flags ^= PIXEL_SCALE
+
+//TFF 30/4/19: Ports VoreStation Mechanical Vore Prefs & Remains-leaving in 1 go
+/mob/living/examine(mob/user)
+ . = ..()
+ if(showvoreprefs)
+ to_chat(user, "\[Mechanical Vore Preferences\]")
+
+/mob/living/Topic(href, href_list) //Can't find any instances of Topic() being overridden by /mob/living in polaris' base code, even though /mob/living/carbon/human's Topic() has a ..() call
+ if(href_list["vore_prefs"])
+ display_voreprefs(usr)
+ return ..()
+
+/mob/living/proc/display_voreprefs(mob/user) //Called by Topic() calls on instances of /mob/living (and subtypes) containing vore_prefs as an argument
+ if(!user)
+ CRASH("display_voreprefs() was called without an associated user.")
+ var/dispvoreprefs = "[src]'s vore preferences
"
+ dispvoreprefs += "Digestable: [digestable ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Leaves Remains: [digest_leave_remains ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Mob Vore: [allowmobvore ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Drop-nom prey: [can_be_drop_prey ? "Enabled" : "Disabled"]
"
+ dispvoreprefs += "Drop-nom pred: [can_be_drop_pred ? "Enabled" : "Disabled"]
"
+ user << browse("